optaplanner - DefaultConstructionHeuristicPhase - workingScoreHolder 持有不接受移动的无效分数
问题描述
我基于 optaplanner 7.4.1 构建了一个 VRP 解决方案。使用默认构造启发式“FIRST_FIT_DECREASING”。在我现在可以看到的ConstructionHeuristicDecider中,在decisionNextStep方法结束时,选择了一个步骤并将其返回给DefaultConstructionHeuristicPhase的solve方法。一切都好。这一步的得分是可以的,但是在求解循环中的下一个位置现在从decisionNextStep的移动循环中最后检查的移动的得分开始,而不是选择的移动的得分。
因此,如果在第一步中选择了分数“init:-157/hard:0/soft:-2100”,他现在将根据最后检查的分数开始第一次计算(例如“init:-157/hard:-111” /软:-2200”)。由于第二步的初始分数较低,并且没有触及硬约束,因此在 ConstructionHeuristicDecider 的第一个“addMove”调用中添加了一个无效分数(第二步的第一步根本不应该有硬分数) .
我认为核心问题是这样一个事实,即在 DroolsScoreDirector calculateScore 中调用“kieSession.fireAllRules()”时,workingScoreHolder 仍然保留最后检查的,但不接受上一步最后一步的分数。有谁知道如何处理这个问题?
附加信息:也许另一种方法可能是在执行undoMove之后检查ConstructionHeuristicDecider的doMove中是否不应该将workingScoreHolder重置为执行原始移动之前的分数。据我了解,移动的评分是在 processmove 中明确完成的。之后,执行撤消移动后不会重新计算工作分数。所以分数和解决方案在那个时刻是不同步的。
问候, 弗兰克
解决方案
通过专用的 ScoreCalculator 重建评分,避免我的 CustomShadowVaribleListeners 中可能存在的一些缺陷解决了这个问题
推荐阅读
- python - 替换数组中值的最快方法
- javascript - Swagger..无法呈现此定义 提供的定义未指定有效的版本字段
- javascript - RxJS 中的自我修复错误处理
- javascript - DraftJs:如何插入其中包含链接的 html?
- python - 熊猫在某些字符之前和之后删除文本
- java - JPA 基于另一个键自动生成复合键
- javafx - 我将我的项目 javafx 转换为 gradle
- node.js - Mongoose:如何根据日期对 Json 数组进行排序
- javascript - 无法从组件访问 props 字段
- r - R:使用if条件替换数据框的值并应用