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

Optapy中Less_than_8_workhours约束报错问题求助

问题分析与修复方案

错误原因

你的less_than_8_workhours约束存在两处关键问题:

  • 遍历单个对象导致报错:在filter逻辑中,你尝试遍历schedule2(单个Schedule实例),但Schedule并非可迭代对象,这直接引发了约束评估异常。
  • 逻辑不符合需求:原代码通过join关联同操作员同日的Schedule,再尝试统计数量,但这种方式会产生重复匹配(比如A和B两个Schedule会被匹配两次:A-B、B-A),且统计逻辑完全错误。

正确约束实现

你的需求是统计同一操作员当日的Schedule数量,若少于4个则违反硬约束,应使用groupBy进行分组统计,这是OptaPlanner处理聚合统计的标准方式:

def less_than_8_workhours(constraint_factory: ConstraintFactory):
    return constraint_factory \
        .from_(Schedule) \
        # 按操作员和日期分组,同时统计每组的Schedule数量
        .groupBy(
            lambda schedule: schedule.operator,
            lambda schedule: schedule.today_date,
            constraint_factory.count()
        ) \
        # 筛选出当日Schedule数量不足4的操作员分组
        .filter(lambda operator, date, count: count < 4) \
        # 对每个不符合要求的分组施加硬惩罚
        .penalize("At least 8 Workhours a day", HardSoftScore.ONE_HARD)

额外说明

  • 每个Timeslot时长2小时,4个Timeslot刚好满足8小时工作时长,因此统计数量小于4触发约束的逻辑是合理的。
  • 使用groupBy进行聚合统计,既避免了重复计算问题,也符合OptaPlanner的约束建模规范,性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:46:01