切换至BAVET时含可空规划变量实体的异常行为咨询
OptaPlanner 8.36.0.Final中DROOLS与BAVET约束流实现的行为差异问题
场景背景
- 使用OptaPlanner 8.36.0.Final版本
Ewe是带有可空规划变量Ram的PlanningEntity,现有100只Ewe,需求是为其中50至75只分配Ram
约束代码
return constraintFactory .forEach(Ewe.class) .groupBy(ConstraintCollectors.count()) .penalize(level, (count) -> { return activeRange.check(count); } ) .asConstraint(name);
该约束用于对分配Ram的Ewe数量不足50或超过75的情况施加惩罚。
不同约束流实现的表现
DROOLS实现(ConstraintStreamImplType.DROOLS)
表现符合预期:约束会正常评估分配数量是否在50-75范围内,对不符合条件的情况施加惩罚。
BAVET实现(ConstraintStreamImplType.BAVET)
行为异常:求解器结束时无任何Ewe被分配Ram,得分为零(即选择了无分配的解决方案),且该约束未被评估。
疑问
仅切换两种ConstraintStream实现类型、未做其他变更的情况下,验证出以下差异:
- DROOLS会在匹配实体数量为零时评估约束
- BAVET在匹配实体数量为零时不会评估约束
最终需求是即使计数为零也要统计条目,请问该差异是否为预期行为?
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

