我在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脚本。
答案 0 :(得分:1)
pyomo
命令执行一些额外的操作,以人类可读的形式输出结果。基本步骤是:
在步骤2中,“结果自动加载”表示存储在结果对象上的解决方案对象被取消并加载到模型中。当您在脚本中打印结果对象时,这会导致令人困惑的“解决方案数量:0”输出。
如果您希望Pyomo将解决方案对象留在结果对象上,则应将load_solutions=False
传递给solve方法。然后,在检查状态并验证结果对象包含解决方案(len(results.solution) > 0
)之后,您可以使用model.solutions.load_from(results)
手动将解决方案加载到模型中。