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

如何给CVXPY布尔向量变量设置约束以排除(1,1)可行解

如何在CVXPY中排除布尔变量的(1,1)组合?

你需要在原问题中添加约束,限制两个布尔变量不能同时取1,以下是可行的实现方式:

原问题回顾

原代码是最大化两个布尔变量的和,默认最优解是(1,1),sum为2:

import cvxpy as cp

x1 = cp.Variable(boolean=True)
x2 = cp.Variable(boolean=True)
sum_var = x1 + x2
prob = cp.Problem(cp.Maximize(sum_var))
prob.solve(verbose=True)

错误原因分析

你尝试的cp.transforms.indicator([x1==1, x2==1])>=1无法达到目的:

  • indicator函数的正确用法是针对单个条件生成指示变量,而非传入条件列表
  • 该约束的逻辑是要求至少一个变量为1,这反而包含了(1,1)的情况,完全不符合需求

正确实现方法

方法1:添加线性约束(推荐)

直接通过线性约束x1 + x2 <= 1限制两个变量不能同时为1,这种方式简洁高效,符合CVXPY的凸优化要求:

import cvxpy as cp

x1 = cp.Variable(boolean=True)
x2 = cp.Variable(boolean=True)
sum_var = x1 + x2

# 添加约束:排除x1=1且x2=1的情况
constraints = [x1 + x2 <= 1]

prob = cp.Problem(cp.Maximize(sum_var), constraints)
prob.solve(verbose=True)

print("x1的值:", x1.value)
print("x2的值:", x2.value)
print("最大sum:", sum_var.value)

方法2:使用逻辑约束

如果需要更直观的逻辑表达,可以用CVXPY的逻辑函数logical_not和logical_and,底层会自动转换为等价的线性约束:

import cvxpy as cp

x1 = cp.Variable(boolean=True)
x2 = cp.Variable(boolean=True)
sum_var = x1 + x2

# 逻辑上表示“x1和x2不同时为真”
constraints = [cp.logical_not(cp.logical_and(x1, x2))]

prob = cp.Problem(cp.Maximize(sum_var), constraints)
prob.solve(verbose=True)

两种方法最终都会得到最优解sum=1,可行解为(0,1)或(1,0)。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:50:10