如何使用OptaPlanner确定执行任务的设备数量及任务起止时间
OptaPlanner多设备任务调度实现建议
现有代码适配调整
你当前使用的链式规划变量默认仅支持单设备分配逻辑,单个Task实体仅能关联一个锚点DeviceInfo,无法满足同一任务分配多台设备的需求,需根据业务场景选择对应改造方案:
多设备分配方案选择
方案1:集合规划变量(任务不可拆分场景)
如果同一任务的多台设备为并行执行完整任务、无需拆分任务内容,直接在Task类上新增集合规划变量即可,实现逻辑最简洁:
@PlanningEntity(difficultyComparatorClass = TaskDifficultyComparator.class) @Data @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_NULL) public class Task extends TaskOrDevice { // 新增集合规划变量存储分配的设备列表 @PlanningCollectionVariable(valueRangeProviderRefs = "deviceRange") private List<DeviceInfo> assignedDevices; @CustomShadowVariable(variableListenerClass = StartTimeUpdatingVariableListener.class, sources = { @PlanningVariableReference(variableName = "assignedDevices") }) private Long startTime; // 单位:分钟 private Long endTime; private List<DeviceInfo> selectAbleDevices; }
直接通过集合大小即可管控分配的设备数量,无需额外新增实体。
方案2:中间分配实体(任务可拆分场景)
如果任务支持拆分为多个分片、不同设备可各执行部分任务量,新增TaskDeviceAssignment中间规划实体:
@PlanningEntity @Data public class TaskDeviceAssignment { @PlanningVariable(valueRangeProviderRefs = { "deviceRange", "assignmentRange" }, graphType = PlanningVariableGraphType.CHAINED) private TaskOrDevice previousTaskOrDevice; @AnchorShadowVariable(sourceVariableName = "previousTaskOrDevice") private DeviceInfo deviceInfo; // 关联对应的原任务 private Task task; // 当前分片工作量 private Long workload; @CustomShadowVariable(variableListenerClass = StartTimeUpdatingVariableListener.class, sources = { @PlanningVariableReference(variableName = "previousTaskOrDevice") }) private Long startTime; private Long endTime; }
原Task类转为问题事实类,存储任务基础属性、可选设备列表、总工作量等配置。
可选设备范围限制
新增过滤器限制设备可选范围,避免任务被分配到可选清单外的设备:
public class TaskAssignableDeviceFilter implements SelectionFilter<TaskDeviceAssignment, TaskOrDevice> { @Override public boolean accept(ScoreDirector scoreDirector, TaskDeviceAssignment assignment, TaskOrDevice value) { if (value instanceof DeviceInfo device) { return assignment.getTask().getSelectAbleDevices().contains(device); } return true; } }
将过滤器配置到规划变量上即可生效。
核心约束规则配置
硬约束(必须满足)
- 设备同一时间仅能执行一个任务/任务分片
- 任务仅能分配可选清单内的设备
- 单任务分配的设备数量在配置的最小、最大阈值范围内
软约束(优化目标)
- 所有任务总完工时间最小
- 设备总闲置时间最小
- 设备使用总成本最低(如有成本参数)
任务起止时间计算逻辑
- 保留自定义影子变量监听器,每个任务/任务分片的开始时间取前序任务的结束时间
- 同一任务分配多台设备时,任务整体结束时间取所有关联设备执行该任务的结束时间最大值
- 如需多设备协同执行同一任务,可在监听器中增加协同判断逻辑,保证所有设备的执行时间窗口重叠
内容的提问来源于stack exchange,提问作者jiping huang
相关产品推荐
相关产品推荐

