我正在用Gekko优化套件解决多个优化问题。我为三个变量(book3.csv)生成随机数,并将它们作为初始值和参数导入python。我运行优化解算器并收集结果。它工作得很好。然而,当我尝试了大约20次来检查时,我多次收到一条错误消息Exception:@error:solutionnotfound。它停止在同一位置:…gekko.py行2174,在solve raise Exception(response)
我在每一轮优化中收集控制变量的值u
,在每一个时间点i
,并将其保存在一个数据帧utot中,以便跟踪每一轮每次做出的所有决策。我注意到utot
的最后一列(在最后一个时间点)有一些正值,我认为不应该是正值。我有意地放置Pe0=0
,这样u=0
在所有时间点都是最佳的,但是utot
的最后一列仍然有一些正值。我不知道我错过了什么
from gekko import GEKKO
import pandas as pd
import numpy as np
from numpy import random
file_path='./Book3.csv'
d=pd.read_csv("Book3.csv")
dftemp = pd.DataFrame(data=d)
na=len(dftemp)
# time points
n=51
year=50
# constants
Pa0 = 1
Pe0 = 0
C = 10
r = 0.05
k=50
shift=100
ll=0.5*random.rand(n)
index = range(0, na)
columns = range(0, n)
columns1 = range(0, 1)
#Dataframe to collect results
Atot=pd.DataFrame(index=index,columns=columns)
Etot=pd.DataFrame(index=index,columns=columns)
utot=pd.DataFrame(index=index,columns=columns)
PVtot=pd.DataFrame(index=index,columns=columns1)
for i in range(0,na):
# create GEKKO model
m = GEKKO(remote=False)
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)
l = m.Param(value=ll)
# Equation
m.Equation(A.dt()==-u)
m.Equation(E.dt()==u)
m.Equation(Pe.dt()==-Pe/k)
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-r*C*u+E*Pe+shift)*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]))
for j in range(0,n):
Atot.loc[i][j]=A.value[j]
Etot.loc[i][j]=E.value[j]
utot.loc[i][j]=u.value[j]
PVtot.loc[i][0]=Jf.value[0]
print(PVtot.sum())
如果初始条件保持不变,请尝试设置
m.options.TIME_SHIFT=0
以避免及时推进。默认值为m.options.TIME_SHIFT=1
,其中所有先前值向左移动,第二个地平线点成为第一个时间点。这是实时运行到物理进程的应用程序的默认设置。每一个周期,模拟或最优控制问题向前推进一个时间步地平线上的最后一点有时对目标函数没有影响,因此解算器不会被迫将其移动到特定值。这可以通过用
m.fix_final(utot,100)
固定最后一个值来检查,并查看这是否会改变目标函数值。如果目标函数值不变,则解算器将无法找到该值的唯一解。如果你想让它独一无二,那么就包括一个额外的目标,比如m.Minimize(1e-5 * utot**2)
提交问题时,请包括重现行为所需的所有文件。下面是一些关于创建Minimal, Reproducible example的提示
相关问题 更多 >
编程相关推荐