Crear capa de análisis de Problema de generación de rutas para vehículos (Network Analyst)

Resumen

Crea una capa de análisis de red de problema de generación de rutas para vehículos (VRP) y establece sus propiedades de análisis. Una capa de análisis VRP resulta útil para optimizar un conjunto de rutas con una flota de vehículos. La capa se puede crear utilizando un dataset de red local o un servicio alojado en línea o en un portal.

Uso

  • Después de crear la capa de análisis con esta herramienta, puede agregarle objetos de análisis de red usando la herramienta Agregar ubicaciones, resolver el análisis usando la herramienta Resolver y guardar los resultados en el disco usando la herramienta Guardar en archivo de capa.

  • Al utilizar esta herramienta en modelos de geoprocesamiento, si el modelo se ejecuta como herramienta, la capa de análisis de red de salida debe convertirse en parámetro de modelo; de lo contrario, la capa de salida no se agrega al contenido del mapa.

Parámetros

EtiquetaExplicaciónTipo de datos
Fuente de datos de red

El servicio o dataset de red en el que se realizará el análisis de red. Utilice la dirección URL del portal para un servicio.

Network Dataset Layer; String
Nombre de capa
(Opcional)

Nombre de la capa de análisis de red VRP que se va a crear.

String
Modo de viaje
(Opcional)

El nombre del modo de viaje que se utilizará en el análisis. El modo de viaje representa un conjunto de parámetros de red como, por ejemplo, restricciones del viaje y las normas sobre cambios de sentido, que determina cómo un peatón, un coche, un camión u otro medio de transporte se desplaza por la red. Los modos de viaje se definen en su fuente de datos de red. También puede utilizar como entrada del parámetro un objeto arcpy.na.TravelMode y una cadena que contenga la representación JSON válida de un modo de viaje.

El VRP solo resuelve la impedancia basada en el tiempo, por lo que solo se ofrecen para su selección los modos de viaje de impedancia basados en el tiempo.

String
Unidades de campo de tiempo
(Opcional)

Especifica las unidades de tiempo que van a utilizar los campos temporales de las subcapas y tablas de la capa de análisis (clases de análisis de red). Este valor no necesita coincidir con las unidades del atributo de coste de tiempo.

Más información sobre los atributos de coste

  • MinutosSe usarán los minutos como unidad de tiempo. Esta es la opción predeterminada.
  • SegundosSe usarán los segundos como unidad de tiempo.
  • HorasSe usarán las horas como unidad de tiempo.
  • DíasSe usarán los días como unidad de tiempo.
String
Unidades de campo de distancia
(Opcional)

Especifica las unidades de distancia que van a utilizar los campos de distancia de las subcapas y tablas de la capa de análisis (clases de análisis de red). Este valor no necesita coincidir con las unidades del atributo de coste de distancia opcional.

Más información sobre los atributos de coste

  • MillasSe usarán las millas como unidades de distancia. Esta es la opción predeterminada.
  • KilómetrosSe usarán los kilómetros como unidades de distancia.
  • PiesSe usarán los pies como unidades de distancia.
  • YardasSe usarán las yardas como unidades de distancia.
  • MetrosSe usarán los metros como unidades de distancia.
  • PulgadasSe usarán las pulgadas como unidades de distancia.
  • CentímetrosSe usarán los centímetros como unidades de distancia.
  • MilímetrosSe usarán los milímetros como unidades de distancia.
  • DecímetrosSe usarán los decímetros como unidades de distancia.
  • Millas náuticasSe usarán las millas náuticas como unidades de distancia.
String
Fecha predeterminada
(Opcional)

La fecha implícita para los valores del campo de hora sin una fecha especificada con el tiempo. Si un campo de hora de un objeto de orden, como TimeWindowStart, tiene un valor de solo hora, la fecha será la fecha predeterminada. La fecha predeterminada no tiene ningún efecto sobre los valores de campo de tiempo que ya tienen una fecha.

Configure el análisis para utilizar una de las fechas especiales siguientes para modelar un día de la semana o la fecha actual en lugar de una fecha estática específica:

  • Hoy, 30/12/1899
  • Domingo, 31/12/1899
  • Lunes, 1/1/1900
  • Martes, 2/1/1900
  • Miércoles, 3/1/1900
  • Jueves, 4/1/1900
  • Viernes, 5/1/1900
  • Sábado, 6/1/1900

Más información sobre cómo se utilizan e interpretan las fechas y horas en un análisis de red

