OptaPlanner中impactConfigurable约束测试问题求助
OptaPlanner 8.25.0.Final中ImpactConfigurable约束的测试方案
针对impactConfigurable类型约束无法直接用impactsBy()测试的问题,有两个实用解决思路:
方案一:测试时注入约束权重配置
因为impactConfigurable的分值依赖外部配置的权重,你可以在创建ConstraintVerifier时手动指定目标约束的权重,这样就能正常使用impactsBy()验证具体分值。
示例代码:
// 构建自定义约束配置,给目标约束设置对应权重 ConstraintConfiguration constraintConfig = new ConstraintConfiguration(); constraintConfig.setConstraintWeightMap(Map.of( "你的约束包路径.约束名称", HardSoftScore.ofSoft(1) // 若要测试-1则设为HardSoftScore.ofSoft(-1) )); // 创建带配置的ConstraintVerifier ConstraintVerifier<你的Solution类, 你的Entity类> verifier = ConstraintVerifier.build() .withConstraintConfiguration(constraintConfig) .withConstraints(你的约束Provider实例) .build(); // 现在可以正常执行测试 verifier.verifyThat(myConstraint).given(obj1, obj2).impactsBy(1);
方案二:验证约束触发次数而非固定分值
如果不需要测试具体分值,只需要确认约束是否触发、触发几次,可以用matches()方法直接验证匹配次数,或者结合penalizes()/rewards()(适用于明确惩罚/奖励类型的约束)。
示例代码:
// 验证约束触发1次 verifier.verifyThat(myConstraint).given(obj1, obj2).matches(1); // 若约束是惩罚类型,验证惩罚次数 verifier.verifyThat(myConstraint).given(obj1, obj2).penalizes(1);
进阶:通过ConstraintMatch细粒度验证
如果需要更精准的验证,可以获取ConstraintMatchTotal对象,直接检查触发次数和总分值:
ConstraintMatchTotal matchTotal = verifier.verifyThat(myConstraint) .given(obj1, obj2) .getConstraintMatchTotal(); // 验证触发次数 assertEquals(1, matchTotal.getConstraintMatchCount()); // 验证总影响分值(需提前配置好权重) assertEquals(HardSoftScore.ofSoft(1), matchTotal.getScore());
内容的提问来源于stack exchange,提问作者Justin Phillips
相关产品推荐
相关产品推荐

