Optaplanner VRP инкрементальный счет - продолжительность тура - PullRequest
0 голосов
/ 05 марта 2019

Я хочу создать вычисление добавочной оценки для VRP, чтобы минимизировать стоимость, где стоимость - это переменная стоимость транспортного средства (долл. США / км) плюс стоимость водителя (долл. США / ч), и у меня также есть жесткое ограничение, которое является общейпродолжительность поездки (8 ч / водитель), (для которой я добавил параметр скорости движения для всего транспортного средства, а также водителя usd / ч).Я уже реализовал это в простом вычислении баллов, но с большим набором данных он должен работать намного больше, чем я хочу, поэтому я попробовал пошаговый способ.

Я попытался просто вставить дополнительные строки в исходный инкремент.оценка счета, но, похоже, не удалось.Поскольку я читаю другие источники, и я думаю, что проблема может быть связана с последовательностью обновлений previousStandstill, vehicle и nextCustomer.Поэтому, когда он обновляет предыдущий стандарт, клиенты иногда еще не добавляют автомобиль, поэтому я не могу сопоставить время вождения (расстояние от предыдущего уровня / скорость движения) с данным транспортным средством.

Я уже проверил, чтов домене Customer есть аннотация @PlanningEntity, а в методе getVehicle - аннотация @AnchorShadowVariable.

Я действительно застрял здесь.Буду признателен за любую помощь.

Обновление: я добавил некоторый код в incrementalScore -> insertPreviousStandstill, чтобы получить транспортное средство предыдущегоStandstill:

        Vehicle vehicle = null;
        Vehicle vehicle2 = null;
        Standstill previousStandstill2 = customer.getPreviousStandstill();
        while (vehicle == null) {
            if (previousStandstill2 instanceof Vehicle) {
                vehicle = previousStandstill2.getVehicle();
            } else {
                Customer customer2 = (Customer) previousStandstill2;
                vehicle2 = customer2.getVehicle();
                if (vehicle2 == null) {
                    previousStandstill2 = customer2.getPreviousStandstill();
                } else {
                    vehicle = vehicle2;
                }
            }
        }
        Long vehicle_varcost = vehicle.getVarCost();
        softScore -= customer.getDistanceFromPreviousStandstill() * vehicle_varcost / 1000;

(также добавлено vehicle_varcost для всехдо и после изменения кода) Работает нормально, пока не будет построена эвристика (я получаю тот же результат с EasyScore), но если впоследствии не получится.

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