Несогласованная цепочка после добавления ProblemFactChange в Ssolution при планировании в реальном времени - PullRequest
0 голосов
/ 13 июля 2020

Я какое-то время работал с optaplanner, но впервые делаю планирование в реальном времени, проблема довольно простая c цепочка VRP со временем windows, но точно знаю, что у меня проблема .

Поработав некоторое время, когда я удаляю некоторые Standstill с помощью последовательности документации (ScoreDirector#beforeEntityRemoved, удаление объекта из списка и обновление sh экземпляра списка, ScoreDirector#afterEntityRemoved, а затем ScoreDirector#triggerVariableListeners) из цепочки, цепочка становится несовместимой, следующая остановка previousStandStill не совпадает с текущей остановкой, а иногда даже null

Но все это происходит только когда я удалил более 2 или 3 Standstill s, если я удалю только 1, он продолжает работать

PD: Об удалении объекта: Я пробовал с удалением и без удаления ссылки на объект из текущей цепочки, но когда я удаляю элемент из цепочка вручную иногда показывает ошибку, сообщающую мне, что ссылки неправильные, но я не понимаю, почему, когда я обнаруживаю, что цепочка несовместима optaplanner не обнаруживает его.

for (int i = 0; i < visitsToRemove.size(); i++) {
    OptimizingVisit visit = visitsToRemove.get( i );
    OptimizingVisit solverReference = scoreDirector.lookUpWorkingObject( visit );
    scoreDirector.beforeEntityRemoved( solverReference );
    solution.getVisits().remove( solverReference ); //working equals method is implemented here
    solution.setVisits( new ArrayList<>( solution.getVisits() ) );
    scoreDirector.afterEntityRemoved( solverReference );
    logger.info( String.format("Order #%s (%s) was removed from the solution",visit.getOrderNumber(),visit.getOrderId()) );
}

Я знаю, что вам, ребята, может понадобиться дополнительная информация, и я дам ее вам по мере необходимости, но я, честно говоря, не знаю, что вам может понадобиться, моя проблема в значительной степени является копией примера с некоторыми идентификаторами для ссылки на объекты моего домена.

Заранее спасибо

1 Ответ

1 голос
/ 14 июля 2020

Недостаточно удалить посещение A из списка visitList. Также нужно удалить A из цепей. Любое посещение B, имеющее ссылку previous, указывающую на A, теперь должно указывать на A. Любое посещение C (= A.previous), для которого C .next указывает на A, теперь должно указывать на A.next (= B).

Это PITA, да. Когда-нибудь упрощение VRP сделает это намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...