我正在尝试用 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]]]