通过OptaPlanner优化 COVID-19 疫苗接种预约安排(1)-无视频版

近两年来的冠疫情使得社会工作生活备受影响。接种疫苗是其中一种有效减缓疫情的途径之一,但病毒的传染性,疫苗接种的规律性,及接种人群数量及分布等特性,对接种活动的计划安排提出了巨大挑战。面对大量的接种数据和复杂的接种安排,人工编制接种计划明显会影响工作效率,并降低接种安排的合理性。本文将接种计划视作一个规划问题,通过开源规划引擎OptaPlanner,自动生成一个符合接种规范、提高工作效率、降低社会运行成本的接种计划方案。

本文章译自Paul Brown先生,一位开源社区的资深贡献者。以下为原文:https://www.optaplanner.org/blog/2021/03/04/OptimizingCovid19VaccinationScheduling.html

事实证明,COVID-19 疫苗接种预约安排是一项全球性挑战。尽管多次尝试,有资格接种疫苗的人仍无法获得预约。那些预定和接种疫苗的人,有时到达疫苗接种中心后才得知他们的预约已被取消。有些人发现,与他们同在一个疫苗接种时间窗口的有数百人,必须排队等候数小时才能接种。但是,情况并非必须如此混乱。你可以参考 OptaPlanner快速入门案例中的【疫苗接种预约】程序,来开发排程系统,从而生成一个既高效又公平的接种时间表。【疫苗接种预约调度程序】使用人工智能 (AI) 来确定人员的优先级,并根据多个约束和优先级分配时间段。该示例是OptaPlanner 快速入门系列的一部分,在 GitHub 上提示。

系统自动分配预约调度系统的好处

安排预约有两种主要方式,一种是预约者从系统中选择一个预约空档(即用户选择),另一种是系统分配一个档期并告诉这个人何时何地参加(即由系统自动分配)。
以下是两种方法的快速比较:

用户选择

这种方法类似于用于音乐会票务网站(如 Ticketmaster™)的方法。这是大多数音乐会门票的销售方式。人们相互竞争固定数量的门票或预约。

该方法的特点:

  • 预约以先到先得的方式提供.

  • 一个人从一系列可用的约会中选择心仪的约会时间和地点.

这种方法的挑战:

  • 先到先得的方式可能不公平.

  • 当过多人同时进行预约时,系统过载反复让将网速较慢的人无法预约.

  • 当多人尝试同时预约同一个时段时,只有一个人预约成功其他人都无法预约,导致用户体验不佳。有些人可能会彻底放弃尝试预约;而另一方面,一些非黄金时间的空档无人问津.

  • 根据优先级、年龄或第二次剂量状态等标准进行排序变得很棘手.

  • 用户选择的预约内,可能无法提供所需的疫苗类型(辉瑞™、Moderna™、阿斯利康™).

可以说,用户选择方式不是疫苗接种计划的最有效方法。人们可以选择最近的疫苗接种中心,但该中心的容量可能不是最大的。对于个人有利方式,对于整个群体来说并不一定是最佳的。系统无法将每一个人引导同时满足个人需求,同时容量可满足所有人需求的中心。此外,这种方法很容易让系统出现过载。

系统自动分配

使用这种基于推送的方法,人们将他们的信息提供给系统,由系统来分配一个预约。

这种方法的特点:

  • 预约的空档是根据优先级分配的.

  • 系统根据预先设定的计划约束,分配最佳预约时间和地点。

这种方法的挑战:

  • 人们分得的时间段可能不可行(例如时间冲突)。
  • 人们可能更偏向重新预约。

系统自动分配方式比用户选择方式更易于人们使用,更公平;并且对于疫苗接种预约安排更高效。

第二剂挑战

大多数 COVID-19 疫苗需要接种两剂。为了获得最佳效果,第二剂必须在与第一剂相隔特定时间范围内接种,并使用相同的疫苗类型。最重要的是,不同的疫苗有不同的第二剂时间间隔。在这些时间范围内,有一个最早可接种日期(可以接种第二剂的第一天)、一个理想日期(接种第二剂的最佳日期)和一个最后期限(接种第二剂的最后日期)。例如,辉瑞第二剂的理想日期是第一剂后 21 天,但 Moderna 疫苗第二剂的理想日期是第一剂后 28 天。
因此,假设你从人们接种 Moderna 疫苗开始算,4 周后你仍在给人们接种第一剂;但此时已经是一些接种了辉瑞疫苗第一剂的人接种第二剂的时候了。您必须决定是预约需要第二剂的人还是预约人接受第一剂。这可能看起来很简单,但这种情况有潜在的复杂性。假设在接种疫苗的第一周,你为高优先级的人接种了疫苗,同时也为普通优先级的人们也接种了,因为你会发现在这个时间你完成了高优先级人群接种后,还有额外剩余的疫苗,而你又不能浪费掉这个时间。四个星期后,你必须决定,预约此时的预约优先分给第一剂高优先级的人,还是分配给需要接种第二剂的低优先级的人。
一种解决方案是在接受第一剂和第二剂的人之间平等地共享预约,但这样做可能会导致需要第二剂的人积压。如果你继续给予接种第一剂的人预约,而不优先给需要第二剂的人预约,最终等待接种第二剂的需求量将出现滚雪球式的积压;从而导致第二剂疫苗实际接种日期将与理想日期相距甚远,甚至可能超过接种窗口期,这将使第一剂疫苗接种的效果大大降低。
因此,无论首剂患者的优先级高低,都应优先提供给第二剂接种者预约。

