如果条件与OR-Tools CP Solver

时间:2018-07-16 08:44:59

标签: or-tools

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

更具体地说,我有一些任务T具有持续时间D,由于特定的雇员E的天性N(例如前端任务,后端任务等),它们必须按特定顺序O由某些特定雇员E执行

我有:

  • 一个T int var数组,可以获取E范围内的值(将要执行任务的雇员)。
  • 固定持续时间间隔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')
   [...]

当然,那是行不通的。

我真的很感谢任何建议。

2 个答案:

答案 0 :(得分:2)

应该看看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

答案 1 :(得分:0)

Laurent Perron,我修改了no_overlap_sample_sat.py来遵循您的建议,但这不起作用。我修改的是:

# No Overlap constraint.
boolvar = model.NewBoolVar('boolvar')
i = model.NewIntVar(0, 10, 'i')
x = model.NewIntVar(0, 10, 'x')
model.Add(i - x == 0)
model.AddNoOverlap(
    [task_0, task_1, task_2, weekend_0, weekend_1, weekend_2]).OnlyEnforceIf(boolvar)
model.Add(x == i).OnlyEnforceIf(boolvar)
model.Add(x != i).OnlyEnforceIf(boolvar.Not())

输出是:

  

Solver以非最佳状态退出:1

您还有其他建议吗?