首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >朱莉娅(JuMP):具有多个条件值的指示器约束(可能是布尔表达式吗?)

朱莉娅(JuMP):具有多个条件值的指示器约束(可能是布尔表达式吗?)
EN

Stack Overflow用户
提问于 2020-11-30 11:23:10
回答 1查看 590关注 0票数 1

我希望通过“时间”实现一个约束,具体取决于二进制决策变量x中值的变化。

对于电力系统的机组组合优化问题,我正在尝试实现最小运行时间约束。x表示单元激活,其中01分别显示电源单元n在某一时刻关闭或打开t

因此,指标约束似乎是一个很有前途的解决方案,在相似问题的启发下,实现似乎相当简单。

因此,由于引入了布尔运算符(!¬),我过早地希望以布尔方式表示更改:

代码语言:javascript
运行
复制
@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]

我得到了以下错误:

代码语言:javascript
运行
复制
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

我检查了指标约束是否只在一个期限内正常工作。

问题:这是可能的,还是有另一个明显的解决方案?

疑难解答和解决办法:,我尝试了以下方法(如果我的诊断是错误的,请纠正我):

  • 将更改实现为表达式:指示符约束只适用于二进制整数变量。
  • 将变更实现为与x相关的另一个变量。我已经找到了一个解决方案,但这是相当粗略的,这是一个朱莉娅话语文档。从解决方案中发现,当前的问题是,指标约束并不是双蕴涵的,而只是一种方式,即LHS->RHS请看@Oscar Dowson发布的 适当方法

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 22:03:59

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

代码语言:javascript
运行
复制
# 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建模手册来帮助制定正确的约束公式。

关于更多的细节,请看线程这里,我从哪里得到了答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65072615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档