Optaplanner, какие типы перемещений использует эвристическая фаза построения?

#optaplanner

Вопрос:

Поэтому я реализовал пример TWVRP с задержкой до последнего шаблона: https://docs.optaplanner.org/8.6.0.Final/optaplanner-docs/html_single/#chainedThroughTimeAutomaticDelayUntilLast

Мой код выходит из себя, когда две части одной и той же остановки назначаются одному и тому же транспортному средству, поэтому я стараюсь избежать этого с помощью фильтра выбора перемещения. Этот фильтр работает просто отлично, но я все равно попадаю в сценарии, где посещения назначаются таким образом, и я получаю повреждение баллов. Какие еще типы перемещений использует фаза CH по умолчанию, которые мне нужно отфильтровать? Конфигурация моей фазы CH прямо сейчас:

 <constructionHeuristic>
    <constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>
    <changeMoveSelector>
        <filterClass>org.acme.solver.filters.VisitChangeMoveFilter</filterClass>
    </changeMoveSelector>
 </constructionHeuristic>
 

Обновить:

Искажение счета, похоже, происходит во время движения noop (Посещение-мои остановки, Сотрудник-мои якоря). Зачем Optaplanner пробовать такой ход?

     VariableListener corruption after completedAction 
(Visit{id=3743c419-aff3-46c6-969c-4c85cb5656ad,
       arrivalTime=2021-06-03T17:00, 
       linkedVisit =76ba82ef-e146-498a-9fdd-8c51adb2198e,
       previousStop=Employee{id=8d2b8894-a13a-41d6-9def-05b2ac1facf2}} 

{Employee{id=8d2b8894-a13a-41d6-9def-05b2ac1facf2} -> Employee{id=8d2b8894-a13a-41d6-9def-05b2ac1facf2}})
 

Комментарии:

1. Повреждение списка переменных обычно является ошибкой в прослушивателе пользовательских переменных. Вы пользуетесь одним из них? Пожалуйста, поделитесь. В противном случае в вопросе недостаточно информации. Я думаю, что CH использует только движения изменения. Это ожидаемо. Не уверен, чего вы пытаетесь достичь с помощью фильтра. Обычно, если движение делает что-то, что вам «не нравится», вы наказываете это баллом. Если изменение хода приводит к повреждению счета, у вас есть проблема в другом месте.