如何在CPMPy中从列表生成带OR逻辑的模型约束?
如何在CPMPy中批量组合多掩码的OR约束
你可以通过两种原生方式实现多掩码约束的OR组合,完全不需要用eval这类方法:
方法1:使用CPMPy内置的cp.any()函数
直接生成所有单个约束的列表,再用cp.any()将它们组合成OR逻辑的约束,这是最简洁的写法:
import cpmpy as cp import numpy as np # 示例变量与掩码集合 p = cp.IntVar(-3, 3, shape=(10,)) # 自定义变量数组 foo_masks = [np.random.choice([True, False], size=10) for _ in range(3)] # 任意数量的布尔掩码 # 生成所有单个约束 single_constraints = [cp.abs(cp.sum(p[mask])) == 3 for mask in foo_masks] # 组合成OR约束 combined_or_constraint = cp.any(single_constraints) # 加入模型 model = cp.Model(combined_or_constraint)
方法2:手动循环累积OR表达式
如果需要更灵活的控制(比如中途添加条件判断),可以初始化第一个约束,再循环后续掩码逐个进行OR运算:
import cpmpy as cp import numpy as np p = cp.IntVar(-3, 3, shape=(10,)) foo_masks = [np.random.choice([True, False], size=10) for _ in range(3)] # 处理空掩码列表的边界情况 if not foo_masks: combined_or_constraint = cp.False # 空OR等价于False else: # 初始化第一个约束 combined_or_constraint = cp.abs(cp.sum(p[foo_masks[0]])) == 3 # 循环组合剩余约束 for mask in foo_masks[1:]: curr_constraint = cp.abs(cp.sum(p[mask])) == 3 combined_or_constraint = combined_or_constraint | curr_constraint model = cp.Model(combined_or_constraint)
两种方法都支持任意数量的掩码,生成的约束和你手动写(...) | (...) | ...完全等价,且都是CPMPy原生支持的语法,可读性和维护性都更好。
内容的提问来源于stack exchange,提问作者pawel
相关产品推荐
相关产品推荐

