是否有一些关于如何在OR-Tools中建模两个因变量数组之间相关性的软约束的一般规则?
我正试图解决一个复杂的轮班调度问题,我不能把我的头围绕它。员工被分成两个小组,一般规则是只有一个小组的人工作,除非需要休假或病假。我想象的是这样的:
<表类>
第一天
第二天
第三天
第四天
第五天
tbody><<tr>团队1 x x - - x 团队2 - - x x - 表类>
这似乎奏效了:
for d in range(num_days):
for e in range(num_emp):
t = emp_team[e]
works_with_other_team = model.NewBoolVar(f'emp_team:{e}_{t}')
model.Add(works_with_other_team == True).OnlyEnforceIf(work[d,e], team_assignments[d,t].Not())
obj_bool_vars.append(works_with_other_team)
obj_bool_coeffs.append(3) # pick appropriate penalty
,然后在var*coeff
model.Minimize(
sum(obj_bool_vars[i] * obj_bool_coeffs[i] for i in range(len(obj_bool_vars)))
)
最初我试图做下面的事情,它失败了
model.Add(works_with_other_team == work[d,e] & team_assignments[d,t].Not())
当NotImplementedError: calling and on a linear expression is not supported, please use CpModel.AddBoolAnd
失败时,我继续尝试用AddBoolAnd
或AddBoolOr
实现它,但更优雅的解决方案是使用OnlyEnforceIf