第 10 章 Red Hat build of Quarkus 的 OptaPlanner:一个 vaccination appointment scheduler quick Start 指南
您可以使用 OptaPlanner vaccination appointment scheduler 快速启动来开发一个高效和公平的调度。vaccination appointment scheduler 使用人工智能(AI)来排列人员优先级,并根据多个限制和优先级分配时间插槽。
先决条件
- 已安装 OpenJDK 11 或更高版本。Red Hat build of Open JDK 位于红帽客户门户网站中的 Software Downloads 页面中(需要登录)。
- 已安装 Apache Maven 3.8 或更高版本。Maven 可从 Apache Maven 项目网站 获得。
- 提供了 IDE,如 IntelliJ IDEA、VSCode、Ecli 或 NetBeans。
- 您已创建了 Quakus OptaPlanner 项目,如 第 5 章 OptaPlanner 和 Quarkus 入门 所述。
10.1. OptaPlanner vaccination appointment 调度程序的工作方式 复制链接链接已复制到粘贴板!
调度点有两种主要方法:系统可以让人选择一个点插槽(user-selects),或者系统分配一个插槽,并告知人在什么地方进行参与(系统自动分配)。OptaPlanner vaccination appointment 调度程序使用 system-automaticly-assigns 方法。使用 OptaPlanner vaccination appointment 调度程序,您可以创建一个应用程序,其中人员向系统提供信息,系统分配一个点。
这个方法的特性:
- 点插槽会根据优先级分配。
- 系统根据预配置的规划限制分配最佳点时间和位置。
- 对于有限数量的故障点,系统不会受到大量用户负担。
这种方法通过使用规划限制为每个人创建分数,从而尽可能减少许多人。人员的分数决定何时获得缺陷。个人分数越大,他们可以获得较早的缺陷。
10.1.1. optaPlanner vaccination appointment scheduler 约束 复制链接链接已复制到粘贴板!
OptaPlanner vaccination appointment 调度程序约束是 hard、medium 或 soft :
硬限制不能被破坏。如果有任何硬约束无法正常工作,则计划不可激活,且无法执行:
- capacity :在任何位置没有任何时间不用尽书 vaccine 容量。
- Vaccine max age: 如果 vaccine 具有最长期限,请不要在第一次执行时将其管理的时间超过 vaccine 最长期限。确保为人获得适合其年龄的 vaccine 类型。例如,对于最长期限限制为 65 年,不要为旧人员分配 75 年。
- 所需的 vaccine 类型:使用所需的 vaccine 类型。例如,vaccine 的第二个操作必须与第一个操作相同。
- 就绪日期:管理指定日期或之后的 vaccine。例如,如果人收到第二个操作,请在特定 vaccine 类型的推荐最早的 vaccination 日期前不对其进行管理,例如 26 天。
- 到期日期:管理指定日期或之前的 vaccine。例如,如果人收到第二个操作,请在特定 vaccine 的推荐时间前对其进行管理,例如,第一次执行 3 个月。
- 限制最大旋转距离:将每个人分配给接近一组 vaccination 数据中心之一。这通常是三个数据中心之一。这个限制是通过旋转时间而不是距离来计算的,因此,一个人位于 urban 区域中的人通常具有比同一区域更低的距离。
中等约束决定在没有足够容量为任何人分配点时没有达到点的点。这通过受限规划调用:
- schedule second dose vaccinations:除非理想的日期不在规划窗口外,不要保留任何第二个 dose vaccination appointments unassigned。
- 根据优先级评级调度人员:每个人都有优先级评级。这通常是它们的年龄,但如果它们是健康的 worker,则可能要高得多。仅保留具有最低优先级评级的用户。它们将在下一次运行中考虑。这个约束比之前的约束是软的,因为第二个操作总是优先于优先级的评级。
软限制不应中断:
- 首选凭证 :如果人拥有首选凭证中心,为他们授予该中心上的点。
- 距离:最小化个人必须到达其分配的预测中心的距离。
- 理想的日期:管理 vaccine on 或尽可能接近指定日期。例如,如果人收到第二个操作,请在特定 vaccine 的理想日期上对其进行管理,例如 28 天。这个约束比距离约束相比,避免在国家内向人发送半次,成为他们理想的日期。
- 优先级评级:调度在计划窗口中之前具有较高的优先级评级的人员。这个约束比距离约束是软的,以避免在国家范围内发送半方。此约束也比理想的日期约束要软,因为第二个条件优先于优先级的评级。
硬限制会与其他硬限制进行权重。软限制会与其他软限制加权。但是,硬限制总是优先于中等和软限制。如果硬约束中断,则计划不可取。但是,如果没有硬约束,则考虑软和中等约束来确定优先级。由于用户通常比可用点插槽更多,所以您必须优先选择。最后,首先先分配第二个问题,以避免创建稍后系统的可能性。之后,用户会根据优先级评级进行分配。任何人都以优先级评级开始,这是其年龄。这比年龄较早的人优先选择旧的人员。之后,位于特定优先级组中的人员会收到几百个额外点。这因组的优先级而异。例如,nurses 可能会收到额外的 1000 点。这样,旧的 nurses 优先于 younger nurses,而您的 nurses 则优先于不是微不足的人员。下表演示了这个概念:
年龄 | 作业(job) | 优先级评级 |
---|---|---|
60 | nurse | 1060 |
33 | nurse | 1033 |
71 | 弃用 | 71 |
52 | 办公室 worker | 52 |
10.1.2. OptaPlanner solver 复制链接链接已复制到粘贴板!
在 OptaPlanner 的核心上,使用问题数据集和覆盖规划限制和配置的引擎。问题数据集包含有关人员、vaccines 和 vaccination 数据中心的所有信息。该解析器通过各种数据组合进行,最终决定优化点计划,以及分配给特定中心上提示点的人员。以下图例显示了相应的调度:
10.1.3. 持续规划 复制链接链接已复制到粘贴板!
持续规划是同时管理一个或多个即将推出的规划周期的技术,并每月重复该过程,每周、每天、每天、每小时或更频繁地重复此过程。规划窗口以指定间隔递增。下面的图图显示了每天更新的两周规划窗口:
两个每周规划窗口被分为一半。第一个每周处于 published 状态,第二个每周处于草案状态。人员在计划窗口发布的和草案部分中被分配到点。但是,只有计划窗口发布部分的人员才会收到它们的点。其他点仍然可以在下次运行中轻松更改。这样做可让 OptaPlanner 在再次运行 solver 时更改草案部分中的故障点(如果需要)。例如,如果需要第二天做的人具有周一日期,并且一个理想的日期为周五,OptaPlanner 不必为他们授予周一的解点。
您可以确定规划窗口的大小,但只了解问题空间的大小。问题空间是创建计划的所有各种元素。您提前规划的时间越大,问题空间越大。
10.1.4. 固定计划实体 复制链接链接已复制到粘贴板!
如果您持续规划每天,在已经分配给人的两周内会存在点。为确保 appointments 没有双书,OptaPlanner 会将现有的点标记为分配,方法是固定它们。固定用于定位一个或多个特定的分配,并强制 OptaPlanner 调度这些固定分配。固定规划实体(如点点)在竞争过程中不会改变。
实体是否固定,还是由点状态决定。缩写可以有五个状态: Open
、Invited
、Accepted
、Rejected
或 Rescheduled
。
您实际上不会在快速启动演示代码中直接看到这些状态,因为 OptaPlanner 引擎只对点是否固定感兴趣。
您需要能够计划已经调度的点。固定 Invited
或 Accepted
状态的点。带有 Open
、Reschedule
和 Rejected
状态的点不会被固定,并可用于调度。
在本例中,当解析器在发布和草案范围内在两个周计划窗口中运行时,它会搜索。除了未计划输入数据外,解析器还考虑任何未
固定实体,以及 Open
、Reschedule 或 Rejected
状态。如果解析器每天运行,您会在运行 solver 前看到一个新的日期添加到计划中。
请注意,新一天的点已被分配,之前在规划窗口的草案部分调度的 Amy 和 Edna 会被调度到窗口的发布部分。这是因为 Gus 和 Hugo 请求重新调度。这不会造成任何混淆,因为 Amy 和 Edna 不会通知其草案日期。现在,由于他们在计划窗口的发布部分中有点,因此它们会收到通知并询问接受或拒绝它们的点,其点现已固定。