扩展道路维护示例

问题描述 投票:0回答:1

我遇到的情况是我的问题域与道路维护示例紧密匹配,因此我尝试将其用作我的参考。

我需要扩展示例的领域是 Job -> Crew 之间的关系。想象一下,多个工作人员可以被分配到同一个工作(也许是为了更快地完成,也许是为了比工作 2 更优先考虑工作 1)。为了做到这一点,我想我会做以下事情:

  1. 将 Job.crew 从单例更改为列表
  2. 将@PlanningVariable更改为@PlanningListVariable注释
  3. 更新适当的获取/设置/构造函数...(确保列表在创建时不为空)

但是,我现在得到的努力是在同一实体类中不支持基本计划变量和列表计划变量。

如何扩展示例以支持船员列表?

optaplanner timefold
1个回答
0
投票

将@PlanningVariable更改为@PlanningListVariable注释

就您而言,您不想这样做:分配给该工作的工作人员的顺序并不重要。但是

@PlanningListVariable
会对其进行优化(目前不支持与普通 var 组合,所以今天这是一个死胡同)。

提案A)

相反,请遵循“座位模式”(尚未记录)。基本上,给每个工作一个固定的

List<JobSeat>
。每个 JobSeat 都有一个 Job 和一个
@PlanningVariable
Crew(不再是 Job)。

这种方法的问题在于自动配置不仅仅起作用:您需要自定义移动和一大堆其他痛苦。

提案 B) // 推荐

使用考试示例 hack。问题是我们没有将其移植到时间折叠快速入门中。 您可以在这里找到代码。

查看 Exam、LeadingExam 和 FollowingExam。将 Job 重命名为 JobSeat 并使其抽象。将 JobSet 扩展为 PrimaryJobSeat 和 secondaryJobSeat。 抽象 JobSeat 有 1 个计划变量(工作人员)。 PrimaryJobSeat 有 1 个额外的计划变量(起始)。 secondaryJobSeat 有一个固定的 PrimaryJobSeat 并使用相同的开始时间。


重要提示:维护计划快速入门使用时间粒度模式。如果时间粒度较小(低于 1 小时)或时间周期较长(数周),则无法很好地扩展。使用通过时间链接模式(请参阅文档)的车辆路由实施可能会更好,例如通常用于安排维护技术人员的我们的现场服务路由模型的 REST API。这取决于您的用例。

© www.soinside.com 2019 - 2024. All rights reserved.