Anaconda中的pyomo求解器(与命令行不同的结果)

时间:2018-03-19 18:00:25

标签: python-3.x pyomo

我在https://www.osti.gov/servlets/purl/1376827`运行PDF的第64页的rosenbrock.py示例,类似于pyomo_examples \ doc \ pyomobook \ nonlinear-ch \ rosen

from pyomo.environ import *
model = ConcreteModel()
model.x = Var(initialize=-1.2, bounds=(-2, 2))
model.y = Var(initialize=1.0, bounds=(-2, 2))
model.obj = Objective(expr=(1-model.x)**2 + 
100*(model.y-model.x**2)**2,sense=minimize)

我在Windows 10 64位下使用带有Python 3.6的Anaconda,并且我在路径中安装了GLPK和IPOPT(IPOPT是SolverStudio安装的一部分)。我可以从命令行运行示例,我得到以下缩写结果:

>pyomo solve rosen.py --solver=ipopt --summary
Number of solutions: 1
Solution Information
Gap: None
Status: optimal
Function Value: 2.9895642187051186e-17
Solution Summary
Variables:
x : Value: 0.9999999945428673
y : Value: 0.9999999890517721
Objectives: Value: 2.9895642187051186e-17
Constraints:  None

如果我在IPython / Anaconda中使用SolverFacotry运行相同的模型:

opt = SolverFactory("ipopt",  executable=
"E:\\SolverStudio\\SolverStudio\\Solvers\\64bit\\ipopt.exe")
results = opt.solve(model)
print(results)

我得到的结果是“终止条件:最佳”,但解决方案显示“解决方案数量:0”。

Problem: 
Lower bound: -inf
Upper bound: inf
Number of objectives: 1
Number of constraints: 0
Number of variables: 2
Sense: unknown
Solver: 
Status: ok
Message: Ipopt 3.12.1\x3a Optimal Solution Found
Termination condition: optimal
Id: 0
Error rc: 0
Time: 0.5311787128448486
Solution: 
number of solutions: 0
number of solutions displayed: 0

结果表明问题没有限制,感觉是不可知的。我可以在Pythan中使用与命令行使用相同的模型吗?我是否需要以某种方式更改它?我期望在命令行和IPython / Anaconda中使用相同的Python脚本。

1 个答案:

答案 0 :(得分:1)

pyomo命令执行一些额外的操作,以人类可读的形式输出结果。基本步骤是:

  1. 构建模型
  2. 调用求解(结果自动加载)
  3. 使用人类可读的名称从模型中提取解决方案
  4. 打印结果
  5. 在步骤2中,“结果自动加载”表示存储在结果对象上的解决方案对象被取消并加载到模型中。当您在脚本中打印结果对象时,这会导致令人困惑的“解决方案数量:0”输出。

    如果您希望Pyomo将解决方案对象留在结果对象上,则应将load_solutions=False传递给solve方法。然后,在检查状态并验证结果对象包含解决方案(len(results.solution) > 0)之后,您可以使用model.solutions.load_from(results)手动将解决方案加载到模型中。