使用 OR-Tools CP Solver 应用约束条件

Cla*_*uiz 6 or-tools

我正在为 Job-Shop 问题实施一个类似的解决方案,但有一个区别:我不知道必须执行每项任务的机器。解决这个问题也是问题的一部分。事实上,我们可以说,我正在尝试解决护士问题和工作车间问题的组合。

更具体地说,我有一些持续时间为 D 的任务 T,由于他们的性质 N(假设前端任务、后端任务等),这些任务必须由某些特定员工 E 以特定顺序 O 执行。

我有:

  • 可以获取 E 范围内的值的 T int vars 数组(将要执行任务的员工)。
  • 一组固定的持续时间间隔变量(以知道它的持续时间 D 来安排它们)。
  • E 序列变量,它应该是员工将要执行的任务序列(间隔变量)。
  • 任务和员工之间关系 N 的一些约束。
  • O 阶的一些其他约束。

解决这个问题的一种方法是:先解决分配问题,然后安排任务。我已经做到了这一点。

但是我想将它作为一个独特的解决方案来实现。

我被困在这个:如何创建一个依赖于我之前创建的 int vars 的析取约束?

对于那些需要查看代码的人:

for i in range(number_employees):
    disj = solver.DisjunctiveConstraint([interval_var[task_id] if int_var[task_id] == i] ,'i_name')
   [...]
Run Code Online (Sandbox Code Playgroud)

当然,那是行不通的。

我真的很感激任何建议。

Lau*_*ron 4

应该看看 CP-SAT 求解器。它支持半具体化约束。

也就是说,(在Python中):

model.AddNoOverlap([间隔列表]).OnlyEnforceIf(boolvar)

model.Add(x == i).OnlyEnforceIf(boolvar)

model.Add(x != i).OnlyEnforceIf(boolvar.Not())

请参阅:https ://github.com/google/or-tools/blob/master/ortools/sat/doc/index.md