解决疫苗接种预约调度问题

OptaPlanner 疫苗接种预约调度程序使用系统自动分配的方法,通过使用规划约束为每个人创建一个接种分值来解决尽可能多的人的疫苗接种问题。各人的接种分值决定了他们何时获得预约。一个人的接种分值越高,他们获得更早约会的机会就越大。约束分为硬约束、中等约束的或软约束的:

  • 硬约束不能被打破。如果任何硬约束被破坏,则计划不可行且无法执行。包含以下硬约束:

  • 接种能力(容量):在任何时间、任何地点,发放的预约量均不可超疫苗可用量。

  • 疫苗最大年龄:如果一种疫苗有最大年龄限制,不能将它分配给接种第一针时,年龄已超过限制的接种者;以确保为人们提供适合其年龄的疫苗类型。例如,不要为 75 岁的人分配最高年龄限制为 65 岁的疫苗预约。
  • 所需的疫苗类型限制:限制所使用的疫苗类型。例如,第二剂疫苗必须与第一剂的疫苗类型相同。
  • 准备日期:确保在指定日期或之后接种疫苗。例如,如果一个人接受了第二剂疫苗,请不要在针对特定疫苗类型的建议最早可能的疫苗接种日期之前(例如第一剂疫苗后 26 天)进行接种。
  • 截止日期:在指定日期或之前接种疫苗。例如,如果一个人接受了第二剂疫苗,需要在特定疫苗的推荐疫苗接种最终到期日之前接种(例如第一剂疫苗后三个月)。
  • 限制最大旅行距离:将每个人分配到离他们住所最近的一组疫苗接种中心之一。这通常是三个中心之一。此限制是根据旅行时间而非距离计算的,因此居住在城市地区的人通常比农村人的最大旅行距离更短。

  • 当没有足够的能力为每个人分配约会时,中等约束决定谁没有得到约会。这称为过度约束规划:

  • 安排第二剂疫苗接种:除非理想的接种日期不在计划时间段内,否则不要遗漏任何未分配的第二剂疫苗接种预约。

  • 根据优先级安排人员:每个人都有一个优先级。通常是以年龄作为参考,但如果是医疗工作者,则可能会更高。只留下优先级最低的人未分配,他们将在下一次规划中被分配。此约束比先前的(第二剂约束)更低,因为第二剂接种的重要性高。

  • 不违反坏软约束(除非逼不得已):

  • 首选的疫苗接种中心:如果某人有首选疫苗接种中心,则将其分配到该中心。

  • 距离:最小化一个人必须前往指定的疫苗接种中心的距离。
  • 理想日期:尽可能在指定日期或接近指定日期接种疫苗。例如,如果某人接受了第二剂疫苗,请在特定疫苗的理想日期(例如第一剂疫苗后 28 天)进行接种。注意:这个约束应比距离约束要软,以避免将人们到处分配全国各地,只是为了离他们的理想约会更近一天。即为了更接近理想接种一天时间,而将一个人分配到跨省接种,是不可取的。
  • 优先级:越接近(第二针)理想接种时间的人员的优先越高。此约束级别比距离约束更低,以避免将人们到处分配全国各地,因为他们只是接近理相接种日期,并未到达该日期。该约束也比理想的日期约束更低,因为第二剂的优先级高于优先级。

在相同的约束类型里,有些硬约束与其它硬约束进行对比里,需要一定的加权。软约束亦然。然而,无论它们各自的权重如何,在进行评分运算时,硬约束高于中等约束,中等约束高于软约束。当排队预约的人多于预约可分配量时,所以你需要做出艰难的决定。必须首先分配第二剂预约,以避免形成后续时间里,这些第二剂的预约积累,对后面的工作形成压力。然后才根据优先级分配预约。每个人都以他们的年龄作为优先级,这样可以令老年人优先于年轻人接种。之后,处于特定优先级组中的人会获得几百个额外优先级积分,以提高他们的优先级,积分多少取决于他们组的优先级。例如,护士可能会获得额外的 1000 分;在此基础上,年长护士又优先于年轻护士,年轻护士优先于非护士。下表说明了这个概念:

年龄工作优先级 60 护士 1060 33 护士 1033 71 退休 71 52 办公室职员 53

表 1. 优先等级表

(译者:第一篇先完成该安全的业务分配部分,在第二篇将会翻译其技术实现部分,敬请期待)

本系列文章在公众号不定时连载,请关注公众号(让APS成为可能)及时接收,二维码:

通过OptaPlanner优化 COVID-19 疫苗接种预约安排(1)-无视频版

