На этой странице описан жизненный цикл плана маршрута с использованием API оптимизации маршрутов, начиная с определения потребностей в маршрутизации и заканчивая интегрированным планом маршрута в вашей системе.
Следуя этапам плана маршрута, вы можете достичь следующих целей:
- Сопоставьте операции автопарка. Переведите данные о физическом автопарке, сложных ограничениях и бизнес-целях в код для API.
- Оптимизация планов маршрутов для вашего бизнеса. Узнайте, как улучшить план маршрута, чтобы он соответствовал вашим целям и повышал эффективность повседневной работы.
- Развертывание в рабочей среде. Внедрите план маршрутов в повседневную работу.
На схеме ниже показан жизненный цикл плана маршрута.
Этап реализации плана маршрута происходит при первой интеграции API или при значительном изменении бизнес-требований. Она охватывает этапы с 1 по 5.
Этап повседневной работы менее трудоемкий, и доработка минимальна. Она охватывает этапы со второго по четвертый.
Жизненный цикл маршрута состоит из следующих этапов:
- Определите масштаб проблемы. Прежде чем начать работу с API, определите и систематизируйте свои цели, ресурсы, задачи и ограничения, чтобы получить полное представление о своих операциях.
- Сопоставьте данные. Преобразуйте информацию о вашем бизнесе в параметры API, чтобы план маршрута соответствовал вашим требованиям к работе автопарка.
- Создайте запрос и получите план маршрута. Введите данные в API и получите оптимизированный план маршрута.
- Уточните план маршрута. Протестируйте план маршрута и доработайте его, скорректировав ограничения и цели, чтобы он соответствовал всем вашим потребностям.
- Интегрируйте план маршрута. Подключите план маршрута к существующим системам, чтобы обеспечить навигацию.
Определите масштаб проблемы
Прежде чем использовать API, вам нужно распределить сведения о повседневных операциях по категориям данных. Это позволит вам начать процесс внедрения с чётким пониманием того, каковы ваши текущие ресурсы и задачи, что их ограничивает и каких целей вы хотите достичь с помощью своего автопарка.
Определите ресурсы и задачи
Важный этап планирования маршрута – определение ресурсов и задач, то есть транспортных средств и грузов.
| Транспортные средства | отправки; |
|---|---|
|
|
Определите ограничения
Ограничения – это лимиты и правила, касающиеся использования транспортных средств и обработки грузов. Они определяют большую часть ваших операций и жизненно важны при создании оптимизированного плана маршрута.
Ограничения обычно делятся на две категории:
| Жесткие ограничения | Мягкие ограничения |
|---|---|
| Эти ограничения нельзя нарушать. Например, грузовик не может перевозить больше груза, чем позволяет его грузоподъемность, а водитель не может забрать товар после закрытия магазина. | Это предпочтения, которые при необходимости можно нарушить, обычно за дополнительную плату. Например, вы можете предпочитать загружать грузовик только на 80% или доставлять груз до определенного времени, но при этом допускать превышение этих ограничений, чтобы получить более оптимальный маршрут. |
Вот некоторые из них:
- Ограничения по вместимости. Максимальный вес, объем или количество товаров, которые может перевозить транспортное средство.
- Временные окна. Конкретные временные интервалы, когда местоположение открыто для посещения, или конкретные часы смены водителя.
- Расходы. Стоимость эксплуатации транспортного средства или пропуска доставки. Одна из основных целей API – создать экономически эффективный план маршрута.
- Перерывы водителя. Периоды отдыха водителя, которые обычно требуются по трудовому законодательству после определенного количества рабочих часов.
Определите бизнес-цели
После того, как вы определите свои ресурсы и задачи и их ограничения, пришло время определить, какие показатели наиболее важны для вашего бизнеса. Цели связаны с ограничениями и помогают определить, что наиболее важно при планировании маршрута.
Вот несколько примеров бизнес-целей:
| Объем парка | Расстояние | Время | Стоимость |
|---|---|---|---|
| Вы хотите минимизировать количество используемых транспортных средств или задействовать весь автопарк, чтобы закончить рабочий день раньше? | Вы хотите выбрать самый короткий путь, чтобы сэкономить топливо, или предпочитаете более быстрый маршрут, который может быть длиннее из-за использования автомагистралей? | Вы хотите минимизировать общее количество рабочих часов или сделать приоритетом прибытие в определенное время, что может увеличить время в пути? | Хотите ли вы минимизировать операционные расходы, такие как заработная плата и топливо, или готовы принять более высокие затраты, чтобы соблюсти строгие сроки? |
Сопоставьте данные
Собрав данные, сопоставьте их со свойствами API. Это позволит оптимизатору получить всю необходимую информацию и составить маршрут с учетом особенностей вашего бизнеса.
Используйте параметры из следующих таблиц, чтобы сопоставить ресурсы, задачи, ограничения и цели, которые вы сопоставили в разделе Определение проблемы.
Сопоставление переменных
| Пример из жизни | Параметр API | Описание |
|---|---|---|
| Водитель или транспортное средство | model.vehicles[] |
Представляет одно транспортное средство в вашем автопарке. |
| Адреса складов |
vehicles[].startWaypointvehicles[].endWaypoint
|
Место, где транспортное средство начинает и заканчивает маршрут. |
| Часы работы |
model.globalStartTimemodel.globalEndTime
|
Самое раннее время начала и самое позднее время окончания работы всего автопарка. |
| Задача или пакет | model.shipments[] |
Представляет задание. Можно указать pickup, delivery или оба параметра. |
| Местоположение задачи |
pickups[].arrivalWaypointdeliveries[].arrivalWaypoint
|
Географическое местоположение, в котором выполняется работа. |
| Время обслуживания |
pickups[].durationdeliveries[].duration
|
Время, затраченное на выполнение задачи в определенном месте (например, на разгрузку), без учета времени в пути. |
Сопоставление ограничений
| Ограничения реального мира | Параметр API | Описание |
|---|---|---|
| Вместимость автомобиля | vehicles[].loadLimits |
Задает жесткое или мягкое ограничение вместимости транспортного средства. Если loadDemand отправления превышает оставшийся лимит, оно не назначается. |
| Размер пакета | shipments[].loadDemands |
Объем грузоподъемности транспортного средства, который занимает отправление. |
| Ограничения для транспортных средств | shipments[].allowedVehicleIndices |
Ограничивает доставку, чтобы ее могли выполнить только определенные транспортные средства или водители. |
| Часы работы | shipments[].pickups[].timeWindows или shipments[].deliveries[].timeWindows |
Задает часы, в которые можно посетить место. Если транспортное средство не может прибыть в указанный период, доставка пропускается. |
| Ограничение на продолжительность смены | vehicles[].routeDurationLimit |
Устанавливает жесткое или мягкое ограничение на продолжительность работы конкретного водителя (например, максимум 8 часов) независимо от глобального времени окончания. |
| Перерывы для водителя | vehicles[].breakRule |
Принудительно применяет определенные правила отдыха, например обязательные перерывы после определенного количества часов работы. |
| Ограничения для дорог | vehicles[].travelMode |
Указывает способ передвижения (например, DRIVE или BICYCLE). Это ограничивает маршрут разрешенными дорогами и определяет скорости, используемые для расчета времени в пути. |
Сопоставление целей
| Цель в реальном мире | Параметр API | Описание |
|---|---|---|
| Минимизация размера парка | vehicles[].fixedCost |
Применяется к разовой стоимости использования транспортного средства. Высокие постоянные расходы вынуждают маршрут отдавать приоритет использованию меньшего количества транспортных средств, а не увеличению общего расстояния или времени работы. |
| Минимизировать расстояние | vehicles[].costPerKilometer |
За каждый километр пути взимается плата. Приоритет отдается более коротким маршрутам, чтобы экономить топливо и уменьшать износ автомобиля. |
| Минимизация общего времени | vehicles[].costPerHour |
Применяет стоимость за каждый час, когда транспортное средство активно (включая время в пути и время ожидания). отдает приоритет скорости выполнения. |
| Минимизация времени в пути | vehicles[].costPerTraveledHour |
Применяется стоимость, относящаяся к времени, затраченному на перемещение. Это позволяет различать ситуации, когда вы стоите в пробке (дорого), и когда вы ждете на остановке(потенциально дешевле). |
| Как задавать приоритетность задач | shipments[].penaltyCost |
Применяется, если определенная доставка пропущена. Установите высокое значение, чтобы критически важные задачи выполнялись в первую очередь. |
Создайте запрос и получите ответ
Чтобы создать план маршрута с помощью Route Optimization API, выполните следующие действия:
- Настройте среду. Настройте проект Google Cloud, включите API и настройте аутентификацию. Инструкции приведены в разделе Начало работы. Это нужно сделать лишь один раз.
- Отправьте запрос. Создайте тело запроса, используя сопоставление данных, определенное в предыдущем разделе. Информацию о конечных точках, заголовках и форматировании запросов можно найти в разделе Как сделать запрос к API.
- Изучите ответ. Получив ответ от API, изучите план маршрута и значение каждого параметра. Подробнее о том, как интерпретировать ответ…
Как уточнить план маршрута
Преобразование реальных логистических задач в ограничения и расходы API – сложная задача. Первоначальный план маршрута может не соответствовать вашим бизнес-целям или ожиданиям водителей. Уточнение плана маршрута – это итеративный процесс тестирования возвращенных маршрутов и корректировки параметров до тех пор, пока вы не найдете настройку, которая позволит достичь ваших целей.
Корректировка целей и ограничений
Если сгенерированный план маршрута вам не подходит, вы можете изменить некоторые параметры, чтобы получить другие результаты. Ужесточение или ослабление параметров меняет способ решения конфликтующих целей в плане маршрута, а ослабление параметров – это эффективный способ обнаружить параметры, которые вызывают ошибки в ваших планах маршрутов.
В таблице ниже перечислены распространенные проблемы с маршрутизацией и параметры, которые можно настроить для их устранения.
| Сценарий | Параметр | Корректировка | Описание |
|---|---|---|---|
| Важная посылка не отправлена | shipments[].penaltyCost |
увеличить ее стоимость или добавить штрафные расходы к другим отправлениям; | Если отправка необязательна, увеличьте стоимость штрафа, чтобы сделать ее приоритетной. Если доставка обязательна (не предусматривает штрафных санкций), добавьте штрафные санкции к другим, менее важным вариантам доставки. Это делает их необязательными, что освобождает время и вместимость транспортного средства для важной доставки. |
| Вы отказались от получения напечатанных фото в этом месяце. | softStartTime/softEndTime |
Добавление мягких временных окон | При жестких временных окнах задачи, которые опаздывают даже на одну минуту, отбрасываются. Мягкие временные окна позволяют водителю прибыть немного не по расписанию, заплатив "стоимость", а не провалив задание. |
| Отправка пропущена из-за веса | loadLimits[].softMaxLoad и costPerUnitAbove |
Как добавить требования к мягкой загрузке | Позволяет немного превысить идеальную вместимость автомобиля (за штраф), чтобы не оставлять посылку. |
| Доставка пропущена из-за перегрузки флота | model.vehicles[] или shipments[].timeWindows |
Добавьте транспортные средства или увеличьте временные интервалы | Если у вас слишком много поставок для текущего автопарка, особенно в пиковые часы, добавьте больше транспортных средств или расширьте окна доставки, чтобы распределить рабочую нагрузку. |
| Маршруты слишком длинные или неэффективные | vehicles[].costPerKilometer/costPerHour |
Добавлять расходы или увеличивать их значение. | Сообщает API, что поездки обходятся дорого, и побуждает его исключать удаленные изолированные остановки, чтобы создавать более плотные маршруты для автопарка. |
| Смены водителей слишком длинные | vehicles[].routeDurationLimit или model.vehicles[] |
Добавьте ограничения по продолжительности или добавьте транспортные средства и ограничения. | Устанавливает жесткое ограничение (например, 8 часов) на общее время, которое водитель проводит в пути. Добавление транспортных средств само по себе не сократит маршруты, если вы также не примените ограничения по продолжительности, чтобы заставить решатель распределить рабочую нагрузку по большему парку. |
Как изменить план маршрута
Часто требуется обновить план маршрута, сохранив его основу, например добавить в расписание активного водителя пункт забора. Для этого используйте параметры внедрения, которые предоставляют API начальную точку на основе вашего предыдущего решения, позволяя ему изменять существующий план, а не рассчитывать новый с нуля.
Ниже описаны способы обновления плана маршрута с помощью параметров внедрения.
- Передайте маршруты из предыдущего ответа в поле
injectedFirstSolutionRoutesнового запроса. Это ускоряет поиск оптимального решения и позволяет перепланировать маршруты перед началом рабочего дня, например чтобы добавить в них срочные заказы. - Укажите степень изменения в поле
injectedSolutionConstraint. Это полезно, когда операции уже выполняются, поскольку позволяет сохранить текущую последовательность действий водителя или исправить части плана, которые уже были выполнены. - Убедитесь, что обновленный маршрут по-прежнему назначен правильному транспортному средству, установив для
interpretInjectedSolutionsUsingLabelsзначениеtrue. Это полезно при экспериментах с добавлением или удалением грузов и транспортных средств, поскольку маршруты сопоставляются с помощью ярлыков, а не индексов. Для этого все ярлыки транспортных средств и отправлений должны быть уникальными.
Интегрируйте план маршрута
Окончательный план маршрута – это объект данных, представляющий собой оптимизированное управление ресурсами и задачами с учетом ваших ограничений и целей. Интегрируйте этот план маршрута в свою систему, чтобы использовать его в повседневной работе. Обычно это включает визуализацию плана маршрута для менеджеров автопарка и отправку пошаговых инструкций водителям.
Визуализация
Чтобы менеджеры автопарка могли проверять и отслеживать ваш план маршрута, вы можете визуализировать его следующими способами:
Чтобы менеджеры автопарка могли проверять и отслеживать ваш план маршрута, его можно отобразить на карте на панели управления. В зависимости от текущего этапа разработки вы можете визуализировать план маршрута следующими способами:
- Изучайте без кода. Вы можете использовать приложение Оптимизация маршрутов с открытым исходным кодом, чтобы посмотреть, как API преобразует ваши данные в физические маршруты на карте. Это веб-приложение служит инструментом исследования, который позволяет создавать сценарии, настраивать параметры ограничений и визуально отображать полученные планы маршрутов перед написанием кода.
- Показ порядка посещений. Вы можете показать последовательность посещений в виде пронумерованных точек на карте, чтобы оценить планы оптимизации и отправки в своей системе. Для этого найдите массив
visitsв каждом маршруте ответа API. Элементы в этом массиве упорядочены в точности так, как водитель должен их выполнять. Вы можете перебрать этот список, использоватьshipmentIndex, чтобы получить координаты местоположения для каждой остановки, и использовать библиотеку сопоставления, чтобы отобразить пронумерованные маркеры на карте в соответствии с их порядком в списке. - Нарисуйте физический маршрут. Вы можете визуализировать точный запланированный путь на карте, чтобы понять, почему оптимизатор выбрал определенную последовательность. Эта ломаная линия представляет собой предполагаемый путь для планирования и оценки, а не маршрут, по которому водитель едет в реальном времени. Установите в запросе параметр
populatePolylines: true, чтобы получить полеencodedPolylineдля каждого маршрута, и декодируйте его с помощью методаgoogle.maps.geometry.encoding.decodePath()из Maps JavaScript API.
Отправка водителям
Вы можете интегрировать пошаговые маршруты в приложение для водителей с помощью Navigation SDK или добавить ссылки на контент в потребительское приложение Google Карт.
- Navigation SDK. Если у вас есть собственное приложение для водителей, вы можете интегрировать Navigation SDK для Android или iOS, чтобы получать пошаговые инструкции прямо в приложении.
Вы можете интегрировать информацию о задаче из ответа API в свою систему и использовать SDK для навигации. Чтобы передать маршруты из ответа API в SDK, укажите в запросе
populateTransitionPolylines: true. Это создаетrouteTokenдля каждого перехода в ответе. - Fleet Engine. Чтобы получить доступ к расширенным функциям управления автопарком, импортируйте план маршрута, созданный API, в Fleet Engine. Это позволит вам отслеживать выполнение маршрута в реальном времени. В то время как API предоставляет ломаную линию предполагаемого пути для оценки, Fleet Engine связывает запланированную последовательность посещений с отслеживанием транспортных средств в реальном времени.