На этой странице описывается жизненный цикл плана маршрута, созданного с помощью Route Optimization 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 без написания кода. Вы можете использовать приложение Route Optimization с открытым исходным кодом, чтобы посмотреть, как 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 связывает запланированную последовательность посещений с отслеживанием транспортных средств в реальном времени.