本文为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邮件列表,国内网络可能较难访问,需自行解决)

最新文章

  1. MySql: 查看当前登录用户,当前数据库
  2. 在asp.net mvc4项目里bootstrap datetimepicker控件的使用
  3. [BZOJ 3209]花神的数论题
  4. Java中Comparable和Comparator实现对象比较
  5. ko list and css gradient
  6. 分布式配置管理平台 Disconf
  7. Zepto Code Rush 2014——Dungeons and Candies
  8. (中等) POJ 1054 The Troublesome Frog,记忆化搜索。
  9. bat常用命令
  10. 六、Html头部和元信息
  11. springboot~rabbitmq自己通过UI手动发布队列需要注意的地方
  12. 设置tomcat开机自启和后台运行
  13. day46-python爬虫学习
  14. IDEA中,将项目加入maven管理。
  15. 10.23 正睿停课训练 Day7
  16. windows 同时启动多个Tomcat 控制台日志(startup.bat)输出到指定文件中
  17. iOS-方法之+ initialize 与 +load
  18. 【工具向01】——markdown 文本编辑语言相关
  19. C# WinForm中添加用户控件
  20. tf.transpose函数的用法讲解

热门文章

  1. [转载]nc命令详解
  2. redis之 主从复制和哨兵(一)
  3. Filter是什么?有什么作用?
  4. 为什么 char 数组比 Java 中的 String 更适合存储密码?
  5. spring-boot-EnvironmentPostProcessor
  6. Spring AOP and AspectJ AOP 有什么区别?
  7. 说出几条 Java 中方法重载的最佳实践?
  8. 学习zabbix(四)
  9. 单总线协议DS1820
  10. keil Uvision4 面向51单片机数据类型属性一览表