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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:52:35