如何在pulp中编写涉及指示变量的约束条件?
PuLP二元指示变量约束实现方案
你当前的约束已经覆盖了「lpSum(some_var) > 0时indicator_var必须为1」的逻辑,仅需补充一条反向约束即可满足全部规则。
补充约束的核心逻辑:要实现「lpSum(some_var) = 0时indicator_var必须为0」,等价于实现其逆否命题「indicator_var = 1时lpSum(some_var) ≥ 最小正阈值」,据此补充约束即可。
完整约束代码
情况1:some_var为整数变量
此时lpSum(some_var)的最小正取值为1,直接用1作为阈值即可:
for j in some_list: sum_val = lpSum(some_var[i, j] for i in some_other_list) # 原有约束:sum_val>0时indicator_var[j]必须为1 prob += sum_val <= indicator_var[j] * 5 # 新增约束:indicator_var[j]为1时sum_val≥1,等价于sum_val=0时indicator_var[j]必须为0 prob += sum_val >= indicator_var[j] * 1
情况2:some_var为连续变量
取一个大于求解器数值容差的小值epsilon(通常取1e-4~1e-3即可)作为阈值:
epsilon = 1e-4 for j in some_list: sum_val = lpSum(some_var[i, j] for i in some_other_list) prob += sum_val <= indicator_var[j] * 5 prob += sum_val >= indicator_var[j] * epsilon
规则验证
- 当sum_val=0时:第二条约束要求
0 ≥ indicator_var[j] * 阈值,阈值为正,因此indicator_var[j]只能取0,符合要求 - 当sum_val>0时:第一条约束要求
sum_val ≤ 5 * indicator_var[j],sum_val为正,因此indicator_var[j]只能取1,符合要求
内容的提问来源于stack exchange,提问作者sierra_papa
相关产品推荐
相关产品推荐

