Создать слой анализа задачи маршрута транспорта (Network Analyst)

Краткая информация

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

Использование

  • После создания слоя анализа при помощи данного инструмента, вы можете добавлять в него объекты сетевого анализа при помощи инструмента Добавить положения, выполнять анализ при помощи инструмента Расчет и сохранять результаты на диске при помощи инструмента Сохранить в файл слоя.

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

Параметры

ПодписьОписаниеТип данных
Источник сетевых данных

Набор сетевых данных или сервис, для которого выполняется сетевой анализ. Для сервиса используйте URL-адрес портала.

Network Dataset Layer; String
Имя слоя
(Дополнительный)

Имя создаваемого слоя сетевого анализа VRP.

String
Режим передвижения
(Дополнительный)

Имя режима передвижения для выполнения анализа. Режим передвижения представляет собой набор сетевых настроек, например, ограничений передвижения и правил разворотов, определяющих, как пешеход, легковой или грузовой автомобиль или другое средство транспорта передвигается по сети. Режимы передвижения определяются вашим источником сетевых данных. Объект arcpy.na.TravelMode и строка, содержащая действительное представление JSON режима перемещения, также могут использоваться как ввод для параметра.

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

String
Единицы поля времени
(Дополнительный)

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

Более подробно о атрибутах стоимости

  • МинутыЕдиницы времени даются в минутах. Это значение по умолчанию
  • СекундыЕдиницы времени даются в секундах.
  • ЧасыЕдиницы времени даются в часах.
  • ДниЕдиницы времени даются в днях.
String
Единицы поля расстояния
(Дополнительный)

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

Более подробно о атрибутах стоимости

  • МилиЕдиницами измерения расстояния будут мили. Это значение по умолчанию
  • КилометрыЕдиницами измерения расстояния будут километры.
  • ФутыЕдиницами измерения расстояния будут футы.
  • ЯрдыЕдиницами измерения расстояния будут ярды.
  • МетрыЕдиницами измерения расстояния будут метры.
  • ДюймыЕдиницами измерения расстояния будут дюймы.
  • СантиметрыЕдиницами измерения расстояния будут сантиметры.
  • МиллиметрыЕдиницами измерения расстояния будут миллиметры.
  • ДециметрыЕдиницами измерения расстояния будут дециметры.
  • Морские милиЕдиницами измерения расстояния будут морские мили.
String
Дата по умолчанию
(Дополнительный)

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

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

  • Сегодня – 12/30/1899
  • Воскресенье – 12/31/1899
  • Понедельник – 1/1/1900
  • Вторник – 1/2/1900
  • Среда – 1/3/1900
  • Четверг – 1/4/1900
  • Пятница – 1/5/1900
  • Суббота – 1/6/1900

Узнать подробнее о том, как дата и время используется и интерпретируется в сетевом анализе

Date
Часовой пояс для полей времени
(Дополнительный)

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

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

  • Локальное время в местоположенияхЗначения даты и времени, связанные с заказами или станциями, будут находиться в часовом поясе, в котором расположены заказы и станции. Для маршрутов значения даты-времени основываются на часовом поясе, в котором расположено станция начала маршрута. Если у маршрута нет исходной станции, то все заказы и станции на всех маршрутах должны быть в одном часовом поясе. Для остановок значения даты-времени основываются на часовом поясе маршрута. Это значение по умолчанию
  • UTCЗначения даты и времени, связанные с заказами или станциями, будут в скоординированном универсальном времени (UTC) и не будут соответствовать часовому поясу, в котором расположены заказы и станции.
String
Форма выходного маршрута
(Дополнительный)

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

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

  • По сетиПолученные маршруты будут иметь точную форму лежащих в основе источников сети. Выходные данные содержат данные линейных измерений маршрутов. Значения измерений увеличиваются от первой остановки и сохраняют общий импеданс до достижения заданного положения.
  • Без линийДля выходных маршрутов форма не создается.
  • Прямые линииВыходной формой маршрута будет прямая линия, соединяющая остановки.Эта опция недоступна, если выбранный источник сетевых данных является сервисом.
