- 对于每天,每个护士(约15-20名)都会被分配一个班次
- 有少量(约6个)不同的班次
- 有相当数量的限制和优化标准,无论是关于一天还是关于员工,例如:
- 每天必须至少有一定数量的人分配到每个班次
- 某些班次重叠,因此如果有人做中间班次,则早班次可以少一个人
- 有些人喜欢早班次,有些人喜欢晚班次,但仍需要最少的换班次数才能获得更高的轮班工资。
- 不允许一个人连续工作晚班次和早班次(由于最小休息时间法规)
- 满足分配的工作周长度(对于不同的人员有所不同)
- ...
因此,基本上有大量(约20 * 30 = 600)变量,每个变量都可以取少量的离散值。
目前,我的计划是使用修改过的最小冲突算法。
- 从随机分配开始
- 为每个人和每天设置适应度函数
- 选择适应度值最差的人或者日期
- 随机选择该日期/人员的一个分配,并将其设置为导致最佳适应度值的值
- 重复以上步骤,直到达到最大迭代次数或无法找到所选日期/人员的改进为止
还有更好的想法吗?我有些担心它会陷入局部最优解。我应该使用某种形式的模拟退火吗?或者考虑不仅一次更改一个变量,而是专门在两个人之间切换班次(当前手动算法中的主要组件)?我希望避免将算法定制为当前的约束条件,因为这些条件可能会发生改变。
编辑:不需要找到严格的最优解;目前的排班是手动完成的,我相信大部分时间结果都明显不够优秀 - 应该很容易超越它。短期调整和手动覆盖肯定也是必要的,但我不认为这会成为问题;将过去和手动分配标记为“固定”实际上应该通过减少解决方案空间来简化任务。