如需了解更多关于Optaplanner的应用,请发电邮致:kentbill@gmail.com
或到讨论组发表你的意见:https://groups.google.com/forum /#!forum/optaplanner-cn ;
若有需要可添加本人微信(13631823503)或QQ(12977379)实时沟通,但因本人日常工作繁忙,通过微信,QQ等工具可能无法深入沟通,较复杂的问题,建议以邮件或讨论组方式提出。(讨论组属于google邮件列表,国内网络可能较难访问,需自行解决)

Original: https://www.cnblogs.com/kentzhang/p/16164233.html
Author: kentzhang
Title: 通过OptaPlanner优化 COVID-19 疫苗接种预约安排(1)-无视频版

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622583/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • crudapi增删改查接口零代码产品成功案例之金茶王投票系统

    crudapi增删改查接口零代码产品成功案例之金茶王投票系统 简介 2020年由于疫情原因,金茶王投票活动改成线上云投票,所以需要一套投票系统进行比赛。参赛选手包括两种类型,分别为…

    Java 2023年6月6日
    095
  • 解决mybatisplus分页查询不起作用

    需要增加以下配置: @Configuration(proxyBeanMethods = false) public class MybatisAutoConfiguration {…

    Java 2023年5月30日
    061
  • SpringBoot项目启动即执行某个方法

    ​因为自身做项目要用到,所以收集了一下大概有三种,目前使用 实现ApplicationRunner接口形式。 ​有一点小坑,因为我要调用的方法是要从配置文件中取值才行,但是这个实现…

    Java 2023年6月6日
    086
  • day03_3_流程控制练习题

    流程控制练习题 一、编程题 1、实现一个课程名称和课程代号的转换器:输入下表中的课程代号,输出课程的名称。用户可以循环进行输入,如果输入0就退出系统。(使用switch +whil…

    Java 2023年6月8日
    068
  • Spring:SpringMVC一例

    文章目录 + [目录结构](#-1) + [web.xml](#webxml-4) + [SpringMVC核心配置文件:md5-servlet.xml](#springmvcmd…

    Java 2023年5月30日
    077
  • SpringCloud(二):nacos作为配置中心

    访问nacos服务:http://localhost:8848/nacos/#默认账户、密码:nacos 1、创建namespace 2、在’配置管理’-》…

    Java 2023年5月30日
    090
  • Java学到什么程度能找到一份还不错的工作

    我的读者里有很多 Java 新人,新人是指正在学 Java 的、以及工作时间不长的年轻人,他们经常问我一个问题: Java 学到什么程度才能找到一份还不错的工作? 今天我就从我自己…

    Java 2023年6月7日
    077
  • Windows 查询并关闭指定端口

    (1)首先进入cmd界面 (2)查询指定的端口 找到已占用端口号的进程号,例如端口号:8080 netstat -ano | findstr 8080 (3)关闭指定端口 task…

    Java 2023年6月5日
    088
  • 【Java面试手册-基础篇】Java中的main()方法能否被重载?

    答案是肯定的,我们可以重载main()方法,一个Java类可以有任意数量的main()方法,比如下面的 MainDemo 类,就有多个 main() 方法。 package com…

    Java 2023年6月8日
    087
  • SpringCloud(四).熔断器监控Hystrix Dashboard 和 Turbine

    Hystrix-Dashboard是一款监视Hystrix状态的一款工具,能够显示出熔断时间,响应速度等信息,只能显示一个应用的信息,如果想查看整个系统中多个服务的数据,就需要使用…

    Java 2023年6月7日
    075
  • [转]Nginx主动式后端服务器健康检查配置

    环境: SpringCloud微服务(eureka注册中心);nginx作为负载均衡; 场景: Nginx -> A服务当流量高峰期时,kill A服务A服务还没有挂掉,但是…

    Java 2023年5月30日
    057
  • 2 Java内存层面的对象认识

    1 对象的创建 2 对象的内存布局 3 对象的访问定位 3.1句柄访问 3.2 直接指针访问 说明:此分析基于HotSpot虚拟机 1 对象的创建 Java对象的创建方式有三种: …

    Java 2023年6月7日
    076
  • SpringBoot整合WebService(实用版)

    SpringBoot整合WebService 简介 WebService就是一种跨编程语言和跨操作系统平台的远程调用技术 此处就不赘述WebService相关概念和原理了,可以参考…

    Java 2023年6月8日
    0104
  • 浅析Java双亲委派机制及其作用

    双亲委派机制:当某个类加载器准备加载一个.class字节码文件时,它首先将这个加载任务委派给上一级类加载器,上一级加载器再委派到更上一级类加载器,递归这个操作直到最顶级的类加载器。…

    Java 2023年6月8日
    071
  • 限流常规设计和实例

    限流算法 计数器限流 固定窗口 滑动窗口 桶限流 令牌桶 漏桶 计数器 计数器限流可以分为: 固定窗口 滑动窗口 固定窗口 固定窗口计数器限流简单明了,就是限制单位之间内的请求数,…

    Java 2023年6月14日
    050
  • 【spring-boot】如何使用apollo

    文章背景 本文介绍如果在spring boot中接入apollo 官方文档:https://github.com/ctripcorp/apollo/wiki#%E4%B8%80%E…

    Java 2023年5月29日
    059
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球