【问题标题】:'@Error: Solution not found' being returned when using gekko for optimization使用 gekko 进行优化时返回“@Error:未找到解决方案”
【发布时间】:2022-01-14 12:36:17
【问题描述】:

我正在尝试完成长达一年的电池优化问题(8760 小时)。 “ind_1”和“ind_2”是长度为 8760 的列表,包含 0s/1s。一年中的某些时间可能会获得额外收入,因此这些指标列表用于区分这些时间(进一步用于最大化功能)。

m = Gekko(remote=False)
#variables
e_battery = m.Var(lb=0, ub=4000, value=2000) #energy in battery at time t, battery size 4 MWh, initial value is 2MWh
command = m.Var(lb=-1000, ub=1000) #command power -1 to 1 (in MW)
e_price = m.Param(value = price) #price is a list of 8760 values
ind_1 = m.Param(value = ind_1) 
ind_2 = m.Param(value = ind_2)
m.time = np.linspace(0,8759, 8760)
m.Equation(e_battery.dt() == e_battery + command)
m.Maximize((-command)*(e_price + ind_1*ind1_price + ind_2*ind2_price))
m.options.IMODE = 6
m.solve()

当我运行上述模型时,它会运行大约 20 次迭代,然后返回错误:“@error: Solution Not Found”。此任务的目标是返回一个包含 8760 个值的数组(命令变量),以最大化返回。这个错误来自哪里的任何想法?

【问题讨论】:

    标签: python optimization gekko


    【解决方案1】:

    看起来其中一个方程式不正确:

    m.Equation(e_battery.dt() == e_battery + command)
    

    这会导致 e_battery 呈指数上升,超过上限。应该是:

    m.Equation(e_battery.dt() == command)
    

    有一个特定的错误代码可以让您深入了解求解器未能找到解决方案的原因。最常见的两个是最大迭代和不可行的解决方案。如果是最大迭代次数,请尝试将m.options.MAX_ITER 设置为更高的数字(最多 1000?)。如果它是不可行的解决方案,那么查看运行目录m.path 中的infeasibilities.txt 文件以找到导致问题的约束。要尝试的另一件事是最初使用较小的时间范围来验证它是否适用于大约 100 个时间步长的东西。

    from gekko import Gekko
    import numpy as np
    m = Gekko(remote=False)
    #variables
    n = 100
    price=np.ones(n)
    e_battery = m.Var(lb=0, ub=4000, value=2000) #energy in battery at time t
    # battery size 4 MWh, initial value is 2MWh
    command = m.Var(lb=-1000, ub=1000) #command power -1 to 1 (in MW)
    e_price = m.Param(value = price) #price is a list of 8760 values
    ind_1=1; ind_2=1
    ind1_price=1; ind2_price=1
    ind_1 = m.Param(value = ind_1) 
    ind_2 = m.Param(value = ind_2)
    m.time = np.linspace(0,n-1,n)
    m.Equation(e_battery.dt() == command)
    m.Maximize((-command)*(e_price + ind_1*ind1_price + ind_2*ind2_price))
    m.options.IMODE = 6
    m.solve()
    

    这给出了一个成功的解决方案:

    EXIT: Optimal Solution Found.
    
     The solution was found.
    
     The final value of the objective function is  -6000.00005999999
     
     ---------------------------------------------------
     Solver         :  IPOPT (v3.12)
     Solution time  :  0.05 sec
     Objective      :  -6000.00005999999
     Successful solution
     ---------------------------------------------------
    

    【讨论】:

    • 嗨,约翰,非常感谢您的详细回复。以下代码建议是否更新“e_battery”变量? ''' m.Equation(e_battery.dt() == command) ''' 每次迭代后,“e_battery+command”的值应该落在电池SoC限制的上下界(0-4 MWh)内
    • 是的,就是d(e_battery)/dt = command。如果command 不为零,则e_battery 的值会发生变化。
    • 非常感谢。你的建议对我有用!
    • 这可能完全是另一个问题,但我想我会在这里问。我正在尝试添加另一个约束条件,即电池每 24 小时最多执行 2 个循环(一次完全充电和放电)。约束有点复杂,因为 FULL 问题范围是 8760 小时,但每 24 小时必须满足循环条件。你知道gekko中有任何类似的例子吗(由2个时间范围组成)。我最初的想法是总结每天的电池操作 - 但仍然不知道如何解决多个时间范围。任何想法都会有所帮助!
    • 是的,这可能是一个单独的问题。继续尝试一些东西,如果它不起作用,请发布示例代码。
    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2021-07-02
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多