String
Значимость превышения временного окна
(Дополнительный)

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

  • ВысокоеМеханизм расчета ищет решение с минимальным нарушением временных окон путем увеличения общего времени в пути. Выберите данный параметр, если прибытие на заказы вовремя важнее, чем сокращение общей стоимости. Это может быть необходимо, если вы встречаетесь с клиентами по вашей просьбе и не хотите создавать им неудобства в случае опоздания (альтернативным вариантом является использование жесткого временного окна, которое нельзя нарушить).При наличии других ограничений задачи выбора маршрута транспорта может быть невозможно посетить все заказы в пределах выделенных для них временных окон. В этом случае даже настройка Высокий может вызывать нарушения.
  • СреднееМеханизм расчета будет стремиться найти компромиссное решение с одновременным соблюдением временных окон и обеспечением минимальных затрат. Это значение по умолчанию
  • НизкоеМеханизм расчета ищет решение с минимальным временем в пути независимо от временных окон. Выберите данный параметр, если соблюдение временных окон не столь важно, как сокращение общей стоимости. Этот параметр также можно использовать при накоплении отставания в обработке заказов. Для обработки как можно большего количества заказов в день и сокращения отставания можно выбрать данный параметр несмотря на то, что клиенты могут испытывать неудобства из-за позднего прибытия транспортных средств.
String
Значимость избыточного времени нахождения в пути
(Дополнительный)

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

Более подробно о парах заказов

  • ВысокоеМеханизм расчета ищет решение с минимальным лишним временем между вызовами за счет увеличения общего времени в пути. Используйте этот параметр при необходимости перевозки людей между парами заказов, и вы хотите сократить их время в пути. Это характеристика сервисов такси
  • СреднееМеханизм расчета ищет компромиссное решение с одновременным сокращением избыточного времени и обеспечением минимальных общих затрат. Это значение по умолчанию
  • НизкоеМеханизм расчета ищет решение, минимизирующее общие затраты, независимо от избыточного времени в пути. Этот параметр обычно используется курьерской службой. Поскольку курьерская служба перевозит грузы, а не людей, время в пути не имеет большого значения. Использование данного параметра позволяет курьерской службе обслуживать парные заказы в должной очередности и минимизировать общие затраты.
String
Построить путевой лист при расчете
(Дополнительный)

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

  • Отмечено – при расчете будет создан пошаговый путевой лист. Это значение по умолчанию
  • Не отмечено – во время расчета не будет создаваться пошаговый путевой лист.
Boolean
Пространственная кластеризация
(Дополнительный)

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

  • Отмечено – Заказы, назначенные для отдельного маршрута, будут пространственно кластеризованы. Деление заказов на кластеры приводит к сохранению маршрутов в небольших областях и сокращает частоту пересечения линий маршрутов; при этом деление на кластеры может привести к увеличению общего времени в пути. Это значение по умолчанию
  • Не отмечено – механизм расчета не будет выставлять приоритеты для пространственно кластеризованных заказов, и линии маршрутов могут пересекаться. Используйте данный параметр, если указаны зоны маршрута.
Boolean
Игнорировать неверные местоположения в течение времени расчета
(Дополнительный)

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

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

Производные выходные данные

ПодписьОписаниеТип данных
Слой Network Analyst

Новый слой сетевого анализа.

Network Analyst Layer

arcpy.management.MakeVehicleRoutingProblemAnalysisLayer(network_data_source, {layer_name}, {travel_mode}, {time_units}, {distance_units}, {default_date}, {time_zone_for_time_fields}, {line_shape}, {time_window_factor}, {excess_transit_factor}, {generate_directions_on_solve}, {spatial_clustering}, {ignore_invalid_locations})
ИмяОписаниеТип данных
network_data_source

Набор сетевых данных или сервис, для которого выполняется сетевой анализ. Для сервиса используйте URL-адрес портала.

Network Dataset Layer; String
layer_name
(Дополнительный)

Имя создаваемого слоя сетевого анализа VRP.

String
travel_mode
(Дополнительный)

Имя режима передвижения для выполнения анализа. Режим передвижения представляет собой набор сетевых настроек, например, ограничений передвижения и правил разворотов, определяющих, как пешеход, легковой или грузовой автомобиль или другое средство транспорта передвигается по сети. Режимы передвижения определяются вашим источником сетевых данных. Объект arcpy.na.TravelMode и строка, содержащая действительное представление JSON режима перемещения, также могут использоваться как ввод для параметра.

String
time_units
(Дополнительный)

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

Более подробно о атрибутах стоимости

  • MinutesЕдиницы времени даются в минутах. Это значение по умолчанию
  • SecondsЕдиницы времени даются в секундах.
  • HoursЕдиницы времени даются в часах.
  • DaysЕдиницы времени даются в днях.
