"EXIT: Maximum Number of Iterations Exceeded." 逐一解决多个优化问题时出错

"EXIT: Maximum Number of Iterations Exceeded." error while solving multiple optimization problem one by one

我正在尝试使用 Gekko 优化套件一一解决多个优化问题。该套件成功地分别解决了问题:运行 问题 1,运行 问题 2 的整个代码,依此类推。但是,当我尝试使用一个简单的 for 循环一个一个地 运行 时,由于“退出:超出最大迭代次数”,出现错误提示“异常:@error:未找到解决方案”。似乎第一个问题正确解决了,然后在第二个问题的中间停止了。我可以得到关于这个问题的建议吗?

from gekko import GEKKO
import pandas as pd
import numpy as np


# create GEKKO model
m = GEKKO()

d = {'A0': [10, 15, 20], 'h': [1, 0.8, 1.2],'emax': [4, 4, 5] }
dftemp = pd.DataFrame(data=d)
na=len(dftemp)


# time points
n=11 
year=10

m.time = np.linspace(0,year,n)
t=m.time

# constants
Pa0 = 1 
Pe0 = 0.5 
C = 1 
r = 0.05 
l = 0.1 
k=50
    
for i in range(0,na):
    A0=dftemp.loc[i][0]
    h=dftemp.loc[i][1]
    emax=dftemp.loc[i][2]    
    
    u = m.MV(value=0,lb=0, ub=emax)
    u.STATUS = 1
    u.DCOST = 0
    
    A = m.SV(value=A0)
    E = m.SV(value=0)
    t = m.Param(value=m.time)
    Pe = m.Var(value=Pe0)
    d = m.Var(value=1)
    
    # Equation
    m.Equation(A.dt()==-u)
    m.Equation(E.dt()==u)
    m.Equation(Pe.dt()==1.5/k*Pe)
    m.Equation(d==m.exp(-t*r))
    m.Equation(A>=0)
        
    # Objective (Utility)
    J = m.Var(value=0)
    
    # Final objective
    Jf = m.FV()
    Jf.STATUS = 1
    m.Connection(Jf,J,pos2='end')
    m.Equation(J.dt() == m.log((A+E*(1-l))*h*Pa0-C*u+E*Pe))*d
    
    # maximize U
    m.Maximize(Jf)
    
    # options
    m.options.IMODE = 6  # optimal control
    m.options.NODES = 3  # collocation nodes
    m.options.SOLVER = 3 # solver (IPOPT)
    
    # solve optimization problem
    m.solve()
    
    # print profit
    print('Optimal Profit: ' + str(Jf.value[0]))

有两种方法可以解决问题:

  1. 在每个循环中重新定义 Gekko 模型:
    # create GEKKO model
    m = GEKKO()

    m.time = np.linspace(0,year,n)
    t=m.time

进入循环而不是循环外。

from gekko import GEKKO
import pandas as pd
import numpy as np

d = {'A0': [10, 15, 20], 'h': [1, 0.8, 1.2],'emax': [4, 4, 5] }
dftemp = pd.DataFrame(data=d)
na=len(dftemp)

# time points
n=11 
year=10

# constants
Pa0 = 1 
Pe0 = 0.5 
C = 1 
r = 0.05 
l = 0.1 
k=50
    
for i in range(0,na):
    # create GEKKO model
    m = GEKKO()

    m.time = np.linspace(0,year,n)
    t=m.time

    A0=dftemp.loc[i][0]
    h=dftemp.loc[i][1]
    emax=dftemp.loc[i][2]    
    
    u = m.MV(value=0,lb=0, ub=emax)
    u.STATUS = 1
    u.DCOST = 0
    
    A = m.SV(value=A0)
    E = m.SV(value=0)
    t = m.Param(value=m.time)
    Pe = m.Var(value=Pe0)
    d = m.Var(value=1)
    
    # Equation
    m.Equation(A.dt()==-u)
    m.Equation(E.dt()==u)
    m.Equation(Pe.dt()==1.5/k*Pe)
    m.Equation(d==m.exp(-t*r))
    m.Equation(A>=0)
        
    # Objective (Utility)
    J = m.Var(value=0)
    
    # Final objective
    Jf = m.FV()
    Jf.STATUS = 1
    m.Connection(Jf,J,pos2='end')
    m.Equation(J.dt() == m.log((A+E*(1-l))*h*Pa0-C*u+E*Pe))*d
    
    # maximize U
    m.Maximize(Jf)
    
    # options
    m.options.IMODE = 6  # optimal control
    m.options.NODES = 3  # collocation nodes
    m.options.SOLVER = 3 # solver (IPOPT)
    
    # solve optimization problem
    m.solve()
    
    # print profit
    print('Optimal Profit: ' + str(Jf.value[0]))
  1. 一次定义模型并用不同的边界和初始猜测值解决它。
from gekko import GEKKO
import pandas as pd
import numpy as np

d = {'A0': [10, 15, 20], 'h': [1, 0.8, 1.2],'emax': [4, 4, 5] }
dftemp = pd.DataFrame(data=d)
na=len(dftemp)

# time points
n=11 
year=10

# constants
Pa0 = 1 
Pe0 = 0.5 
C = 1 
r = 0.05 
l = 0.1 
k=50
    
# create GEKKO model
m = GEKKO()

m.time = np.linspace(0,year,n)
t=m.time

u = m.MV(value=0,lb=0)
u.STATUS = 1
u.DCOST = 0

A = m.SV(lb=0)
E = m.SV(value=0)
t = m.Param(value=m.time)
Pe = m.Var(value=Pe0)
d = m.Var(value=1)
h = m.Param()

# Equation
m.Equation(A.dt()==-u)
m.Equation(E.dt()==u)
m.Equation(Pe.dt()==1.5/k*Pe)
m.Equation(d==m.exp(-t*r))
    
# Objective (Utility)
J = m.Var(value=0)

# Final objective
Jf = m.FV()
Jf.STATUS = 1
m.Connection(Jf,J,pos2='end')
m.Equation(J.dt() == m.log((A+E*(1-l))*h*Pa0-C*u+E*Pe))*d

# maximize U
m.Maximize(Jf)

# options
m.options.IMODE = 6  # optimal control
m.options.NODES = 3  # collocation nodes
m.options.SOLVER = 3 # solver (IPOPT)
m.options.TIME_SHIFT = 0

for i in range(0,na):
    A0=dftemp.loc[i][0]; A.value=A0
    h.value=dftemp.loc[i][1]
    emax=dftemp.loc[i][2]; u.upper = emax    
    
    # solve optimization problem
    m.solve()
    
    # print profit
    print('Optimal Profit: ' + str(Jf.value[0]))

这比第一个选项更有效,因为不需要重新定义模型。