最大化所有护士在调度中的传播
Maximize the spread of all nurses in Scheduling
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) 为真,则工作 [n, d + i - 1] 为假。对于所有相关的 n
、d
、i
.
编码为 model.AddBoolOr(work[n, d].Not(), b(i).Not(), work[n, d + i - 1].Not()]
最大化 i 其中 b(i) 为真。一个粗略的解决方案就是 model.Maximize(sum(b(i)))
。也许这可以改进。
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) 为真,则工作 [n, d + i - 1] 为假。对于所有相关的
n
、d
、i
. 编码为 最大化 i 其中 b(i) 为真。一个粗略的解决方案就是
model.Maximize(sum(b(i)))
。也许这可以改进。
model.AddBoolOr(work[n, d].Not(), b(i).Not(), work[n, d + i - 1].Not()]