Удалить автомобиль из VRP

Как правильно удалить (= удалить) автомобиль из коллекции сущности планирования (аналогично VehicleRoutingSolution.VehicleList в примерах VRP OptaPlanner) через ProblemFactChange?

До сих пор я пытался

  • сбросить следующий клиент перед удалением автомобиля
  • сбросить следующийКлиент на автомобиль и превзойти его первого клиента
  • сделать то же самое для всех прикованных клиентов на транспортном средстве
  • перебор через список клиентов

Я получаю IllegalStateException либо из-за несоответствия между prevStandstill и nextCustomer, либо из-за сбоя фазы локального поиска с неинициализированным решением.

Изменить: перемещение первого клиента в цепочке на другой автомобиль, кажется, работает нормально.

Редактировать 2

Я попытался сбросить всех клиентов в цепочке с помощью этого фрагмента

Customer customer = vehicle.getNextCustomer();
while(customer!=null)
{
    Customer nextCustomer = customer.getNextCustomer();
    scoreDirector.beforeVariableChanged(customer, "previousStandstill");    //Exception on second customer
    customer.setPreviousStandstill(null);
    scoreDirector.afterVariableChanged(customer, "previousStandstill");
    scoreDirector.beforeVariableChanged(customer, "nextCustomer");
    customer.setNextCustomer(null);
    scoreDirector.afterVariableChanged(customer, "nextCustomer");
    customer.setVehicle(null);
    customer=nextCustomer;
}

но я получаю удар с IllegalStateException при втором проходе через цикл

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: The entity (CUST39(after CUST39)) has a variable (previousStandstill) with value (CUST39(after null)) which has a sourceVariableName variable (nextCustomer) with a value (null) which is not that entity.
Verify the consistency of your input problem for that sourceVariableName variable.
    at org.optaplanner.core.impl.domain.variable.inverserelation.SingletonInverseVariableListener.retract(SingletonInverseVariableListener.java:82)
    at org.optaplanner.core.impl.domain.variable.inverserelation.SingletonInverseVariableListener.beforeVariableChanged(SingletonInverseVariableListener.java:44)
    at org.optaplanner.core.impl.domain.variable.listener.VariableListenerSupport.beforeVariableChanged(VariableListenerSupport.java:145)
    at org.optaplanner.core.impl.score.director.AbstractScoreDirector.beforeVariableChanged(AbstractScoreDirector.java:257)
    at org.optaplanner.core.impl.score.director.AbstractScoreDirector.beforeVariableChanged(AbstractScoreDirector.java:228)

Это кажется очевидным (состояние недопустимо, потому что первый клиент отсоединен от второго, а второй все еще указывает на первого), но я не знаю, каков правильный маршрут;) вокруг него.

это

    Customer nextCustomer = customer.getNextCustomer();
    customer.setPreviousStandstill(null);
    customer.setNextCustomer(null);
    scoreDirector.beforeVariableChanged(customer, "previousStandstill");
    scoreDirector.beforeVariableChanged(customer, "nextCustomer");
    scoreDirector.afterVariableChanged(customer, "nextCustomer");
    scoreDirector.afterVariableChanged(customer, "previousStandstill");

Кажется, работает - CH уволен для каждого из удаленных клиентов, количество ходов верно, EasyScore работает, и исключение избегается. Но разве это плохо?

1 ответ

Решение

Сделайте все это:

  • В то время как каждый следующий клиент этого автомобиля, установить previousStandstill (= VAR) на ноль, и это nextCustomer (= обратная тень var) также на ноль, и это vehicle (= якорная тень var) также на нуле.
  • Удалить автомобиль из списка транспортных средств решения

Обязательно вызывайте методы before/after соответствующим образом.

Клиенты этого транспортного средства будут тогда неинициализированы, и CH решателя инициализирует их.

Другие вопросы по тегам