Вопрос:

Использование GAMS / CPLEX от Python PYOMO

pyomo gams-math

821 просмотра

1 ответ

13 Репутация автора

Я заметил, что Pyomo 5.3 предлагает плагин GAMS Solver. https://github.com/Pyomo/pyomo/blob/master/pyomo/solvers/plugins/solvers/GAMS.py

Это очень интересно, так как у нас есть лицензия GAMS / CPLEX, где мы можем использовать CPLEX в качестве решателя, но только через GAMS. С новым интерфейсом Pyomo-Gams, насколько я понимаю, можно сформулировать проблему в Pyomo и перевести ее в GAMS и решить CPLEX.

Однако, когда я тестирую это с интеграцией оболочки, она очень медленная (40 секунд для 30 решений небольшого MIP против 6 секунд с glpk / ipopt / cbc). Кроме того, документация плагина фактически отсутствует.

Но, возможно, кто-то из вас имеет некоторый опыт использования этого интерфейса и может помочь мне с этим

  • действительно ли pyomo переводит модель pyomo в код gams? Если да, где я могу найти gams-файл?
  • Насколько эффективен перевод и как мне действовать, если я хочу повторно решить небольшую модель?
  • В чем разница между использованием оболочки или GAMS Python API?
  • есть ли где найти документацию по этому поводу?

  • Также кажется, что conda предоставляет Pyomo 5.3 только для Linux / Python 3.6 ИЛИ для Windows / Python 2.7 https://anaconda.org/conda-forge/pyomo/files?version=5.3 , поэтому мне пришлось использовать pip для установки Pyomo 5.3 на моей машине.

Заранее спасибо Тео

import pyomo.environ as pe

# set up the model
model = pe.ConcreteModel()

model.MaxWeight = pe.Param(initialize=0,mutable=True)
model.Item = ['hammer','wrench','screwdriver','towel']

Weight = {'hammer':5,'wrench':7,'screwdriver':4,'towel':3}
Value = {'hammer':8,'wrench':3,'screwdriver':6,'towel':11}

model.x = pe.Var(model.Item,within=pe.Binary)
model.z = pe.Objective(expr=sum(Value[i] * model.x[i] for i in model.Item),sense=pe.maximize)
model.constraint = pe.Constraint(expr=sum(Weight[i]*model.x[i] for i in model.Item) <= model.MaxWeight)

# time execution
solver_list = ['cbc', 'ipopt', 'gams', 'glpk']

for i, solver_name in enumerate(solver_list):
    solver = pe.SolverFactory(solver_name)
    print(solver_name)
    tic = time.time()
    for MaxWeight_i in range(0,30):
        model.MaxWeight = MaxWeight_i
        result = solver.solve(model)

        soln_items = list()
        for i in model.x:
            if pe.value(model.x[i]) > 0.5:
                soln_items.append(i)
        # print("Maximum Weight =", MaxWeight_i, soln_items)

    print("{:7.2f} s".format(time.time()-tic))
    print(" ")
Автор: Theo Источник Размещён: 12.01.2018 08:57

Ответы (1)


0 плюса

40 Репутация автора

Решение

Это довольно задержано, но я могу ответить на несколько ваших вопросов.

Во-первых, только что была создана базовая страница документации для интерфейса GAMS на readthedocs, которую вы можете найти по адресу: http://pyomo.readthedocs.io/en/latest/library_reference/solvers/gams.html . Обратите внимание, что это местоположение может измениться, так как я полагаю, что в ближайшее время мы реструктурируем дерево документации, но вы сможете найти «gams», чтобы найти его снова в будущем. Если есть больше документов, которые, как вы считаете, хотели бы видеть вы или другие, пожалуйста, дайте мне знать, так как я был бы рад предоставить что-нибудь полезное.

Что касается разницы между интерфейсом оболочки и интерфейсом API Python, то здесь их нет. Я подумал, что при использовании API можно было бы увеличить производительность, но в прошлом этого не было (и на самом деле одна модель, на которой я это пробовал, все равно увидела, что интерфейс оболочки был быстрее). Если вы попробуете и то, и другое испытаете иначе, я тоже буду рад узнать об этом.

Автор: Grant Seastream Размещён: 29.05.2018 05:21
Вопросы из категории :
32x32