You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在OR-Tools CP-SAT中为列表索引变量编写约束?

解决OR-Tools CP-SAT中用变量索引列表的约束问题

你遇到的问题很典型——CP-SAT的cp_model模块确实不允许直接用变量或线性表达式作为Python列表的索引,这就是你看到TypeError: list indices must be integers or slices, not _SumArray报错的原因:rowIdx * idxLen + columnIdx是CP-SAT的线性表达式对象,不是原生Python整数,没法直接用来索引列表。

好消息是,CP-SAT提供了和constraint_solver.pywrapcpsolver.Element()对应的功能,就是cp_model.Element()函数,它可以帮你构造一个代表列表中指定索引位置元素的表达式,这个表达式能直接用于约束定义。

修改后的代码示例

from ortools.sat.python import cp_model

model = cp_model.CpModel()
TableA = [...][...]  # 你的二维常量列表
TableB = [...]       # 你的一维常量列表
idxLen = ...         # 你代码中定义的索引长度,比如TableA的列数
constraint_num = ... # 约束数量

rowIdx = model.NewIntVar(0, idxLen - 1, 'rowIdx')
columnIdx = model.NewIntVar(0, idxLen - 1, 'columnIdx')

for i in range(constraint_num):
    # 构造扁平化的索引表达式
    flat_index = rowIdx * idxLen + columnIdx
    # 用Element获取TableA[i]中对应索引位置的元素表达式
    target_element = cp_model.Element(TableA[i], flat_index)
    # 添加约束:该元素等于TableB[i]
    model.Add(target_element == TableB[i])

额外说明

如果你的场景是直接用二维索引(rowIdx作为行号,columnIdx作为列号)访问二维列表,也可以嵌套使用Element

# 获取TableA[rowIdx][columnIdx]的表达式
two_d_element = cp_model.Element(
    [cp_model.Element(row, columnIdx) for row in TableA],
    rowIdx
)
model.Add(two_d_element == some_value)

这个方法本质上是让CP-SAT求解器理解你要访问列表中变量索引对应的元素,而不是让Python直接执行索引操作(Python只能处理整数索引)。

内容的提问来源于stack exchange,提问作者jason

火山引擎 最新活动