在ORTools中对两个相关数组进行优化



是否有一些关于如何在OR-Tools中建模两个因变量数组之间相关性的软约束的一般规则?

我正试图解决一个复杂的轮班调度问题,我不能把我的头围绕它。员工被分成两个小组,一般规则是只有一个小组的人工作,除非需要休假或病假。我想象的是这样的:

<表类> 第一天 第二天 第三天 第四天 第五天 tbody><<tr>团队1xx--x团队2--xx-

这似乎奏效了:

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失败时,我继续尝试用AddBoolAndAddBoolOr实现它,但更优雅的解决方案是使用OnlyEnforceIf

最新更新