我正在尝试在 Python 上使用 Google Or-tools 构建一个非常简单的测试用例。我有一个包含 20 个整数变量的插槽的列表,我试图设置的唯一约束是从 0 到 4 的每个值都被看到 3 次。
例如,这将是一个解决方案:
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, -1, -1, -1, -1, -1, -1, -1, -1]
我尝试了以下示例:
from ortools.constraint_solver import pywrapcp
solver = pywrapcp.Solver("test")
num_profs = 5
num_slots = 20
prof_variables = [solver.IntVar(-1, num_profs, "slot{}.prof".format(i)) for i in range(num_slots)]
for prof in range(num_profs):
solver.Add(solver.Sum([prof_variables[i] == prof for i in range(num_slots)]) == 3)
db = solver.Phase(prof_variables, solver.CHOOSE_FIRST_UNBOUND, solver.ASSIGN_MIN_VALUE)
#tl = solver.TimeLimit(10000)
solver.NewSearch(db)
count = 0
while solver.NextSolution():
count += 1
print("Time:", solver.WallTime(), "ms")
print()
print("Solution " + str(count))
for i in range(num_slots):
print(prof_variables[i].Value())
if count > 2:
break
solver.EndSearch()
但是,它没有找到任何解决方案(如果我不设置时间限制,它永远不会完成)。
如果我用 删除约束Sum
,则完成(根本没有约束)。
由于这个约束非常微不足道,我希望我写它的方式不正确。关于如何解决它的任何想法?