Date
Zona horaria para campos de hora
(Opcional)

Especifica la zona horaria que van a utilizar los campos de fecha/hora de entrada que admite la herramienta.

Especificar valores de fecha y hora en UTC resulta útil si no conoce la zona horaria en la que se encuentran las órdenes o depósitos o cuando tiene órdenes y depósitos en varias zonas horarias y desea que todos los valores de fecha y hora empiecen simultáneamente. La opción UTC solo es aplicable cuando su dataset de red define un atributo de zona horaria. De lo contrario, todos los valores de fecha y hora se tratan como la zona horaria que corresponde a esa ubicación.

  • Hora local en ubicacionesLos valores de fecha y hora asociados a las órdenes o depósitos estarán en la zona horaria en la que se encuentran las órdenes y depósitos. Para las rutas, los valores de fecha y hora están basados en la zona horaria en la que se encuentra el depósito inicial para la ruta. Si una ruta no tiene un depósito inicial, todas las órdenes y los depósitos de todas las rutas deben estar en una única zona horaria. Para los descansos, los valores de fecha y hora están basados en la zona horaria de las rutas. Esta es la opción predeterminada.
  • UTCLos valores de fecha y hora asociados a las órdenes o depósitos estarán en hora universal coordinada (UTC) y no se basan en la zona horaria en la que se encuentran las órdenes o depósitos.
String
Forma de ruta de salida
(Opcional)

Especifica el tipo de forma que se utilizará para las entidades de ruta que genere el análisis.

Independientemente del tipo de forma de salida que especificado, la mejor ruta siempre se determina por la impedancia de la red y no por la distancia euclidiana. Esto significa que solo las formas de la ruta son diferentes, no los elementos transitables subyacentes de la red.

  • A lo largo de la redLas rutas de salida tendrán la misma forma que las fuentes de red subyacentes. La salida incluye mediciones de ruta para la referenciación lineal. Las mediciones aumentan desde la primera parada y registran la impedancia acumulada para llegar a una posición determinada.
  • Sin líneasNo se generará ninguna forma para las rutas de salida.
  • Líneas rectasLa forma de la ruta de salida será una línea recta simple entre las paradas.Esta opción no está disponible si la fuente de datos de red seleccionada es un servicio.
String
Importancia de la violación de la ventana de tiempo
(Opcional)

Especifica la importancia de respetar las ventanas de tiempo sin causar violaciones. La violación de ventana de tiempo ocurre cuando una ruta llega a una orden, depósito o descanso después de que se cierra la ventana de tiempo. La violación es el intervalo entre el final de la ventana de tiempo y la hora de llegada de una ruta.

  • AltoEl solucionador busca una solución que minimice las violaciones de ventana de tiempo a costa de incrementar el tiempo total del viaje. Elija este ajuste si considera que llegar a tiempo a las órdenes es más importante que minimizar el coste total de la solución. Este puede ser el caso si entra en contacto con sus clientes en respuesta a las órdenes y no desea molestarles con demoras en las llegadas (otra opción es emplear ventanas de tiempo rígidas que no se pueden violar).Dadas otras restricciones de un problema de generación de rutas para vehículos, podría resultar imposible visitar todas las órdenes dentro de sus ventanas de tiempo. En este caso, incluso un ajuste Alto podría provocar infracciones.
  • MedioEl solucionador busca el equilibrio entre cumplir las ventanas de tiempo y reducir el coste total de la solución. Esta es la opción predeterminada.
  • BajoEl solucionador busca una solución que minimice el tiempo total del viaje, independientemente de las ventanas de tiempo. Elija este ajuste si considera que respetar las ventanas de tiempo es menos importante que reducir el coste total de la solución. Puede utilizar esta configuración si tiene varios trabajos atrasados de solicitudes de servicio. Para poder cumplir con más órdenes en un día y reducir el trabajo atrasado, puede elegir este ajuste aunque los clientes puedan sufrir las molestias de los retrasos en las llegadas de la flota.
String
Importancia del exceso de tiempo de tránsito
(Opcional)

Especifica la importancia de reducir el exceso de tiempo de tránsito. El exceso de tiempo de tránsito es la cantidad de tiempo que excede el tiempo requerido para viajar directamente entre las órdenes asociadas. El exceso de tiempo resulta de los descansos o viajes a otras órdenes o depósitos entre las visitas a las órdenes asociadas. Este parámetro solo es relevante si se utiliza Pares de órdenes.

