Подход
Попытка реализовать повторное планирование, выполнив следующие шаги:
Запустите решатель с начальными входными данными и дайте ему поработать некоторое время
Завершить решатель - перед завершением сохраните наилучшее решение в ScoreDirectorFactory.buildScoreDirector ()
Добавление новых клиентов с использованием экземпляра solver.addProblemFactChange (AddCustomerProblemFactChange instance)
Соблюдается руководство по оптаплане 7.10, раздел 16.5.1 для захода на посадку.Мы используем чрезмерно ограниченное планирование в нашем проекте
Код
Метод завершения (с помощью вызова покоя):
VehicleRoutingSolution sol = solver.getBestSolution();
scoreDirectorFactory = solver.getScoreDirectorFactory();
director = scoreDirectorFactory.buildScoreDirector();
director.setWorkingSolution(sol);
solver.terminateEarly();
CustomerList - Список клиентов, которых я хочу добавить после решателя
for (Customer customer : customerList) {
AddCustomerProblemFactChange add = new
AddCustomerProblemFactChange(customer);
solver.addProblemFactChange(add);
}
if (!solver.isSolving()) {
VehicleRoutingSolution solution = solver.solve(director.getWorkingSolution());
}
AddCustomerProblemFactChange
public class AddCustomerProblemFactChange implements ProblemFactChange<VehicleRoutingSolution> {
private Customer customer;
public AddCustomerProblemFactChange1(Customer customer) {
this.customer = customer;
}
@Override
public void doChange(ScoreDirector<VehicleRoutingSolution> scoreDirector) {
VehicleRoutingSolution solution = scoreDirector.getWorkingSolution();
solution.setCustomerList( new ArrayList<>(solution.getCustomerList()));
//solution.buildConnectedCustomer(this.distances, this.customer);
scoreDirector.beforeEntityAdded(customer);
solution.getCustomerList().add(customer);
scoreDirector.afterEntityAdded(customer);
scoreDirector.triggerVariableListeners();
}
}
Журналы
13:31:01.738 [-8080-exec-7] INFO Solving restarted: time spent (3), best score (-1init/0hard/0medium/-39840000soft), environment mode (REPRODUCIBLE), random (JDK with seed 0).
13:31:01.749 [-8080-exec-7] DEBUG CH step (0), time spent (14), score (0hard/-70medium/-39840000soft), selected move count (11), picked move (TimeWindowedCustomer-123{null -> Vehicle-2}).
Вопрос
Проблема с вышеуказанным подходом заключается в добавлении новых клиентов, новыхдобавленная сущность всегда присваивается слишком ограниченному объекту (Vehicle-2).Я не могу понять, как optalanner выбирает Vehicle для назначения клиенту на этапе эвристики строительства.