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

通过OptaPlanner优化 COVID-19 疫苗接种预约安排(2)的更多相关文章

  1. 转:mysql性能优化的19个要点

    原文来自于:http://outofmemory.cn/mysql/mysql-performance-tips 1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方 ...

  2. Android 性能优化(19)*代码优化11条技巧:Performance Tips

    Performance Tips 1.In this document Avoid Creating Unnecessary Objects 避免多余的对象 Prefer Static Over Vi ...

  3. 来看看Uber的司机支持服务签到及预约系统的架构设计思路

    Uber的Greenlight Hubs(GLH)在全球拥有超过700个分支机构,为合作车主提供从账户和支付到车辆检查和车主注册等各方面的人工支持.为了给合作车主创造更好的体验并提高客户满意度,Ube ...

  4. 19-MySQL DBA笔记-操作系统、硬件、网络的优化

    第19章 操作系统.硬件.网络的优化 本章将介绍操作系统和硬件的性能优化,对于硬件,我们主要讲述CPU.内存.磁盘阵列及固态硬盘.任何优化,首先都需要有足够的数据支持,对于操作系统下性能数据的收集,这 ...

  5. MySQL内核深度优化

    版权声明:本文由简怀兵原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/179 来源:腾云阁 https://www.qclo ...

  6. 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化

    作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...

  7. 举个栗子看如何做MySQL 内核深度优化

    本文由云+社区发表 作者介绍:简怀兵,腾讯云数据库高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MyS ...

  8. 如何深度优化MySQL内核

    MYSQL数据库适用场景广泛,相较于Oracle.DB2性价比更高,Web网站.日志系统.数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是I ...

  9. mysql5.7官网直译SQL语句优化--select语句优化

    8.2 sql语句优化 大致内容如下: 8.2.1:SELECT语句的优化 8.2.2:优化子查询,派生表和试图引用 8.2.3:优化INFORMATION_SCHEMA查询 8.2.4:优化数据改变 ...

随机推荐

  1. 盘点几种DIY加密狗的制作方法,适用于穿越机模拟器

    前言 前几天笔者的加密狗在使用中突然坏掉了,现象是插电脑不识别,LED灯不亮. 网上很多模友也反映了同样的问题: http://bbs.5imx.com/forum.php?mod=viewthrea ...

  2. 12.9 Override

    12.9 Override 静态方法 父类的引用可以指向子类静态方法(用static修饰的方法)的调用只和左边定义的数据类型有关,如: public class Person { public sta ...

  3. 使用git clone 报错curl56 errno 10054解决方法

    使用git clone 报错curl56 errno 10054解决方法 ----------------版权声明:本文为CSDN博主「伽马射线爆」的原创文章,遵循CC 4.0 BY-SA版权协议,转 ...

  4. kafka 学习(二--前言)

    kafka 现在在企业应用和互联网项目中的应用越来越多了,本篇文章就从 kafka 的基础开始带你一展 kafka 的宏图 1. 什么是 Kafka Kafka 是一个分布式流式平台,它有三个关键能力 ...

  5. 什么是feigin?它的优点是什么?

    1.feign采用的是基于接口的注解2.feign整合了ribbon,具有负载均衡的能力3.整合了Hystrix,具有熔断的能力使用:1.添加pom依赖.2.启动类添加@EnableFeignClie ...

  6. 一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?

    可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致.

  7. 什么是 Spring Cloud Bus?我们需要它吗?

    考虑以下情况:我们有多个应用程序使用 Spr ng Cloud Config 读取属性,而S ring Cloud Config 从GIT 读取这些属性. 下面的例子中多个员工生产者模块从 Employe ...

  8. spring-boot-learning-Web开发知识

    1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 3).自己编写业务代码: 文件名的功能 x ...

  9. kafka生产者网络层总结

    1 层次结构 负责进行网络IO请求的是NetworkClient,主要层次结构如下 ClusterConnectionStates报存了每个节点的状态,以node为key,以node的状态为value ...

  10. 「入门篇」初识JVM (下下) - GC

    垃圾收集主要是针对堆和方法区进行:程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于> 线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收. GC - J ...