Más información sobre Pares de órdenes

  • AltoEl solucionador busca una solución con un menor exceso de tiempo de tránsito entre las órdenes asociadas a costa de incrementar el coste total del viaje. Use esta configuración si está transportando personas entre órdenes asociadas y desea acortar el tiempo de viaje. Esto es característico de los servicios de taxi.
  • MedioEl solucionador busca el equilibrio entre reducir el exceso de tiempo de tránsito y reducir el coste general de la solución. Esta es la opción predeterminada.
  • BajoEl solucionador busca una solución que minimice el coste total de la solución, independientemente del exceso de tiempo de tránsito. En general, esta configuración se usa para servicios de correo. Debido a que los servicios de mensajería transportan paquetes y no personas, el tiempo de viaje no es tan importante. Al utilizar este ajuste, los servicios de mensajería pueden cumplir con las órdenes asociadas en la secuencia adecuada y minimizar el coste total de la solución.
String
Generar indicaciones al resolver
(Opcional)

Especifica si se generarán indicaciones.

  • Activado: se generarán indicaciones paso a paso al resolver. Esta es la opción predeterminada.
  • Desactivado: no se generarán indicaciones paso a paso al resolver.
Boolean
Clustering espacial
(Opcional)

Especifica si se utilizará el clustering espacial.

  • Activado: las órdenes asignadas a una ruta individual se agruparán espacialmente. La agrupación de órdenes tiende a mantener las rutas en áreas más pequeñas y a reducir la frecuencia con la que se intersecan entre sí las líneas de ruta; sin embargo, el clustering puede aumentar los tiempos globales de viaje. Esta es la opción predeterminada.
  • Desactivado: el solucionador no concederá prioridad a las órdenes de clustering espacial y las líneas de ruta podrían intersecarse. Utilice esta opción si las zonas de ruta están especificadas.
Boolean
Ignorar ubicaciones no válidas en la hora de la resolución
(Opcional)

Especifica si se ignorarán las ubicaciones de entrada no válidas.

  • Activado: las ubicaciones de entrada no válidas se ignorarán para que el análisis se realice correctamente utilizando solo ubicaciones válidas.
  • Desactivado: las ubicaciones no válidas no se ignorarán y harán que el análisis falle. Esta es la opción predeterminada.
Boolean

Salida derivada

EtiquetaExplicaciónTipo de datos
Capa de Network Analyst

La nueva capa de análisis de red.

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})
NombreExplicaciónTipo de datos
network_data_source

El servicio o dataset de red en el que se realizará el análisis de red. Utilice la dirección URL del portal para un servicio.

Network Dataset Layer; String
layer_name
(Opcional)

Nombre de la capa de análisis de red VRP que se va a crear.

String
travel_mode
(Opcional)

El nombre del modo de viaje que se utilizará en el análisis. El modo de viaje representa un conjunto de parámetros de red como, por ejemplo, restricciones del viaje y las normas sobre cambios de sentido, que determina cómo un peatón, un coche, un camión u otro medio de transporte se desplaza por la red. Los modos de viaje se definen en su fuente de datos de red. También puede utilizar como entrada del parámetro un objeto arcpy.na.TravelMode y una cadena que contenga la representación JSON válida de un modo de viaje.

String
time_units
(Opcional)

Especifica las unidades de tiempo que van a utilizar los campos temporales de las subcapas y tablas de la capa de análisis (clases de análisis de red). Este valor no necesita coincidir con las unidades del atributo de coste de tiempo.

Más información sobre los atributos de coste

  • MinutesSe usarán los minutos como unidad de tiempo. Esta es la opción predeterminada.
  • SecondsSe usarán los segundos como unidad de tiempo.
  • HoursSe usarán las horas como unidad de tiempo.
  • DaysSe usarán los días como unidad de tiempo.
String
distance_units
(Opcional)

Especifica las unidades de distancia que van a utilizar los campos de distancia de las subcapas y tablas de la capa de análisis (clases de análisis de red). Este valor no necesita coincidir con las unidades del atributo de coste de distancia opcional.

Más información sobre los atributos de coste

  • MilesSe usarán las millas como unidades de distancia. Esta es la opción predeterminada.
  • KilometersSe usarán los kilómetros como unidades de distancia.
  • FeetSe usarán los pies como unidades de distancia.
  • YardsSe usarán las yardas como unidades de distancia.
  • MetersSe usarán los metros como unidades de distancia.
  • InchesSe usarán las pulgadas como unidades de distancia.
  • CentimetersSe usarán los centímetros como unidades de distancia.
  • MillimetersSe usarán los milímetros como unidades de distancia.
  • DecimetersSe usarán los decímetros como unidades de distancia.
  • NauticalMilesSe usarán las millas náuticas como unidades de distancia.
