线性规划中布尔表达式¬A ∧ B => C的正确线性化方法
布尔表达式
¬A ∧ B => C的线性化实现 以下推导默认A、B、C均为0-1二元决策变量:取值1代表对应布尔命题为真,取值0代表为假,这也是线性规划处理布尔逻辑的标准变量定义方式。
先把原逻辑转成容易线性化的等价形式
所有蕴含式都遵循最基础的等价规则:P => Q 和 ¬P ∨ Q 真值完全一致,没有任何逻辑差异。
套到你要处理的表达式里:
- 前件P是
¬A ∧ B - 后件Q是C
代入等价规则后原式变为:¬(¬A ∧ B) ∨ C
再用德摩根律把括号里的否定展开,最终化简成纯析取(全是「或」连接)的形式:A ∨ ¬B ∨ C
你写的约束报错的原因
你构造的0 <= (1-A) + B - 2* C <= 1的核心问题是把合法可行解给排除了。
比如取A=0、B=0、C=1,这个场景下前件¬A ∧ B为假,按照蕴含式的规则,前件为假时整个表达式恒真,属于完全合法的取值,但代入你的约束算出来值是(1-0) + 0 - 2*1 = -1,直接违反了你设的大于等于0的下界要求。类似被误删的合法解还有好几个,求解器自然会报不可行。
正确的线性约束
对于0-1变量组成的析取式,只要所有子命题的线性项相加大于等于1,就能满足「至少一个子命题为真」的逻辑要求——毕竟只要有一个子项取1,总和就至少是1。
对应到我们化简得到的A ∨ ¬B ∨ C,¬B对应的线性项是1-B,直接写出约束:
A + (1 - B) + C >= 1
把常数项移到右边化简,最终只需要加这一条约束就行:
A - B + C >= 0
正确性校验
枚举所有8种0-1取值组合可以验证:
- 唯一违反原逻辑的场景(A=0、B=1、C=0,即前件为真、后件为假,蕴含不成立),代入约束得
0 -1 +0 = -1 <0,被约束正确禁止 - 其余7种合法取值代入约束,结果全部大于等于0,没有任何可行解被误删
完全符合原布尔表达式的逻辑要求。
内容的提问来源于stack exchange,提问作者Mada
相关产品推荐
相关产品推荐

