最大化所有护士在调度中的传播

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

  1. 你需要保证b(i)个变量之间的一致性:b(i) => b(i-1)

  2. 如果护士 n 在第 d 天工作,并且 b(i) 为真,则工作 [n, d + i - 1] 为假。对于所有相关的 ndi.

  3. 编码为 model.AddBoolOr(work[n, d].Not(), b(i).Not(), work[n, d + i - 1].Not()]
  4. 最大化 i 其中 b(i) 为真。一个粗略的解决方案就是 model.Maximize(sum(b(i)))。也许这可以改进。