Package google.maps.routeoptimization.v1

Содержание

RouteOptimization

Сервис для оптимизации маршрутов транспортных средств.

Проверка определенных типов полей:

  • google.protobuf.Timestamp
    • Время указывается в формате Unix-времени: количество секунд, прошедших с 1 января 1970 г. 00:00:00+00:00.
    • Значение seconds должно находиться в диапазоне [0, 253402300799], то есть в диапазоне [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Значение nanos должно быть не задано или равно 0.
  • google.protobuf.Duration
    • Значение seconds должно находиться в диапазоне [0, 253402300799], то есть в диапазоне [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00].
    • Значение nanos должно быть не задано или равно 0.
  • google.type.LatLng
    • Широта должна быть в диапазоне [-90,0, 90,0].
    • Долгота должна быть в диапазоне [-180.0, 180.0].
    • По крайней мере одно из значений широты и долготы должно быть ненулевым.
BatchOptimizeTours

rpc BatchOptimizeTours(BatchOptimizeToursRequest) returns (Operation)

Оптимизирует маршруты транспортных средств для одного или нескольких сообщений OptimizeToursRequest в виде пакета.

Этот метод представляет собой продолжительную операцию. Входные данные для оптимизации (сообщения OptimizeToursRequest) и выходные данные (сообщения OptimizeToursResponse) считываются из Cloud Storage и записываются в него в формате, указанном пользователем. Как и в случае с методом OptimizeTours, каждый объект OptimizeToursRequest содержит ShipmentModel и возвращает OptimizeToursResponse с полями ShipmentRoute, которые представляют собой набор маршрутов, выполняемых транспортными средствами с минимальными общими затратами.

Пользователь может запрашивать operations.get, чтобы проверить статус LRO:

Если поле LRO done имеет значение false, значит, по крайней мере один запрос все ещё обрабатывается. Другие запросы могли быть выполнены успешно, и их результаты доступны в Cloud Storage.

Если поле done LRO имеет значение true, значит все запросы обработаны. Результаты всех успешно обработанных запросов будут доступны в Cloud Storage. Результаты неудавшихся запросов не будут доступны в Cloud Storage. Если поле error LRO заполнено, оно содержит ошибку из одного из неудачных запросов.

Области авторизации

Требуется следующая область действия OAuth:

  • https://www.googleapis.com/auth/cloud-platform
Права доступа IAM

Требуется следующее разрешение IAM для ресурса parent:

  • routeoptimization.operations.create

Подробную информацию можно найти в документации по IAM.

OptimizeTours

rpc OptimizeTours(OptimizeToursRequest) returns (OptimizeToursResponse)

Отправляет OptimizeToursRequest, содержащий ShipmentModel, и возвращает OptimizeToursResponse, содержащий ShipmentRoute, которые представляют собой набор маршрутов, которые должны быть выполнены транспортными средствами, минимизируя общую стоимость.

Модель ShipmentModel в основном состоит из Shipment, которые нужно выполнить, и Vehicle, которые можно использовать для транспортировки Shipment. ShipmentRoute назначает Shipment Vehicle. В частности, они назначают каждому транспортному средству серию Visit, где Visit соответствует VisitRequest, то есть получению или доставке Shipment.

Цель состоит в том, чтобы назначить ShipmentRoute Vehicle так, чтобы минимизировать общую стоимость, где стоимость состоит из множества компонентов, определенных в ShipmentModel.

Области авторизации

Требуется следующая область действия OAuth:

  • https://www.googleapis.com/auth/cloud-platform
Права доступа IAM

Требуется следующее разрешение IAM для ресурса parent:

  • routeoptimization.locations.use

Подробную информацию можно найти в документации по IAM.

OptimizeToursLongRunning

rpc OptimizeToursLongRunning(OptimizeToursRequest) returns (Operation)

Это вариант метода OptimizeTours, предназначенный для оптимизации с большими значениями времени ожидания. Этот метод предпочтительнее, чем OptimizeTours, если оптимизация занимает больше нескольких минут.

Возвращенный объект long-running operation (LRO) будет иметь имя в формате <parent>/operations/<operation_id> и может использоваться для отслеживания хода вычислений. Тип поля metadata – OptimizeToursLongRunningMetadata. В случае успеха тип поля response – OptimizeToursResponse.

Области авторизации

Требуется следующая область действия OAuth:

  • https://www.googleapis.com/auth/cloud-platform
Права доступа IAM

Требуется следующее разрешение IAM для ресурса parent:

  • routeoptimization.operations.create

Подробную информацию можно найти в документации по IAM.

OptimizeToursUri

rpc OptimizeToursUri(OptimizeToursUriRequest) returns (Operation)

Это вариант метода OptimizeToursLongRunning, предназначенный для оптимизации с большими значениями тайм-аута и большими размерами ввода/вывода.

Клиент указывает URI OptimizeToursRequest, хранящегося в Google Cloud Storage, а сервер записывает OptimizeToursResponse в указанный клиентом URI Google Cloud Storage.

Этот метод предпочтительнее, чем OptimizeTours, если оптимизация занимает больше нескольких минут, а размер входных и выходных данных превышает 8 МБ. Однако его можно использовать и для более быстрой оптимизации с меньшим объемом данных.

Возвращенный объект long-running operation (LRO) будет иметь имя в формате <parent>/operations/<operation_id> и может использоваться для отслеживания хода вычислений. Тип поля metadata – OptimizeToursUriMetadata. В случае успеха тип поля response – OptimizeToursUriResponse.

Области авторизации

Требуется следующая область действия OAuth:

  • https://www.googleapis.com/auth/cloud-platform
Права доступа IAM

Требуется следующее разрешение IAM для ресурса parent:

  • routeoptimization.operations.create

Подробную информацию можно найти в документации по IAM.

AggregatedMetrics

Агрегированные показатели для ShipmentRoute (или OptimizeToursResponse) по всем элементам Transition и/или Visit (или по всем элементам ShipmentRoute).

Поля
performed_shipment_count

int32

Количество выполненных отправок. Обратите внимание, что пара "забор – доставка" учитывается только один раз.

travel_duration

Duration

Общая продолжительность поездки по маршруту или решению.

wait_duration

Duration

Общая продолжительность ожидания для маршрута или решения.

delay_duration

Duration

Общая продолжительность задержки для маршрута или решения.

break_duration

Duration

Общая продолжительность перерывов для маршрута или решения.

visit_duration

Duration

Общая продолжительность посещений для маршрута или решения.

total_duration

Duration

Общая продолжительность должна быть равна сумме всех указанных выше значений. Для маршрутов это также соответствует:

[ShipmentRoute.vehicle_end_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_end_time] - [ShipmentRoute.vehicle_start_time][google.maps.routeoptimization.v1.ShipmentRoute.vehicle_start_time]
travel_distance_meters

double

Общее расстояние для маршрута или решения.

max_loads

map<string, VehicleLoad>

Максимальная нагрузка, достигнутая на всем маршруте (или решении), для каждого из количеств на этом маршруте (или решении), рассчитанная как максимум по всем Transition.vehicle_loads (или ShipmentRoute.metrics.max_loads

performed_mandatory_shipment_count

int32

Количество выполненных обязательных поставок.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

performed_shipment_penalty_cost_sum

double

Сумма Shipment.penalty_cost выполненных поставок.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

BatchOptimizeToursMetadata

У этого типа нет полей.

Метаданные операции для вызовов BatchOptimizeToursRequest.

BatchOptimizeToursRequest

Запрос на пакетную оптимизацию маршрутов в качестве асинхронной операции. Каждый входной файл должен содержать один объект OptimizeToursRequest, а каждый выходной файл – один объект OptimizeToursResponse. Запрос содержит информацию для чтения, записи и анализа файлов. Все входные и выходные файлы должны находиться в одном проекте.

Поля
parent

string

Обязательно. Целевой проект и местоположение для вызова.

Формат:

  • projects/{project-id}
  • projects/{project-id}/locations/-

Региональные значения {location-id} не поддерживаются.

model_configs[]

AsyncModelConfig

Обязательно. Входные и выходные данные для каждой модели покупок, например пути к файлам и форматы данных.

AsyncModelConfig

Информация для асинхронного решения одной модели оптимизации.

Поля
display_name

string

Необязательное поле. Название модели, заданное пользователем. Может использоваться как псевдоним для отслеживания моделей.

input_config

InputConfig

Обязательно. Информация о входной модели.

output_config

OutputConfig

Обязательно. Информация о желаемом местоположении выходных данных.

BatchOptimizeToursResponse

У этого типа нет полей.

Ответ на BatchOptimizeToursRequest. Возвращается в продолжительной операции после ее завершения.

BreakRule

Правила создания перерывов для транспортного средства (например, обеденных перерывов). Перерыв – это непрерывный период времени, в течение которого транспортное средство остается без движения в текущем положении и не может выполнять никаких посещений. Перерыв может произойти:

  • во время поездки между двумя посещениями (включая время непосредственно до или после посещения, но не в середине посещения), и в этом случае оно продлевает соответствующее время транспортировки между посещениями;
  • или до начала движения транспортного средства (транспортное средство не может начать движение в середине перерыва), и в этом случае это не влияет на время начала движения транспортного средства.
  • или после окончания поездки (то же самое, но со временем окончания поездки).
Поля
break_requests[]

BreakRequest

Последовательность рекламных пауз. Посмотрите сообщение BreakRequest.

frequency_constraints[]

FrequencyConstraint

Может применяться несколько FrequencyConstraint. Они должны быть выполнены для всех BreakRequest этого BreakRule. Подробнее FrequencyConstraint…

BreakRequest

Последовательность перерывов (их количество и порядок), которые применяются к каждому транспортному средству, должна быть известна заранее. Повторяющиеся поля BreakRequest определяют последовательность и порядок, в котором должны происходить события. Их временные окна (earliest_start_time / latest_start_time) могут перекрываться, но они должны быть совместимы с заказом (это проверяется).

Поля
earliest_start_time

Timestamp

Обязательно. Нижняя граница (включительно) начала перерыва.

latest_start_time

Timestamp

Обязательно. Верхняя граница (включительно) начала перерыва.

min_duration

Duration

Обязательно. Минимальная длительность рекламной паузы. Значение должно быть положительным.

FrequencyConstraint

Вы можете дополнительно ограничить частоту и продолжительность перерывов, указанных выше, установив минимальную частоту перерывов, например "Каждые 12 часов должен быть перерыв не менее 1 часа". Если это можно интерпретировать как "В течение любого скользящего временного окна продолжительностью 12 часов должен быть хотя бы один перерыв продолжительностью не менее одного часа", то этот пример будет преобразован в следующий FrequencyConstraint:

{
   min_break_duration { seconds: 3600 }         # 1 hour.
   max_inter_break_duration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

Время и продолжительность перерывов в решении будут учитывать все такие ограничения, в дополнение к временным окнам и минимальной продолжительности, уже указанным в BreakRequest.

На практике FrequencyConstraint может применяться к непоследовательным перерывам. Например, следующее расписание соответствует примеру "1 час каждые 12 часов":

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
Поля
min_break_duration

Duration

Обязательно. Минимальная длительность рекламной паузы для этого ограничения. Неотрицательное число. Посмотреть описание комнаты "FrequencyConstraint".

max_inter_break_duration

Duration

Обязательно. Максимально допустимая продолжительность любого интервала времени на маршруте, который не включает хотя бы частично перерыв duration >= min_break_duration. Значение должно быть положительным.

DataFormat

Форматы данных для входных и выходных файлов.

Перечисления
DATA_FORMAT_UNSPECIFIED Недопустимое значение. Формат не должен быть UNSPECIFIED.
JSON JavaScript Object Notation.
PROTO_TEXT Текстовый формат буферов протокола. Подробнее: https://protobuf.dev/reference/protobuf/textformat-spec/.

DistanceLimit

Ограничение, определяющее максимальное расстояние, которое можно преодолеть. Она может быть жесткой или мягкой.

Если задано мягкое ограничение, то должны быть определены и soft_max_meters, и cost_per_kilometer_above_soft_max, причем их значения должны быть неотрицательными.

Поля
max_meters

int64

Строгое ограничение, согласно которому расстояние не должно превышать max_meters. Лимит должен быть неотрицательным.

soft_max_meters

int64

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

Если задано, значение soft_max_meters должно быть меньше max_meters и быть неотрицательным.

cost_per_kilometer_below_soft_max

double

Цена за километр увеличивается до soft_max_meters по следующей формуле:

  min(distance_meters, soft_max_meters) / 1000.0 *
  cost_per_kilometer_below_soft_max.

Эта цена не поддерживается в route_distance_limit.

cost_per_kilometer_above_soft_max

double

Цена за километр, если расстояние превышает soft_max_meters. Если расстояние меньше лимита, дополнительная стоимость равна 0. В противном случае она рассчитывается по следующей формуле:

  (distance_meters - soft_max_meters) / 1000.0 *
  cost_per_kilometer_above_soft_max.

Стоимость не может быть отрицательной.

GcsDestination

Местоположение в Google Cloud Storage, куда будут записываться выходные файлы.

Поля
uri

string

Обязательно. URI Google Cloud Storage.

GcsSource

Местоположение в Google Cloud Storage, откуда будет считываться входной файл.

Поля
uri

string

Обязательно. URI объекта Google Cloud Storage в формате gs://bucket/path/to/object.

InjectedSolutionConstraint

Решение, добавленное в запрос, включая информацию о том, какие посещения должны быть ограничены и как.

Поля
routes[]

ShipmentRoute

Маршруты решения, которые нужно добавить. Некоторые маршруты могут быть исключены из исходного решения. Маршруты и пропущенные отправления должны соответствовать базовым предположениям о допустимости, перечисленным для injected_first_solution_routes.

skipped_shipments[]

SkippedShipment

Пропущенные отправления решения, которые нужно добавить. Некоторые из них могут быть опущены в исходном решении. См. поле routes.

constraint_relaxations[]

ConstraintRelaxation

Для нуля или более групп транспортных средств указывает, когда и насколько ослабить ограничения. Если это поле пустое, все непустые маршруты транспортных средств полностью ограничены.

ConstraintRelaxation

Для группы транспортных средств указывает, при каких пороговых значениях ограничения на посещения будут смягчены и до какого уровня. Перевозки, указанные в поле skipped_shipment, пропускаются, то есть не выполняются.

Поля
relaxations[]

Relaxation

Все ослабления ограничений на посещения, которые будут применяться к посещениям на маршрутах с транспортными средствами в vehicle_indices.

vehicle_indices[]

int32

Указывает индексы транспортных средств, к которым применяется ограничение посещения relaxations. Если значение не указано, то оно считается значением по умолчанию, а relaxations применяется ко всем транспортным средствам, которые не указаны в других constraint_relaxations. По умолчанию может быть не более одного, то есть допускается не более одного пустого поля ослабления ограничений vehicle_indices. Индекс транспортного средства можно указать только один раз, даже если у вас несколько constraint_relaxations.

Индекс транспортного средства сопоставляется так же, как ShipmentRoute.vehicle_index, если interpret_injected_solutions_using_labels имеет значение true (см. комментарий fields).

Релаксация

Если relaxations пуст, время начала и последовательность всех посещений на routes полностью ограничены, и в эти маршруты нельзя вставить или добавить новые посещения. Кроме того, время начала и окончания работы транспортного средства в routes полностью ограничено, если только транспортное средство не пустое (то есть не имеет посещений и в модели для used_if_route_is_empty установлено значение false).

relaxations(i).level указывает уровень ослабления ограничений, применяемый к посещению #j, которое удовлетворяет следующим условиям:

  • route.visits(j).start_time >= relaxations(i).threshold_time И
  • j + 1 >= relaxations(i).threshold_visit_count

Аналогично, время начала маршрута транспортного средства может быть изменено на relaxations(i).level, если выполняются следующие условия:

  • vehicle_start_time >= relaxations(i).threshold_time И
  • relaxations(i).threshold_visit_count == 0, а время окончания работы транспортного средства – до relaxations(i).level, если выполняется следующее условие:
  • vehicle_end_time >= relaxations(i).threshold_time И
  • route.visits_size() + 1 >= relaxations(i).threshold_visit_count

Чтобы применить уровень смягчения, если посещение соответствует threshold_visit_count ИЛИ threshold_time, добавьте два relaxations с одинаковым level: один с заданным threshold_visit_count, а другой – с заданным threshold_time. Если посещение соответствует условиям нескольких relaxations, применяется наименее строгий уровень. В результате от начала транспортного средства до посещений маршрута в порядке до конца транспортного средства уровень релаксации становится более расслабленным: то есть уровень релаксации не снижается по мере продвижения маршрута.

Время и последовательность посещений маршрута, которые не соответствуют пороговым условиям любого relaxations, полностью ограничены, и в эти последовательности нельзя вставлять посещения. Кроме того, если начало или конец маршрута транспортного средства не удовлетворяет условиям какого-либо послабления, время фиксируется, если только транспортное средство не пустое.

Поля
level

Level

Уровень смягчения ограничений, который применяется, когда выполняются условия в threshold_time или после этого времени И не менее threshold_visit_count.

threshold_time

Timestamp

Время, в которое или после которого может быть применено смягчение level.

threshold_visit_count

int32

Количество посещений, после которого может быть применено смягчение level. Если значение threshold_visit_count равно 0 (или не задано), level может применяться непосредственно в начале поездки.

Если это route.visits_size() + 1, то level может применяться только к концу транспортного средства. Если оно больше route.visits_size() + 1, то level не применяется для этого маршрута.

Уровень

Выражает различные уровни ослабления ограничений, которые применяются к посещению и последующим посещениям, когда оно удовлетворяет пороговым условиям.

Ниже они перечислены в порядке убывания строгости.

Перечисления
LEVEL_UNSPECIFIED

Неявный уровень ослабления по умолчанию: ограничения не ослабляются, то есть все посещения полностью ограничены.

Это значение не должно явно использоваться в level.

RELAX_VISIT_TIMES_AFTER_THRESHOLD Время начала посещения и время начала/окончания работы транспортного средства будут смягчены, но каждое посещение останется привязанным к одному и тому же транспортному средству, и необходимо соблюдать последовательность посещений: между ними или перед ними нельзя вставлять другие посещения.
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD То же, что и RELAX_VISIT_TIMES_AFTER_THRESHOLD, но последовательность посещений также нестрогая: посещения могут выполняться только этим транспортным средством, но могут и не выполняться.
RELAX_ALL_AFTER_THRESHOLD То же, что и RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD, но транспортное средство также не ограничено: посещения полностью бесплатны в пороговое время или после него и потенциально могут не выполняться.

InputConfig

Укажите входные данные для [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Поля
data_format

DataFormat

Обязательно. Формат входных данных.

Объединенное поле source. Обязательно. source может иметь одно из следующих значений:
gcs_source

GcsSource

Местоположение в Google Cloud Storage. Это должен быть один объект (файл).

Местоположение

Инкапсулирует местоположение (географическую точку и необязательный заголовок).

Поля
lat_lng

LatLng

Географические координаты путевой точки.

heading

int32

Направление движения по компасу. Это значение используется, чтобы указать сторону дороги, на которой нужно забрать или высадить пассажира. Значения направления могут быть от 0 до 360, где 0 – это север, 90 – восток и т. д.

OptimizeToursLongRunningMetadata

У этого типа нет полей.

Метаданные операции для вызовов OptimizeToursLongRunning.

OptimizeToursRequest

Запрос, который нужно передать решателю оптимизации поездок. Он определяет модель доставки, которую нужно решить, а также параметры оптимизации.

Поля
parent

string

Обязательно. Выберите проект или местоположение, чтобы позвонить.

Формат:

  • projects/{project-id}
  • projects/{project-id}/locations/-

Региональные значения {location-id} не поддерживаются.

timeout

Duration

Если задано время ожидания, сервер возвращает ответ до истечения этого времени или до достижения крайнего срока для синхронных запросов (в зависимости от того, что наступит раньше).

Для асинхронных запросов сервер генерирует решение (если возможно) до истечения времени ожидания.

model

ShipmentModel

Модель доставки, которую нужно решить.

solving_mode

SolvingMode

По умолчанию используется режим DEFAULT_SOLVE (0).

search_mode

SearchMode

Режим поиска, использованный для выполнения запроса.

injected_first_solution_routes[]

ShipmentRoute

Направьте алгоритм оптимизации на поиск первого решения, похожего на предыдущее.

Модель ограничивается при построении первого решения. Все доставки, не выполненные по маршруту, неявно пропускаются в первом решении, но могут быть выполнены в последующих решениях.

Решение должно соответствовать некоторым базовым предположениям о валидности:

  • Для всех маршрутов значение vehicle_index должно быть в допустимом диапазоне и не должно повторяться.
  • Для всех посещений shipment_index и visit_request_index должны быть в диапазоне.
  • На отправление можно ссылаться только в одном маршруте.
  • забор отправления должен быть выполнен до его доставки.
  • Для одной доставки можно выполнить не более одной альтернативной доставки или самовывоза.
  • Для всех маршрутов время увеличивается (т.е. vehicle_start_time <= visits[0].start_time <= visits[1].start_time ... <= vehicle_end_time).
  • Доставка может выполняться только на разрешенном транспортном средстве. Транспортное средство допускается, если поле Shipment.allowed_vehicle_indices пустое или его значение vehicle_index включено в Shipment.allowed_vehicle_indices.

Если внедренное решение невыполнимо, ошибка проверки не обязательно возвращается, вместо нее может быть возвращена ошибка, указывающая на невыполнимость.

injected_solution_constraint

InjectedSolutionConstraint

Ограничить алгоритм оптимизации, чтобы найти окончательное решение, похожее на предыдущее. Например, это может быть полезно, чтобы зафиксировать части маршрутов, которые уже пройдены или которые должны быть пройдены, но не должны изменяться.

Если внедренное решение невыполнимо, ошибка проверки не обязательно возвращается, вместо нее может быть возвращена ошибка, указывающая на невыполнимость.

refresh_details_routes[]

ShipmentRoute

Если поле не пустое, указанные маршруты будут обновлены без изменения последовательности посещений или времени в пути. Будут обновлены только другие сведения. Это не решает модель.

По состоянию на ноябрь 2020 года это поле заполняет только ломаные линии непустых маршрутов и требует, чтобы для populate_polylines было задано значение true.

Поля route_polyline переданных маршрутов могут не соответствовать маршруту transitions.

Это поле нельзя использовать вместе с injected_first_solution_routes или injected_solution_constraint.

Правила Shipment.ignore и Vehicle.ignore не влияют на работу функции. Ломаные линии по-прежнему заполняются между всеми посещениями на всех непустых маршрутах, независимо от того, игнорируются ли связанные отправления или транспортные средства.

interpret_injected_solutions_using_labels

bool

Если значение true:

  • использует ShipmentRoute.vehicle_label вместо vehicle_index, чтобы сопоставить маршруты во внедренном решении с транспортными средствами в запросе; повторно использует сопоставление исходного ShipmentRoute.vehicle_index с новым ShipmentRoute.vehicle_index, чтобы обновить ConstraintRelaxation.vehicle_indices, если оно не пустое, но сопоставление должно быть однозначным (т.е. несколько ShipmentRoute не должны иметь один и тот же исходный vehicle_index).
  • использует ShipmentRoute.Visit.shipment_label вместо shipment_index для сопоставления посещений в добавленном решении с доставками в запросе;
  • использует SkippedShipment.label вместо SkippedShipment.index, чтобы сопоставить пропущенные отправки во внедренном решении с отправками из запроса.

Такая интерпретация применяется к полям injected_first_solution_routes, injected_solution_constraint и refresh_details_routes. Его можно использовать, когда индексы отправлений или транспортных средств в запросе изменились с момента создания решения, возможно, потому, что отправления или транспортные средства были удалены из запроса или добавлены в него.

Если задано значение true, ярлыки из следующих категорий должны появляться в своей категории не более одного раза:

Если vehicle_label во внедренном решении не соответствует транспортному средству из запроса, соответствующий маршрут удаляется из решения вместе с посещениями. Если shipment_label в добавленном решении не соответствует доставке из запроса, соответствующее посещение удаляется из решения. Если SkippedShipment.label в добавленном решении не соответствует отправлению из запроса, SkippedShipment удаляется из решения.

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

ПРИМЕЧАНИЕ. Вызывающий абонент должен убедиться, что каждый Vehicle.label (resp. Shipment.label) уникально идентифицирует транспортное средство (или отправление), используемое в двух соответствующих запросах: прошлом запросе, который создал OptimizeToursResponse, используемый во внедренном решении, и текущем запросе, который включает внедренное решение. Описанных выше проверок уникальности недостаточно, чтобы гарантировать выполнение этого требования.

consider_road_traffic

bool

Учитывайте оценку трафика при расчете полей ShipmentRoute (Transition.travel_duration, Visit.start_time и vehicle_end_time), при заполнении поля ShipmentRoute.has_traffic_infeasibilities и при расчете поля OptimizeToursResponse.total_cost.

populate_polylines

bool

Если задано значение true, в ответе ShipmentRoute будут указаны ломаные линии.

populate_transition_polylines

bool

Если задано значение true, в ответе ShipmentRoute.transitions будут указаны ломаные линии и токены маршрутов.

allow_large_deadline_despite_interruption_risk

bool

Если это значение задано, то у запроса может быть крайний срок (см. https://grpc.io/blog/deadlines) до 60 минут. В противном случае максимальный срок составляет 30 минут. Обратите внимание, что у долгосрочных запросов риск прерывания значительно выше, хотя и остается небольшим.

use_geodesic_distances

bool

Если задано значение true, расстояния будут рассчитываться по геодезическим линиям, а не по Google Картам, а время в пути – по геодезическим линиям со скоростью, заданной в поле geodesic_meters_per_second.

label

string

Ярлык, который можно использовать для идентификации этого запроса, возвращаемый в OptimizeToursResponse.request_label.

geodesic_meters_per_second

double

Если для параметра use_geodesic_distances задано значение true, это поле должно быть заполнено. Оно определяет скорость, которая используется для расчета времени в пути. Значение должно быть не менее 1,0 м/с.

max_validation_errors

int32

Ограничивает количество возвращаемых ошибок проверки. Обычно эти ошибки прикрепляются к полезной нагрузке ошибки INVALID_ARGUMENT как сведения об ошибке BadRequest (https://cloud.google.com/apis/design/errors#error_details)), если только solving_mode=VALIDATE_ONLY: см. поле OptimizeToursResponse.validation_errors. По умолчанию используется значение 100,а максимальное значение – 10 000.

SearchMode

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

Перечисления
SEARCH_MODE_UNSPECIFIED Режим поиска не указан. Эквивалентно RETURN_FAST.
RETURN_FAST Остановить поиск после нахождения первого хорошего решения.
CONSUME_ALL_AVAILABLE_TIME Потратить все доступное время на поиск лучших решений

SolvingMode

Определяет, как решатель должен обрабатывать запрос. Во всех режимах, кроме VALIDATE_ONLY, если запрос недействителен, вы получите ошибку INVALID_REQUEST. Чтобы ограничить количество возвращаемых ошибок, используйте параметр max_validation_errors.

Перечисления
DEFAULT_SOLVE Решите модель. Предупреждения могут быть выданы в [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors].
VALIDATE_ONLY Только проверяет модель, не решая ее: заполняет как можно больше OptimizeToursResponse.validation_errors.
DETECT_SOME_INFEASIBLE_SHIPMENTS

Заполняет только OptimizeToursResponse.validation_errors или OptimizeToursResponse.skipped_shipments и не решает остальную часть запроса (status и routes не заданы в ответе). Если в маршрутах injected_solution_constraint обнаружены невыполнимые условия, они указываются в поле OptimizeToursResponse.validation_errors, а поле OptimizeToursResponse.skipped_shipments остается пустым.

Важно! Здесь возвращаются не все невыполнимые доставки, а только те, которые были обнаружены во время предварительной обработки.

TRANSFORM_AND_RETURN_REQUEST

Этот режим работает, только если поле ShipmentModel.objectives не пустое. Запрос не решен. Она только проверяется и заполняется расходами, соответствующими заданным целям. Также ознакомьтесь с документацией по ShipmentModel.objectives. Полученный запрос возвращается как OptimizeToursResponse.processed_request.

Экспериментальная функция. Подробнее: https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

OptimizeToursResponse

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

Поля
routes[]

ShipmentRoute

Маршруты, рассчитанные для каждого транспортного средства; i-й маршрут соответствует i-му транспортному средству в модели.

request_label

string

Копия OptimizeToursRequest.label, если в запросе был указан ярлык.

skipped_shipments[]

SkippedShipment

Список всех пропущенных отправлений.

validation_errors[]

OptimizeToursValidationError

Список всех ошибок проверки, которые мы смогли обнаружить самостоятельно. Ознакомьтесь с объяснением сообщения OptimizeToursValidationError в разделе "Несколько ошибок". Если для параметра solving_mode задано значение DEFAULT_SOLVE, вместо ошибок будут показываться предупреждения.

processed_request

OptimizeToursRequest

В некоторых случаях мы изменяем входящий запрос, прежде чем решить его, например добавляем расходы. Если solving_mode == TRANSFORM_AND_RETURN_REQUEST, здесь возвращается измененный запрос.

Экспериментальная функция. Подробнее: https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

metrics

Metrics

Показатели продолжительности, расстояния и использования для этого решения.

Показатели

Общие показатели, агрегированные по всем маршрутам.

Поля
aggregated_route_metrics

AggregatedMetrics

Агрегированные данные по маршрутам. Каждый показатель представляет собой сумму (или максимальное значение для загрузок) по всем полям ShipmentRoute.metrics с одинаковым названием.

skipped_mandatory_shipment_count

int32

Количество пропущенных обязательных поставок.

used_vehicle_count

int32

Количество используемых транспортных средств. Примечание. Если маршрут транспортного средства пуст и для параметра Vehicle.used_if_route_is_empty задано значение true, транспортное средство считается используемым.

earliest_vehicle_start_time

Timestamp

Самое раннее время начала для используемого транспортного средства, вычисляемое как минимальное значение по всем используемым транспортным средствам ShipmentRoute.vehicle_start_time.

latest_vehicle_end_time

Timestamp

Последнее время окончания для используемого транспортного средства, вычисляемое как максимальное значение по всем используемым транспортным средствам ShipmentRoute.vehicle_end_time.

costs

map<string, double>

Стоимость решения с разбивкой по полям запроса, связанным со стоимостью. Ключи – это пути прототипа, относящиеся к входному OptimizeToursRequest, например model.shipments.pickups.cost, а значения – это общая стоимость, сгенерированная соответствующим полем стоимости, агрегированная по всему решению. Другими словами, costs["model.shipments.pickups.cost"] – это сумма всех стоимостей самовывоза в решении. Все расходы, определенные в модели, подробно описаны здесь, за исключением расходов, связанных с TransitionAttributes, которые по состоянию на январь 2022 года представлены только в агрегированном виде.

total_cost

double

Общая стоимость решения. Сумма всех значений на карте расходов.

OptimizeToursUriMetadata

У этого типа нет полей.

Метаданные операции для вызовов OptimizeToursUri.

OptimizeToursUriRequest

Запрос, используемый методом OptimizeToursUri.

Поля
parent

string

Обязательно. Выберите проект или местоположение, чтобы позвонить.

Формат:

  • projects/{project-id}
  • projects/{project-id}/locations/-

Региональные значения {location-id} не поддерживаются.

input

Uri

Обязательно. URI объекта Cloud Storage, содержащего OptimizeToursRequest.

output

Uri

Обязательно. URI объекта Cloud Storage, который будет содержать OptimizeToursResponse.

OptimizeToursUriResponse

Ответ, возвращенный методом OptimizeToursUri.

Поля
output

Uri

Необязательное поле. URI объекта Cloud Storage, содержащего OptimizeToursResponse, закодированный в формате JSON или textproto. Если объект был закодирован в формате JSON, расширение имени объекта будет .json. Если объект был закодирован как textproto, расширение имени объекта будет .txtpb.

crc32_checksum ресурса можно использовать для проверки того, что его содержимое не было изменено.

OptimizeToursValidationError

Описывает ошибку или предупреждение, возникшие при проверке OptimizeToursRequest.

Поля
code

int32

Ошибка проверки определяется парой (code, display_name), которая всегда присутствует.

Поля после этого раздела содержат дополнительную информацию об ошибке.

Несколько ошибок. Если ошибок несколько, в процессе проверки система пытается вывести несколько из них. Как и в случае с компилятором, этот процесс не идеален. Некоторые ошибки проверки являются критическими, то есть останавливают весь процесс. Это относится, в частности, к ошибкам display_name="UNSPECIFIED". Некоторые ошибки могут привести к тому, что в процессе проверки будут пропущены другие ошибки.

Стабильность. code и display_name должны быть очень стабильными. Однако со временем могут появиться новые коды и отображаемые названия, из-за чего для определенного (недопустимого) запроса может быть возвращена другая пара (code, display_name), поскольку новая ошибка скрыла старую. Пример: "НЕСКОЛЬКО ОШИБОК".

display_name

string

Отображаемое название ошибки.

fields[]

FieldReference

Контекст ошибки может включать 0, 1 (в большинстве случаев) или более полей. Например, сослаться на транспортное средство № 4 и первую погрузку отправления № 2 можно следующим образом:

fields { name: "vehicles" index: 4}
fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }

Однако обратите внимание, что количество элементов fields не должно меняться для определенного кода ошибки.

error_message

string

Человекочитаемая строка, описывающая ошибку. Между code и error_message существует сопоставление 1:1 (когда code != "UNSPECIFIED").

СТАБИЛЬНОСТЬ. Нестабильно. Сообщение об ошибке, связанное с определенным значением code, может со временем измениться (например, стать более понятным). Используйте вместо них display_name и code.

offending_values

string

Может содержать значения полей. Эта функция доступна не всегда. Не полагайтесь на него и используйте только для отладки модели вручную.

FieldReference

Указывает контекст ошибки проверки. FieldReference всегда относится к определенному полю в этом файле и имеет ту же иерархическую структуру. Например, чтобы указать элемент № 2 атрибута start_time_windows для автомобиля № 5, используйте следующий код:

name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }

Однако мы опускаем объекты верхнего уровня, такие как OptimizeToursRequest или ShipmentModel, чтобы не перегружать сообщение.

Поля
name

string

Название поля, например "vehicles".

sub_field

FieldReference

Рекурсивно вложенное подполе (при необходимости).

Объединенное поле index_or_key.

Поле index_or_key может иметь одно из следующих значений:

index

int32

Индекс поля, если оно повторяется.

key

string

Ключ, если поле является картой.

OutputConfig

Укажите пункт назначения для результатов [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours].

Поля
data_format

DataFormat

Обязательно. Формат выходных данных.

Объединенное поле destination. Обязательно. destination может иметь одно из следующих значений:
gcs_destination

GcsDestination

Местоположение в Google Cloud Storage, куда будут записываться выходные данные.

RouteModifiers

Инкапсулирует набор необязательных условий, которые должны выполняться при расчете маршрутов транспортных средств. Это похоже на RouteModifiers в Routes Preferred API платформы Google Карт. Подробнее: https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers.

Поля
avoid_tolls

bool

Указывает, следует ли избегать платных дорог, если это возможно. Предпочтение будет отдаваться маршрутам без платных дорог. Применяется только к моторизованным видам транспорта.

avoid_highways

bool

Указывает, следует ли по возможности избегать скоростных шоссе. Предпочтение будет отдаваться маршрутам без шоссе. Применяется только к моторизованным видам транспорта.

avoid_ferries

bool

Указывает, следует ли по возможности избегать паромных переправ. Предпочтение будет отдаваться маршрутам без паромных переправ. Применяется только к моторизованным видам транспорта.

avoid_indoor

bool

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

Доставка

Перевозка одного товара от места получения до места доставки. Чтобы доставка считалась выполненной, уникальное транспортное средство должно посетить одно из мест погрузки (и соответствующим образом уменьшить свою свободную вместимость), а затем посетить одно из мест доставки (и соответствующим образом увеличить свою свободную вместимость).

Поля
display_name

string

Отображаемое название отправления, заданное пользователем. Длина названия не должна превышать 63 символа. Можно использовать символы UTF-8.

pickups[]

VisitRequest

Набор альтернативных вариантов самовывоза, связанных с доставкой. Если не указано, транспортному средству нужно только посетить местоположение, соответствующее доставкам.

deliveries[]

VisitRequest

Набор альтернативных вариантов доставки, связанных с отправлением. Если не указано, транспортному средству нужно посетить только местоположение, соответствующее местам получения.

load_demands

map<string, Load>

Требования к загрузке груза (например, вес, объем, количество поддонов и т. д.). Ключи в карте должны быть идентификаторами, описывающими тип соответствующей нагрузки, в идеале также включая единицы измерения. Например, weight_kg, volume_gallons, pallet_count и т. д. Если заданный ключ не появляется на карте, соответствующая нагрузка считается нулевой.

allowed_vehicle_indices[]

int32

Набор транспортных средств, которые могут выполнить эту доставку. Если оставить поле пустым, то все транспортные средства смогут выполнять эту задачу. Транспортные средства указываются по их индексу в списке vehicles объекта ShipmentModel.

costs_per_vehicle[]

double

Указывает стоимость, которая возникает, когда эта поставка доставляется каждым транспортным средством. Если оно указано, то должно содержать ОДНО из следующих значений:

  • столько же элементов, сколько и costs_per_vehicle_indices. costs_per_vehicle[i] соответствует транспортному средству costs_per_vehicle_indices[i] модели.
  • столько же элементов, сколько транспортных средств в модели. i-й элемент соответствует транспортному средству #i модели.

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

costs_per_vehicle_indices[]

int32

Индексы транспортных средств, к которым применяется costs_per_vehicle. Если поле не пустое, в нем должно быть столько же элементов, сколько и в поле costs_per_vehicle. Индекс транспортного средства не может быть указан более одного раза. Если автомобиль исключен из costs_per_vehicle_indices, его стоимость равна нулю.

pickup_to_delivery_absolute_detour_limit

Duration

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

Например, пусть t – это кратчайшее время, необходимое для перехода от выбранной альтернативы самовывоза непосредственно к выбранной альтернативе доставки. Тогда параметр pickup_to_delivery_absolute_detour_limit будет принудительно применять следующие настройки:

start_time(delivery) - start_time(pickup) <=
t + pickup_to_delivery_absolute_detour_limit

Если для одной и той же перевозки указаны и относительные, и абсолютные ограничения, для каждой возможной пары "забор – доставка" используется более строгое ограничение. По состоянию на октябрь 2017 г. объезды поддерживаются, только если продолжительность поездки не зависит от транспортных средств.

pickup_to_delivery_time_limit

Duration

Указывает максимальную продолжительность от начала самовывоза до начала доставки отправления. Если указано, оно должно быть неотрицательным, а отправка должна содержать как минимум самовывоз и доставку. Это не зависит от того, какие альтернативы выбраны для получения и доставки, а также от скорости транспортного средства. Это ограничение можно использовать вместе с ограничением на максимальное отклонение от маршрута. В решении будут учтены оба ограничения.

shipment_type

string

Непустая строка, указывающая тип отправления. С помощью этой функции можно задавать несовместимости или требования между shipment_types (см. shipment_type_incompatibilities и shipment_type_requirements в ShipmentModel).

Отличается от visit_types, которое указывается для одного посещения: у всех пунктов самовывоза/доставки, относящихся к одной и той же отправке, одинаковое значение shipment_type.

label

string

Указывает ярлык для этой отправки. Этот ярлык указывается в ответе в поле shipment_label соответствующего объекта ShipmentRoute.Visit.

ignore

bool

Если true, пропустить эту доставку, но не применять penalty_cost.

Если в модели есть shipment_type_requirements, игнорирование отправки приведет к ошибке проверки.

Игнорирование отправки, выполняемой в injected_first_solution_routes или injected_solution_constraint, разрешено; решатель удаляет связанные посещения для получения/доставки из выполняемого маршрута. precedence_rules, которые ссылаются на игнорируемые отправления, также будут игнорироваться.

penalty_cost

double

Если доставка не завершена, этот штраф добавляется к общей стоимости маршрутов. Отправка считается завершенной, если посещен один из вариантов получения и доставки. Стоимость может быть выражена в той же единице, что и все остальные поля, связанные со стоимостью, в модели, и должна быть положительной.

ВАЖНО! Если штраф не указан, он считается бесконечным, то есть доставка должна быть выполнена.

pickup_to_delivery_relative_detour_limit

double

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

Например, пусть t – это кратчайшее время, необходимое для перехода от выбранной альтернативы самовывоза непосредственно к выбранной альтернативе доставки. Тогда параметр pickup_to_delivery_relative_detour_limit будет принудительно применять следующие настройки:

start_time(delivery) - start_time(pickup) <=
std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))

Если для одной и той же перевозки указаны и относительные, и абсолютные ограничения, для каждой возможной пары "забор – доставка" используется более строгое ограничение. По состоянию на октябрь 2017 г. объезды поддерживаются, только если продолжительность поездки не зависит от транспортных средств.

Загрузка

При посещении к загрузке транспортного средства может быть добавлено заранее определенное количество, если это погрузка, или вычтено, если это доставка. В этом сообщении указана такая сумма. Посмотрите load_demands.

Поля
amount

int64

Величина, на которую будет варьироваться нагрузка транспортного средства, выполняющего соответствующее посещение. Поскольку это целое число, пользователям рекомендуется выбрать подходящую единицу измерения, чтобы избежать потери точности. Значение должно быть больше или равно 0.

VisitRequest

Запрос на посещение, которое может быть выполнено транспортным средством. У него есть одно или два местоположения (см. ниже), время открытия и закрытия, представленное временными окнами, и продолжительность обслуживания (время, которое транспортное средство проводит на месте после прибытия для погрузки или разгрузки товаров).

Поля
arrival_location

LatLng

Географическое местоположение, куда прибывает транспортное средство при выполнении этого действия (VisitRequest). Если в модели доставки есть матрицы расстояний, то arrival_location указывать не нужно.

arrival_waypoint

Waypoint

Путевая точка, в которую прибывает транспортное средство при выполнении этого действия (VisitRequest). Если в модели доставки есть матрицы расстояний и длительности, то arrival_waypoint указывать не нужно.

departure_location

LatLng

Географическое местоположение, из которого транспортное средство отправляется после завершения этого VisitRequest. Если значение совпадает со значением свойства arrival_location, то его можно не указывать. Если в модели доставки есть матрицы расстояний и длительности, то departure_location указывать не нужно.

departure_waypoint

Waypoint

Путевая точка, от которой транспортное средство отправляется после завершения этого VisitRequest. Если значение совпадает со значением свойства arrival_waypoint, то его можно не указывать. Если в модели доставки есть матрицы расстояний и длительности, то departure_waypoint указывать не нужно.

tags[]

string

Указывает теги, прикрепленные к запросу на посещение. Пустые или повторяющиеся строки не допускаются.

time_windows[]

TimeWindow

Временные окна, ограничивающие время прибытия в пункт посещения. Обратите внимание, что транспортное средство может уехать за пределы временного окна прибытия, т.е. время прибытия + продолжительность не обязательно должны находиться внутри временного окна. Если транспортное средство прибудет раньше TimeWindow.start_time, может возникнуть время ожидания.

Если TimeWindow не указано, транспортное средство может выполнить посещение в любое время.

Временные окна не должны пересекаться или примыкать друг к другу. Их следует указывать в порядке возрастания.

Поля cost_per_hour_after_soft_end_time и soft_end_time можно задать, только если указан один временной интервал.

duration

Duration

Продолжительность посещения, то есть время, проведенное транспортным средством между прибытием и отправлением (добавляется к возможному времени ожидания; см. time_windows).

cost

double

Стоимость обслуживания этого запроса на посещение на маршруте транспортного средства. Это позволяет задавать разные цены для разных вариантов самовывоза или доставки. Единица измерения должна совпадать с единицей измерения Shipment.penalty_cost. Значение не может быть отрицательным.

load_demands

map<string, Load>

Загрузить требования этого запроса на посещение. Это поле аналогично полю Shipment.load_demands, но применяется только к этому объекту VisitRequest, а не ко всему объекту Shipment. Перечисленные здесь требования добавляются к требованиям, указанным в Shipment.load_demands.

visit_types[]

string

Указывает типы посещения. Это значение можно использовать, чтобы выделить дополнительное время, необходимое транспортному средству для завершения посещения (см. Vehicle.extra_visit_duration_for_visit_type).

Каждый тип может быть указан только один раз.

label

string

Указывает ярлык для этого VisitRequest. Этот ярлык возвращается в ответе как visit_label в соответствующем ShipmentRoute.Visit.

avoid_u_turns

bool

Указывает, следует ли избегать разворотов на автомобильных маршрутах в этом месте. Мы стараемся избегать разворотов, но не можем гарантировать, что их не будет. Это экспериментальная функция, и ее поведение может измениться.

Экспериментальная функция. Подробнее: https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

ShipmentModel

Модель доставки содержит набор поставок, которые должны быть выполнены набором транспортных средств, при этом минимизируется общая стоимость, которая представляет собой сумму:

  • стоимость маршрутизации транспортных средств (сумма стоимости за общее время, стоимости за время в пути и фиксированной стоимости для всех транспортных средств).
  • штрафы за невыполненную отгрузку.
  • стоимость доставки за весь период;
Поля
shipments[]

Shipment

Набор отправлений, которые должны быть выполнены в модели.

vehicles[]

Vehicle

Набор транспортных средств, которые можно использовать для посещений.

objectives[]

Objective

Набор целей для этой модели, которые будут преобразованы в затраты. Если он не пустой, входная модель должна быть бесплатной. Чтобы получить измененный запрос, используйте solving_mode = TRANSFORM_AND_RETURN_REQUEST. Обратите внимание, что в этом случае запрос не будет решен. Ознакомьтесь с соответствующей документацией.

Экспериментальная функция. Подробную информацию можно найти на странице https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

global_start_time

Timestamp

Глобальное время начала и окончания модели. Время за пределами этого диапазона не считается действительным.

Временной диапазон модели должен быть меньше года, то есть разница между global_end_time и global_start_time должна быть не более 31 536 000 секунд.

При использовании полей cost_per_*hour вы можете уменьшить этот интервал, чтобы повысить эффективность (например, если вы моделируете один день, то можете установить глобальные временные ограничения на этот день). Если значение не задано, по умолчанию используется 00:00:00 UTC, 1 января 1970 г. (т. е. seconds: 0, nanos: 0).

global_end_time

Timestamp

Если значение не задано, по умолчанию используется 00:00:00 UTC, 1 января 1971 г. (т. е. seconds: 31536000, nanos: 0).

global_duration_cost_per_hour

double

"Общая продолжительность" плана – это разница между самым ранним временем начала и самым поздним временем окончания для всех транспортных средств. Пользователи могут назначить стоимость за час для этого количества, чтобы попытаться оптимизировать выполнение задания в кратчайшие сроки. Единицы измерения должны совпадать с теми, которые используются в файле Shipment.penalty_cost.

duration_distance_matrices[]

DurationDistanceMatrix

Указывает матрицы длительности и расстояния, используемые в модели. Если это поле пустое, то вместо него будут использоваться расстояния, рассчитанные с помощью Google Карт или геодезических методов, в зависимости от значения поля use_geodesic_distances. Если оно не пустое, то use_geodesic_distances не может быть true, а duration_distance_matrix_src_tags и duration_distance_matrix_dst_tags не могут быть пустыми.

Примеры использования

  • Есть два местоположения: locA и locB.
  • 1 транспортное средство, которое начинает и заканчивает маршрут в точке locA.
  • 1 запрос на посещение для самовывоза в местоположении B.
model {
  vehicles { start_tags: "locA"  end_tags: "locA" }
  shipments { pickups { tags: "locB" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_dst_tags: "locA"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • Есть три местоположения: locA, locB и locC.
  • 1 транспортное средство, начинающее свой маршрут в locA и заканчивающее его в locB, используя матрицу "fast".
  • 1 транспортное средство, начинающее свой маршрут в locB и заканчивающее его в locB, используя матрицу "медленно".
  • 1 транспортное средство, начинающее свой маршрут в locB и заканчивающее его в locB, используя матрицу "fast".
  • 1 запрос на посещение для самовывоза в местоположении locC.
model {
  vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
  vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
  shipments { pickups { tags: "locC" } }
  duration_distance_matrix_src_tags: "locA"
  duration_distance_matrix_src_tags: "locB"
  duration_distance_matrix_src_tags: "locC"
  duration_distance_matrix_dst_tags: "locB"
  duration_distance_matrix_dst_tags: "locC"
  duration_distance_matrices {
    vehicle_start_tag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  duration_distance_matrices {
    vehicle_start_tag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
duration_distance_matrix_src_tags[]

string

Теги, определяющие источники матриц длительности и расстояния. duration_distance_matrices(i).rows(j) определяет длительность и расстояние от посещений с тегом duration_distance_matrix_src_tags(j) до других посещений в матрице i.

Теги соответствуют VisitRequest.tags или Vehicle.start_tags. Каждому значению VisitRequest или Vehicle должен соответствовать ровно один тег в этом поле. Обратите внимание, что теги источника, назначения и матрицы в объекте Vehicle могут совпадать. Аналогично, теги источника и назначения в объекте VisitRequest также могут совпадать. Все теги должны быть разными и не могут быть пустыми строками. Если это поле не пустое, то поле duration_distance_matrices также не должно быть пустым.

duration_distance_matrix_dst_tags[]

string

Теги, определяющие пункты назначения матриц продолжительности и расстояния; duration_distance_matrices(i).rows(j).durations(k) (соответственно, duration_distance_matrices(i).rows(j).meters(k)) определяет продолжительность (или расстояние) поездки от посещений с тегом duration_distance_matrix_src_tags(j) до посещений с тегом duration_distance_matrix_dst_tags(k) в матрице i.

Теги соответствуют VisitRequest.tags или Vehicle.start_tags. Указанный VisitRequest или Vehicle должен точно соответствовать одному тегу в этом поле. Обратите внимание, что теги источника, назначения и матрицы в объекте Vehicle могут совпадать. Аналогично, теги источника и назначения в объекте VisitRequest также могут совпадать. Все теги должны быть разными и не могут быть пустыми строками. Если это поле не пустое, то поле duration_distance_matrices также не должно быть пустым.

transition_attributes[]

TransitionAttributes

В модель добавлены атрибуты перехода.

shipment_type_incompatibilities[]

ShipmentTypeIncompatibility

Наборы несовместимых типов доставки (см. ShipmentTypeIncompatibility).

shipment_type_requirements[]

ShipmentTypeRequirement

Наборы требований shipment_type (см. ShipmentTypeRequirement).

precedence_rules[]

PrecedenceRule

Набор правил приоритета, которые должны соблюдаться в модели.

ВАЖНО! Использование правил приоритета ограничивает размер задачи, которую можно оптимизировать. Запросы, в которых используются правила приоритета, включающие много отправлений, могут быть отклонены.

max_active_vehicles

int32

Ограничивает максимальное количество активных транспортных средств. Транспортное средство активно, если его маршрут выполняет хотя бы одну перевозку. Это может быть полезно, если водителей меньше, чем транспортных средств, и автопарк неоднороден. Затем оптимизация выберет лучший набор транспортных средств. Значение должно быть строго положительным.

DurationDistanceMatrix

Указывает матрицу продолжительности и расстояния от начальных местоположений посещений и транспортных средств до конечных местоположений посещений и транспортных средств.

Поля
rows[]

Row

Определяет строки матрицы продолжительности и расстояния. Количество элементов должно совпадать с количеством элементов в поле ShipmentModel.duration_distance_matrix_src_tags.

vehicle_start_tag

string

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

Каждое начало маршрута должно соответствовать ровно одной матрице, то есть ровно одно поле start_tags должно соответствовать полю vehicle_start_tag матрицы (и только этой матрицы).

У всех матриц должны быть разные значения vehicle_start_tag.

Строка

Указывает строку матрицы продолжительности и расстояния.

Поля
durations[]

Duration

Значения продолжительности для заданной строки. Количество элементов должно совпадать с количеством элементов в поле ShipmentModel.duration_distance_matrix_dst_tags.

meters[]

double

Значения расстояния для заданной строки. Если в модели нет расходов или ограничений, связанных с расстояниями, это поле можно оставить пустым. В противном случае в нем должно быть столько же элементов, сколько в поле durations.

Цель

Цели полностью заменяют модель расходов и поэтому несовместимы с существующими расходами. Каждая цель сопоставляется с рядом предопределенных затрат, например для транспортных средств, отправлений или атрибутов перехода.

Экспериментальная функция. Подробнее: https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request.

Поля
type

Type

Тип цели.

weight

double

Насколько эта цель должна учитываться по сравнению с другими. Это может быть любое неотрицательное число. Сумма весов не обязательно должна быть равна 1. По умолчанию вес равен 1.0.

Тип

Тип цели, который будет сопоставлен с набором расходов.

Перечисления
DEFAULT Чтобы обеспечить приемлемое решение, будет использоваться набор затрат по умолчанию. Примечание.Эту цель можно использовать отдельно, но она также всегда будет добавляться с весом 1, 0 в качестве базовой к целям, указанным пользователем, если она ещё не присутствует.
MIN_DISTANCE "MIN". Минимизировать общее пройденное расстояние.
MIN_WORKING_TIME Минимизируйте общее рабочее время, суммированное по всем транспортным средствам.
MIN_TRAVEL_TIME То же, что и выше, но с акцентом только на время в пути.
MIN_NUM_VEHICLES Минимизировать количество используемых транспортных средств.

PrecedenceRule

Правило приоритета между двумя событиями (каждое событие – это получение или доставка груза): "второе" событие должно начаться не ранее чем через offset_duration после начала "первого".

Несколько приоритетов могут относиться к одним и тем же (или связанным) событиям, например "забор B происходит после доставки A" и "забор C происходит после забора B".

Кроме того, приоритеты применяются, только если выполняются обе перевозки, и игнорируются в противном случае.

Поля
first_is_delivery

bool

Указывает, является ли "первое" событие доставкой.

second_is_delivery

bool

Указывает, является ли "второе" событие доставкой.

offset_duration

Duration

Смещение между первым и вторым событием. Значение может быть отрицательным.

first_index

int32

Индекс отправления "первого" события. Это поле должно быть заполнено.

second_index

int32

Индекс отправления для второго события. Это поле должно быть заполнено.

ShipmentRoute

Маршрут транспортного средства можно разбить по временной оси следующим образом (предполагается, что посещений n):

  |            |            |          |       |  T[2], |        |      |
  | Transition |  Visit #0  |          |       |  V[2], |        |      |
  |     #0     |    aka     |   T[1]   |  V[1] |  ...   | V[n-1] | T[n] |
  |  aka T[0]  |    V[0]    |          |       | V[n-2],|        |      |
  |            |            |          |       | T[n-1] |        |      |
  ^            ^            ^          ^       ^        ^        ^      ^
vehicle    V[0].start   V[0].end     V[1].   V[1].    V[n].    V[n]. vehicle
 start     (arrival)   (departure)   start   end      start    end     end

Обратите внимание, что мы различаем:

  • "точечные события", такие как начало и конец движения транспортного средства, а также начало и конец каждого посещения (прибытие и отправление). Они происходят в определенную секунду.
  • "временные интервалы", например сами посещения и переходы между ними. Хотя интервалы времени иногда могут иметь нулевую продолжительность, то есть начинаться и заканчиваться в одну и ту же секунду, часто они имеют положительную продолжительность.

Инварианты:

  • Если посещений n, то переходов n+1.
  • Посещение всегда окружено переходом до него (тот же индекс) и переходом после него (индекс + 1).
  • За запуском автомобиля всегда следует переход № 0.
  • Окончанию маршрута всегда предшествует переход #n.

Давайте подробнее рассмотрим, что происходит во время Transition и Visit.

---+-------------------------------------+-----------------------------+-->
   |           TRANSITION[i]             |           VISIT[i]          |
   |                                     |                             |
   |  * TRAVEL: the vehicle moves from   |      PERFORM the visit:     |
   |    VISIT[i-1].departure_location to |                             |
   |    VISIT[i].arrival_location, which |  * Spend some time:         |
   |    takes a given travel duration    |    the "visit duration".    |
   |    and distance                     |                             |
   |                                     |  * Load or unload           |
   |  * BREAKS: the driver may have      |    some quantities from the |
   |    breaks (e.g. lunch break).       |    vehicle: the "demand".   |
   |                                     |                             |
   |  * WAIT: the driver/vehicle does    |                             |
   |    nothing. This can happen for     |                             |
   |    many reasons, for example when   |                             |
   |    the vehicle reaches the next     |                             |
   |    event's destination before the   |                             |
   |    start of its time window         |                             |
   |                                     |                             |
   |  * DELAY: *right before* the next   |                             |
   |    arrival. E.g. the vehicle and/or |                             |
   |    driver spends time unloading.    |                             |
   |                                     |                             |
---+-------------------------------------+-----------------------------+-->
   ^                                     ^                             ^
V[i-1].end                           V[i].start                    V[i].end

Наконец, вот как можно организовать ПУТЕШЕСТВИЕ, ПЕРЕРЫВЫ, ЗАДЕРЖКУ и ОЖИДАНИЕ во время перехода.

  • Они не перекрывают друг друга.
  • Задержка DELAY уникальна и должна быть непрерывным периодом времени непосредственно перед следующим посещением (или окончанием работы транспортного средства). Таким образом, чтобы узнать время начала и окончания задержки, достаточно знать ее продолжительность.
  • BREAKS – это смежные, неперекрывающиеся периоды времени. В ответе указано время начала и продолжительность каждого перерыва.
  • TRAVEL и WAIT – это прерываемые действия. Они могут прерываться несколько раз во время перехода. Клиенты могут предположить, что поездка происходит "как можно скорее" и что "ожидание" заполняет оставшееся время.

Пример сложного запроса:

                               TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
  ||     |       |           |       |           |         |         ||
  ||  T  |   B   |     T     |       |     B     |         |    D    ||
  ||  r  |   r   |     r     |   W   |     r     |    W    |    e    ||
  ||  a  |   e   |     a     |   a   |     e     |    a    |    l    ||
  ||  v  |   a   |     v     |   i   |     a     |    i    |    a    ||
  ||  e  |   k   |     e     |   t   |     k     |    t    |    y    ||
  ||  l  |       |     l     |       |           |         |         ||
  ||     |       |           |       |           |         |         ||
--++-----------------------------------------------------------------++-->
Поля
vehicle_index

int32

Транспортное средство, выполняющее маршрут, идентифицируется по его индексу в источнике ShipmentModel.

vehicle_label

string

Ярлык транспортного средства, выполняющего этот маршрут, равный ShipmentModel.vehicles(vehicle_index).label, если указан.

vehicle_start_time

Timestamp

Время, когда транспортное средство начинает движение по маршруту.

vehicle_end_time

Timestamp

Время, когда транспортное средство завершает маршрут.

visits[]

Visit

Упорядоченная последовательность посещений, представляющая маршрут. visits[i] – это i-е посещение на маршруте. Если это поле пустое, транспортное средство считается неиспользуемым.

transitions[]

Transition

Упорядоченный список переходов для маршрута.

has_traffic_infeasibilities

bool

Если для поля OptimizeToursRequest.consider_road_traffic задано значение true, это означает, что несоответствия в расписании маршрута прогнозируются с использованием оценок продолжительности поездки на основе трафика. Возможно, у вас недостаточно времени, чтобы завершить поездку с учетом трафика, задержек и перерывов между посещениями, до первого посещения или после последнего посещения, при этом соблюдая временные окна посещения и транспортного средства. Пример:

  start_time(previous_visit) + duration(previous_visit) +
  travel_duration(previous_visit, next_visit) > start_time(next_visit)

Прибытие в пункт next_visit, скорее всего, произойдет позже текущего временного окна из-за увеличения расчетного времени в пути (travel_duration(previous_visit, next_visit)) в связи с дорожной ситуацией. Кроме того, перерыв может быть принудительно совмещен с посещением из-за увеличения расчетного времени в пути и ограничений по времени посещения или перерыва.

route_polyline

EncodedPolyline

Представление маршрута в виде закодированной ломаной линии. Это поле заполняется, только если для OptimizeToursRequest.populate_polylines задано значение true.

breaks[]

Break

Перерывы, запланированные для транспортного средства, выполняющего этот маршрут. Последовательность breaks представляет собой временные интервалы, каждый из которых начинается с соответствующего значения start_time и длится duration секунд.

metrics

AggregatedMetrics

Продолжительность, расстояние и нагрузка для этого маршрута. Поля AggregatedMetrics суммируются по всем ShipmentRoute.transitions или ShipmentRoute.visits в зависимости от контекста.

vehicle_fullness

VehicleFullness

VehicleFullness, чтобы рассчитать, насколько ограничение показателей близко к лимитам транспортных средств. Поля этого объекта содержат соотношения между полем ограниченного показателя (например, AggregatedMetrics.travel_distance_meters) и соответствующим лимитом транспортного средства (например, Vehicle.route_distance_limit).

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

route_costs

map<string, double>

Стоимость маршрута с разбивкой по полям запроса, связанным со стоимостью. Ключи – это пути прототипа, относящиеся к входному OptimizeToursRequest, например model.shipments.pickups.cost, а значения – это общая стоимость, сгенерированная соответствующим полем стоимости, агрегированная по всему маршруту. Другими словами, costs["model.shipments.pickups.cost"] – это сумма всех стоимостей самовывоза на маршруте. Все расходы, определенные в модели, подробно описаны здесь, за исключением расходов, связанных с TransitionAttributes, которые по состоянию на январь 2022 года представлены только в агрегированном виде.

route_total_cost

double

Общая стоимость маршрута. Сумма всех расходов на карте расходов.

Перерыв

Данные о выполнении рекламной паузы.

Поля
start_time

Timestamp

Время начала рекламной паузы.

duration

Duration

Продолжительность перерыва.

EncodedPolyline

Закодированное представление ломаной линии. Дополнительную информацию о кодировании ломаных линий можно найти на страницах https://developers.google.com/maps/documentation/utilities/polylinealgorithm и https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.

Поля
points

string

Строка, представляющая закодированные точки ломаной линии.

Переходы

Переход между двумя событиями на маршруте. Ознакомьтесь с описанием ShipmentRoute.

Если у транспортного средства нет start_location и/или end_location, соответствующие показатели поездки равны 0.

Поля
travel_duration

Duration

Продолжительность поездки во время этого перехода.

travel_distance_meters

double

Расстояние, пройденное во время перехода.

traffic_info_unavailable

bool

Если информация о трафике запрашивается через OptimizeToursRequest.consider_road_traffic и ее не удается получить для Transition, этому логическому значению присваивается true. Это может быть временная проблема (редкий сбой на серверах трафика в реальном времени) или постоянная (для этого местоположения нет данных).

delay_duration

Duration

Сумма задержек, примененных к этому переходу. Если задержка есть, она начинается ровно за delay_duration сек. до следующего события (посещения или окончания маршрута). Прочтите TransitionAttributes.delay.

break_duration

Duration

Суммарная продолжительность пауз, которые произошли во время этого перехода (если они были). Сведения о времени начала и продолжительности каждой рекламной паузы хранятся в ShipmentRoute.breaks.

wait_duration

Duration

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

total_duration

Duration

Общая продолжительность перехода, указанная для удобства. Она рассчитывается по следующей формуле:

  • start_time следующего посещения (или vehicle_end_time, если это последний переход) – start_time этого перехода;
  • Если ShipmentRoute.has_traffic_infeasibilities имеет значение false, то дополнительно выполняется следующее: total_duration = travel_duration + delay_duration.
  • break_duration + wait_duration`.
start_time

Timestamp

Время начала перехода.

route_polyline

EncodedPolyline

Закодированное представление ломаной линии маршрута, по которому двигался пользователь во время перехода. Это поле заполняется, только если для populate_transition_polylines задано значение true.

route_token

string

Только для вывода. Непрозрачный токен, который можно передать в Navigation SDK, чтобы восстановить маршрут во время навигации и, в случае изменения маршрута, соблюсти исходное намерение при создании маршрута. Этот токен следует рассматривать как непрозрачный объект. Не сравнивайте его значение в разных запросах, так как оно может измениться, даже если сервис возвращает один и тот же маршрут. Это поле заполняется, только если для populate_transition_polylines задано значение true.

vehicle_loads

map<string, VehicleLoad>

Загрузка транспортного средства во время этого перехода для каждого типа, который либо указан в Vehicle.load_limits этого транспортного средства, либо имеет ненулевое значение Shipment.load_demands для некоторой доставки, выполненной по этому маршруту.

Нагрузки во время первого перехода – это начальные нагрузки на маршруте транспортного средства. Затем после каждого посещения load_demands посещения либо добавляются, либо вычитаются, чтобы получить нагрузки следующего перехода, в зависимости от того, было ли посещение получением или доставкой.

VehicleLoad

Сообщает фактическую загрузку транспортного средства в определенной точке маршрута для заданного типа (см. Transition.vehicle_loads).

Поля
amount

int64

Степень загруженности транспортного средства указанного типа. Единица измерения нагрузки обычно указывается в типе. Посмотрите Transition.vehicle_loads.

Перейти

Посещение, выполненное во время маршрута. Это посещение соответствует получению или доставке Shipment.

Поля
shipment_index

int32

Индекс поля shipments в источнике ShipmentModel.

is_pickup

bool

Если значение равно true, посещение соответствует получению Shipment. В противном случае оно соответствует доставке.

visit_request_index

int32

Индекс VisitRequest в поле pickup или delivery объекта Shipment (см. is_pickup).

start_time

Timestamp

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

load_demands

map<string, Load>

Общая нагрузка на посещение как сумма отправления и запроса на посещение load_demands. Если посещение связано с доставкой, значения будут отрицательными. В отчетах указываются те же типы источников спроса, что и в поле Transition.loads.

detour

Duration

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

start_time(delivery) - start_time(pickup)
- (duration(pickup) + travel duration from the pickup location
to the delivery location).

В противном случае оно вычисляется на основе start_location транспортного средства и равно:

start_time - vehicle_start_time - travel duration from
the vehicle's `start_location` to the visit.
shipment_label

string

Копия соответствующего Shipment.label, если он указан в Shipment.

visit_label

string

Копия соответствующего VisitRequest.label, если он указан в VisitRequest.

visit_type

VisitType

Необязательное поле. Указывает тип посещения. Переопределяет поле Visit.is_pickup.

injected_solution_location_token

int32

Непрозрачный токен, представляющий информацию о месте посещения.

Это поле может быть заполнено в посещениях маршрутов результатов, если для этого посещения для VisitRequest.avoid_u_turns было установлено значение true или если для ShipmentModel.avoid_u_turns было установлено значение true в запросе OptimizeToursRequest.

Экспериментальная функция. Подробнее: https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request.

VisitType

Указывает, является ли посещение самовывозом, доставкой или посещением Stop. Посещения остановок используются, только если включена мультимодальная оптимизация.

Перечисления
VISIT_TYPE_UNSPECIFIED Тип посещения не указан.
PICKUP_SHIPMENT Посещение соответствует получению отправления.
DELIVER_SHIPMENT Посещение соответствует доставке груза.

ShipmentTypeIncompatibility

Указывает на несовместимость между отправлениями в зависимости от их shipment_type. Появление несовместимых отправлений на одном маршруте ограничивается в зависимости от режима несовместимости.

Поля
types[]

string

Список несовместимых типов. Две поставки с разными значениями shipment_types считаются несовместимыми.

incompatibility_mode

IncompatibilityMode

Режим, примененный к несовместимости.

IncompatibilityMode

Режимы, определяющие, как ограничивается появление несовместимых отправлений на одном маршруте.

Перечисления
INCOMPATIBILITY_MODE_UNSPECIFIED Неуказанный режим несовместимости. Это значение не должно использоваться.
NOT_PERFORMED_BY_SAME_VEHICLE В этом режиме две доставки несовместимых типов не могут выполняться одним транспортным средством.
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

В этом режиме две доставки несовместимых типов не могут находиться в одном транспортном средстве одновременно.

  • Они могут использовать один и тот же автомобиль, только если один заказ будет доставлен до того, как будет забран другой.
  • Если обе перевозки включают только забор груза (без доставки) или только доставку (без забора), они не могут выполняться одним транспортным средством.

ShipmentTypeRequirement

Задает требования к перевозкам на основе их shipment_type. Особенности требования определяются режимом требования.

Поля
required_shipment_type_alternatives[]

string

Список альтернативных типов доставки, необходимых для dependent_shipment_types.

dependent_shipment_types[]

string

Для всех отправлений с типом в поле dependent_shipment_types требуется, чтобы на том же маршруте было посещено хотя бы одно отправление типа required_shipment_type_alternatives.

ПРИМЕЧАНИЕ. Цепочки требований, в которых shipment_type зависит от самого себя, не допускаются.

requirement_mode

RequirementMode

Режим, примененный к требованию.

RequirementMode

Режимы, определяющие внешний вид зависимых отправлений на маршруте.

Перечисления
REQUIREMENT_MODE_UNSPECIFIED Режим требования не указан. Это значение не должно использоваться.
PERFORMED_BY_SAME_VEHICLE В этом режиме все "зависимые" отправления должны использовать то же транспортное средство, что и хотя бы одно из их "обязательных" отправлений.
IN_SAME_VEHICLE_AT_PICKUP_TIME

В режиме IN_SAME_VEHICLE_AT_PICKUP_TIME все зависимые отправления должны находиться в одном транспортном средстве с обязательным отправлением в момент его получения.

Поэтому у зависимого самовывоза должно быть одно из следующих значений:

  • обязательная доставка, которая выполняется после доставки на маршруте;
  • "Обязательная" доставка должна быть забрана до "зависимой". Если у "обязательной" доставки есть доставка, она должна быть выполнена после того, как будет забрана "зависимая" доставка.
IN_SAME_VEHICLE_AT_DELIVERY_TIME То же, что и в предыдущем случае, но зависимые отправления должны находиться в транспортном средстве в момент доставки обязательного отправления.

SkippedShipment

Указывает сведения о невыполненных доставках в решении. В простых случаях и/или если мы можем определить причину пропуска, мы указываем ее здесь.

Поля
index

int32

Индекс соответствует индексу отправления в источнике ShipmentModel.

label

string

Копия соответствующего Shipment.label, если он указан в Shipment.

reasons[]

Reason

Список причин, по которым отправка была пропущена. См. комментарий выше Reason. Если мы не сможем определить, почему отправка была пропущена, причины не будут указаны.

penalty_cost

double

Это копия Shipment.penalty_cost, которая включена сюда, чтобы было проще увидеть серьезность пропущенной отправки.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

estimated_incompatible_vehicle_ratio

double

Примерное соотношение транспортных средств, которые не могут выполнить эту перевозку по одной или нескольким причинам, указанным ниже. Примечание. Это поле заполняется, только если причина связана с транспортным средством.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

Причина

Если мы можем объяснить, почему отправка была пропущена, причины будут перечислены здесь. Если причины разные, то в массиве reason будет больше одного элемента. Для пропущенной доставки нельзя указать несколько одинаковых причин, то есть таких, у которых совпадают все поля, кроме example_vehicle_index. Пример:

reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 1
  example_exceeded_capacity_type: "Apples"
}
reasons {
  code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
  example_vehicle_index: 3
  example_exceeded_capacity_type: "Pears"
}
reasons {
  code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
  example_vehicle_index: 1
}

Пропущенная доставка несовместима со всеми транспортными средствами. Причины могут быть разными для всех транспортных средств, но по крайней мере у одного транспортного средства будет превышена вместимость "Яблок" (включая транспортное средство 1), по крайней мере у одного транспортного средства будет превышена вместимость "Груш" (включая транспортное средство 3) и по крайней мере у одного транспортного средства будет превышен лимит расстояния (включая транспортное средство 1).

Поля
code

Code

См. комментарии к коду.

example_vehicle_indices[]

int32

То же, что и example_vehicle_index, но мы предоставляем список нескольких идентифицированных транспортных средств. Этот список не является исчерпывающим. Это поле заполняется, только если для [fill_example_vehicle_indices_in_skipped_reasons][] задано значение true.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

example_exceeded_capacity_type

string

Если код причины – DEMAND_EXCEEDS_VEHICLE_CAPACITY, то в документе указан один тип емкости, который превышен.

example_vehicle_index

int32

Если причина связана с несовместимостью груза и транспортного средства, в этом поле указывается индекс одного подходящего транспортного средства.

Код

Код, определяющий тип причины. Порядок здесь не имеет значения. В частности, он не указывает, какая из причин будет показана первой, если применимы обе.

Перечисления
CODE_UNSPECIFIED Его не следует использовать.
NO_VEHICLE В модели нет транспортного средства, поэтому все перевозки невыполнимы.
DEMAND_EXCEEDS_VEHICLE_CAPACITY Требования к доставке превышают вместимость транспортного средства для некоторых типов вместимости, один из которых – example_exceeded_capacity_type.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT

Минимальное расстояние, необходимое для выполнения этой перевозки, то есть от start_location транспортного средства до мест погрузки и/или доставки груза и до конечного местоположения транспортного средства, превышает route_distance_limit транспортного средства.

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

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT

Минимальное время, необходимое для выполнения этой перевозки, включая время в пути, время ожидания и время обслуживания, превышает route_duration_limit транспортного средства.

Примечание. Время в пути рассчитывается для наилучшего сценария, а именно как геодезическое расстояние, умноженное на 36 м/с (примерно 130 км/ч).

CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT То же, что и выше, но сравнивается только минимальное время в пути и travel_duration_limit транспортного средства.
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS Транспортное средство не может выполнить эту доставку даже при наилучшем сценарии (см. CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT для расчета времени), если оно начнет движение в самое раннее время начала: общее время приведет к тому, что транспортное средство закончит движение после самого позднего времени окончания.
VEHICLE_NOT_ALLOWED Поле allowed_vehicle_indices отправления не пустое, и это транспортное средство не относится к нему.
VEHICLE_IGNORED

Поле ignore транспортного средства имеет значение true.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

SHIPMENT_IGNORED

Поле ignore отправления имеет значение true.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT

Доставка пропущена в injected_solution_constraint.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED

Ослабление ограничений для маршрута транспортного средства, указанное в поле injected_solution_constraint, не позволяет вставить посещение.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

ZERO_PENALTY_COST

У отправления нулевая стоимость штрафа. Это может быть полезно для расширенного моделирования, а также для объяснения того, почему отправка была пропущена.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

TimeWindow

Временные окна ограничивают время события, например время прибытия при посещении или время начала и окончания движения транспортного средства.

Жесткие границы временного окна, start_time и end_time, определяют самое раннее и самое позднее время события, так что start_time <= event_time <= end_time. Нижняя граница мягкого временного окна soft_start_time выражает предпочтение, чтобы событие произошло в момент soft_start_time или после него. Если событие происходит до soft_start_time, то начисляется стоимость, пропорциональная времени до soft_start_time. Верхняя граница мягкого временного окна soft_end_time означает, что событие должно произойти не позднее soft_end_time. Если оно произойдет позже soft_end_time, то будет начислена стоимость, пропорциональная времени задержки. start_time, end_time, soft_start_time и soft_end_time должны находиться в пределах глобальных ограничений по времени (см. ShipmentModel.global_start_time и ShipmentModel.global_end_time) и соответствовать следующим требованиям:

  0 <= `start_time` <= `end_time` and
  0 <= `start_time` <= `soft_start_time` and
  0 <= `soft_end_time` <= `end_time`.
Поля
start_time

Timestamp

Время начала жесткого временного окна. Если значение не указано, будет задано ShipmentModel.global_start_time.

end_time

Timestamp

Время окончания жесткого временного окна. Если значение не указано, будет задано ShipmentModel.global_end_time.

soft_start_time

Timestamp

Время начала интервала.

soft_end_time

Timestamp

Мягкое время окончания временного окна.

cost_per_hour_before_soft_start_time

double

Цена за час, которая добавляется к другим расходам в модели, если событие происходит до soft_start_time. Рассчитывается следующим образом:

   max(0, soft_start_time - t.seconds)
                          * cost_per_hour_before_soft_start_time / 3600,
t being the time of the event.

Значение должно быть положительным. Поле можно заполнить, только если задано значение soft_start_time.

cost_per_hour_after_soft_end_time

double

Цена за час, которая добавляется к другим расходам в модели, если событие происходит после soft_end_time. Рассчитывается следующим образом:

   max(0, t.seconds - soft_end_time.seconds)
                    * cost_per_hour_after_soft_end_time / 3600,
t being the time of the event.

Значение должно быть положительным. Поле можно заполнить, только если задано значение soft_end_time.

TransitionAttributes

Задает атрибуты переходов между двумя последовательными посещениями на маршруте. К одному переходу может применяться несколько TransitionAttributes. В этом случае все дополнительные расходы суммируются и применяется самое строгое ограничение или лимит (в соответствии с естественной семантикой "И").

Поля
src_tag

string

Теги, определяющие набор переходов (src->dst), к которым применяются эти атрибуты.

Исходное посещение или начало маршрута транспортного средства совпадает, если его VisitRequest.tags или Vehicle.start_tags содержит src_tag или не содержит excluded_src_tag (в зависимости от того, какое из этих двух полей не пустое).

excluded_src_tag

string

Посмотрите src_tag. Только одно из полей src_tag и excluded_src_tag должно быть заполнено.

dst_tag

string

Посещение пункта назначения или окончание маршрута транспортного средства соответствует условию, если его VisitRequest.tags или Vehicle.end_tags содержит dst_tag или не содержит excluded_dst_tag (в зависимости от того, какое из этих двух полей не пустое).

excluded_dst_tag

string

Посмотрите dst_tag. Только одно из полей dst_tag и excluded_dst_tag должно быть заполнено.

cost

double

Указывает стоимость выполнения этого перехода. Единица измерения должна быть такой же, как и для других расходов в модели. Значение не может быть отрицательным. Она применяется поверх всех остальных существующих расходов.

cost_per_kilometer

double

Указывает стоимость за километр, применяемую к расстоянию, пройденному при выполнении этого перехода. Она добавляется к значению атрибута Vehicle.cost_per_kilometer, указанному для автомобилей.

distance_limit

DistanceLimit

Ограничивает расстояние, которое можно преодолеть при выполнении этого перехода.

По состоянию на июнь 2021 г. поддерживаются только мягкие ограничения.

delay

Duration

Указывает задержку, возникающую при выполнении этого перехода.

Эта задержка всегда происходит после завершения посещения исходной страницы и перед началом посещения целевой страницы.

Ури

Универсальный идентификатор ресурса, указывающий на ресурс, который может быть прочитан и записан Route Optimization API.

Поля
uri

string

URI ресурса. Возможно, ресурс ещё не существует.

Содержимое ресурса закодировано в формате JSON или textproto. Поддерживаются только ресурсы Google Cloud Storage. Если ресурс закодирован в формате JSON, его название должно заканчиваться на .json. Если ресурс закодирован как textproto, его название должно заканчиваться на .txtpb. Например, URI Google Cloud Storage для файла в формате JSON может выглядеть так: gs://bucket/path/input/object.json.

Транспортное средство

Моделирует транспортное средство в задаче доставки. При решении задачи доставки для этого транспортного средства будет построен маршрут, начинающийся в точке start_location и заканчивающийся в точке end_location. Маршрут – это последовательность посещений (см. ShipmentRoute).

Поля
display_name

string

Отображаемое название транспортного средства, заданное пользователем. Длина названия не должна превышать 63 символа. Можно использовать символы UTF-8.

travel_mode

TravelMode

Способ передвижения, от которого зависит, какие дороги может использовать транспортное средство и с какой скоростью оно может двигаться. Дополнительные сведения: travel_duration_multiple.

route_modifiers

RouteModifiers

Набор условий, которые необходимо выполнить и которые влияют на расчет маршрутов для данного транспортного средства.

start_location

LatLng

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

start_waypoint

Waypoint

Путевая точка, представляющая географическое местоположение, в котором транспортное средство начинает движение до того, как заберет груз. Если не указаны ни start_waypoint, ни start_location, транспортное средство начинает маршрут в первом пункте посадки. Если в модели доставки есть матрицы длительности и расстояния, то start_waypoint указывать не нужно.

end_location

LatLng

Географическое местоположение, в котором транспортное средство заканчивает последний VisitRequest. Если значение не указано, ShipmentRoute транспортного средства завершается сразу после выполнения последнего VisitRequest. Если в модели доставки есть матрицы длительности и расстояния, то end_location указывать не нужно.

end_waypoint

Waypoint

Путевая точка, представляющая географическое местоположение, в котором транспортное средство останавливается после завершения последнего VisitRequest. Если не указано ни end_waypoint, ни end_location, ShipmentRoute транспортного средства завершается сразу после выполнения последнего VisitRequest. Если в модели доставки есть матрицы длительности и расстояния, то end_waypoint указывать не нужно.

start_tags[]

string

Указывает теги, прикрепленные к началу маршрута транспортного средства.

Пустые или повторяющиеся строки не допускаются.

end_tags[]

string

Указывает теги, прикрепленные к концу маршрута транспортного средства.

Пустые или повторяющиеся строки не допускаются.

start_time_windows[]

TimeWindow

Временные окна, в течение которых транспортное средство может покинуть начальное местоположение. Они должны находиться в пределах глобальных временных ограничений (см. поля ShipmentModel.global_*). Если значение не указано, то действуют только глобальные ограничения по времени.

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

Поля cost_per_hour_after_soft_end_time и soft_end_time можно задать, только если указан один временной интервал.

end_time_windows[]

TimeWindow

Временные интервалы, в течение которых транспортное средство может прибыть в конечный пункт назначения. Они должны находиться в пределах глобальных временных ограничений (см. поля ShipmentModel.global_*). Если значение не указано, то действуют только глобальные ограничения по времени.

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

Поля cost_per_hour_after_soft_end_time и soft_end_time можно задать, только если указан один временной интервал.

unloading_policy

UnloadingPolicy

Правила разгрузки, применяемые к транспортному средству.

load_limits

map<string, LoadLimit>

Вместимость транспортного средства (например, вес, объем, количество поддонов). Ключи в карте – это идентификаторы типа нагрузки, соответствующие ключам поля Shipment.load_demands. Если в этой карте нет определенного ключа, соответствующая емкость считается неограниченной.

cost_per_hour

double

Расходы на транспортное средство: все расходы суммируются и должны быть указаны в той же единице измерения, что и Shipment.penalty_cost.

Стоимость часа маршрута транспортного средства. Эта стоимость применяется к общему времени, затраченному на маршрут, и включает время в пути, время ожидания и время посещения. Использование cost_per_hour вместо cost_per_traveled_hour может привести к дополнительной задержке.

cost_per_traveled_hour

double

Стоимость часа в пути на маршруте транспортного средства. Эта стоимость применяется только к времени в пути по маршруту (то есть к значению, указанному в поле ShipmentRoute.transitions), и не включает время ожидания и время посещения.

cost_per_kilometer

double

Стоимость километра маршрута транспортного средства. Эта стоимость применяется к расстоянию, указанному в ShipmentRoute.transitions, и не применяется к расстоянию, пройденному от arrival_location до departure_location одного VisitRequest.

fixed_cost

double

Фиксированная стоимость, которая применяется, если это транспортное средство используется для доставки.

used_if_route_is_empty

bool

Это поле применяется только к транспортным средствам, маршрут которых не включает доставку грузов. Указывает, следует ли считать транспортное средство подержанным.

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

В противном случае транспортное средство не перемещается из начальной точки в конечную, а для break_rule и задержки (из TransitionAttributes) не задано расписание. В этом случае ShipmentRoute транспортного средства не содержит никакой информации, кроме индекса и метки транспортного средства.

route_duration_limit

DurationLimit

Ограничение, применяемое к общей продолжительности маршрута транспортного средства. В заданном OptimizeToursResponse продолжительность маршрута транспортного средства – это разница между его vehicle_end_time и vehicle_start_time.

travel_duration_limit

DurationLimit

Ограничение, применяемое к продолжительности поездки по маршруту транспортного средства. В заданном OptimizeToursResponse продолжительность поездки по маршруту равна сумме всех его transitions.travel_duration.

route_distance_limit

DistanceLimit

Ограничение, применяемое к общей протяженности маршрута транспортного средства. В заданном объекте OptimizeToursResponse расстояние маршрута – это сумма всех его объектов transitions.travel_distance_meters.

extra_visit_duration_for_visit_type

map<string, Duration>

Указывает сопоставление строк visit_types с длительностью. Продолжительность – это время, которое добавляется к VisitRequest.duration для посещений с указанным visit_types. Если указано значение cost_per_hour, то за дополнительное время посещения взимается плата. Ключи (например, visit_types) не могут быть пустыми строками.

Если у запроса на посещение несколько типов, на карте будет добавлена продолжительность для каждого типа.

break_rule

BreakRule

Описывает расписание перерывов, которое должно соблюдаться для этого транспортного средства. Если поле не заполнено, перерывы для этого транспортного средства не планируются.

label

string

Указывает ярлык для этого транспортного средства. Этот ярлык возвращается в ответе как vehicle_label соответствующего ShipmentRoute.

ignore

bool

Если задано значение true, то для used_if_route_is_empty должно быть задано значение false, и это транспортное средство не будет использоваться.

Если доставка выполняется игнорируемым транспортным средством в injected_first_solution_routes, она пропускается в первом решении, но может быть выполнена в ответе.

Если перевозка выполняется игнорируемым транспортным средством в injected_solution_constraint и любая связанная с ним погрузка/доставка должна оставаться на транспортном средстве (т.е. не ослаблена до уровня RELAX_ALL_AFTER_THRESHOLD), она пропускается в ответе. Если у отправления есть непустое поле allowed_vehicle_indices и все разрешенные транспортные средства игнорируются, оно пропускается в ответе.

travel_duration_multiple

double

Указывает мультипликативный коэффициент, который можно использовать для увеличения или уменьшения времени в пути этого транспортного средства. Например, если указать значение 2,0, то время в пути для этого транспортного средства будет в два раза больше, чем для стандартного. Этот коэффициент не влияет на продолжительность посещений. Если заданы cost_per_hour или cost_per_traveled_hour, это влияет на стоимость. Значение должно находиться в диапазоне [0,001; 1000,0]. Если значение не задано, транспортное средство считается стандартным, а множитель – равным 1,0.

ВНИМАНИЕ! Время в пути будет округлено до ближайшей секунды после применения этого множителя, но до выполнения любых числовых операций, поэтому небольшой множитель может привести к потере точности.

См. также раздел extra_visit_duration_for_visit_type ниже.

DurationLimit

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

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

Поля
max_duration

Duration

Строгое ограничение, согласно которому продолжительность не должна превышать max_duration.

soft_max_duration

Duration

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

Если задано свойство soft_max_duration, его значение должно быть неотрицательным. Если также задан параметр max_duration, значение soft_max_duration должно быть меньше, чем max_duration.

quadratic_soft_max_duration

Duration

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

Если задано значение quadratic_soft_max_duration, должны выполняться следующие условия:

  • Значение должно быть неотрицательным.
  • Необходимо указать max_duration.
  • Значение quadratic_soft_max_duration должно быть меньше max_duration.
  • Разница должна быть не больше одного дня: max_duration - quadratic_soft_max_duration <= 86400 seconds.
cost_per_hour_after_soft_max

double

Стоимость за час, если нарушено пороговое значение soft_max_duration. Если продолжительность меньше порогового значения, дополнительная плата не взимается. В противном случае она зависит от продолжительности следующим образом:

  cost_per_hour_after_soft_max * (duration - soft_max_duration)

Стоимость не может быть отрицательной.

cost_per_square_hour_after_quadratic_soft_max

double

Стоимость за квадратный час, которая взимается при нарушении порогового значения quadratic_soft_max_duration.

Если продолжительность меньше порогового значения, дополнительная плата не взимается. В противном случае она зависит от продолжительности следующим образом:

  cost_per_square_hour_after_quadratic_soft_max *
  (duration - quadratic_soft_max_duration)^2

Стоимость не может быть отрицательной.

LoadLimit

Определяет ограничение по весу груза, которое применяется к транспортному средству, например "этот грузовик может перевозить не более 3500 кг". Посмотрите load_limits.

Поля
soft_max_load

int64

Регулируемое ограничение нагрузки. Посмотрите cost_per_unit_above_soft_max.

cost_per_unit_above_soft_max

double

Если нагрузка на маршруте этого транспортного средства превысит soft_max_load, будет применен следующий штраф (только один раз для каждого транспортного средства): (нагрузка – soft_max_load) * cost_per_unit_above_soft_max. Все расходы суммируются и должны быть указаны в той же единице измерения, что и Shipment.penalty_cost. Мягкие ограничения можно задавать только для типов, которые применяются либо только к заборам, либо только к доставкам во всей модели.

start_load_interval

Interval

Допустимый интервал загрузки транспортного средства в начале маршрута.

end_load_interval

Interval

Допустимый интервал загрузки транспортного средства в конце маршрута.

max_load

int64

Максимально допустимая нагрузка.

cost_per_kilometer

LoadCost

Стоимость перемещения одной единицы груза на один километр для этого транспортного средства. Этот показатель можно использовать как косвенный показатель расхода топлива: если нагрузка – это вес (в ньютонах), то нагрузка*километр имеет размерность энергии.

Экспериментальная функция. Подробную информацию можно найти на странице https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

cost_per_traveled_hour

LoadCost

Стоимость перевозки единицы груза в течение одного часа для этого транспортного средства.

Экспериментальная функция. Подробную информацию можно найти на странице https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Интервал

Интервал допустимых объемов загрузки.

Поля
min

int64

Минимально допустимая нагрузка. Значение должно быть больше или равно 0. Если указаны оба, то min должно быть меньше или равно max.

max

int64

Максимально допустимая нагрузка. Значение должно быть больше или равно 0. Если значение не указано, максимальная нагрузка не ограничивается этим сообщением. Если указаны оба, то min должно быть меньше или равно max.

LoadCost

Стоимость перемещения одной единицы груза в течение Transition. Для заданной нагрузки стоимость состоит из двух частей:

  • min(load, load_threshold) * cost_per_unit_below_threshold
  • max(0, load - load_threshold) * cost_per_unit_above_threshold

При такой стоимости решения предпочитают сначала доставлять высокие требования или, что эквивалентно, забирать высокие требования в последнюю очередь. Например, если у автомобиля

load_limit {
  key: "weight"
  value {
    cost_per_kilometer {
      load_threshold: 15
      cost_per_unit_below_threshold: 2.0
      cost_per_unit_above_threshold: 10.0
    }
  }
}

и его маршрут: старт,самовывоз,самовывоз,доставка,доставка,конец с переходами:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

тогда стоимость, понесенная этим LoadCost, равна (cost_below * load_below * kilometers + cost_above * load_above * kms)

  • переход 0: 0.0
  • переход 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0;
  • Переход 2: 2,0 * 15 * 1,0 + 10,0 * (20 - 15) * 1,0 = 80,0
  • переход 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0;
  • переход 4: 0.0

Таким образом, LoadCost на маршруте составляет 120,0.

Однако если маршрут состоит из следующих точек: начало, получение,доставка,получение,доставка,конец,то переходы будут такими:

transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travel_distance_meters: 1000.0 }

тогда расходы, связанные с этим LoadCost, составят

  • переход 0: 0.0
  • переход 1: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0;
  • переход 2: 0.0
  • переход 3: 2,0 * 10 * 1,0 + 10,0 * 0 * 1,0 = 20,0;
  • переход 4: 0,0

В данном случае LoadCost по маршруту составляет 40,0.

LoadCost увеличивает стоимость решений с переходами, в которых перевозится много груза.

Экспериментальная функция. Подробную информацию можно найти на странице https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request.

Поля
load_threshold

int64

Объем груза, выше которого стоимость перемещения единицы груза меняется с cost_per_unit_below_threshold на cost_per_unit_above_threshold. Значение должно быть больше или равно 0.

cost_per_unit_below_threshold

double

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

cost_per_unit_above_threshold

double

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

TravelMode

Способы передвижения, которые могут использоваться транспортными средствами.

Это должно быть подмножество способов передвижения Routes API платформы Google Карт. См. https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode.

Примечание. Маршруты для WALKING находятся на этапе бета-тестирования. Иногда на них могут отсутствовать тротуары или пешеходные дорожки. Вы должны показывать это предупреждение пользователю для всех пешеходных маршрутов, которые вы показываете в своем приложении.

Перечисления
TRAVEL_MODE_UNSPECIFIED Способ передвижения не указан, эквивалентно DRIVING.
DRIVING Режим передвижения, соответствующий маршруту (автомобиль и т. д.).
WALKING Способ передвижения, соответствующий пешеходному маршруту.

UnloadingPolicy

Правила разгрузки транспортного средства. Применяется только к отправлениям, для которых указаны и самовывоз, и доставка.

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

Перечисления
UNLOADING_POLICY_UNSPECIFIED Правила разгрузки не указаны. Доставка должна выполняться после соответствующего забора.
LAST_IN_FIRST_OUT Доставка должна выполняться в порядке, обратном порядку получения.
FIRST_IN_FIRST_OUT Доставка должна выполняться в том же порядке, что и самовывоз.

VehicleFullness

VehicleFullness – это показатель, который вычисляет, насколько заполнено транспортное средство. Каждое поле VehicleFullness находится в диапазоне от 0 до 1 и вычисляется как отношение между полем ограниченного показателя (например, AggregatedMetrics.travel_distance_meters) и связанным с ним ограничением транспортного средства (например, Vehicle.route_distance_limit), если оно существует. В противном случае коэффициент заполненности не задается. Если лимит равен 0, в поле устанавливается значение 1. Примечание. Если маршрут невыполним из-за трафика, некоторые необработанные коэффициенты заполнения могут превышать 1,0, например транспортное средство может превысить ограничение по расстоянию. В таких случаях мы ограничиваем значение заполненности до 1, 0.

Поля
max_fullness

double

Максимальное значение всех остальных полей в этом сообщении.

distance

double

Соотношение между AggregatedMetrics.travel_distance_meters и Vehicle.route_distance_limit. Если правило Vehicle.route_distance_limit не задано, это поле будет пустым.

travel_duration

double

Соотношение между [AggregatedMetrics.travel_duration_seconds][] и Vehicle.travel_duration_limit. Если правило Vehicle.travel_duration_limit не настроено, это поле будет пустым.

active_duration

double

Отношение [AggregatedMetrics.total_duration_seconds][] к Vehicle.route_duration_limit. Если правило Vehicle.route_duration_limit не настроено, это поле будет пустым.

max_load

double

Максимальное соотношение между всеми типами [AggregatedMetrics.max_load][] и их соответствующими Vehicle.load_limits. Если все поля Vehicle.load_limits не заданы, это поле также не будет задано.

active_span

double

Отношение (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) для заданного транспортного средства. Если знаменатель отсутствует, используется (ShipmentModel.global_end_time - ShipmentModel.global_start_time).

Путевая точка

Инкапсулирует путевую точку. Путевые точки обозначают места прибытия и отправления для VisitRequests, а также начальные и конечные местоположения для Vehicles.

Поля
side_of_road

bool

Необязательное поле. Указывает, что местоположение этой путевой точки должно иметь предпочтение для остановки транспортного средства на определенной стороне дороги. Если вы зададите это значение, маршрут будет проходить через местоположение, чтобы транспортное средство могло остановиться на той стороне дороги, к которой смещено местоположение относительно центра дороги. Этот вариант не подходит для пеших маршрутов.

vehicle_stopover

bool

Указывает, что путевая точка предназначена для остановки транспортных средств с целью посадки или высадки пассажиров. Этот параметр работает только для режима движения DRIVING и когда для location_type задано значение location.

Экспериментальное поле. Его поведение или наличие может измениться в будущем.

Объединенное поле location_type. Различные способы представления местоположения. location_type может иметь одно из следующих значений:
location

Location

Точка, заданная с помощью географических координат, включая необязательный заголовок.

place_id

string

Идентификатор места POI, связанный с путевой точкой.

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