gpt4 book ai didi

python - GEKKO if3 变量在优化中给出意想不到的结果

转载 作者:行者123 更新时间:2023-12-05 05:37:24 24 4
gpt4 key购买 nike

我一直在努力学习如何使用 Gekko,目前正在尝试根据输入/输出价格对最佳电池充电/放电进行建模(从 herehere 中获得灵感。

下面是我的后续代码。

from gekko import Gekko
import numpy as np
m = Gekko()

electricity_price_in = np.random.uniform(low=0.1, high=1, size=50)
electrictiy_price_out = np.random.uniform(low=0.3, high=3, size=50)


E_battery = m.Var(lb=0, ub=366.2, value=0) #energy in battery at time t, battery size 366 MWh
Pc = m.Var(lb=0, ub=50) #charge power, 50 MW max
Pd = m.Var(lb=0, ub=36.6) #discharge power, max 36 MW
E_price_in = m.Param(electricity_price_in)
E_price_out = m.Param(electrictiy_price_out)
m.time = np.linspace(0,49, 50)

Revenue = m.Intermediate(Pd*E_price_out)
Cost = m.Intermediate(Pc*E_price_in)

m.Equation(E_battery.dt() == Pc-Pd)
m.Equation(E_battery >= 0)

m.Maximize(Revenue - Cost)
m.options.IMODE = 6
m.solve()

这似乎工作正常。但是,如果包含以下代码,我会得到截然不同的结果:

isCharging = m.if3(-Pc,1,0)
isDischarging = m.if3(-Pd,1,0)

相信我正在做的是创造两个变量。因为它们不是约束方程并且不包含在目标函数中,所以我希望包含它不会改变我的结果,但是我的代码给出了非常不同的结果(所有变量都变成了一个零列表)。

为什么添加这两个变量会改变我的结果?

最佳答案

m.if3() 函数将默认求解器从 IPOPT 更改为 APOPT,以便求解混合整数优化问题。 APOPT 求解器找到了不同的(更差的)局部解,因此您看到了不同之处。

另外,随机数生成器需要一个种子值来每次都给出相同的结果,例如 np.random.seed(1)。与 m.if3() 函数关联的附加变量和方程式也可能需要更多迭代。尝试对使用 IPOPT 解决方案初始化的 APOPT 使用热启动。

无论是否存在 m.if3() 语句,此脚本都会给出相同的答案。

from gekko import Gekko
import numpy as np
m = Gekko()

np.random.seed(1)
electricity_price_in = np.random.uniform(low=0.1, high=1, size=50)
electrictiy_price_out = np.random.uniform(low=0.3, high=3, size=50)

E_battery = m.Var(lb=0, ub=366.2, value=0) #energy in battery at time t, battery size 366 MWh
Pc = m.Var(lb=0, ub=50) #charge power, 50 MW max
Pd = m.Var(lb=0, ub=36.6) #discharge power, max 36 MW
E_price_in = m.Param(electricity_price_in)
E_price_out = m.Param(electrictiy_price_out)
m.time = np.linspace(0,49, 50)

Revenue = m.Intermediate(Pd*E_price_out)
Cost = m.Intermediate(Pc*E_price_in)

m.Equation(E_battery.dt() == Pc-Pd)
m.Equation(E_battery >= 0)

m.Maximize(Revenue - Cost)

isCharging = m.if3(-Pc,1,0)
isDischarging = m.if3(-Pd,1,0)

m.options.IMODE = 6

m.options.SOLVER = 3
m.solve(disp=False)
print('Objective (IPOPT)', m.options.objfcnval)

m.options.TIME_SHIFT = 0
m.options.SOLVER = 1
m.solve()
print('Objective (APOPT)', m.options.objfcnval)

关于python - GEKKO if3 变量在优化中给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73117785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com