为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

达令说 2022-05-11 14:41:19
我正在构建一个具有一组复杂约束的班次调度程序,为此我正在使用 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]知道可能是什么问题吗?
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

num_vals = 3for 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)]])



查看完整回答
反对 回复 2022-05-11
  • 1 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信