使用 NEOS 作为 Pyomo 求解器
Using NEOS as a Pyomo solver
最近开始做一些OR,一直在尝试用Pyomo和NEOS做一些优化问题。我一直在关注 UT Austin Pyomo 的一个讲座,当我的 GLPT 难以安装时,我转向了 NEOS。我现在很难从 NEOS 收到已解决的答案。
我目前的情况是这样的:
from pyomo import environ as pe
import os
os.environ['NEOS_EMAIL'] = 'my registered email'
model = pe.ConcreteModel()
model.x1 = pe.Var(domain=pe.Binary)
model.x2 = pe.Var(domain=pe.Binary)
model.x3 = pe.Var(domain=pe.Binary)
model.x4 = pe.Var(domain=pe.Binary)
model.x5 = pe.Var(domain=pe.Binary)
obj_expr = 3 * model.x1 + 4 * model.x2 + 5 * model.x3 + 8 * model.x4 + 9 * model.x5
model.obj = pe.Objective(sense=pe.maximize, expr=obj_expr)
con_expr = 2 * model.x1 + 3 * model.x2 + 4 * model.x3 + 5 * model.x4 + 9 * model.x5 <= 20
model.con = pe.Constraint(expr=con_expr)
solver_manager = pe.SolverManagerFactory('neos')
results = solver_manager.solve(model, solver = "minos")
print(results)
我在 return 中收到的是解决方案的数量 = 0,而我知道一个事实存在。我还看到我没有设置任何界限,那么我该怎么做呢?再说一次,我对此很陌生,无法在其他地方找到任何类型的文档,或者我只是不知道如何查找。
感谢您的帮助!
这是当前结果对象的设计“问题”。由于历史原因,该字段报告结果对象中包含的解决方案数量,而不是求解器生成的解决方案数量。默认情况下,Pyomo 求解器直接将求解器 return 编辑的解决方案加载到原始模型中(为了方便和效率),而不是 return 在结果对象中。您可以通过向 solve()
调用提供 load_solutions=False
来更改该行为。
至于界限,你指的界限是什么?使用 Var()
声明的 bounds=
参数或 domain=
参数设置变量边界。对于您的示例,因为变量被声明为 Binary
,它们都有 [0..1]
的界限。 objective 上的边界是通过解析求解器输出收集的。这取决于您正在使用的求解器(许多不报告边界信息)和用于解析求解器结果的接口。
最后一点,您要将 MIP 问题发送给 LP/NLP 求解器 (minos)。您将从求解器返回二进制变量的小数值。
最近开始做一些OR,一直在尝试用Pyomo和NEOS做一些优化问题。我一直在关注 UT Austin Pyomo 的一个讲座,当我的 GLPT 难以安装时,我转向了 NEOS。我现在很难从 NEOS 收到已解决的答案。
我目前的情况是这样的:
from pyomo import environ as pe
import os
os.environ['NEOS_EMAIL'] = 'my registered email'
model = pe.ConcreteModel()
model.x1 = pe.Var(domain=pe.Binary)
model.x2 = pe.Var(domain=pe.Binary)
model.x3 = pe.Var(domain=pe.Binary)
model.x4 = pe.Var(domain=pe.Binary)
model.x5 = pe.Var(domain=pe.Binary)
obj_expr = 3 * model.x1 + 4 * model.x2 + 5 * model.x3 + 8 * model.x4 + 9 * model.x5
model.obj = pe.Objective(sense=pe.maximize, expr=obj_expr)
con_expr = 2 * model.x1 + 3 * model.x2 + 4 * model.x3 + 5 * model.x4 + 9 * model.x5 <= 20
model.con = pe.Constraint(expr=con_expr)
solver_manager = pe.SolverManagerFactory('neos')
results = solver_manager.solve(model, solver = "minos")
print(results)
我在 return 中收到的是解决方案的数量 = 0,而我知道一个事实存在。我还看到我没有设置任何界限,那么我该怎么做呢?再说一次,我对此很陌生,无法在其他地方找到任何类型的文档,或者我只是不知道如何查找。
感谢您的帮助!
这是当前结果对象的设计“问题”。由于历史原因,该字段报告结果对象中包含的解决方案数量,而不是求解器生成的解决方案数量。默认情况下,Pyomo 求解器直接将求解器 return 编辑的解决方案加载到原始模型中(为了方便和效率),而不是 return 在结果对象中。您可以通过向 solve()
调用提供 load_solutions=False
来更改该行为。
至于界限,你指的界限是什么?使用 Var()
声明的 bounds=
参数或 domain=
参数设置变量边界。对于您的示例,因为变量被声明为 Binary
,它们都有 [0..1]
的界限。 objective 上的边界是通过解析求解器输出收集的。这取决于您正在使用的求解器(许多不报告边界信息)和用于解析求解器结果的接口。
最后一点,您要将 MIP 问题发送给 LP/NLP 求解器 (minos)。您将从求解器返回二进制变量的小数值。