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)
现在我已经拼命尝试了两个可以解决混合整数非线性问题的求解器。
- 首先我尝试了 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)
。
我在 Pyomo 中有一个混合整数非线性问题,它有一个 objective 函数和几个由非线性项和二进制变量组成的约束。
流行的求解器“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 没有定义 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)
。