首页 > 解决方案 > Julia (JuMP):具有多个条件值的指标约束(布尔表达式可能吗?)

问题描述

我想根据我的二元决策变量中的值在x“时间”内的变化来实施约束。

我正在尝试为电力系统的单元承诺优化问题实施最小运行时间约束。x表示单元激活,其中01表示电源单元分别n在某个时间t关闭或打开。

为此,指标约束似乎是一个有前途的解决方案,并且在类似问题的启发下,实施似乎非常简单。

因此,由于引入了布尔运算符 ( !and ¬),我过早地想以布尔方式表达变化:

@constraint(m, xx1[n=1:N,t=2:T], (!x[n,t-1] && x[n,t]) => {next(t, 1) + next(t, 2) == 2})

说:如果单位之前被停用但现在处于开启状态,则要求该单位在接下来的 2 次处于活动状态。

哪里next(t, i) = x[((t - 1 + i) % T) + 1]

我收到以下错误:

LoadError: MethodError: no method matching !(::VariableRef)
Closest candidates are:
  !(!Matched::Missing) at missing.jl:100
  !(!Matched::Bool) at bool.jl:33
  !(!Matched::Function) at operators.jl:896

我检查了指标约束是否仅适用于单个术语。

问题:这是可能的还是有其他明显的解决方案?

故障排除和解决方法:我尝试了以下方法(如果我的诊断错误,请纠正我):

您可以从github获取工作代码。

标签: booleanjuliajulia-jump

解决方案


诀窍是找到具有等效真值表的约束:

# Like
(!x[1] && x[2]) => {z == 1}

# Is equivalent to:
z >= -x[1] + x[2]

# Proof
-x[1] + x[2] = sum <= z
--------------------------
 - 0  +  0   =  0  <= 0
 - 1  +  0   =  -1 <= 0 
 - 0  +  1   =  1  <= 1
 - 1  +  1   =  0  <= 0

我被推荐给 MOSEK Modeling Cookbook来帮助制定正确的约束公式。

最终请参阅此处的线程以获取更多详细信息。


推荐阅读