自动排班-护士(分白班|夜班)
当服务器启动时检测需要自动排班,自动开始排班的算法执行
- 获得本周的所有日期,例如2023-01-29.....2023-02-04
- 依次对每个科室,从第一天开始,逐天进行排班,分别设置两个二个数组,day[7];night[7]分别记忆一周内每天白班夜班的值班情况
- 获取所有的护士对象,然后对其中一天进行排班:
- 先排当日的早班。首先初始化所有护士的权值,以一个护士为例,从当日开始向前依次查看昨天,前天,大前天等等本周当日之前的本护士的值班情况,夜班,白班等等,根绝离本日越近,对护士的加权更高。
- 当对本日所有护士的值班加权完毕后,根据每天单个科室最低值班人数与本科室护士的最小值来对大根堆进行初始化,然后便利所有的护士节点,通过贪心与TOPK的思想建立最优的大根堆,将大根堆中的护士取出就是当前排版的最接近最优人选,一次作为自动排版的结果。
- 以上便完成了一个科室一天中白班或夜班的自动排班,清空小根堆的存储内容,并且根据情况给各个护士的加权,然后进入夜班或者下一个科室的排班。
- 每次完成一次排班都对护士临时列表进行随机打乱,保证了每次排班的随机性,防止排班计划僵化。
- 手动触发,在管理员后台手动触发(当服务器出现问题或其他情况,导致自动排班未能按时进行,可在后台管理员进行手动触发自动排班,具体的实现算法与上述无异)