【发布时间】:2021-04-22 11:51:59
【问题描述】:
我在 Pyomo 中有一个混合整数非线性问题,它有一个目标函数和几个由非线性项和二进制变量组成的约束。
流行的求解器“ipopt”会找到一个解,但它会将二进制变量视为连续变量。
opt=SolverFactory("ipopt")
results=opt.solve(instance)
results.write()
instance.load(results)
现在我已经拼命尝试了两个可以解决混合整数非线性问题的求解器。
- 首先我尝试了 MindPy 求解器 (https://pyomo.readthedocs.io/en/stable/contributed_packages/mindtpy.html)。不幸的是没有成功:
我总是收到错误消息:“type NoneType doesn't define round method”。这让我感到惊讶,因为 ipopt-solver 找到了没有问题的解决方案,而 mindtpy-solver 是线性求解器和非线性求解器的混合体,实际上应该可以解决这个问题。
opt=SolverFactory('mindtpy').solve(instance, mip_solver="glpk", nlp_solver="ipopt", tee=True)
results=opt.solve(instance)
results.write()
instance.load(results)
2)然后我尝试了apopt求解器。您必须从“https://github.com/APMonitor/apopt”单独下载并将所有文件放入工作目录。
然后我尝试执行以下代码,不幸的是没有成功:
opt=SolverFactory("apopt.py")
results=opt.solve(instance)
results.write()
instance.load(results)
我总是收到以下错误消息:“错误消息:[WinError 193] %1 不是有效的 Win32 应用程序”。这可能与我的 Python 解释器需要 apopt.exe 相关,因为我有一台 Windows 机器。尝试将 .py 转换为 .exe 文件等尝试失败。此外,单独指定 Solverfactory(..., "executable=C\Users\Python...\\apopt.py" 不起作用。
有没有人知道如何让求解器“接受”和/或求解器“Mindtpy”工作并且可以对错误消息做些什么? 非常感谢您!
编辑:
这是一个示例性和简单的具体模型。我试图将它翻译成更简单的代码。正如我已经说过的,ipopt 求解器找到了解决方案:
model = pyo.ConcreteModel()
model.x = pyo.Var([1,2,3,4], domain=pyo.NonNegativeReals)
model.x = pyo.Var([5], domain=pyo.Binary)
model.OBJ = pyo.Objective(expr = 2*model.x[1] + 3*model.x[2] + 3*model.x[3] + 4*model.x[4])
model.Constraint1 = pyo.Constraint(expr = 3*model.x[1] + 4*model.x[2] >= 1)
model.Constraint2 = pyo.Constraint(expr = 3*model.x[3] + 4*model.x[4] >= 1)
model.Constraint3 =pyo.Constraint(expr = 1000*cos(model.x[3]) < 1000)
model. Constraint4=pyo.Constraint(expr = 1000*sin(model.x[4]) < 1000)
model.Constraint5=pyo.Constraint(expr = model.x[2] <= 10000*(1-model.x[5])
model.Constraint6= pyo.Constraint (expr=model.x[2] <= 10000*(model.x[5]))
【问题讨论】:
-
这可能绝对行不通,但似乎 apopt 最近一次更新是在几年前。您是否尝试过从该时间段运行 pyomo 版本。 Pyomo 一直在更新,东西被丢弃了,其他的也在更新。除此之外,你为什么不使用 NEOS 服务器来运行 couenne 求解器。这是一个 MINLP 求解器。
-
嘿,你能帮我如何在代码中实现 Couenne 求解器吗?那么,我必须遵循哪些步骤?调用 Couenne 求解器的命令是什么?
-
我认为您需要先下载求解器可执行文件 - ampl.com/products/solvers/open-source/#couenne。请注意依赖项 (github.com/coin-or/Couenne),其中大部分都可以在同一个第一个链接中找到。将 couenne 可执行位置添加到您的系统路径,然后在您的代码中更改为 opt = SolverFactory('couenne") 。
-
非常感谢您的帮助!我会试试看:)
标签: python optimization solver pyomo