首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MINLP求解器在Pyomo中的实现

MINLP求解器在Pyomo中的实现
EN

Stack Overflow用户
提问于 2021-04-22 11:51:59
回答 2查看 1.4K关注 0票数 2

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

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

代码语言:javascript
运行
复制
opt=SolverFactory("ipopt")
results=opt.solve(instance)
results.write()
instance.load(results)

现在,我已经拼命地尝试了两种求解混合整数非线性问题的方法。

  1. 首先,我尝试了MindPy求解器( 包/mintpy.html)。不幸的是,没有成功:

我总是收到错误消息:“类型NoneType不定义圆形方法”。这让我感到惊讶,因为ipopt求解者找到了一个没有问题的解决方案,而头脑中的求解者是一个线性求解者和一个非线性求解者的混合体,应该能够解决这个问题。

代码语言:javascript
运行
复制
opt=SolverFactory('mindtpy').solve(instance, mip_solver="glpk", nlp_solver="ipopt", tee=True)
results=opt.solve(instance)
results.write()
instance.load(results)

(2)然后我尝试了种群求解器。您必须从"https://github.com/APMonitor/apopt“中单独下载它,并将所有文件放到工作目录中。

然后,我尝试执行以下代码,不幸的是,没有成功:

代码语言:javascript
运行
复制
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“和/或求解器"Mindtpy”工作,并能够对错误消息做些什么?非常感谢您提前!

编辑:

这里是一个示例性和简单的具体模型。我试着把它翻译成更简单的代码。正如我已经说过的,ipopt解决者找到了一个解决方案:

代码语言:javascript
运行
复制
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]))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-07 18:12:06

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

APOPT解算器

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

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

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

混合整数非线性规划的APOPT联机解决程序读取AMPL、Pyomo或其他NL文件编写器的输出。与其他解决程序类似,此脚本读取模型(NL)文件并生成解决方案(sol)文件。它将NL文件发送到远程服务器,计算解决方案(远程),并通过internet连接检索解决方案(sol)文件。它与承载APOPT解决程序的服务器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以获得更多信息和解决方案选项帮助

有关带有引用的APOPT解决程序的信息可以在维基百科文章中找到。APOPT与盖科集成,可以与m=GEKKO(remote=False)在本地运行。

票数 1
EN

Stack Overflow用户

发布于 2021-04-22 18:10:44

“类型NoneType不定义圆形方法”

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

代码语言:javascript
运行
复制
x-0.5 <= y <= x+0.5 
x continuous variable
y integer variable

圆()之所以真的非常糟糕,是因为它是不可微的,不连续的。几乎所有的NLP和MINLP求解程序都具有平滑的功能(有时阅读文档很有用)。

在修复了您的模型(其中有很多问题)之后,我无法再现关于with ()的错误消息。

代码语言:javascript
运行
复制
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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67212743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档