String
default_date
(Opcional)

La fecha implícita para los valores del campo de hora sin una fecha especificada con el tiempo. Si un campo de hora de un objeto de orden, como TimeWindowStart, tiene un valor de solo hora, la fecha será la fecha predeterminada. La fecha predeterminada no tiene ningún efecto sobre los valores de campo de tiempo que ya tienen una fecha.

Configure el análisis para utilizar una de las fechas especiales siguientes para modelar un día de la semana o la fecha actual en lugar de una fecha estática específica:

  • Hoy, 30/12/1899
  • Domingo, 31/12/1899
  • Lunes, 1/1/1900
  • Martes, 2/1/1900
  • Miércoles, 3/1/1900
  • Jueves, 4/1/1900
  • Viernes, 5/1/1900
  • Sábado, 6/1/1900

Más información sobre cómo se utilizan e interpretan las fechas y horas en un análisis de red

Date
time_zone_for_time_fields
(Opcional)

Especifica la zona horaria que van a utilizar los campos de fecha/hora de entrada que admite la herramienta.

  • LOCAL_TIME_AT_LOCATIONSLos valores de fecha y hora asociados a las órdenes o depósitos estarán en la zona horaria en la que se encuentran las órdenes y depósitos. Para las rutas, los valores de fecha y hora están basados en la zona horaria en la que se encuentra el depósito inicial para la ruta. Si una ruta no tiene un depósito inicial, todas las órdenes y los depósitos de todas las rutas deben estar en una única zona horaria. Para los descansos, los valores de fecha y hora están basados en la zona horaria de las rutas. Esta es la opción predeterminada.
  • UTCLos valores de fecha y hora asociados a las órdenes o depósitos estarán en hora universal coordinada (UTC) y no se basan en la zona horaria en la que se encuentran las órdenes o depósitos.

Especificar valores de fecha y hora en UTC resulta útil si no conoce la zona horaria en la que se encuentran las órdenes o depósitos o cuando tiene órdenes y depósitos en varias zonas horarias y desea que todos los valores de fecha y hora empiecen simultáneamente. La opción UTC solo es aplicable cuando su dataset de red define un atributo de zona horaria. De lo contrario, todos los valores de fecha y hora se tratan como la zona horaria que corresponde a esa ubicación.

String
line_shape
(Opcional)

Especifica el tipo de forma que se utilizará para las entidades de ruta que genere el análisis.

  • ALONG_NETWORKLas rutas de salida tendrán la misma forma que las fuentes de red subyacentes. La salida incluye mediciones de ruta para la referenciación lineal. Las mediciones aumentan desde la primera parada y registran la impedancia acumulada para llegar a una posición determinada.
  • NO_LINESNo se generará ninguna forma para las rutas de salida.
  • STRAIGHT_LINESLa forma de la ruta de salida será una línea recta simple entre las paradas.Esta opción no está disponible si la fuente de datos de red seleccionada es un servicio.

Independientemente del tipo de forma de salida que especificado, la mejor ruta siempre se determina por la impedancia de la red y no por la distancia euclidiana. Esto significa que solo las formas de la ruta son diferentes, no los elementos transitables subyacentes de la red.

String
time_window_factor
(Opcional)

Especifica la importancia de respetar las ventanas de tiempo sin causar violaciones. La violación de ventana de tiempo ocurre cuando una ruta llega a una orden, depósito o descanso después de que se cierra la ventana de tiempo. La violación es el intervalo entre el final de la ventana de tiempo y la hora de llegada de una ruta.

  • HighEl solucionador busca una solución que minimice las violaciones de ventana de tiempo a costa de incrementar el tiempo total del viaje. Elija este ajuste si considera que llegar a tiempo a las órdenes es más importante que minimizar el coste total de la solución. Este puede ser el caso si entra en contacto con sus clientes en respuesta a las órdenes y no desea molestarles con demoras en las llegadas (otra opción es emplear ventanas de tiempo rígidas que no se pueden violar).Dadas otras restricciones de un problema de generación de rutas para vehículos, podría resultar imposible visitar todas las órdenes dentro de sus ventanas de tiempo. En este caso, incluso un ajuste Alto podría provocar infracciones.
  • MediumEl solucionador busca el equilibrio entre cumplir las ventanas de tiempo y reducir el coste total de la solución. Esta es la opción predeterminada.
  • LowEl solucionador busca una solución que minimice el tiempo total del viaje, independientemente de las ventanas de tiempo. Elija este ajuste si considera que respetar las ventanas de tiempo es menos importante que reducir el coste total de la solución. Puede utilizar esta configuración si tiene varios trabajos atrasados de solicitudes de servicio. Para poder cumplir con más órdenes en un día y reducir el trabajo atrasado, puede elegir este ajuste aunque los clientes puedan sufrir las molestias de los retrasos en las llegadas de la flota.
