在Pyomo中有一个混合整数非线性问题,具有一个目标函数和由非线性项和二元变量组成的几个约束条件。
流行的求解器"ipopt“找到了一个解决方案,但它将二进制变量视为连续变量。
opt=SolverFactory("ipopt")
results=opt.solve(instance)
results.write()
instance.load(results)
现在,我已经拼命地尝试了两种求解混合整数非线性问题的方法。
我总是收到错误消息:“类型NoneType不定义圆形方法”。这让我感到惊讶,因为ipopt求解者找到了一个没有问题的解决方案,而头脑中的求解者是一个线性求解者和一个非线性求解者的混合体,应该能够解决这个问题。
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“中单独下载它,并将所有文件放到工作目录中。
然后,我尝试执行以下代码,不幸的是,没有成功:
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解决者找到了一个解决方案:
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]))
发布于 2021-09-07 18:12:06
尝试将路径添加到apopt.py变量中。apopt.py程序的作用就像一个可执行文件,以model.nl
作为求解器的参数,它生成一个sol
解决方案文件,然后进行处理以检索解决方案。与AIMS或Pyomo中的其他求解者不同,APOPT在公共服务器上远程计算。下面是运行APOPT的附加指令。
APOPT解算器
APOPT (for Advanced Process OPTimizer)是一个用于解决以下任何形式的大规模优化问题的软件包:
APOPT的应用包括化学反应器、搅拌摩擦焊接、防止深海管道中水合物的形成、计算生物学、固体氧化物燃料电池以及无人机的飞行控制。AMPL、APMonitor、Gekko和Pyomo支持APOPT。
混合整数非线性规划的APOPT联机解决程序读取AMPL、Pyomo或其他NL文件编写器的输出。与其他解决程序类似,此脚本读取模型(NL)文件并生成解决方案(sol)文件。它将NL文件发送到远程服务器,计算解决方案(远程),并通过internet连接检索解决方案(sol)文件。它与承载APOPT解决程序的服务器http://byu.apopt.com进行通信。请与support@apmonitor.com联系以获得支持,特别是如果存在功能请求或对问题解决方案的关注。
使用说明:
有关带有引用的APOPT解决程序的信息可以在维基百科文章中找到。APOPT与盖科集成,可以与m=GEKKO(remote=False)
在本地运行。
发布于 2021-04-22 18:10:44
“类型NoneType不定义圆形方法”
您应该(几乎)永远不要在MINLP模型中使用圆形()函数。这也是不必要的。相反,使用整数变量,如:
x-0.5 <= y <= x+0.5
x continuous variable
y integer variable
圆()之所以真的非常糟糕,是因为它是不可微的,不连续的。几乎所有的NLP和MINLP求解程序都具有平滑的功能(有时阅读文档很有用)。
在修复了您的模型(其中有很多问题)之后,我无法再现关于with ()的错误消息。
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>
https://stackoverflow.com/questions/67212743
复制相似问题