String
distance_units
(Дополнительный)

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

Более подробно о атрибутах стоимости

  • MilesЕдиницами измерения расстояния будут мили. Это значение по умолчанию
  • KilometersЕдиницами измерения расстояния будут километры.
  • FeetЕдиницами измерения расстояния будут футы.
  • YardsЕдиницами измерения расстояния будут ярды.
  • MetersЕдиницами измерения расстояния будут метры.
  • InchesЕдиницами измерения расстояния будут дюймы.
  • CentimetersЕдиницами измерения расстояния будут сантиметры.
  • MillimetersЕдиницами измерения расстояния будут миллиметры.
  • DecimetersЕдиницами измерения расстояния будут дециметры.
  • NauticalMilesЕдиницами измерения расстояния будут морские мили.
String
default_date
(Дополнительный)

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

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

  • Сегодня – 12/30/1899
  • Воскресенье – 12/31/1899
  • Понедельник – 1/1/1900
  • Вторник – 1/2/1900
  • Среда – 1/3/1900
  • Четверг – 1/4/1900
  • Пятница – 1/5/1900
  • Суббота – 1/6/1900

Узнать подробнее о том, как дата и время используется и интерпретируется в сетевом анализе

Date
time_zone_for_time_fields
(Дополнительный)

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

  • LOCAL_TIME_AT_LOCATIONSЗначения даты и времени, связанные с заказами или станциями, будут находиться в часовом поясе, в котором расположены заказы и станции. Для маршрутов значения даты-времени основываются на часовом поясе, в котором расположено станция начала маршрута. Если у маршрута нет исходной станции, то все заказы и станции на всех маршрутах должны быть в одном часовом поясе. Для остановок значения даты-времени основываются на часовом поясе маршрута. Это значение по умолчанию
  • UTCЗначения даты и времени, связанные с заказами или станциями, будут в скоординированном универсальном времени (UTC) и не будут соответствовать часовому поясу, в котором расположены заказы и станции.

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

String
line_shape
(Дополнительный)

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

  • ALONG_NETWORKПолученные маршруты будут иметь точную форму лежащих в основе источников сети. Выходные данные содержат данные линейных измерений маршрутов. Значения измерений увеличиваются от первой остановки и сохраняют общий импеданс до достижения заданного положения.
  • NO_LINESДля выходных маршрутов форма не создается.
  • STRAIGHT_LINESВыходной формой маршрута будет прямая линия, соединяющая остановки.Эта опция недоступна, если выбранный источник сетевых данных является сервисом.

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

String
time_window_factor
(Дополнительный)

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

  • HighМеханизм расчета ищет решение с минимальным нарушением временных окон путем увеличения общего времени в пути. Выберите данный параметр, если прибытие на заказы вовремя важнее, чем сокращение общей стоимости. Это может быть необходимо, если вы встречаетесь с клиентами по вашей просьбе и не хотите создавать им неудобства в случае опоздания (альтернативным вариантом является использование жесткого временного окна, которое нельзя нарушить).При наличии других ограничений задачи выбора маршрута транспорта может быть невозможно посетить все заказы в пределах выделенных для них временных окон. В этом случае даже настройка Высокий может вызывать нарушения.
  • MediumМеханизм расчета будет стремиться найти компромиссное решение с одновременным соблюдением временных окон и обеспечением минимальных затрат. Это значение по умолчанию
  • LowМеханизм расчета ищет решение с минимальным временем в пути независимо от временных окон. Выберите данный параметр, если соблюдение временных окон не столь важно, как сокращение общей стоимости. Этот параметр также можно использовать при накоплении отставания в обработке заказов. Для обработки как можно большего количества заказов в день и сокращения отставания можно выбрать данный параметр несмотря на то, что клиенты могут испытывать неудобства из-за позднего прибытия транспортных средств.
String
excess_transit_factor
(Дополнительный)

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

Более подробно о парах заказов

  • HighМеханизм расчета ищет решение с минимальным лишним временем между вызовами за счет увеличения общего времени в пути. Используйте этот параметр при необходимости перевозки людей между парами заказов, и вы хотите сократить их время в пути. Это характеристика сервисов такси
  • MediumМеханизм расчета ищет компромиссное решение с одновременным сокращением избыточного времени и обеспечением минимальных общих затрат. Это значение по умолчанию
  • LowМеханизм расчета ищет решение, минимизирующее общие затраты, независимо от избыточного времени в пути. Этот параметр обычно используется курьерской службой. Поскольку курьерская служба перевозит грузы, а не людей, время в пути не имеет большого значения. Использование данного параметра позволяет курьерской службе обслуживать парные заказы в должной очередности и минимизировать общие затраты.
