Строю VRP-решение на базе optaplanner 7.4.1. с использованием эвристики построения по умолчанию "FIRST_FIT_DECREASING". В ConstructionHeuristicDecider я теперь вижу, что в конце метода chooseNextStep шаг выбирается и передается обратно методу решения DefaultConstructionHeuristicPhase. Все в порядке. Оценка этого шага в порядке, но следующее размещение в цикле решения теперь начинается со счета последнего проверенного хода в цикле ходов DecisionNextStep, а не со счета выбранного хода.
Итак, если на первом этапе был выбран счет «init: -157 / hard: 0 / soft: -2100», он теперь начинает первый расчет на основе последнего проверенного результата (например, «init: -157 / hard: -111 / мягкий: -2200 "). Поскольку оценка инициализации второго шага ниже и жесткое ограничение не затрагивается, в первом вызове addMove метода ConstructionHeuristicDecider добавляется недопустимая оценка (первый ход второго шага вообще не должен иметь жесткой оценки) .
Я думаю, что основная проблема заключается в том, что при вызове "kieSession.fireAllRules ()" в DroolsScoreDirector calculateScore рабочийScoreHolder по-прежнему сохраняет последнюю проверенную, но не принятую оценку с последнего хода предыдущего шага. Есть ли у кого-нибудь идеи, как решить эту проблему?
Дополнительная информация: возможно, другой подход может заключаться в проверке того, не следует ли в doMove ConstructionHeuristicDecider после выполнения undoMove сбрасывать счет до выполнения исходного хода. Насколько я понимаю, подсчет очков за ход явно делается в processmove. После этого рабочий счет не пересчитывается после выполнения хода отмены. Таким образом, оценка и решение в данный момент не синхронизированы.
С уважением, Фрэнк