通过OptaPlanner优化 COVID-19 疫苗接种预约安排(2)
本文为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)的更多相关文章
- 转:mysql性能优化的19个要点
原文来自于:http://outofmemory.cn/mysql/mysql-performance-tips 1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方 ...
- Android 性能优化(19)*代码优化11条技巧:Performance Tips
Performance Tips 1.In this document Avoid Creating Unnecessary Objects 避免多余的对象 Prefer Static Over Vi ...
- 来看看Uber的司机支持服务签到及预约系统的架构设计思路
Uber的Greenlight Hubs(GLH)在全球拥有超过700个分支机构,为合作车主提供从账户和支付到车辆检查和车主注册等各方面的人工支持.为了给合作车主创造更好的体验并提高客户满意度,Ube ...
- 19-MySQL DBA笔记-操作系统、硬件、网络的优化
第19章 操作系统.硬件.网络的优化 本章将介绍操作系统和硬件的性能优化,对于硬件,我们主要讲述CPU.内存.磁盘阵列及固态硬盘.任何优化,首先都需要有足够的数据支持,对于操作系统下性能数据的收集,这 ...
- MySQL内核深度优化
版权声明:本文由简怀兵原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/179 来源:腾云阁 https://www.qclo ...
- 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化
作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...
- 举个栗子看如何做MySQL 内核深度优化
本文由云+社区发表 作者介绍:简怀兵,腾讯云数据库高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MyS ...
- 如何深度优化MySQL内核
MYSQL数据库适用场景广泛,相较于Oracle.DB2性价比更高,Web网站.日志系统.数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是I ...
- mysql5.7官网直译SQL语句优化--select语句优化
8.2 sql语句优化 大致内容如下: 8.2.1:SELECT语句的优化 8.2.2:优化子查询,派生表和试图引用 8.2.3:优化INFORMATION_SCHEMA查询 8.2.4:优化数据改变 ...
随机推荐
- Linux系统常用的命令
1.查看本机IP地址:ifconfig 2.查看当前所在路径:pwd 3.查看指定名称线程:ps -ef | grep tomcat 4.查看当前目录结构:ll 或者 ls 5.杀死指定线程:kill ...
- Golang 包了解以及程序的执行
Golang 包了解以及程序的执行 引言 Go 语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合,是一种高级的代码复用方案.Go 语言中为我们提供了很多内置包,如 fmt.o ...
- 洛谷P1049 [NOIP2001 普及组] 装箱问题
本题就是一个简单的01背包问题 1.因为每个物品只能选一次,而且要使箱子的剩余空间为最小.所以可以确定属性为 MAX 2.由于是从n个物品里面选i个物品 那么就是选出的i个物品的空间总和要尽可能的 ...
- Java并发机制(6)--阻塞队列
Java并发编程:阻塞队列整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3933404.html 1.什么是阻塞队列 除了同步容器(Hashtable ...
- java-設計模式-工場方法
工廠方法: 一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中. 这满足创建型 ...
- SpringDataJdbc多数据源
代码基于 SpringBoot + SpringDataJDBC + Mybatis 架构 介绍使用多数据源的关键的一些类:AbstractRoutingDataSource继承实现determine ...
- 在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处?
在测试目标只关注 Spring MVC 组件的情况下,WebMvcTest 注释用于单元测试 Spring MVC 应用程序.在上面显示的快照中,我们只想启动 ToTestController. 执行 ...
- 学习Nginx(三)
nginx的性能测试及常用优化手段 一.nginx的性能测试及对比 1.环境准备 [root@test8_hadoop_kaf ~]# yum install -y httpd-tools [ro ...
- MyBatis Plus 2.3 个人笔记-01-代码生成器
sb_mybatis_puls2.3 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- 搞懂高并发性能指标:QPS、TPS、RT、吞吐量
一.QPS,每秒查询 QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的 ...