在Timefold自定义阶段中能否访问分数计算功能?
在Timefold自定义初始阶段中访问分数计算的简便方法
更新分数的正确姿势
你碰到scoreDirector.getWorkingSolution().getScore()不更新的问题,核心是修改工作解后没触发分数重算。每次手动修改解的内容后,必须调用scoreDirector.calculateScore(),之后拿到的分数就是最新的。代码示例:// 修改工作解的逻辑 scoreDirector.calculateScore(); Score latestScore = scoreDirector.getWorkingSolution().getScore();要是你用
scoreDirector.doMove(Move)来执行移动操作,ScoreDirector会自动帮你算分,不用手动调用上面的方法。别用ConstraintVerifier做运行时评分
ConstraintVerifier是给单元测试用的,它会单独创建解的副本和评分环境,没法复用当前阶段的ScoreDirector状态,所以拿不到和当前工作解匹配的实际分数,完全不适合在自定义阶段里用。更高效的复用内置机制
如果你是在做自定义构造启发式阶段,直接用Timefold提供的扩展点更省心:- 继承
AbstractConstructionHeuristicPhase,通过getScoreDirector()拿到当前的ScoreDirector实例。 - 执行移动优先用
scoreDirector.doMove(Move),它会自动处理解修改、分数更新,还支持撤销。 - 要随机选最优移动的话,可以先收集候选移动,对每个移动执行后调用
scoreDirector.calculateScore()拿到分数,再给高分移动设置更高的选中概率就行。
- 继承
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

