本文为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. linux下安装简单的文件上传与下载工具 lrzsz

    编译安装 1.从下面的网站下载 lrzsz-1.12.20.tar.gz wget https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 2.查看里面的I ...

  2. 『现学现忘』Docker基础 — 32、通过DockerFile的方式挂载数据卷

    目录 1.简单了解一下DockerFile 2.通过DockerFile的方式挂载数据卷 (1)创建DockerFile文件 (2)编辑Dockerfile文件 (3)构建Dokcer镜像 (4)启动 ...

  3. 【编程教室】Python绘制冬奥吉祥物“冰墩墩”

    大家好,欢迎来到 Crossin的编程教室 ! 这两天,随着北京冬奥会的开幕,吉祥物"冰墩墩"可是火出了圈,多少人排长队都买不到.据说甚至有人把价格炒到了几千元. 就连昨天的&qu ...

  4. Tomcat启动时shell窗口乱码解决方法

    tomcat/conf/目录下,修改logging.properties java.util.logging.ConsoleHandler.encoding = utf-8 更改为 java.util ...

  5. spring源码-扩展点

    /** * @Author quan * @Date 2020/11/13 * 扩展原理 * BeanPostProcessor bean后置处理器,bean创建对象初始化前后进行拦截工作 * * * ...

  6. char的越界赋值即其原理剖析

    思考: int ch = 'A'; int ch1 = 65; int ch2 = 321; printf("%c %c %c\n", ch, ch1, ch2);的输出结果是什么 ...

  7. 技能篇:linux服务性能问题排查及jvm调优思路

    只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求.最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的.如果你是负责中间件或 ...

  8. CSS的inline、block与inline-block

    基本知识点 行内元素一般是内容的容器,而块级元素一般是其他容器的容器,行内元素适合显示具体内容,而块级元素适合做布局. 块级元素(block):独占一行,对宽高的属性值生效:如果不给宽度,块级元素就默 ...

  9. throws子句在继承当中overrride时有什么规则

    8.throws子句在继承当中overrride时的规则 马克-to-win:当子类方法override父类方法时,throws子句不能引进新的checked异常.换句话说:子类override方法的 ...

  10. activity-alias属性的使用

    activity-alias是Android里为了重复使用Activity而设计的.1. 含义和作用:         对于activity-alias标签,它有一个属性叫android:targen ...