Строю 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. После этого рабочий счет не пересчитывается после выполнения хода отмены. Таким образом, оценка и решение в данный момент не синхронизированы.
С уважением, откровенный
Изменен с DRL на IncrementalScoreCalculator, и теперь он работает. Скорее всего, у меня был недостаток в одном из моих слушателей CustomVariableListener.





восстановление скоринга с помощью специального ScoreCalculator, избегая, вероятно, некоторых недостатков в моих CustomShadowVaribleListeners, решивших проблему
Что произойдет, если вы включите environmentMode FULL_ASSERT?