boolean - Julia (JuMP):具有多个条件值的指标约束(布尔表达式可能吗?)
问题描述
我想根据我的二元决策变量中的值在x
“时间”内的变化来实施约束。
我正在尝试为电力系统的单元承诺优化问题实施最小运行时间约束。x
表示单元激活,其中0
和1
表示电源单元分别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
我检查了指标约束是否仅适用于单个术语。
问题:这是可能的还是有其他明显的解决方案?
故障排除和解决方法:我尝试了以下方法(如果我的诊断错误,请纠正我):
- 将更改实现为表达式:指标约束仅适用于二进制整数变量。
- 将更改作为与
x
. 我找到了一个解决方案,但它非常粗略,记录在Julia discourse 中。从解决方案中发现的直接问题是指示符约束不能作为双向蕴涵起作用,而只能作为一种方式起作用,LHS->RHS
。请参阅@Oscar Dowson 给出的正确方法。
您可以从github获取工作代码。
解决方案
诀窍是找到具有等效真值表的约束:
# 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来帮助制定正确的约束公式。
最终请参阅此处的线程以获取更多详细信息。
推荐阅读
- c# - 在 Visual Studio 中部署 SQLCLR -- 如何覆盖生成的发布脚本
- java - 为什么我的文本文件没有被读取和打印?
- vue.js - shallowReadonly 和用反应对象计算之间的区别 (Vue)
- javascript - 为什么添加onClicked监听器的位置会影响代码的运行速度?
- android - 屏幕旋转时如何加载另一个用户界面?
- python - 没有名为“文件夹名称”的模块
- c# - C# 和 Minecraft 服务器启动
- javascript - 谷歌应用程序脚本在它应该执行时执行两次函数
- c - 使用 VS Code 在 WSL 中调试 C 代码时出现问题
- java - 为什么Android中View.class的所有方法总是抛出异常