You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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法把析取约束转化为线性约束:

  1. 引入四个二进制变量z1, z2, z3, z4(取值0或1)
  2. 定义足够大的常数M(比如远大于x、y的可能取值范围,如1e6)
  3. 添加以下约束:
# 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:16:08