Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么AddMultiplicationEquality仅限于2个变量?_Python_Or Tools - Fatal编程技术网

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

Python 为什么AddMultiplicationEquality仅限于2个变量?,python,or-tools,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)) sq_r = model.NewIntVar(0, 1,

我正在构建一个具有复杂约束集的轮班计划程序,我正在为此使用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))
        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)]])
我试图设置一个约束,其中5个IntVar值的后续行的乘积始终等于零,因此我使用如下方法:

    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))
        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
....
我已经检查了github上的文档以及此处和github上的一些示例,但从未发现变量列表中有两个以上项目的示例,尽管文档显示了以下内容:

def AddMultiplicationEquality(self, target, variables)
Adds target == variables[0] * .. * variables[n]
知道有什么问题吗

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())
然后


就像它说的,它还没有实现。我想他们本打算更一般一些,并把它放在文档中,但从来没有考虑过这样做。确切地说,我从来没有找到过它的一个用例,你的也不例外。在您的例子中,prod==0相当于一个变量is==0。对于每个等价于var==0的var,可以有一个布尔变量,并在这些布尔变量上添加bool_或。将5个变量相乘将更有效率。看见