2014-11-25 2 views
2

Я новичок в оптимизации маршрутов и буду признателен за вашу помощь в решении следующих бизнес-требований с помощью jsprit. Я получил некоторую обратную связь от Стефана Шредера, который помог мне узнать некоторые основы о jsprit. Сначала я объясню бизнес-требование, а затем задаю несколько вопросов.Оптимизация маршрута с несколькими хранилищами, типами заданий и назначениями

Цель состоит в том, чтобы запланировать список работ по техническому обслуживанию, которые должны быть завершены через месяц. Ежедневный график должен быть подготовлен на весь месяц. Цель здесь - выполнить максимальное количество заданий в день.

  • Есть 4 депо каждый из них в регионе
  • Каждая область имеет около 70 складов в общей сложности 300 складов
  • Расстояния между каждым депо и складами в пределах этой области известно
  • Есть 3-4 транспортных средства разных типов в каждом регионе в общей сложности 12 транспортных средств
  • Транспортные средства в регионе могут обслуживать только склады в этом регионе
  • Транспортные средства в регионе имеют одинаковую начальную точку ч происходит с конечной точкой
  • Транспортные средства не имеют, требования пикап или поставки мощности
  • Транспортные средства используются только для работников транспорта, которые будут выполнять работы по техническому обслуживанию
  • Средняя скорость каждого автомобиля известна
  • есть около 80 типов заданий по техническому обслуживанию
  • каждого типа задания взять известное количество времени в минутах
  • задание технического обслуживания не должно начинаться в определенное время
  • на ежемесячной основе, есть Arou й 200 работы по техническому обслуживанию, которые должны быть выполнены
  • Эти рабочие места могут быть на любом складе
  • Более работа может иметь место в том же складе в тот же день или другой день
  • Есть 3 восемь смен в пределах день. 6 AM-2PM, 2 PM-10PM и 10PM до 6AM
  • Транспортное средство покидает склад склада в начале смены и посещает столько складов в течение восьмичасовой смены
  • Автомобиль должен ждать на складе, пока работа выполняется до перехода на следующий склад или возврата на склад депо.

Основное понимание заключается в том, что задание технического обслуживания может быть определено как услуга в jsprit и что время начала и возврата может быть установлено для каждого средство передвижения. Кроме того, можно использовать матрицу затрат, чтобы добавить время и расстояние к отношениям между транспортным средством и складами. Вопросы, которые у меня есть, следующие:

  1. Каждое задание на техническое обслуживание должно быть определено как служба, в результате чего будет создано 200 объектов обслуживания, переданных в решатель VRP, правильно?
  2. У VehicleTypeImpl есть методы addCapacityDimension(), setCostPerDistance() и setCostPerTime(). Что именно они и как они применяют вышеприведенный случай?
  3. У Service.Builder есть метод addSizeDimension(). Что оно делает?
  4. В costMatrixBuilder есть метод добавления TransportDistance и TransportTime. Какие единицы используются этими методами и как я могу их использовать?
  5. Для каждого склада необходимо определить координату и передать метод setStartLocationCoordinate() для каждого VehicleImpl. Это правильно?
  6. АвтомобильBuilder имеет setLatestArrival (double maxDuration); какой блок используется здесь?

Я действительно ценю любую помощь в решении вышеуказанного случая.

Спасибо, Адам

EDIT1:

Несколько вопросов

А. 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) Опять же, вы определяете устройство.

+0

Большое спасибо Stefan. Я ценю вашу помощь. Не могли бы вы подробнее рассказать о том, как можно определить единицы? Как jsprit знает, что расстояния находятся в км, время в минутах и ​​средняя скорость в км/ч?Я посмотрел исходный код и задал несколько вопросов (опубликовано выше с исходным вопросом) – Adam

+0

Предполагаю, что вы используете этот 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). –

+0

Да, вы правы. Я использую VehicleRoutingTransportCostsMatrix для определения времени и расстояния транспорта. Есть ли способ указать самый ранний вылет и последнее прибытие транспортных средств и временное окно рабочих мест с использованием фактических значений даты? Я планирую использовать методы setEarliestStart(), setLatestArrival() и setTimeWindow(), которые принимают только двойные значения. Еще раз спасибо Stefan, я ценю вашу помощь :) – Adam

Смежные вопросы