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