model.Maximize(
sum(shift_requests[n][d] * shifts[( n, d)] for n in all_nurses
for d in all_days))
很好奇如何将以上内容(针对轮班请求进行优化)更改为以下内容,从而针对点差进行优化。我正在尝试尽可能多地分配作业。有想法吗?
model.Maximize(
np.std(shifts[( n, d)] for n in all_nurses
for d in all_days))
您可以尝试以下操作
您有一个布尔值列表:b(i)表示2个工作日之间的平均跨度大于或等于i
您需要确保b(i)变量之间的一致性:b(i)=> b(i-1)
如果护士n在第d天工作,且b(i)为真,则work [n,d + i-1]为假。所有相关的model.AddBoolOr(work[n, d].Not(), b(i).Not(), work[n, d + i - 1].Not()]
,n
,d
都编码为i
。
最大化i,其中b(i)是true。粗略的解决方案就是model.Maximize(sum(b(i)))
。也许可以改进。