如何在Julia的JuMP中定义(x,y)不在指定二维矩形内的约束?
优化问题中排除矩形区域约束的正确写法
你的问题出在直接用布尔运算和错误语法定义约束——大部分优化建模工具(比如JuMP)不支持对连续变量的布尔组合直接做不等于判断,而且你代码里的1.0 < x < 2.0 + 3.0 < y < 4.0逻辑混乱,用加号连接两个区间条件的语法完全错误。
要实现(x,y) ∉ {(x,y)|1.0 < x < 2.0, 3.0 < y < 4.0}这个约束,本质是禁止x同时落在(1,2)区间且y同时落在(3,4)区间,等价于以下四个条件至少满足一个:
- x ≤ 1.0
- x ≥ 2.0
- y ≤ 3.0
- y ≥ 4.0
直接逻辑约束写法(支持逻辑运算符的建模库,如JuMP)
如果你的建模工具支持逻辑或(||),可以直接写:
@constraint(model, x ≤ 1.0 || x ≥ 2.0 || y ≤ 3.0 || y ≥ 4.0)
或者用非运算直接否定“同时满足两个区间”的情况:
@constraint(model, !(1.0 < x < 2.0 && 3.0 < y < 4.0))
纯线性规划场景(不支持逻辑约束)
如果是纯线性规划(不能用逻辑运算符或二进制变量),需要用大M法把析取约束转化为线性约束:
- 引入四个二进制变量
z1, z2, z3, z4(取值0或1) - 定义足够大的常数
M(比如远大于x、y的可能取值范围,如1e6) - 添加以下约束:
# z1=1时强制x≤1.0,z1=0时无限制 @constraint(model, x ≤ 1.0 + M*(1 - z1)) # z2=1时强制x≥2.0,z2=0时无限制 @constraint(model, x ≥ 2.0 - M*(1 - z2)) # z3=1时强制y≤3.0,z3=0时无限制 @constraint(model, y ≤ 3.0 + M*(1 - z3)) # z4=1时强制y≥4.0,z4=0时无限制 @constraint(model, y ≥ 4.0 - M*(1 - z4)) # 至少一个变量为1,保证四个条件至少满足一个 @constraint(model, z1 + z2 + z3 + z4 ≥ 1)
注意:大M法里的M值不能太大(避免数值不稳定),也不能太小(要能覆盖变量的可能取值范围)。
内容的提问来源于stack exchange,提问作者Quinn Xie
相关产品推荐
相关产品推荐

