Optaplanner VRP удаляет клиента из рабочего решения

На основе этого примера из облака проблема балансировки, я пытаюсь удалить клиента из рабочего решения следующим образом:

Location toBeRemovedLocation = customerToBeRemoved.getLocation();
Location lookUpWorkingObject = (Location) scoreDirector.lookUpWorkingObject(toBeRemovedLocation);
scoreDirector.beforeProblemFactRemoved(lookUpWorkingObject);
routingSolution.getLocationList().remove(lookUpWorkingObject);
scoreDirector.afterProblemFactRemoved(lookUpWorkingObject);

Customer workingCustomer=(Customer) scoreDirector.lookUpWorkingObject(customerToBeRemoved);

for (Customer customer : routingSolution.getCustomerList()) {
    nextCustomer=customer.getNextCustomer();
    if (nextCustomer==workingCustomer) {
        scoreDirector.beforeVariableChanged(customer, "nextCustomer");
        customer.setNextCustomer(null);
        scoreDirector.afterVariableChanged(customer, "nextCustomer");
    }
}

scoreDirector.beforeEntityRemoved(workingCustomer);
routingSolution.getCustomerList().remove(workingCustomer);
scoreDirector.afterEntityRemoved(workingCustomer);
scoreDirector.triggerVariableListeners();

В результате у меня получилось вот это исключение:

java.lang.IllegalStateException: сущность (Customer - 6361356485874019865) имеет переменную (previousStandstill) со значением (Customer - 9027426768799526425), которая имеет переменную sourceVariableName (nextCustomer) со значением (null), которое не является этой сущностью. согласованность вашей проблемы ввода для этой переменной sourceVariableName

После этого я попытался также setPreviousStandstill на null:

scoreDirector.beforeVariableChanged(customer, "previousStandstill");
customer.setPreviousStandstill(null);
scoreDirector.afterVariableChanged(customer, "previousStandstill");

Но я получил:

java.lang.IllegalStateException: сущность (Customer - 6361368382933429785) имеет переменную (previousStandstill) со значением (Customer - 9027434800388369945), которая имеет переменную sourceVariableName (nextCustomer) со значением (null), которое не является этой сущностью. согласованность вашей проблемы ввода для этой переменной sourceVariableName.

Нужна помощь, пожалуйста.


person Anahi Adalberto    schedule 20.12.2017    source источник
comment
@Geofrey De Smet   -  person Anahi Adalberto    schedule 20.12.2017


Ответы (1)


Клиенты в VRP привязаны / связаны, если в настоящее время у вас есть цепочка [Customer1, Customer2, Customer3]

- Customer1: nextCustomer = Customer2
- Customer2: nextCustomer = Customer2, prevStandstill = Customer1
- Customer3: prevStandstill = Customer2

и вы пытаетесь удалить из него Customer2, вам нужно исправить как предыдущий, так и следующий элементы:

- Customer1: nextCustomer = Customer3
- Customer2: nextCustomer = null, prevStandstill = null
- Customer3: prevStandStill = Customer1
person grudolf    schedule 21.12.2017