String
generate_directions_on_solve
(Дополнительный)

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

  • DIRECTIONSПри расчете будет создан пошаговый путевой лист. Это значение по умолчанию
  • NO_DIRECTIONSПри расчете не будет создаваться пошаговый путевой лист.
Boolean
spatial_clustering
(Дополнительный)

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

  • CLUSTERЗаказы, назначенные для отдельного маршрута, будут пространственно кластеризованы. Деление заказов на кластеры приводит к сохранению маршрутов в небольших областях и сокращает частоту пересечения линий маршрутов; при этом деление на кластеры может привести к увеличению общего времени в пути. Это значение по умолчанию
  • NO_CLUSTERМеханизм расчета не будет выставлять приоритеты для пространственно кластеризованных заказов, и линии маршрутов могут пересекаться. Используйте данный параметр, если указаны зоны маршрута.
Boolean
ignore_invalid_locations
(Дополнительный)

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

  • SKIPНеверные входные местоположения будут игнорироваться, поэтому анализ будет успешным только при использовании допустимых местоположений.
  • HALTНеверные местоположения не будут игнорироваться, что приведет к сбою анализа. Это значение по умолчанию
Boolean

Производные выходные данные

ИмяОписаниеТип данных
out_network_analysis_layer

Новый слой сетевого анализа.

Network Analyst Layer

Пример кода

MakeVehicleRoutingProblemAnalysisLayer, пример 1 (окно Python)

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

import arcpy 
arcpy.env.workspace = "C:/Data/SanFrancisco.gdb" 
arcpy.na.MakeVehicleRoutingProblemAnalysisLayer("Transportation/Streets_ND")
MakeVehicleRoutingProblemAnalysisLayer, пример 2 (окно Python)

Запустите инструмент с использованием всех параметров.

import arcpy
arcpy.env.workspace = "C:/Data/SanFrancisco.gdb"
arcpy.na.MakeVehicleRoutingProblemAnalysisLayer('Streets_ND', 'FridayRoutes', 
                                                'Driving Time', 'Minutes', 
                                                'Miles', '1/2/2020', 
                                                'LOCAL_TIME_AT_LOCATIONS', 
                                                'TRUE_LINES_WITHOUT_MEASURES', 
                                                'High', 'Medium', 'DIRECTIONS')
MakeVehicleRoutingProblemAnalysisLayer, пример 3 (рабочий процесс)

В следующем автономном скрипте Python показано, как с помощью функции MakeVehicleRoutingProblemAnalysisLayer можно создать маршрут для обработки набора заказов.

# Name: MakeVRPAnalysisLayer_Ex3_Workflow.py
# Description: Find the best routes for a fleet of vehicles, which is operated
#              by a distribution company, to deliver goods from a main
#              distribution center to a set of grocery stores.
# Requirements: Network Analyst Extension

# Import system modules
import arcpy
import os

