在使用Pyomo和NL / ASL求解器接口

时间:2016-10-07 19:48:47

标签: pyomo

我想从cplex解算器获取我的变量的.rc或.urc后缀,使用Pyomo和NL / ASL接口。此接口通常比我的模型的默认cplex接口更快。但是我似乎无法让NL接口返回这些后缀。如果我使用带有默认选项的cplex求解器,我会获得rc后缀的值。但是,如果我使用solver_io =' nl'或者将解算器设置为' cplexamp' (我认为做同样的事情),然后我得到没有rc值。 (我能够获得双重身份,但不能获得rc')

以下是一些示例代码:

from pyomo.environ import *
from pyomo.opt import SolverFactory

def show_rc(m, *args, **kwargs):
    opt = SolverFactory(*args, **kwargs)
    results = opt.solve(m, suffixes=['rc'])
    m.solutions.load_from(results)
    m.rc.pprint()

m = ConcreteModel()
m.X = Var(bounds=(0, 1))
m.obj = Objective(rule=lambda m: 3.14 * m.X, sense=maximize)
m.rc = Suffix(direction=Suffix.IMPORT, datatype=Suffix.FLOAT)

show_rc(m, "cplex")                  # has value 3.14
show_rc(m, "cplex", solver_io="nl")  # no value returned
show_rc(m, "cplexamp")               # no value returned

documentation特别提到通过后缀降低成本,.rc后缀似乎是AMPL的标准位置,但我没有运气通过Pyomo'的NL界面。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,cplexamp可执行文件不会在解决方案文件中返回降低的成本(我刚检查过)。我想AMPL必须使用返回的双解决方案来计算这些。我会在GitHub上打开一张票。也许我们可以将这个功能添加到我们的ASL界面。

就速度而言,你应该试试Pyomo基于Python的Cplex界面(solver_io =“python”)。这通常要快得多,因为它不需要任何文件I / O.在通过Pyomo使用该接口之前,您需要安装Cplex-Python绑定。如果你能“导入cplex”,那么它应该是好的。

编辑:我忘了提到solver_io =“python”确实返回Cplex的降低成本。