我目前正在开发一个应用程序,其中在规定的时间内将任务分配给资源至关重要。目标是优化任务之间的行程时间,同时确保它们按优先级顺序执行。为了实现这一目标,我利用 OptaPlanner (OP) 并遵守特定的约束和任务依赖性。
我使用 @PlanningListVariable、逆关系影子变量和上一个和下一个元素影子变量构建了我的规划实体和解决方案,如下所示:
@PlanningEntity
public class Resource {
@PlanningId
private Long id;
...
@PlanningListVariable
private List<Task> tasks = new ArrayList<>();
...
}
@PlanningEntity
public class Task {
@PlanningId
private UUID id;
...
@InverseRelationShadowVariable(sourceVariableName = "tasks")
private Resource resource;
@PreviousElementShadowVariable(sourceVariableName = "tasks")
protected Task previousTask;
@NextElementShadowVariable(sourceVariableName = "tasks")
protected Task nextTask;
...
}
@PlanningSolution
public class OPPlanningSolution {
private Long id;
@ConstraintConfigurationProvider
private OPConstraintConfiguration opConstraintConfiguration;
@ValueRangeProvider
@ProblemFactCollectionProperty
private List<OPTask> tasks;
@PlanningEntityCollectionProperty
private List<OPResource> resources;
@PlanningScore
private HardMediumSoftScore score;
...
}
最初,这种方法就足够了。然而,当我尝试将任务依赖性合并到问题中时遇到了挑战。例如,任务 T2 必须仅在任务 T1 结束后开始,任务 T3 和 T4 必须同时开始。我设想资源 R1 和 R2 的调度类似于以下模式:
R1: |--T1--|*******|--T4--|
R2: *******|--T2--||--T3--|
虽然任务 T1 很简单,但任务 T2 依赖于任务 T1,任务 T3 和 T4 相互依赖。
在任务类中,我有关于当前任务依赖于哪些任务以及依赖关系类型的信息。
我的困境出现在将这些依赖关系有效地整合到 OptaPlanner 内的调度过程中。在探索潜在的解决方案时,我参考了OptaPlanner文档的第20段并观看了相关的视频,但我还没有能够设计出令人满意的解决方案。
我尝试过的一种方法是颠倒逻辑:为任务分配资源。虽然这使我能够指示 OptaPlanner 为任务分配时间,但我在保留有关上一个和下一个任务的信息方面面临挑战,这对于计算任务之间的行程时间并在必要时最小化它至关重要。
虽然我即将找到这种方法的解决方案,但我感觉它可能不是最有效的。因此,我寻求有关替代策略或改进的指导和见解,以有效解决此问题。
感谢您的关注和帮助。
如果我的情况正确,我对此案的处理方法是:
希望这有帮助