为什么AddMultiplicationEquality仅限于2个变量?

时间:2019-08-26 16:08:33

标签: python or-tools

我正在构建具有一组复杂约束的班次调度程序,并且为此使用CP-SAT解算器。我有一个像这样的数组:

    num_vals = 3
    for n in all_employees:
        for d in all_timeslots:
            shifts[(n, d)] = model.NewIntVar(0, num_vals - 1, 'shift_n%id%i' % (n, d))

am试图设置一个约束,其结果是5个IntVar值的结果行的乘积始终等于零,因此我使用的是这样的东西:

        sq_r = model.NewIntVar(0, 1,'sq_r')
        for wind in range(0,11):
            model.AddMultiplicationEquality(sq_r, [shifts[(n, wind)], shifts[(n, wind+1)], shifts[(n, wind+2)], shifts[(n, wind+3)], shifts[(n, wind+4)]])

但是我遇到以下错误:

Check failed: vars.size() == 2 (5 vs. 2) General int_prod not supported yet.
*** Check failure stack trace: ***
    @   00007FF98D2B8C45  PyInit__pywrapsat
    @   00007FF98D2B6F82  PyInit__pywrapsat
    @   00007FF98D550E50  PyInit__pywrapsat
    @   00007FF98D54D8FF  PyInit__pywrapsat
....

我已经检查了http://google.github.io/or-tools/python/ortools/sat/python/cp_model.html上的文档以及此处和github上的一些示例,但是尽管文档显示以下内容,但从未找到任何在变量列表中找到2个以上项目的示例:

def AddMultiplicationEquality(self, target, variables)
Adds target == variables[0] * .. * variables[n]

任何想法可能是什么问题?

1 个答案:

答案 0 :(得分:2)

num_vals = 3
for n in all_employees:
    for d in all_timeslots:
        shifts[(n, d)] = model.NewIntVar(0, num_vals - 1, 'shift_n%id%i' % (n, d))
        shifts_is_zero[(n, d)] = model.NewBoolVar('shift_is_zero_n%id%i' % (n, d))
        model.Add(shifts[(n, d)] == 0).OnlyEnforceIf(shifts_is_zero[(n, d)])
        model.Add(shifts[(n, d)] > 0).OnlyEnforceIf(shifts_is_zero[(n, d)].Not())

然后

    for wind in range(0,11):
        model.AddBoolOr([shifts_is_zero[(n, wind)], shifts_is_zero[(n, wind+1)], shifts_is_zero[(n, wind+2)], shifts_is_zero[(n, wind+3)], shifts_is_zero[(n, wind+4)]])