"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]))
有两种方法可以解决问题:
- 在每个循环中重新定义 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]))
- 一次定义模型并用不同的边界和初始猜测值解决它。
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]))
这比第一个选项更有效,因为不需要重新定义模型。
我正在尝试使用 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]))
有两种方法可以解决问题:
- 在每个循环中重新定义 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]))
- 一次定义模型并用不同的边界和初始猜测值解决它。
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]))
这比第一个选项更有效,因为不需要重新定义模型。