本文为OptaPlanner官方博客《Optimizing COVID-19 vaccination appointment scheduling》的第二篇译文。第一篇介绍了通过OptaPlanner进行新冠疫苗接种预约规划的业务需求。
本文承接上一篇的内容,着重讲解基于现有的业务约束,在通过OptaPlanner具体的开发实现过程中的各个要点和规划方案。
其中重点描述在规划过程中的持续规划、规划时间窗口和固定规划实体等概念。这类概念与方案在我们日常的APS,VRP和排班等规划场景中非常实用。大家可以参考其思想和设计。
(以下为译文)
求解器(规划引擎)
OptaPlanner 的核心是求解器,它是获取规划问题数据集,并覆盖规划约束和配置的引擎。在本案例中,问题数据集包括有关人员、疫苗和疫苗接种中心的所有信息。求解器通过各种数据组合进行工作,最终生成一个优化的预约时间表,并向分配到特定中心的疫苗接种发出预约。下图显示了引擎创建的计划:
持续规划连续规划是一种同时管理一个或多个未来的计划周期,并可以每月、每周、每天、每小时甚至更频繁地重复该过程的技术。规划的时间窗口按指定的时间间隔往后移动。下图显示了每天更新的两周计划窗口:
两周的计划时间窗口分为两部分。第一周处于已发布状态(即已规划好并公布出去),第二周处于草拟状态(即待计划状态)。在计划时间窗口的已发布部分和草稿部分中,都会将人员分配给可预约的空档。但是,只有已发布部分(即已确定部分)中的人员会收到正式约会通知。其他(第二周、草拟状态)的预约,在下一次运行中可能会有所变更,因此,这个时间,这部分人并未收到正式通知。通过这种方法,你就可以避免将早早将预约安排定死,在预约过程中更灵活应变,而不会一次性固定死预约而无法变通。例如,如果有人需要接种第二剂,并且已经预约到周一(许可时间范围内)进行接种,其最理想接种时间是周三。如果你在稍晚一点,在草拟部分的时间范围内,可以给到他更佳时间,那么届时可以分配一个更接近最理想接种时间的预约给他。
您可以自定义规划时间窗口的大小,但请注意问题空间(通常由数据量,即预约人数及预约中心数决定)的大小。问题空间是创建预约日程的重要构成因素。因此,您提前计划的天数越多,问题空间就越大。
固定规划实体 如果你每天都在进行持续规划(将新的申请加进来,发布新的预约日程,确定未来哪些预约时间段已被占用等),那么在两周内就会出现一些已分配给预约者的工作安排。为确保已被预订的资源不会被重复预约,你需要通过固定现有预约安排,将它们标记为已分配。“固定预约”操作用于锚定一个或多个指定的预约分配结果,并强制 OptaPlanner 在进行新一轮规划运算时,绕开这些已固定的预约进行规划运算。固定的规划实体(例如一个预约)在求解运算期间不再被更改,从而保证它原有预约的确定性。
一个预约是否被固定,由其预约状态决定。如果您查看上一张图片,您可以在上图左侧看到,一个预约空档可以有五种状态:开放、已邀请、已接受、已拒绝或重新规划。
注意:实际上,你在quickstart演示代码中,无法直接看到这些状态,因为OptaPlanner引擎只关心预约是否固定。
因此,从上图中可以看出,程序需要能够绕开已经安排好的预约进行规划运算。状态为“已邀请”或“已接受”的预约已经被固定。状态为 开放、重新规划 和 已拒绝 的预约空档未固定,可用于安排。
在此示例中,当引擎运行时,它会在已发布范围和草拟范围内搜索整个两周计划窗口。除了未计划的输入数据之外,引擎还会考虑所有未固定的实体(具有开放、重新规划或已拒绝状态的预约空档),以找到最佳解决方案。如果引擎每天运行,你将看到在运行引擎之前,计划时间窗口添加了新的一天,如上图中间所示。第三个时间表(最底一个)表示引擎规划的输出结果。
请注意(见中间和底下的两个表),当新一天的预约分配后,本来处于计划窗口草拟部分的 Amy 和 Edna(见中间表) ,将会被安排在计划窗口的已发布部分(见最底下的表),这种情况是可能的,因为表中的Gus和Hugo要求重新规划。这不会引起任何混淆,因为 Amy 和 Edna 在前一个时间窗口内,并未收到正式约定日期,即他们在下一个时间窗口有可能被提前到已发布部分。现在,因为他们出现在计划窗口的已发布部分,他们将收到正式通知,并要求他们回复“接受”或“拒绝”该安排,若接受,他们的预约就被固定。
敬请关注。我们将发布后续博客,以更深入、更技术地了解 OptaPlanner 疫苗接种预约计划程序快速入门。
源代码: https://github.com/kiegroup/optaplanner-quickstarts
本文章由Emily与Murphy合著,由张健彪翻译。
本系列文章在公众号不定时连载,请关注公众号(让APS成为可能)及时接收,二维码:
如需了解更多关于Optaplanner的应用,请发电邮致:kentbill@gmail.com
或到讨论组发表你的意见:https://groups.google.com/forum/#!forum/optaplanner-cn
若有需要可添加本人微信(13631823503)或QQ(12977379)实时沟通,但因本人日常工作繁忙,通过微信,QQ等工具可能无法深入沟通,较复杂的问题,建议以邮件或讨论组方式提出。(讨论组属于google邮件列表,国内网络可能较难访问,需自行解决)
一个IT老农,先尽力担好当儿子、丈夫和父亲的责任,然后做点有趣的事。