在Pyomo中访问可变边界的Duals

时间:2017-05-18 20:41:49

标签: pyomo

是否可以访问Pyomo中与变量边界相关的双重信息?对于约束,您可以声明后缀,但是变量边界是否等效?

1 个答案:

答案 0 :(得分:1)

您可以声明一个名为rc的后缀(降低成本),以便从以下界面获取此内容:

  • Gurobi:LP,MPS,Python
  • Cplex:LP,MPS,Python
  • Glpk:LP,MPS

Xpress也可能在该列表中,但我无法验证。

AMPL的Gurobi和Cplex求解器不会将此信息作为后缀返回(我不知道为什么),因此您无法通过NL文件接口将这些信息传递给Pyomo中的这些求解器。

此外,对于Ipopt,您可以通过分别为下限和上限的双重声明名为ipopt_zL_outipopt_zU_out的后缀来获得此结果。有关更好的解释,请参阅this示例。

上面的列表只是我所知道的。可能还有其他AMPL解算器通过后缀提供此信息,因此只要您知道后缀的名称,就可以通过Pyomo的NL文件接口访问该解决方案信息。

更新:这是gurobi的一个例子:

import pyomo.environ as aml

model = aml.ConcreteModel()
model.x = aml.Var(bounds=(0,1))
model.o = aml.Objective(expr=model.x)
model.c = aml.Constraint(expr=model.x >= -1)

model.rc = aml.Suffix(direction=aml.Suffix.IMPORT)

gurobi = aml.SolverFactory("gurobi",
                           solver_io="lp")
results = gurobi.solve(model)
assert str(results.solver.termination_condition) == "optimal"

print(model.rc[model.x])

正如我在上面所解释的那样,你可以在这个例子中将solver_io设置为与Gurobi“lp”,“mps”或“python”。