使用Python-PYOMO中的GAMS/CPLEX

使用Python-PYOMO中的GAMS/CPLEX,pyomo,gams-math,Pyomo,Gams Math,我注意到pyomo5.3提供了一个GAMS解算器插件。 这是非常令人兴奋的,因为我们有一个GAMS/CPLEX许可证,我们可以使用CPLEX作为解算器,但只能通过GAMS。根据我的理解,有了新的Pyomo-Gams接口,应该可以在Pyomo中表述一个问题,并将其转换为Gams,由CPLEX解决 然而,当我用shell集成测试时,速度非常慢(小MIP的30次解算为40秒,而glpk/ipopt/cbc的解算为6秒)。此外,插件的文档实际上是不存在的 但也许你们中有人有使用该界面的经验,可以帮助我

我注意到pyomo5.3提供了一个GAMS解算器插件。

这是非常令人兴奋的,因为我们有一个GAMS/CPLEX许可证,我们可以使用CPLEX作为解算器,但只能通过GAMS。根据我的理解,有了新的Pyomo-Gams接口,应该可以在Pyomo中表述一个问题,并将其转换为Gams,由CPLEX解决

然而,当我用shell集成测试时,速度非常慢(小MIP的30次解算为40秒,而glpk/ipopt/cbc的解算为6秒)。此外,插件的文档实际上是不存在的

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

  • pyomo是否真的将pyomo模型转换为gams代码?如果是,我在哪里可以找到gams文件
  • 翻译的效率有多高?如果我想反复求解一个小模型,应该如何进行
  • 使用shell和GAMS-pythonapi有什么区别
  • 有什么地方可以找到关于这个的文档吗

  • 此外,conda似乎只为Linux/Python 3.6或Windows/Python 2.7提供了Pyomo 5.3 ,所以我不得不使用pip在我的机器上安装pyomo5.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(" ")
将pyomo.environ作为pe导入
#建立模型
model=pe.ConcreteModel()
model.MaxWeight=pe.Param(initialize=0,mutable=True)
型号项目=[“锤子”、“扳手”、“螺丝刀”、“毛巾”]
重量={“锤子”:5,“扳手”:7,“螺丝刀”:4,“毛巾”:3}
值={'hammer':8,“扳手”:3,“螺丝刀”:6,“毛巾”:11}
model.x=pe.Var(model.Item,in=pe.Binary)
model.z=pe.Objective(expr=sum(model.Item中i的值[i]*model.x[i]),sense=pe.maximize)
model.constraint=pe.constraint(expr=sum(模型项中i的权重[i]*model.x[i])0.5:
soln_items.append(i)
#打印(“最大重量=”,最大重量,单个项目)
打印(“{:7.2f}s.”格式(time.time()-tic))
打印(“”)

这有点晚了,但我可以回答你的几个问题

首先,刚刚为readthedocs上的GAMS接口创建了一个基本文档页面,您可以在以下位置找到:。请注意,此位置可能会更改,因为我相信不久我们将重新构建文档树,但您应该能够搜索“GAMS”如果您认为您或其他人希望看到更多文档,请告诉我,因为我很乐意提供任何有用的信息


至于shell接口和pythonapi接口之间的区别,实际上没有任何区别。我原以为使用API会提高性能,但过去似乎不是这样(事实上,我在一个模型上尝试过,shell接口无论如何都会更快)。如果您同时尝试这两种方法并体验其他方法,我也很高兴知道这一点。

这并不让我感到惊讶。这会带来相当大的开销(pyomo不会直接与GAMS解算器对话,而是让GAMS再次生成模型)。因此,仅对未在Pyomo循环中求解的大型模型使用此选项。选项
keepfiles=True
可用于保留临时文件。