如何解决我正在尝试用 Gekko 解决非线性混合整数问题,但我陷入了循环
我得到的错误是以下“@error: Inequality DeFinition”。我想我进入了一个循环。我对我设置参数的方式也不太自信。我是 gekko 的新手,我在我的代码上找不到我的错。错误发生在“m.solve()”这一行。
m=GEKKO()
#create variables
demand = m.Array(m.Param,5)
t=0
for v in [1150,2320,3200,4100,5400]:
demand[t].value = v
t=t+1
A=m.Array(m.Param,(2,5))
t=0
g=0
for v in [2,2,4,6,2.3,1,1.55,3.85,5.5]:
A[g][t].value = v
t=t+1
if t==5:
t=0
g=1
t=0
g=0
Start=m.Array(m.Param,5))
for v in [180,220,300,70,150,100,120,20,200]:
Start[g][t].value = v
t=t+1
if t==5:
t=0
g=1
t=0
g=0
C=m.Array(m.Param,5))
for v in [15,25,45,40,3,16.2,42,60]:
C[g][t].value = v
t=t+1
if t==5:
t=0
g=1
#create variables
ni = 2; nj = 5;
y = m.Array(m.Var,(ni,nj),lb=0,ub=1,integer=True)
x = m.Array(m.Var,integer=True)
# add limitations to model
m.Equation(y[i][j] * Start[i][j] - x[i][j] <= 0 for i in range(ni) for j in range(nj))
m.Equation(demand[j] <=m.sum([m.sum([x[i][j] for i in range(ni) ])])for j in range(nj))
#add optimization equation
m.Minimize(m.sum([m.sum([A[i][j] * x[i][j] - C[i][j] * y[i][j] * x[i][j]**0.5 for i in range(ni)]) for j in range(nj)]))
m.options.IMODE=3
m.options.solver=1
m.solve()
print(x)
print(y)
print(m.options.OBJFCNVAL)
解决方法
尝试使用 m.Equations()
并生成带方括号的方程列表。我重新编写了您的目标,以便更容易理解。您可以有多个目标,Gekko 会将它们加在一起,因此它已经在进行求和。
from gekko import GEKKO
m=GEKKO()
#create variables
demand = m.Array(m.Param,5)
for i,v in enumerate([1150,2320,3200,4100,5400]):
demand[i].value = v
A=m.Array(m.Param,(2,5))
t=0; g=0
for v in [2,2,4,6,2.3,1,1.55,3.85,5.5]:
A[g][t].value = v
t=t+1
if t==5:
t=0; g=1
t=0; g=0
Start=m.Array(m.Param,5))
for v in [180,220,300,70,150,100,120,20,200]:
Start[g][t].value = v
t=t+1
if t==5:
t=0; g=1
t=0; g=0
C=m.Array(m.Param,5))
for v in [15,25,45,40,3,16.2,42,60]:
C[g][t].value = v
t=t+1
if t==5:
t=0; g=1
#create variables
ni = 2; nj = 5;
y = m.Array(m.Var,(ni,nj),lb=0,ub=1,integer=True)
x = m.Array(m.Var,integer=True)
# add limitations to model
m.Equations([[y[i][j] * Start[i][j] - x[i][j] <= 0 \
for i in range(ni)] \
for j in range(nj)])
m.Equations([demand[j] <=m.sum([m.sum([x[i][j] \
for i in range(ni) ])])
for j in range(nj)])
#add optimization equation
for i in range(ni):
for j in range(nj):
m.Minimize(A[i][j]*x[i][j] - C[i][j]*y[i][j] * x[i][j]**0.5)
m.options.IMODE=3
m.options.Solver=1
m.solve()
print(x)
print(y)
print(m.options.OBJFCNVAL)
这给出了一个看起来很容易解决的解决方案,因此您可能需要再次检查您的方程。
--------- APM Model Size ------------
Each time step contains
Objects : 10
Constants : 0
Variables : 80
Intermediates: 0
Connections : 25
Equations : 25
Residuals : 25
Number of state variables: 45
Number of total equations: - 25
Number of slack variables: - 15
---------------------------------------
Degrees of freedom : 5
----------------------------------------------
Steady State Optimization with APOPT Solver
----------------------------------------------
Iter: 1 I: 0 Tm: 0.00 NLPi: 2 Dpth: 0 Lvs: 0 Obj: 5.68E+04 Gap: 0.00E+00
Successful solution
---------------------------------------------------
Solver : APOPT (v1.0)
Solution time : 1.529999999911524E-002 sec
Objective : 56760.0000000000
Successful solution
---------------------------------------------------
[[[1150.0] [2320.0] [3200.0] [4100.0] [5400.0]]
[[0.0] [0.0] [0.0] [0.0] [0.0]]]
[[[0.0] [0.0] [0.0] [0.0] [0.0]]
[[0.0] [0.0] [0.0] [0.0] [0.0]]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。