繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM