我正在开发一个应用程序,可以优化地为医院的护士分配轮班。我相信这是一个离散变量的线性规划问题,因此可能是 NP-hard:
- 每天,每位护士(约 15-20 名)都被分配一个轮班
- 有少量(约 6 个)不同的班次
- 有相当多的约束和优化标准,无论是与一天有关,还是与员工有关,例如:
- 每天必须为每个班次分配最少人数
- 一些班次重叠,因此如果有人在做中间班次,则可以在早期班次少一个人
- 有些人更喜欢早班,有些人更喜欢晚班,但需要最少的换班才能获得更高的轮班工作工资。
- 一个人一天不能晚班,第二天早班(由于最低休息时间规定)
- 会议分配的工作周长度(不同的人不同)
- ...
所以基本上有大量(大约 20*30 = 600)个变量,每个变量都可以取少量的离散值。
目前,我的计划是使用修改后的最小冲突算法
- 从随机分配开始
- 对每个人和每一天都有一个健身功能
- 选择健身值最差的人或日子
- 为那一天/人随机选择一项任务,并将其设置为产生最佳适应度值的值
- 重复直到达到最大迭代次数或对于选定的日期/人无法找到改进
有更好的想法吗?我有点担心它会陷入局部最优。我应该使用某种形式的模拟退火吗?或者不仅考虑一次只改变一个变量,还特别考虑两个人之间的轮班切换(当前手动算法的主要组成部分)?我想避免根据当前的约束来定制算法,因为这些可能会改变。
编辑:没有必要找到严格的最优解;名册目前是手动完成的,我很确定结果在大多数情况下都不是最理想的——应该不难打败它。短期调整和手动覆盖也肯定是必要的,但我不认为这会是一个问题;将过去和手动分配标记为“固定”实际上应该通过减少解决方案空间来简化任务。