Оптимизация маршрута с использованием нескольких станций, типов работ и пунктов назначения

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

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

  • В регионе по 4 депо.
  • В каждом регионе около 70 складов, всего 300 складов.
  • Известны расстояния между каждым складом и складами в этом регионе.
  • В каждом регионе есть 3-4 машины разных типов, всего 12 машин.
  • Транспортные средства в пределах региона могут обслуживать склады только в этом регионе.
  • Транспортные средства в пределах региона имеют одну и ту же начальную точку, которая является конечной точкой.
  • Транспортные средства не имеют требований к вместимости, пикапу или доставке.
  • Транспортные средства используются только для перевозки рабочих, которые будут выполнять работы по техническому обслуживанию.
  • Известна средняя скорость каждого транспортного средства.
  • Существует около 80 типов работ по техобслуживанию.
  • Каждый тип работы занимает известное количество времени в минутах.
  • Работы по техническому обслуживанию необязательно начинать в определенное время.
  • Ежемесячно необходимо выполнять около 200 работ по техническому обслуживанию.
  • Эти вакансии могут быть на любом складе
  • На одном складе в один и тот же день или в разные дни может выполняться более одной работы.
  • В течение дня работают 3 восьмичасовые смены. С 6:00 до 14:00, с 14:00 до 22:00 и с 22:00 до 6:00
  • Автомобиль покидает склад депо в начале смены и посещает столько же складов в течение восьмичасовой смены.
  • Транспортное средство должно ждать на складе, пока выполняется работа, прежде чем переехать на следующий склад или вернуться на склад депо.

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

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

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

Спасибо Адам

РЕДАКТИРОВАТЬ1:

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

A. Методы setEarliestStart () и setLatestArrival () принимают двойное значение, как я могу указать для этих методов самое раннее отправление и последнее прибытие в качестве фактической даты? Например, время начала - 14:00 28 ноября 2014 г., а время окончания - 22:00 того же дня.

Б. Есть ли способ указать время обслуживания в минутах?

C. Метод VehicleTypeImpl.Builder.setMaxVelocity (double inMeterPerSeconds) ожидает максимальной скорости. Есть ли способ указать среднюю скорость транспортного средства?

D. Все автомобили должны работать в три смены; Означает ли это, что мне придется определять одно и то же транспортное средство три раза, по одному для каждой смены с различным временем самого раннего отправления и самым поздним прибытием?

E. Поскольку задания могут выполняться в любое время в течение месяца, будет ли временное окно для каждого задания передаваться как начало и конец месяца методу Service.Builder.setTimeWindow ()?


person Adam    schedule 25.11.2014    source источник


Ответы (1)


ad1) правильно

ad2) Если емкость не играет роли, вам не нужно addCapacityDimension (..). если это так, вы можете использовать этот метод для определения произвольного количества размеров емкости, таких как, например, вес, объем, количество поддонов (которые тогда являются тремя измерениями). С помощью .setCostPerDistance (..) вы устанавливаете - как следует из названия - стоимость единицы расстояния (например, 1 евро / км). Соответственно, с помощью .setCostPerTime (..) вы устанавливаете затраты на единицу времени, например 20 € / час. Таким образом, если ваш автомобиль / водитель проехал 100 км за 1 час, это будет стоить 100 км * 1 евро / км + 20 евро / час * 1 час.

ad3) Службы могут потреблять емкость ваших транспортных средств. Услуга может быть связана с доставкой груза на сайте клиента / обслуживания. Он может иметь определенный объем, вес и его можно загружать на определенный номер. поддонов. Это то, что вы определяете с помощью .addCapacityDimension (..)

ad4) Вы определяете единицы. Это должна быть та же единица, как вы предполагаете, задавая параметры стоимости.

ad5) Правильно. Но координаты необязательно. Вам либо нужен locationId, либо координата, но вы можете установить и то, и другое. LocationId должен быть тем же, что и при добавлении отношений времени и расстояния в costMatrix.

ad6) Опять же, вы определяете блок.

person Stefan Schröder    schedule 26.11.2014
comment
Большое спасибо, Стефан. Я очень ценю вашу помощь. Не могли бы вы подробнее рассказать о том, как можно определять единицы? Как jsprit узнает, что расстояния указаны в км, время - в минутах, а средняя скорость - в км / ч? Я просмотрел исходный код и у меня есть несколько вопросов (опубликовано выше с исходным вопросом) - person Adam; 27.11.2014
comment
Я предполагаю, что вы используете этот github.com/jsprit/jsprit/blob/master/jsprit-core/src/main/java/, чтобы определить время и расстояние транспортировки. Затем вы должны знать, какую единицу расстояния вы поместили в свою матрицу. Если вы используете км, ваш параметр стоимости за расстояние также должен использовать км, например 10 € / км отсюда .setCostPerDistance (10). Если вы используете m, ваш параметр затрат должен определять затраты на m, например 0,01 € / м, следовательно .setCostPerDistance (0,01). - person Stefan Schröder; 27.11.2014
comment
Да, ты прав. Я использую VehicleRoutingTransportCostsMatrix для определения времени и расстояния транспортировки. Есть ли способ указать самое раннее отправление и самое позднее прибытие транспортных средств и временной интервал выполнения заданий с использованием фактических значений даты? Я планирую использовать методы setEarliestStart (), setLatestArrival () и setTimeWindow (), которые принимают только двойные значения. Еще раз спасибо, Стефан, я очень ценю вашу помощь :) - person Adam; 30.11.2014
comment
Потратив часы на чтение кода, я обнаружил, что класс Time может обрабатывать следующий формат: чч: мм: сс {AM | PM}. Есть ли способ указать день / месяц / год вместе с чч: мм: сс {AM | PM}? Временное окно для некоторых работ обычно составляет несколько дней, а в некоторых случаях 3-4 недели. - person Adam; 30.11.2014