Pyomo 中 MINLP 求解器 "apopt" 的实现

Implementation of MINLP solver "apopt" in Pyomo

我在 Pyomo 中有一个混合整数非线性问题,它有一个 objective 函数和几个由非线性项和二进制变量组成的约束。

流行的求解器“ipopt”找到了一个解,但它将二进制变量视为连续变量。

opt=SolverFactory("ipopt")
results=opt.solve(instance)
results.write()
instance.load(results)

现在我已经拼命尝试了两个可以解决混合整数非线性问题的求解器。

  1. 首先我尝试了 MindPy 求解器 (https://pyomo.readthedocs.io/en/stable/contributed_packages/mindtpy.html)。不幸的是没有成功:

我总是收到错误消息:“type NoneType 没有定义 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" 无效。

有没有人知道如何让求解器“apopt”and/or 求解器“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]))

"type NoneType 没有定义 round 方法"

您应该(几乎)永远不要在您的 MINLP 模型中使用 round() 函数。也不需要。相反,使用整数变量,如:

x-0.5 <= y <= x+0.5 
x continuous variable
y integer variable

round() 之所以非常非常糟糕,是因为它不可微且不连续。几乎所有的 NLP 和 MINLP 求解器都假定平滑函数(有时阅读文档很有用)。


修复你的模型后(它有很多问题),我无法重现关于 round() 的错误消息。

D:\tmp>type pyom1.py
import pyomo.environ as pyo

model = pyo.ConcreteModel()

model.x = pyo.Var([1,2,3,4], domain=pyo.NonNegativeReals)
model.y = pyo.Var(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*pyo.cos(model.x[3]) <= 1000)
model.Constraint4 = pyo.Constraint(expr = 1000*pyo.sin(model.x[4]) <= 1000)
model.Constraint5 = pyo.Constraint(expr = model.x[2] <= 10000*(1-model.y))
model.Constraint6 = pyo.Constraint (expr=model.x[2] <= 10000*(model.y))

pyo.SolverFactory('mindtpy').solve(model, mip_solver='cbc', nlp_solver='ipopt', tee=True)


D:\tmp>python.exe pyom1.py
INFO: ---Starting MindtPy---
INFO: Original model has 6 constraints (2 nonlinear) and 0 disjunctions, with
    5 variables, of which 1 are binary, 0 are integer, and 4 are continuous.
INFO: rNLP is the initial strategy being used.
INFO: NLP 1: Solve relaxed integrality
INFO: NLP 1: OBJ: 1.666666661289117  LB: -inf  UB: inf
INFO: ---MindtPy Master Iteration 0---
INFO: MIP 1: Solve master problem.
INFO: MIP 1: OBJ: 1.6666666499999998  LB: 1.6666666499999998  UB: inf
INFO: NLP 2: Solve subproblem for fixed binaries.
INFO: NLP 2: OBJ: 1.6666666716089886  LB: 1.6666666499999998  UB:
    1.6666666716089886
INFO: MindtPy exiting on bound convergence. LB: 1.6666666499999998 + (tol
    0.0001) >= UB: 1.6666666716089886

D:\tmp>

尝试将 apopt.py 的路径添加到 PATH 变量。 apopt.py 程序就像一个可执行文件,将 model.nl 作为求解器的参数,它会生成一个 sol 解决方案文件,然后对其进行处理以检索解决方案。与 AIMS 或 Pyomo 中的其他求解器不同,APOPT 在 public 服务器上进行远程计算。这是 运行 宁 APOPT 上的 additional instructions

APOPT 求解器

APOPT(Advanced Process OPTimizer)是一个软件包,用于解决以下任何形式的大规模优化问题:

  • 线性规划(LP)
  • 二次规划 (QP)
  • 二次约束二次规划 (QCQP)
  • 非线性规划 (NLP)
  • 混合整数规划 (MIP)
  • 混合整数线性规划 (MILP)
  • 混合整数非线性规划 (MINLP)

APOPT 的应用包括化学反应器、搅拌摩擦焊、防止深海管道中形成水合物、计算生物学、固体氧化物燃料电池和无人驾驶飞行器 (UAV) 的飞行控制。 AMPL、APMonitor、Gekko 和 Pyomo 支持 APOPT。

APOPT 混合整数非线性规划在线求解器从 AMPL、Pyomo 或其他 NL 文件编写器读取输出。与其他求解器类似,此脚本读取模型 (NL) 文件并生成解决方案 (sol) 文件。它将 NL 文件发送到远程服务器,(远程)计算解决方案,并通过互联网连接检索解决方案 (sol) 文件。它与托管 APOPT 求解器的服务器 http://byu.apopt.com 通信。联系 support@apmonitor.com 以获得支持,尤其是在有功能请求或对问题解决方案有疑虑时。

使用说明:

  • 将apopt.py放在系统路径的适当文件夹中(例如Linux、/usr/bin/)
  • 设置适当的权限以使脚本可执行(例如 chmod 775 apopt.py)
  • 在 AMPL、Pyomo 或其他 NL 文件写入中,将求解器选项设置为 apopt.py
  • 通过 运行ning apopt.py -test
  • 测试安装
  • 访问 apopt.com 获取更多信息和求解器选项帮助

有关带参考的 APOPT 求解器的信息可以在 Wikipedia article for APOPT. APOPT has integration with Gekko 找到,并且可以 运行 在本地 m=GEKKO(remote=False)