我正在使用 PuLP 来解决大型 MILP。作为更复杂的限制系统的一部分,我有一个布尔决策变量数组 var_array 和一个单独的布尔变量 var_all_zeros。
我正在尝试但未能建立一个限制,即如果任何 var_array 为 True,则 var_all_zeros 需要为 False。
所以我正在寻找与 python 逻辑 any() 等效的方法,但适用于 PuLP。
我要限制的是:
var_all_zeros = False 如果有(var_array) 否则为 True
向问题添加限制的一种(数学上)可能的方法: 将是放
problem = pulp.LpProblem("Boolean_Optimization", pulp.LpMaximize)
problem += pl.LPSum(var_array) * var_all_zeros == 0
这将在数学上启用约束,因为只有当 sum(var_array) 为零时 var_all_zeros 才能为 True,否则它必须为 False。
但这在 PuLP 中是不允许的,因为决策变量不能相互相乘。
关于如何编码此限制有什么建议吗?
您只需将汇总变量限制为小于数组中的每个值即可构建“或”条件:
var_all_zeros <= 1 - var_array[i] for each i in I