Я новичок в оптимизации маршрутов и буду признателен за вашу помощь в решении следующих бизнес-требований с помощью jsprit. Я получил некоторую обратную связь от Стефана Шредера, который помог мне узнать некоторые основы о jsprit. Сначала я объясню бизнес-требование, а затем задаю несколько вопросов.Оптимизация маршрута с несколькими хранилищами, типами заданий и назначениями
Цель состоит в том, чтобы запланировать список работ по техническому обслуживанию, которые должны быть завершены через месяц. Ежедневный график должен быть подготовлен на весь месяц. Цель здесь - выполнить максимальное количество заданий в день.
- Есть 4 депо каждый из них в регионе
- Каждая область имеет около 70 складов в общей сложности 300 складов
- Расстояния между каждым депо и складами в пределах этой области известно
- Есть 3-4 транспортных средства разных типов в каждом регионе в общей сложности 12 транспортных средств
- Транспортные средства в регионе могут обслуживать только склады в этом регионе
- Транспортные средства в регионе имеют одинаковую начальную точку ч происходит с конечной точкой
- Транспортные средства не имеют, требования пикап или поставки мощности
- Транспортные средства используются только для работников транспорта, которые будут выполнять работы по техническому обслуживанию
- Средняя скорость каждого автомобиля известна
- есть около 80 типов заданий по техническому обслуживанию
- каждого типа задания взять известное количество времени в минутах
- задание технического обслуживания не должно начинаться в определенное время
- на ежемесячной основе, есть Arou й 200 работы по техническому обслуживанию, которые должны быть выполнены
- Эти рабочие места могут быть на любом складе
- Более работа может иметь место в том же складе в тот же день или другой день
- Есть 3 восемь смен в пределах день. 6 AM-2PM, 2 PM-10PM и 10PM до 6AM
- Транспортное средство покидает склад склада в начале смены и посещает столько складов в течение восьмичасовой смены
- Автомобиль должен ждать на складе, пока работа выполняется до перехода на следующий склад или возврата на склад депо.
Основное понимание заключается в том, что задание технического обслуживания может быть определено как услуга в jsprit и что время начала и возврата может быть установлено для каждого средство передвижения. Кроме того, можно использовать матрицу затрат, чтобы добавить время и расстояние к отношениям между транспортным средством и складами. Вопросы, которые у меня есть, следующие:
- Каждое задание на техническое обслуживание должно быть определено как служба, в результате чего будет создано 200 объектов обслуживания, переданных в решатель VRP, правильно?
- У VehicleTypeImpl есть методы addCapacityDimension(), setCostPerDistance() и setCostPerTime(). Что именно они и как они применяют вышеприведенный случай?
- У Service.Builder есть метод addSizeDimension(). Что оно делает?
- В costMatrixBuilder есть метод добавления TransportDistance и TransportTime. Какие единицы используются этими методами и как я могу их использовать?
- Для каждого склада необходимо определить координату и передать метод setStartLocationCoordinate() для каждого VehicleImpl. Это правильно?
- АвтомобильBuilder имеет setLatestArrival (double maxDuration); какой блок используется здесь?
Я действительно ценю любую помощь в решении вышеуказанного случая.
Спасибо, Адам
EDIT1:
Несколько вопросов
А. setEarliestStart() и setLatestArrival() методы принимает двойное значение, как я могу указать самый ранний вылет и последний приезд как фактическая дата для этих методов? Например, время начала - 28 ноября 2014 года в 2 вечера, а время окончания - 10 вечера в тот же день.
B. Есть ли способ указать время обслуживания в минутах?
C. Метод VehicleTypeImpl.Builder.setMaxVelocity (double inMeterPerSeconds) рассчитывает максимальную скорость, есть ли способ указать среднюю скорость транспортного средства?
D. Все транспортные средства должны работать в три смены; означает ли это, что мне придется определить один и тот же автомобиль три раза, по одному на каждую смену с самым ранним отъездом и последним временем прибытия?
E. Поскольку задания могут выполняться в любое время в течение месяца, будет ли передано окно времени для каждого задания в начале и в конце месяца для метода Service.Builder.setTimeWindow()?
Большое спасибо Stefan. Я ценю вашу помощь. Не могли бы вы подробнее рассказать о том, как можно определить единицы? Как jsprit знает, что расстояния находятся в км, время в минутах и средняя скорость в км/ч?Я посмотрел исходный код и задал несколько вопросов (опубликовано выше с исходным вопросом) – Adam
Предполагаю, что вы используете этот https://github.com/jsprit/jsprit/blob/master/jsprit-core/src/main/ java/jsprit/core/util/VehicleRoutingTransportCostsMatrix.java, чтобы определить время транспортировки и расстояния. Затем вы должны знать, какую дистанционную единицу вы положили в свою матрицу. Если вы используете km, ваш параметр стоимости на расстояние должен также использовать km, например. 10 €/км, следовательно .setCostPerDistance (10). Если вы используете m, ваш параметр затрат должен определять затраты на м, например. 0,01 €/м, следовательно .setCostPerDistance (0,01). –
Да, вы правы. Я использую VehicleRoutingTransportCostsMatrix для определения времени и расстояния транспорта. Есть ли способ указать самый ранний вылет и последнее прибытие транспортных средств и временное окно рабочих мест с использованием фактических значений даты? Я планирую использовать методы setEarliestStart(), setLatestArrival() и setTimeWindow(), которые принимают только двойные значения. Еще раз спасибо Stefan, я ценю вашу помощь :) – Adam