try:
    # Check out the Network Analyst license if available.
    # Fail if the Network Analyst
    # license is not available.
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        raise arcpy.ExecuteError("Network Analyst Extension license is not available.")

    # Set environment settings
    output_dir = r"C:\Data"
    # The NA layer's data will be saved to the workspace specified here
    arcpy.env.workspace = os.path.join(output_dir, "Output.gdb")
    arcpy.env.overwriteOutput = True

    # Set local variables
    input_gdb = "C:/Data/SanFrancisco.gdb"
    network = os.path.join(input_gdb, "Transportation", "Streets_ND")
    layer_name = "StoreDeliveryRoute"
    travel_mode = "Driving Time"
    time_units = "Minutes"
    distance_units = "Miles"
    in_orders = os.path.join(input_gdb, "Analysis", "Stores")
    in_depots = os.path.join(input_gdb, "Analysis", "DistributionCenter")
    in_routes = os.path.join(input_gdb, "Analysis", "Routes")
    output_layer_file = os.path.join(output_dir, layer_name + ".lyrx")

    # Create a new Vehicle Routing Problem (VRP) layer. Since the time-based
    # attributes such as ServiceTime on orders and CostPerUnitTime on routes is
    # recorded in minutes, we use minutes for time_units parameter. As we are
    # using cost per unit distance in routes, we have to specify a distance
    # attribute. The values for CosterPerUnitDistance are in miles, so we
    # specify miles for distance units parameter
    result_object = arcpy.na.MakeVehicleRoutingProblemAnalysisLayer(
        network, layer_name, travel_mode, time_units, distance_units,
        line_shape="STRAIGHT_LINES")

    # Get the layer object form the result object. The route layer can now be
    # referenced using the layer object.
    layer_object = result_object.getOutput(0)

    # Get the names of all the sublayers within the VRP layer.
    sub_layer_names = arcpy.na.GetNAClassNames(layer_object)
    # Store the layer names that we will use later
    orders_layer_name = sub_layer_names["Orders"]
    depots_layer_name = sub_layer_names["Depots"]
    routes_layer_name = sub_layer_names["Routes"]

    # Load the store locations as orders. Using field mappings we map the
    # TimeWindowStart1, TimeWindowEnd1, and DeliveryQuantities properties
    # for Orders from the fields of store features and assign a value of
    # 0 to MaxViolationTime1 property. The Name and ServiceTime properties
    # have the correct mapped field names when using the candidate fields
    # from store locations feature class.
    candidate_fields = arcpy.ListFields(in_orders)
    order_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, orders_layer_name, False, candidate_fields)
    order_field_mappings["TimeWindowStart"].mappedFieldName = "TimeStart1"
    order_field_mappings["TimeWindowEnd"].mappedFieldName = "TimeEnd1"
    order_field_mappings["DeliveryQuantity_1"].mappedFieldName = "Demand"
    order_field_mappings["MaxViolationTime"].defaultValue = 0
    arcpy.na.AddLocations(layer_object, orders_layer_name, in_orders, order_field_mappings, "")

    # Load the depots from the distribution center features. Using field mappings
    # we map the Name properties for Depots from the fields of distribution
    # center features and assign a value of 8 AM for TimeWindowStart1 and a
    # value of 5 PM for TimeWindowEnd1 properties
    depot_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, depots_layer_name)
    depot_field_mappings["Name"].mappedFieldName = "Name"
    depot_field_mappings["TimeWindowStart"].defaultValue = "8 AM"
    depot_field_mappings["TimeWindowEnd"].defaultValue = "5 PM"
    arcpy.na.AddLocations(layer_object, depots_layer_name, in_depots, depot_field_mappings, "")

    # Load the routes from a table containing information about routes. In this
    # case, since the fields on the routes table and property names for Routes
    # are the same, we will just use the default field mappings
    routes_field_mappings = arcpy.na.NAClassFieldMappings(layer_object, routes_layer_name)
    routes_field_mappings["Name"].mappedFieldName = "Name"
    routes_field_mappings["StartDepotName"].mappedFieldName = "StartDepotName"
    routes_field_mappings["EndDepotName"].mappedFieldName = "EndDepotName"
    routes_field_mappings["StartDepotServiceTime"].mappedFieldName = "StartDepotServiceTime"
    routes_field_mappings["Capacity_1"].mappedFieldName = "Capacities"
    routes_field_mappings["CostPerUnitTime"].mappedFieldName = "CostPerUnitTime"
    routes_field_mappings["CostPerUnitDistance"].mappedFieldName = "CostPerUnitDistance"
    routes_field_mappings["MaxOrderCount"].mappedFieldName = "MaxOrderCount"
    routes_field_mappings["MaxTotalTime"].mappedFieldName = "MaxTotalTime"
    routes_field_mappings["MaxTotalTravelTime"].mappedFieldName = "MaxTotalTravelTime"
    routes_field_mappings["MaxTotalDistance"].mappedFieldName = "MaxTotalDistance"
    arcpy.na.AddLocations(layer_object, routes_layer_name, in_routes, routes_field_mappings, "")

    # Solve the VRP layer
    arcpy.na.Solve(layer_object)

    # Save the solved VRP layer as a layer file on disk with relative paths
    arcpy.management.SaveToLayerFile(layer_object, output_layer_file, "RELATIVE")

    print("Script Completed Successfully")

except Exception as e:
    # If an error occurred, print line number and error message
    import traceback
    import sys
    tb = sys.exc_info()[2]
    print("An error occurred on line %i" % tb.tb_lineno)
    print(str(e))