DefaultConstructionHeuristicPhase - workingScoreHolder 持有未接受移动的无效分数
DefaultConstructionHeuristicPhase - workingScoreHolder holds invalid score of not accepted move
我基于 optaplanner 7.4.1 构建了一个 VRP 解决方案。使用默认构造启发式 "FIRST_FIT_DECREASING"。在我现在可以看到的 ConstructionHeuristicDecider 中,在方法 decideNextStep 的末尾选择了一个步骤并将其交还给 DefaultConstructionHeuristicPhase 的解决方法。一切都很好。这一步的分数没问题,但求解循环中的下一个位置现在开始于 decideNextStep 的移动循环中最后检查的移动的分数,而不是所选移动的分数。
因此,如果在第一步中选择了分数 "init:-157/hard:0/soft:-2100",他现在将根据最后检查的分数(例如 "init:-157/hard:-111/soft:-2200")开始第一次计算。由于第二步的初始分数较低,并且没有触及硬约束,在 ConstructionHeuristicDecider 的第一次 "addMove" 调用中添加了一个无效分数(第二步的第一步不应该有硬分数在全部)。
我认为核心问题是,当在 DroolsScoreDirector calculateScore 中调用 "kieSession.fireAllRules()" 时,workingScoreHolder 仍然持有上次检查但未接受的来自上一步步骤的最后一步的分数。
有人知道如何处理这个问题吗?
附加信息:也许另一种方法可能是在执行 undoMove 之后检查 ConstructionHeuristicDecider 的 doMove 中是否不应该在执行原始移动之前将 workingScoreHolder 重置为分数。据我了解,移动的评分是在 processmove 中明确完成的。之后,在执行撤消操作后不会重新计算工作分数。所以分数和解决方案在那一刻不同步。
此致,
弗兰克
通过专用的 ScoreCalculator 重建得分,避免我的 CustomShadowVaribleListeners 中的一些缺陷可能解决了这个问题
我基于 optaplanner 7.4.1 构建了一个 VRP 解决方案。使用默认构造启发式 "FIRST_FIT_DECREASING"。在我现在可以看到的 ConstructionHeuristicDecider 中,在方法 decideNextStep 的末尾选择了一个步骤并将其交还给 DefaultConstructionHeuristicPhase 的解决方法。一切都很好。这一步的分数没问题,但求解循环中的下一个位置现在开始于 decideNextStep 的移动循环中最后检查的移动的分数,而不是所选移动的分数。
因此,如果在第一步中选择了分数 "init:-157/hard:0/soft:-2100",他现在将根据最后检查的分数(例如 "init:-157/hard:-111/soft:-2200")开始第一次计算。由于第二步的初始分数较低,并且没有触及硬约束,在 ConstructionHeuristicDecider 的第一次 "addMove" 调用中添加了一个无效分数(第二步的第一步不应该有硬分数在全部)。
我认为核心问题是,当在 DroolsScoreDirector calculateScore 中调用 "kieSession.fireAllRules()" 时,workingScoreHolder 仍然持有上次检查但未接受的来自上一步步骤的最后一步的分数。 有人知道如何处理这个问题吗?
附加信息:也许另一种方法可能是在执行 undoMove 之后检查 ConstructionHeuristicDecider 的 doMove 中是否不应该在执行原始移动之前将 workingScoreHolder 重置为分数。据我了解,移动的评分是在 processmove 中明确完成的。之后,在执行撤消操作后不会重新计算工作分数。所以分数和解决方案在那一刻不同步。
此致, 弗兰克
通过专用的 ScoreCalculator 重建得分,避免我的 CustomShadowVaribleListeners 中的一些缺陷可能解决了这个问题