我正在try 使用"IF3"在Gekko中实现条件逻辑,但我不确定如何在不同的粒度级别成功地实现第二层条件.

"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"的值,当元素i = 0时使用来自"lnuc"的值.

最后,我想限制X1可以= 1的次数(在下面的例子中是4).这意味着备选值总共限制为4次.

我认为我遇到的问题是,因为x1是一个范围为0—1的变量,所以优化器正在更改"lnuc_weeks"中的默认"0"值(我不希望它这样做).我希望优化器基本上保留"lnuc_weeks"中为0的任何内容,并且只从"lnuc_weeks"中初始= 1的元素中 Select 最多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)

推荐答案

.lower.upper边界是在模型初始化时定义的,并且不会改变以反映新优化的值.要实现这些,请使用不等式表达式.使用切换点0.5而不是1,以避免整数值>1>=1的数值问题.默认情况下,解算器容差为1e-6,因此对于方程收敛而言,值0.99999被视为与值1.000001相同.

i = 0
for xi in x2:
    xi.value = blended_srp[i]
    m.Equation(xi >= m.if3((x1[i]) - 0.5, min_promo_price[i], window_lnuc_min_promo_price[i]))
    m.Equation(xi <= m.if3((x1[i]) - 0.5, 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]) - 0.5, lnuc[i], window_lnuc[i]))
    xi.upper = 10
    i += 1

Select 任何四个元素与m.Equation(sum(x1)<=4)是正确的.

Python相关问答推荐

acme错误-Veritas错误:模块收件箱没有属性linear_util'

使用新的类型语法正确注释ParamSecdecorator (3.12)

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

未删除映射表的行

如何访问所有文件,例如环境变量

什么相当于pytorch中的numpy累积ufunc

如何在虚拟Python环境中运行Python程序?

如何使用数组的最小条目拆分数组

计算组中唯一值的数量

将9个3x3矩阵按特定顺序排列成9x9矩阵

多指标不同顺序串联大Pandas 模型

如何在FastAPI中为我上传的json文件提供索引ID?

如何在达到end_time时自动将状态字段从1更改为0

Pandas:填充行并删除重复项,但保留不同的值

如何在Python Pandas中填充外部连接后的列中填充DDL值

一个telegram 机器人应该发送一个测验如何做?""

如何获得满足掩码条件的第一行的索引?

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

Pandas数据框上的滚动平均值,其中平均值的中心基于另一数据框的时间

PYTHON中的selenium不会打开 chromium URL