我想从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界面。有人能指出我正确的方向吗?
答案 0 :(得分:1)
不幸的是,cplexamp可执行文件不会在解决方案文件中返回降低的成本(我刚检查过)。我想AMPL必须使用返回的双解决方案来计算这些。我会在GitHub上打开一张票。也许我们可以将这个功能添加到我们的ASL界面。
就速度而言,你应该试试Pyomo基于Python的Cplex界面(solver_io =“python”)。这通常要快得多,因为它不需要任何文件I / O.在通过Pyomo使用该接口之前,您需要安装Cplex-Python绑定。如果你能“导入cplex”,那么它应该是好的。
编辑:我忘了提到solver_io =“python”确实返回Cplex的降低成本。