能否同时设置并使用ConstraintProvider与ScoreCalculator?解决方案求助
问题:能否同时设置并使用ConstraintProvider与ScoreCalculator?
在OptaPlanner中同时配置ConstraintProvider和EasyScoreCalculator时抛出异常,代码如下:
ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig(); scoreDirectorFactoryConfig.setConstraintProviderClass(VehicleRoutingConstraintProvider.class); scoreDirectorFactoryConfig.setInitializingScoreTrend("ONLY_DOWN"); scoreDirectorFactoryConfig.setEasyScoreCalculatorClass(VRPScoreCalculator.class); solverConfig.setScoreDirectorFactoryConfig(scoreDirectorFactoryConfig);
异常核心信息:
java.lang.IllegalArgumentException: The scoreDirectorFactory cannot have an easyScoreCalculatorClass and a constraintProviderClass together.
解决方案
OptaPlanner中这两种评分实现方式是互斥的,只能选择其一,以下是两种可行处理方式:
将ScoreCalculator逻辑迁移到ConstraintProvider(推荐)
ConstraintProvider基于ConstraintStream API,是OptaPlanner官方推荐的现代评分方案,支持增量计算,性能远优于全量计算的EasyScoreCalculator。把VRPScoreCalculator中的所有评分规则,用ConstraintStream语法重写到VehicleRoutingConstraintProvider里,之后仅保留ConstraintProvider的配置即可:ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig(); scoreDirectorFactoryConfig.setConstraintProviderClass(VehicleRoutingConstraintProvider.class); scoreDirectorFactoryConfig.setInitializingScoreTrend("ONLY_DOWN"); solverConfig.setScoreDirectorFactoryConfig(scoreDirectorFactoryConfig);保留ScoreCalculator,移除ConstraintProvider配置
如果暂时无法重构评分逻辑,可以移除setConstraintProviderClass的调用,仅保留EasyScoreCalculator的配置。但注意这种方式在求解大规模问题时,评分计算性能会显著下降:ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig(); scoreDirectorFactoryConfig.setInitializingScoreTrend("ONLY_DOWN"); scoreDirectorFactoryConfig.setEasyScoreCalculatorClass(VRPScoreCalculator.class); solverConfig.setScoreDirectorFactoryConfig(scoreDirectorFactoryConfig);
内容的提问来源于stack exchange,提问作者Vasavi Bodala
相关产品推荐
相关产品推荐

