我目前正在为一个大学项目研究一个模型混合整数非线性规划(Bin-Backing问题(,我正试图使用GEKKO来解决它。
任何建议都将不胜感激。
# ___Initialize model___
m = GEKKO()
# ___Global options_____
m.options.SOLVER = 1
ni = 4550
nj =6
nk= 35
# variables:
x = m.Array(m.Var, (ni,nk,nj), lb=0, integer=True) #integer variable
y = m.Array(m.Var, (nj,nk), lb=0, ub=1, integer=True) #binary variable
# Parameters:
w1=m.Const(w)
h1=m.Const(h)
Psum_total=m.Const(value=sum_total)
P = m.Array(m.Param,ni)
for i in range(ni):
P[i].value = PPP[i]
V = m.Array(m.Param,ni)
for i in range(ni):
V[i].value=VV[i]
d= m.Array(m.Param,ni)
for i in range(ni):
d[i] = 50
Psum_vetor=m.Array(m.Param,nj)
for j in range(nj):
Psum_vetor[j].value=sumP[j]
#Intermediate
Lkj = [[m.Intermediate(m.sum([P[i]*x[i][k][j] for i in range(ni)])) for j in range(nj)] for k in range(nk)]
xyi = [m.Intermediate(m.sum([ x[i][k][j]*y[j][k] for k in range(nk) for j in range(nj)])) for i in range(ni)]
z= m.Intermediate(m.sum([xyi[i]*V[i] for i in range(ni)]))
s = Psum_total
for k in range(nk):
for j in range(nj):
s += Lkj[k][j]
# Equations
m.Equation([xyi[i] <= d[i] for i in range(ni)])
m.Equation([sum([ Lkj[k][j]*y[j][k] for j in range(nj)]) <= h1*w1 for k in range(nk)])
m.Equation([sum([Lkj[k][j]*y[j][k] for k in range(nk)]) == s/7 - P[j] for j in range(nj)])
m.Obj(-z)
m.options.IMODE = 3
m.solve()
print(x)
输出:
apm 35.186.172.229_gk_model1 <br><pre> ----------------------------------------------------------------
APMonitor, Version 1.0.1
APMonitor Optimization Suite
----------------------------------------------------------------
--------- APM Model Size ------------
Each time step contains
Objects : 0
Constants : 0
Variables : 0
Intermediates: 0
Connections : 0
Equations : 0
Residuals : 0
@error: Insufficient Model
Model must contain at least 1 variable and 1 equation
STOPPING...
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-17-9adce22534dc> in <module>
101
102 # Solve minimization
--> 103 m.solve()
104
105 print(x)
/usr/local/lib/python3.7/dist-packages/gekko/gekko.py in solve(self, disp, debug, GUI, **kwargs)
2183 #print APM error message and die
2184 if (debug >= 1) and ('@error' in response):
-> 2185 raise Exception(response)
2186
2187 #load results
Exception: @error: Insufficient Model
Model must contain at least 1 variable and 1 equation
STOPPING...
根据输出,它似乎没有识别变量或方程。
提前感谢您的帮助。
这里有一个成功解决问题的版本:
# ___Initialize model___
from gekko import GEKKO
m = GEKKO()
# ___Global options_____
m.options.SOLVER = 1
ni = 4
nj =6
nk= 3
# variables:
x = m.Array(m.Var, (ni,nk,nj), lb=0, integer=True) #integer variable
y = m.Array(m.Var, (nj,nk), lb=0, ub=1, integer=True) #binary variable
# Parameters:
w=1; h=1; sum_total=1
PPP=[1]*nj; VV = [1]*ni; sumP = [1]*nj
w1=m.Const(w)
h1=m.Const(h)
Psum_total=m.Const(value=sum_total)
P = m.Array(m.Param,nj)
for i in range(nj):
P[i].value = PPP[i]
V = m.Array(m.Param,ni)
for i in range(ni):
V[i].value=VV[i]
d= m.Array(m.Param,ni)
for i in range(ni):
d[i] = 50
Psum_vetor=m.Array(m.Param,nj)
for j in range(nj):
Psum_vetor[j].value=sumP[j]
#Intermediate
Lkj = [[m.Intermediate(m.sum([P[i]*x[i][k][j] for i in range(ni)])) for j in range(nj)] for k in range(nk)]
xyi = [m.Intermediate(m.sum([ x[i][k][j]*y[j][k] for k in range(nk) for j in range(nj)])) for i in range(ni)]
z= m.Intermediate(m.sum([xyi[i]*V[i] for i in range(ni)]))
s = Psum_total
for k in range(nk):
for j in range(nj):
s += Lkj[k][j]
# Equations
m.Equation([xyi[i] <= d[i] for i in range(ni)])
m.Equation([sum([ Lkj[k][j]*y[j][k] for j in range(nj)]) <= h1*w1 for k in range(nk)])
m.Equation([sum([Lkj[k][j]*y[j][k] for k in range(nk)]) == s/7 - P[j] for j in range(nj)])
m.Maximize(z)
m.options.IMODE = 3
m.solve()
print(x)
带解决方案:
Successful solution
---------------------------------------------------
Solver : APOPT (v1.0)
Solution time : 10.8742999999959 sec
Objective : -1.338429367332205E-014
Successful solution
---------------------------------------------------
[[[[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.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] [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.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] [0.0] [6.0] [0.0] [0.0]]
[[0.0] [0.0] [0.0] [0.0] [0.0] [0.0]]]]
4550x6x35
+6x35
=955710
二进制变量的原始问题大小可能需要一段时间才能解决。可以调整APOPT
解算器选项以提高解算速度。
如果示例代码有错误,请尝试:
pip install gekko --upgrade
将gekko版本升级到最新发行版。
我只是发现这是一个索引错误。谢谢@Hedengren