我基于optaplanner 7.4.1构建了VRP解决方案。使用默认构造试探法“ FIRST_FIT_DECREASING”。现在,我可以在ConstructionHeuristicDecider中看到,在方法defineNextStep的最后,选择了一个步骤,并交给了DefaultConstructionHeuristicPhase的求解方法。一切都很好。该步骤的分数是可以的,但是现在在solve循环中的下一个位置是从defineNextStep的移动循环中最后检查的移动的分数开始的,而不是所选移动的分数。
因此,如果在第一步中选择了分数“ init:-157 / hard:0 / soft:-2100”,那么他现在将根据上次检查的分数开始进行首次计算(例如“ init:-157 / hard :-111 / soft:-2200“)。由于第二步的初始得分较低,并且没有碰到任何硬约束,因此在ConstructionHeuristicDecider的第一个“ addMove”调用中添加了无效得分(第二步的第一步完全没有硬得分)
我认为核心问题是这样的事实,即在DroolsScoreDirector的calculateScore中调用“ kieSession.fireAllRules()”时,workingScoreHolder仍保留上一次检查的分数,但不接受previos步骤的最后一步。 有谁知道如何解决这个问题?
其他信息:也许另一种方法可能是在执行undoMove之后检查是否在ConstructionHeuristicDecider的doMove中,在执行原始移动之前不应将workingScoreHolder重置为得分。据我了解,这一举动显然是在流程中完成的。之后,执行撤消移动后将不重新计算工作得分。因此,评分和解决方案在当时不同步。
关于, 弗兰克
答案 0 :(得分:0)
通过专用的ScoreCalculator重建得分,避免了我的CustomShadowVaribleListeners中的某些缺陷,从而解决了该问题