为什么 AddMultiplicationEquality 仅限于 2 个变量?
Why is the AddMultiplicationEquality limited to only 2 variables?
我正在构建一个具有一组复杂约束的班次调度程序,为此我正在使用 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))
我正在尝试设置一个约束条件,其中 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]
知道可能是什么问题吗?
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)]])
我正在构建一个具有一组复杂约束的班次调度程序,为此我正在使用 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))
我正在尝试设置一个约束条件,其中 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]
知道可能是什么问题吗?
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)]])