首页 > 解决方案 > 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 中明确完成的。之后,执行撤消移动后不会重新计算工作分数。所以分数和解决方案在那个时刻是不同步的。

问候, 弗兰克

标签: optaplannerphaseconstruction

解决方案


通过专用的 ScoreCalculator 重建评分,避免我的 CustomShadowVaribleListeners 中可能存在的一些缺陷解决了这个问题


推荐阅读