DefaultConstructionHeuristicPhase-workingScoreHolder持有未接受移动的



我基于optaplanner 7.4.1构建了一个VRP解决方案。使用默认的构造启发式"FIRST_FIT_DECREASING"。在我现在看到的ConstructionHeuristicDecider中,在方法decideNextStep结束时,选择一个步骤并将其交回DefaultConstructionHeoristicPhase的求解方法。一切都好。这一步的分数是可以的,但求解循环中的下一个位置现在从decideNextStep的移动循环中最后一个检查移动的分数开始,而不是所选移动的分数。

因此,如果在第一步中选择了分数"init:-157/hard:0/soft:-2100",他现在将根据上次检查的分数开始第一次计算(例如"init:-57/hard:-111/soft:-2200"(。由于第二步的init分数较低,并且没有触及硬约束,因此在ConstructionHeuristicDecider的第一个"addMove"调用中添加了一个无效分数(第二步骤的第一步根本不应该有硬分数(。

我认为核心问题是,当在DroolsScoreDirector calculateScore中调用"kieSession.fireAllRules(("时,正在工作的ScoreHolder仍然保留上一步最后一次检查但未接受的分数。有人知道如何处理这个问题吗?

附加信息:也许另一种方法是在执行undoMove后检查ConstructionHeuristicDecider的doMove中,workingScoreHolder是否不应在执行原始移动之前重置为分数。据我所知,移动的得分是在processmove中明确完成的。之后,在执行撤消移动后,工作分数不会重新计算。所以分数和解决方案在那个时刻是不同步的。

谨致问候,Frank

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

相关内容

  • 没有找到相关文章

最新更新