首页 文章

使用Python PYOMO中的GAMS / CPLEX

提问于
浏览
2

我注意到Pyomo 5.3提供了一个GAMS解算器插件 . https://github.com/Pyomo/pyomo/blob/master/pyomo/solvers/plugins/solvers/GAMS.py

这非常令人兴奋,因为我们有一个GAMS / CPLEX许可证,我们可以使用CPLEX作为解算器,但只能通过GAMS . 使用新的Pyomo-Gams界面,从我的理解应该可以在Pyomo中形成一个问题,并将其转换为GAMS并由CPLEX解决 .

但是,当我使用shell集成测试时,它非常慢(对于30个小型MIP的解决方案为40秒,而对于glpk / ipopt / cbc为6个) . 此外,插件的文档实际上是不存在的 .

但也许你们中的某个人有使用该界面的经验,可以帮助我

  • pyomo实际上将pyomo模型转换为gams代码吗?如果是,我在哪里可以找到gams-file?

  • 翻译效率如何,如果我想反复解决一个小模型,我该怎么办?

  • 使用shell或GAMS Python API有什么区别?

  • 有没有找到这方面文件的地方?

  • 此外,似乎conda仅为Linux / Python 3.6或Windows / Python 2.7 https://anaconda.org/conda-forge/pyomo/files?version=5.3提供Pyomo 5.3,因此我不得不使用pip在我的机器上安装Pyomo 5.3 .

在此先感谢,Theo

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(" ")

1 回答

  • 0

    这是相当延迟的,但我可以回答你的一些问题 .

    首先,刚刚为readthedocs上的GAMS界面创建了一个基本文档页面,您可以在以下位置找到它:http://pyomo.readthedocs.io/en/latest/library_reference/solvers/gams.html . 请注意,此位置可能会更改,因为我相信我们很快会重新构建文档树,但您应该能够搜索"gams"以便将来再次找到它 . 如果有's more documentation that you believe you or others would like to see, please let me know as I'很乐意提供任何有用的东西 .

    至于shell接口和Python API接口之间的区别,确实没有 . 我认为通过使用API会有性能提升,但过去似乎并非如此(事实上,我尝试过的一个模型看到shell界面更快) . 如果你尝试两种方式并且经历不同的方式,那么我也很高兴知道这一点 .

相关问题