如何使用Optaplanner仅对现有有序数据集解决方案评分而不寻找新解
OptaPlanner仅对输入方案评分不求解的实现方法
完全可以实现你要的需求,OptaPlanner原生支持对已有方案做约束校验与评分,不需要启动求解寻优流程。你之前会得到新方案是因为调用了solver.solve()方法,该方法本身就是用来生成优化后的新方案的,换用以下逻辑即可:
操作步骤
- 首先完成你的原始输入方案构造:确保你的规划类实例中,所有被
@PlanningVariable注解的字段都已经赋值为你要校验的初始值,不要留空。 - 初始化
ScoreManager实例:该类是OptaPlanner专门用来做分数计算、约束解释的工具类,不需要启动求解流程。
普通Java环境初始化示例:
如果你是Spring Boot集成OptaPlanner,直接通过// 泛型依次替换为你自己的规划类、使用的分数类型(比如常用的HardSoftScore) ScoreManager<TspSolution, HardSoftScore> scoreManager = ScoreManager.create( SolverFactory.createFromXmlResource("你的solver配置文件路径") );@Autowired注入ScoreManager即可。 - 调用分数解释方法获取结果:
ScoreExplanation<TspSolution, HardSoftScore> scoreExplanation = scoreManager.explainScore(你的原始输入方案实例);
结果获取说明
你需要的所有约束满足情况都可以从ScoreExplanation对象中提取:
- 调用
getScore()方法可以得到当前方案的总评分 - 调用
getConstraintMatchTotalMap()可以得到所有违反约束的列表,包含每个约束的违反次数、对应的扣分值 - 调用
getIndictmentMap()可以得到每个规划实体对应的约束违反详情,方便定位具体是哪条数据触发了约束
注意事项
如果你的原始输入方案中存在未赋值的规划变量,可能会触发分数计算异常,校验前请确认所有规划变量都已按你预期的数值完成赋值。
内容的提问来源于stack exchange,提问作者Rukawaa11
相关产品推荐
相关产品推荐

