You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:45:03