如何给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
相关产品推荐
相关产品推荐

