检查分配的元素是否满足 OR-Tools 中的条件

Check if assigned elements satisfy a condition in OR-Tools

我已经说了 100 个元素,我想分配给 10 个位置。

# the elements list holds 100 variables that signify the assignment to a spot
elements = [model.NewIntVar(1, 10) for i in range(100)]

我的每个元素都有特定的大小。现在我想为每个点建模一个(一组)约束,上面写着:分配给这个点的所有元素的添加大小位于一个固定范围内。

因此,如果点 1 分配了元素 1、16 和 64,并且它们的大小为 1521、1732、1431,而我的范围是 (3000, 6000),那就没问题了。但是,如果太多或太大的元素(或太多 few/small)被分配到点 1,那就不行了。

像下面这样的东西不起作用:

for spot in range(10):
    sum_ = sum([get_size(e) for e in elements if e == spot]) # if think if e == spot is what fails
    model.Add(sum_ >= 3000)
    model.Add(sum_ <= 6000)

我如何建模这样的东西?我已经查看了通道限制,但我无法完全理解它。

我认为将赋值建模为布尔值更好:

from ortools.sat.python import cp_model

model = cp_model.CpModel()
solver = cp_model.CpSolver()

all_spots = range(10)
all_elems = range(100)
elements = {
    (elem, spot): model.NewBoolVar(f"{elem} in spot {spot}")
    for elem in all_elems
    for spot in all_spots
}

# only one spot for element
for elem in all_elems:
    model.Add(sum(elements[elem, spot] for spot in all_spots) == 1)

for spot in all_spots:
    # taking the element id as its size
    sum_ = sum(elements[elem, spot] * elem for elem in all_elems)
    model.Add(sum_ >= 0)
    model.Add(sum_ <= 500)

solver.Solve(model)

for (elem, spot), boolean in elements.items():
    if solver.Value(boolean):
        print(boolean)

参见: