[英]GEKKO if3 variable giving unexpected results in optimisation
我一直在尝试学习如何使用 Gekko,目前正在尝试根据输入/输出价格优化电池充电/放电 model(从此处和此处获取灵感。
以下是我的以下代码。
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)
我相信我正在做的是创建两个变量。 由于它们不是约束方程,也不包含在目标 function 中,我原以为包含它不会改变我的结果,但是我的代码给出了非常不同的结果(所有变量都变成了一个零列表)。
为什么添加这两个变量会改变我的结果?
m.if3()
function 将默认求解器从IPOPT
更改为APOPT
,以便它可以解决混合 Integer 优化问题。 APPT 求解器发现了一个不同的(更糟糕的)本地解决方案,因此您看到了不同之处。
此外,随机数生成器需要一个种子值来每次给出相同的结果,例如np.random.seed(1)
。 与m.if3()
function 关联的其他变量和方程也可能需要更多迭代。 尝试对使用 IPOPT 解决方案初始化的 APPT 进行热启动。
无论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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.