如何在 Gekko 中使用分层条件约束

问题描述 投票:0回答:1

我正在尝试使用“if3”在 Gekko 中实现条件逻辑,但不确定如何在不同粒度级别成功实现第 2 层条件。

“x1”是二进制值 (0/1) 的向量,用于控制何时应在元素 i 上使用替代 rhs 值来约束 x2 和 x3。

“x2”是一个浮点数向量,我想根据上面“x1”中的二进制值使元素 i 的下限和上限动态化。如果元素 i 的 x1 值为 = 1,我想使用“window_lnuc_min_promo_price”(相同长度的向量)作为下限,使用“window_lnuc_max_promo_price”作为上限。如果元素 i 的 x1 值 = 0,我想使用“min_promo_price”作为下限,使用“max_promo_price”作为上限。

类似地,“x3”是一个浮点数向量,我想应用相同的逻辑,但只是在 x1 中的元素 i = 1 时使用“window_lnuc”中的值以及当它 = 0 时使用“lnuc”中的值到下界。 .

最后,我想限制 X1 可以 = 1 的次数(下例中为 4 次)。这意味着替代值总共只能出现 4 次。

我认为我遇到的问题是,因为 x1 是一个范围为 0-1 的变量,优化器正在更改“lnuc_weeks”中的默认“0”值(我不希望它这样做)。我希望优化器基本上保留“lnuc_weeks”中任何 0 的内容,并且只从“lnuc_weeks”中最初 = 1 的元素中选择最多 4 个值。

可能有更好的方法来编写此内容,但我们将不胜感激任何帮助/反馈。为了保证输出的可重复性,完整的解决方案有点长,但希望上面/下面的内容足以描述问题。

x1 = m.Array(m.Var,(n), integer=True) #LNUC weeks

i = 0
for xi in x1:
    xi.value = lnuc_weeks[i]
    xi.lower = 0
    xi.upper = 1
    i += 1

x2 = m.Array(m.Var,(n)) #Blended SRP

i = 0
for xi in x2:
    xi.value = blended_srp[i]
    xi.lower = m.if3((x1[i]) - 1, min_promo_price[i], window_lnuc_min_promo_price[i])
    xi.upper = m.if3((x1[i]) - 1, max_promo_price[i], window_lnuc_max_promo_price[i])
    i += 1

x3 = m.Array(m.Var,(n)) #Blended NUC

i = 0
for xi in x3:
    xi.value = blended_nuc[i]
    xi.lower = m.if3((x1[i]) - 1, lnuc[i], window_lnuc[i])
    xi.upper = 10
    i += 1


#Limit max lnuc weeks
m.Equation(sum(x1)<=4)
python linear-programming gekko mixed-integer-programming
1个回答
0
投票

.lower
.upper
边界是在模型初始化时定义的,并且不会更改以反映新优化的值。要实现这些,请使用不等式表达式:

i = 0
for xi in x2:
    xi.value = blended_srp[i]
    m.Equation(xi >= m.if3((x1[i]) - 1, min_promo_price[i], window_lnuc_min_promo_price[i]))
    m.Equation(xi <= m.if3((x1[i]) - 1, max_promo_price[i], window_lnuc_max_promo_price[i]))
    i += 1

i = 0
for xi in x3:
    xi.value = blended_nuc[i]
    m.Equation(xi >= m.if3((x1[i]) - 1, lnuc[i], window_lnuc[i]))
    xi.upper = 10
    i += 1

任意四个带有

m.Equation(sum(x1)<=4)
的元素选择都是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.