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
相关产品推荐
相关产品推荐

