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

OptaPlanner DocYard调度容量约束失效问题排查

约束逻辑错误点

原有约束存在两个核心逻辑缺陷,直接导致容量校验失效:

  • 分组聚合逻辑错误:groupBy(Truck::getDocYard, Truck::getTruckCapacity)的写法是按「堆场+单个卡车容量」做离散分组,没有对分配到同一堆场的卡车容量做累加求和,本质只校验了单台卡车容量不超过堆场容量,完全没覆盖多台卡车总容量超标的场景。比如错误结果中9点档DocYard-A分配的T15、T30单台容量都小于40,原有约束完全不会触发惩罚。
  • 缺失时段分组维度:业务规则要求按单小时时段独立核算堆场容量,就算补全容量求和逻辑,只要没把时段作为分组维度,就会把全天所有时段分配到同一堆场的卡车容量全部累加计算,和业务规则完全不符。
修复后的约束实现

需要补全时段分组维度,同时使用内置求和聚合器计算同分组下的卡车总容量,修复代码如下:

Constraint requiredCapacityConstraint(ConstraintFactory constraintFactory) {
    return constraintFactory.forEach(Truck.class)
            // 按「堆场 + 时段」双维度分组,汇总组内所有卡车的总装载容量
            .groupBy(Truck::getDocYard,
                     Truck::getTimeSlot,
                     ConstraintCollectors.sum(Truck::getTruckCapacity))
            // 筛选出总容量超出堆场单小时处理上限的违规分组
            .filter((docYard, timeSlot, totalCapacity) -> totalCapacity > docYard.getCapacity())
            .penalize("requiredCapacityTotal",
                    HardSoftScore.ONE_HARD,
                    // 惩罚值和超出容量正相关,超出越多惩罚力度越大
                    (docYard, timeSlot, totalCapacity) -> totalCapacity - docYard.getCapacity());
}
修复说明
  • 新增Truck::getTimeSlot分组键后,每个堆场每个时段的卡车分配会独立核算容量,不会出现跨时段累加容量的错误
  • 使用ConstraintCollectors.sum()聚合器后,约束会准确统计同一堆场同一时段下所有卡车的总容量,覆盖多台车总容量超标的违规场景
  • 原有惩罚权重逻辑保留,可引导求解器快速收敛到无硬约束违规的调度方案,你给出的错误结果中T15+T30总45配40容量堆场、T11+T12总23配20容量堆场的违规场景,都会被该约束正确识别并惩罚。

内容的提问来源于stack exchange,提问作者SmlCodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:24:20