【问题标题】:Implementation of MINLP solver "apopt" in Pyomo在 Pyomo 中实现 MINLP 求解器“apopt”
【发布时间】:2021-04-22 11:51:59
【问题描述】:

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

流行的求解器“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 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


【解决方案1】:

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

APPT 求解器

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

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

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

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

使用说明:

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

可以在Wikipedia article 上找到有关 APPT 求解器的信息以及参考资料。 APPT 与Gekko 集成,可以使用m=GEKKO(remote=False) 在本地运行。

【讨论】:

    【解决方案2】:

    “类型 NoneType 没有定义圆形方法”

    您应该(几乎)永远不要在您的 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>
    

    【讨论】:

    • 感谢欧文的回答!不胜感激 :) 很抱歉再次打扰您,但我的代码中没有使用 round() 函数。尽管我不使用 round() 函数,但您知道为什么我会收到此错误消息吗?非常感谢您!
    • 对不起。您可能希望提供一个最小的可重现示例和堆栈跟踪。
    • 这不是有效的 Python,不会编译。
    • 好吧 Erwin,我还没有弄清楚为什么我的代码没有运行,但至少很高兴看到求解器正常工作。非常感谢你的帮助!我真的很感激。
    • 您可能希望在您的问题中更加准确。显示您正在使用的确切代码(至少应该编译),显示带有堆栈跟踪的错误消息,以及您正在使用的确切环境(OS、Python、Pymo 版本)。如果无法重现事物,就很难提供任何有用的帮助。
    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2019-06-13
    相关资源
    最近更新 更多