Оптимизация маршрута с несколькими депо, типами работ и местами назначения
Я новичок в оптимизации маршрутов и буду признателен за помощь в решении следующих бизнес-требований с использованием jsprit. Я получил некоторые отзывы от Стефана Шредера, который помог мне изучить некоторые основы jsprit. Сначала я объясню требования бизнеса, а затем задам несколько вопросов.
Цель состоит в том, чтобы запланировать список работ по техническому обслуживанию, которые должны быть выполнены в течение месяца. Ежедневное расписание должно быть подготовлено на весь месяц. Целью здесь является выполнение максимального количества заданий в день.
- Есть 4 склада каждый в регионе
- Каждый регион имеет около 70 складов на общую сумму 300 складов.
- Расстояния между каждым складом и складами в этом регионе известны
- В каждом регионе 3-4 автомобиля разных типов, всего 12 машин.
- Транспортные средства в пределах региона могут обслуживать только склады в этом регионе
- Транспортные средства в пределах региона имеют ту же начальную точку, которая оказывается конечной точкой
- Транспортные средства не имеют никаких требований по вместимости, вывозу или доставке
- Транспортные средства используются только для перевозки рабочих, которые будут выполнять работы по техническому обслуживанию
- Средняя скорость каждого транспортного средства известна
- Есть около 80 видов работ по техническому обслуживанию
- Каждый тип работы занимает известное количество времени в минутах
- Работа по техническому обслуживанию не должна начинаться в определенное время
- Ежемесячно проводится около 200 работ по техническому обслуживанию.
- Эти работы могут быть на любом складе
- На одном складе в один и тот же день или в другой день может выполняться более одной работы.
- Есть 3 восьмичасовых смены в течение дня. С 6:00 до 22:00, с 14:00 до 22:00 и с 10:00 до 6:00
- Транспортное средство покидает склад в начале смены и в течение восьмичасовой смены посещает как можно больше складов.
- Транспортное средство должно ждать на складе, пока выполняется задание, прежде чем перейти на следующий склад или вернуться на склад.
Насколько я понимаю, задание на обслуживание можно определить как услугу в jsprit и время начала / возврата можно установить для каждого автомобиля. Кроме того, матрица затрат может использоваться для добавления времени и расстояния к отношениям между транспортным средством и складами. У меня есть следующие вопросы:
- Каждое техническое обслуживание должно быть определено как сервис, в результате чего будет 200 сервисных объектов, которые передаются в решатель VRP, верно?
- В VehicleTypeImpl есть методы addCapacityDimension(), setCostPerDistance() и setCostPerTime(). Что именно это и как они применяют вышеупомянутый случай?
- В Service.Builder есть метод addSizeDimension(). Что оно делает?
- У costMatrixBuilder есть метод для добавления TransportDistance и TransportTime. Какие единицы используются этими методами и как я могу их использовать?
- Для каждого депо необходимо определить координату и передать ее в метод setStartLocationCoordinate() для каждого объекта VehicleImpl. Это правильно?
- VehicleBuilder имеет setLatestArrival( double maxDuration); какой блок используется здесь?
Я ценю любую помощь в решении вышеупомянутого случая.
Спасибо адам
EDIT1:
Несколько вопросов
A. Методы setEarliestStart() и setLatestArrival() принимают двойное значение, как я могу указать самый ранний отъезд и последнее прибытие в качестве фактической даты для этих методов? Например, время начала 28 ноября 2014 года в 2 часа дня, а время окончания - 10 часов вечера в тот же день.
B. Есть ли способ указать время обслуживания в минутах?
C. Метод VehicleTypeImpl.Builder.setMaxVelocity(double inMeterPerSeconds) ожидает максимальную скорость, есть ли способ указать среднюю скорость транспортного средства?
D. Все машины должны работать в три смены; значит ли это, что мне придется определять одно и то же транспортное средство три раза, по одному для каждой смены, с различными самыми ранними отправлениями и последним временем прибытия?
E. Так как задания могут выполняться в любое время в течение месяца, будет ли временной интервал для каждого задания передаваться как начало и конец месяца методу Service.Builder.setTimeWindow()?
1 ответ
ad1) правильно
ad2) Если емкость не играет роли, вам не нужно addCapacityDimension(..). если это так, вы можете использовать этот метод для определения произвольного числа измерений вместимости, таких как, например, вес, объем, количество поддонов (которые тогда являются тремя измерениями). С помощью.setCostPerDistance(..) вы устанавливаете - как следует из названия - стоимость единицы расстояния (например, 1€/ км). Соответственно, с помощью.setCostPerTime(..) вы устанавливаете стоимость за единицу времени, например, 20€/ час. Таким образом, если ваш автомобиль / водитель проехал 100 км за 1 час, это будет стоить 100 км * 1 €/ км + 20€/ час * 1 час.
ad3) Услуги могут потреблять мощность в ваших транспортных средствах. Услуга может быть направлена на получение груза на сайте клиента / службы. Он может иметь определенный объем, вес и может быть загружен на определенный номер. поддонов. Это то, что вы определяете с помощью.addCapacityDimension (..)
ad4) Вы определяете единицы. Это должна быть та же самая единица, которую вы принимаете, когда устанавливаете параметры стоимости.
ad5) Верно. Но вам не обязательно координаты. Вам нужен либо locationId, либо координата, но вы можете установить и то, и другое. LocationId должен быть тем же, который вы используете при добавлении ваших отношений времени и расстояния к costMatrix.
ad6) Опять вы определяете единицу.