线性规划中“无两变量相等”约束的线性化求解咨询
嘿,这个问题挺典型的——线性规划本身是处理凸约束的,没法直接表达≠这种非凸的不等关系,但我们有两种常用的思路把它转化成能适配单纯形法(或扩展的整数规划算法)的线性约束,具体选哪种得看你的变量类型:
一、如果变量是连续型的
连续变量里的严格不等x_i ≠ x_j,其实可以拆解成x_i > x_j或者x_i < x_j。但直接写严格不等在LP里会有问题:LP的最优解通常落在可行域的顶点上,而严格不等的解集是开集,可能不存在最优解。所以我们一般引入一个极小的正数ε(比如1e-6,要远小于问题里其他系数的量级),把每个不等关系转化为两个线性约束的逻辑或:
- 对
x₁ ≠ x₂:转化为x₁ ≥ x₂ + ε或者x₂ ≥ x₁ + ε - 对
x₂ ≠ x₃:转化为x₂ ≥ x₃ + ε或者x₃ ≥ x₂ + ε - 对
x₁ ≠ x₃:转化为x₁ ≥ x₃ + ε或者x₃ ≥ x₁ + ε
但逻辑或的约束没法直接放进LP模型里,这时候我们可以枚举所有可能的约束组合:这里总共有2³=8种组合(每对变量选其中一个方向的约束),分别对每种组合求解线性规划,最后从所有可行的解里挑出目标函数值最大的那个,就是满足条件的最优解。
二、如果变量是整数型的(或可以强制为整数)
如果你的问题允许变量取整数(或者原模型隐含变量是整数),那我们可以引入0-1二进制变量来把所有不等条件整合到一个模型里,不用枚举。
具体来说,对每一对需要不等的变量x_i和x_j,引入一个二进制变量y_ij ∈ {0,1},然后添加两个线性约束:
x_i ≥ x_j + 1 - M*(1 - y_ij) x_j ≥ x_i + 1 - M*y_ij
这里的M是一个足够大的正数(要大于x_i和x_j可能的最大差值,看你原模型的约束,取10就完全足够)。
原理说明
- 当
y_ij=1时,第二个约束的大M项失效,变成x_j ≥ x_i + 1,第一个约束会自动满足(因为M足够大,1 - (1-y_ij)=0,左边x_i肯定大于等于右边的负数); - 当
y_ij=0时,第一个约束的大M项失效,变成x_i ≥ x_j + 1,第二个约束自动满足。
这样就保证了x_i和x_j至少相差1,自然满足不等的要求。
对应你的问题,需要引入3个二进制变量y₁₂、y₂₃、y₁₃,添加以下6个约束:
# 处理x₁≠x₂ x₁ ≥ x₂ + 1 - 10*(1 - y₁₂) x₂ ≥ x₁ + 1 - 10*y₁₂ # 处理x₂≠x₃ x₂ ≥ x₃ + 1 - 10*(1 - y₂₃) x₃ ≥ x₂ + 1 - 10*y₂₃ # 处理x₁≠x₃ x₁ ≥ x₃ + 1 - 10*(1 - y₁₃) x₃ ≥ x₁ + 1 - 10*y₁₃
⚠️ 注意:引入二进制变量后,模型就变成了混合整数线性规划(MILP),单纯形法本身没法直接求解,需要用分支定界、割平面这类专门的整数规划算法,但现在主流的求解器(比如CPLEX、Gurobi、甚至开源的CBC)都能很好地处理这类模型。
内容的提问来源于stack exchange,提问作者NoChance




