我正在为Job-Shop问题实施类似的解决方案,但有一个区别:我不知道必须执行每个任务的机器。解决该问题也是问题的一部分。可以说,实际上,我正在尝试解决“护士问题”和“车间工作”问题的组合。
更具体地说,我有一些任务T具有持续时间D,由于特定的雇员E的天性N(例如前端任务,后端任务等),它们必须按特定顺序O由某些特定雇员E执行
我有:
一种解决方法是:首先解决分配问题,然后安排任务。我已经做到了。
但是我想将其实现为独特的解决方案。
我被困在这个问题上:如何根据我之前创建的int vars创建析取约束?
对于需要查看代码的人:
for i in range(number_employees):
disj = solver.DisjunctiveConstraint([interval_var[task_id] if int_var[task_id] == i] ,'i_name')
[...]
当然,那是行不通的。
我真的很感谢任何建议。
答案 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
您还有其他建议吗?