String
excess_transit_factor
(Opcional)

Especifica la importancia de reducir el exceso de tiempo de tránsito. El exceso de tiempo de tránsito es la cantidad de tiempo que excede el tiempo requerido para viajar directamente entre las órdenes asociadas. El exceso de tiempo resulta de los descansos o viajes a otras órdenes o depósitos entre las visitas a las órdenes asociadas. Este parámetro solo es relevante si se utiliza Pares de órdenes.

Más información sobre Pares de órdenes

  • HighEl solucionador busca una solución con un menor exceso de tiempo de tránsito entre las órdenes asociadas a costa de incrementar el coste total del viaje. Use esta configuración si está transportando personas entre órdenes asociadas y desea acortar el tiempo de viaje. Esto es característico de los servicios de taxi.
  • MediumEl solucionador busca el equilibrio entre reducir el exceso de tiempo de tránsito y reducir el coste general de la solución. Esta es la opción predeterminada.
  • LowEl solucionador busca una solución que minimice el coste total de la solución, independientemente del exceso de tiempo de tránsito. En general, esta configuración se usa para servicios de correo. Debido a que los servicios de mensajería transportan paquetes y no personas, el tiempo de viaje no es tan importante. Al utilizar este ajuste, los servicios de mensajería pueden cumplir con las órdenes asociadas en la secuencia adecuada y minimizar el coste total de la solución.
String
generate_directions_on_solve
(Opcional)

Especifica si se generarán indicaciones.

  • DIRECTIONSSe generarán indicaciones paso a paso al resolver. Esta es la opción predeterminada.
  • NO_DIRECTIONSNo se generarán indicaciones paso a paso al resolver.
Boolean
spatial_clustering
(Opcional)

Especifica si se utilizará el clustering espacial.

  • CLUSTERLas órdenes asignadas a una ruta individual se agruparán espacialmente. La agrupación de órdenes tiende a mantener las rutas en áreas más pequeñas y a reducir la frecuencia con la que se intersecan entre sí las líneas de ruta; sin embargo, el clustering puede aumentar los tiempos globales de viaje. Esta es la opción predeterminada.
  • NO_CLUSTEREl solucionador no concederá prioridad a las órdenes de clustering espacial y las líneas de ruta podrían intersecarse. Utilice esta opción si las zonas de ruta están especificadas.
Boolean
ignore_invalid_locations
(Opcional)

Especifica si se ignorarán las ubicaciones de entrada no válidas.

  • SKIPLas ubicaciones de entrada no válidas se ignorarán para que el análisis se realice correctamente utilizando solo ubicaciones válidas.
  • HALTLas ubicaciones no válidas no se ignorarán y harán que el análisis falle. Esta es la opción predeterminada.
Boolean

Salida derivada

NombreExplicaciónTipo de datos
out_network_analysis_layer

La nueva capa de análisis de red.

Network Analyst Layer

Muestra de código

Ejemplo 1 de MakeVehicleRoutingProblemAnalysisLayer (ventana de Python)

Ejecute la herramienta utilizando solo los parámetros requeridos.

import arcpy 
arcpy.env.workspace = "C:/Data/SanFrancisco.gdb" 
arcpy.na.MakeVehicleRoutingProblemAnalysisLayer("Transportation/Streets_ND")
Ejemplo 2 de MakeVehicleRoutingProblemAnalysisLayer (ventana de Python)

Ejecutar la herramienta utilizando todos los parámetros.

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')
Ejemplo 3 de MakeVehicleRoutingProblemAnalysisLayer (flujo de trabajo)

En la siguiente secuencia de comandos independiente de Python se muestra cómo se puede utilizar la función MakeVehicleRoutingProblemAnalysisLayer para cumplir con un conjunto de órdenes con una flota de vehículos.

# 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))