-1

我想使用带有 NL / ASL 接口的 Pyomo 从 cplex 求解器中为我的变量获取 .rc 或 .urc 后缀。这个接口通常比我的模型的默认 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

文档特别提到通过后缀降低成本,而 .rc 后缀似乎是 AMPL 中的标准位置,但我没有通过 Pyomo 的 NL 接口阅读此内容。谁能指出我正确的方向?

4

1 回答 1

1

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

在速度方面,您应该尝试 Pyomo 的基于 Python 的 Cplex 接口 (solver_io="python")。这通常要快得多,因为它不需要任何文件 I/O。您需要先安装 Cplex-Python 绑定,然后才能通过 Pyomo 使用该接口。如果您可以“导入 cplex”,那么应该很好。

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

于 2016-10-07T21:06:36.153 回答