解决同一问题时打开和关闭“异常:@error:Solution not Found”

2024-04-28 16:06:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Gekko优化套件解决多个优化问题。我为三个变量(book3.csv)生成随机数,并将它们作为初始值和参数导入python。我运行优化解算器并收集结果。它工作得很好。然而,当我尝试了大约20次来检查时,我多次收到一条错误消息Exception:@error:solutionnotfound。它停止在同一位置:…gekko.py行2174,在solve raise Exception(response)

我在每一轮优化中收集控制变量的值u,在每一个时间点i,并将其保存在一个数据帧utot中,以便跟踪每一轮每次做出的所有决策。我注意到utot的最后一列(在最后一个时间点)有一些正值,我认为不应该是正值。我有意地放置Pe0=0,这样u=0在所有时间点都是最佳的,但是utot的最后一列仍然有一些正值。我不知道我错过了什么

enter image description here


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())
    

Tags: columnscsvimportdataframeindextimevaluerange
1条回答
网友
1楼 · 发布于 2024-04-28 16:06:15

如果初始条件保持不变,请尝试设置m.options.TIME_SHIFT=0以避免及时推进。默认值为m.options.TIME_SHIFT=1,其中所有先前值向左移动,第二个地平线点成为第一个时间点。这是实时运行到物理进程的应用程序的默认设置。每一个周期,模拟或最优控制问题向前推进一个时间步

地平线上的最后一点有时对目标函数没有影响,因此解算器不会被迫将其移动到特定值。这可以通过用m.fix_final(utot,100)固定最后一个值来检查,并查看这是否会改变目标函数值。如果目标函数值不变,则解算器将无法找到该值的唯一解。如果你想让它独一无二,那么就包括一个额外的目标,比如m.Minimize(1e-5 * utot**2)

提交问题时,请包括重现行为所需的所有文件。下面是一些关于创建Minimal, Reproducible example的提示

相关问题 更多 >