Resumen
Este servicio de ArcGIS Online resuelve un problema de generación de rutas para vehículos (VRP) con el fin de encontrar las mejores rutas para una flota de vehículos.
Un controlador encargado de administrar una flota de vehículos se ve a menudo obligado a tomar decisiones sobre las rutas que deben tomar los vehículos. Tales decisiones implican encontrar la mejor forma de asignar un grupo de clientes a una flota de vehículos, así como de secuenciar y programar sus visitas. Los objetivos para resolver tales VRP consisten en proporcionar un alto nivel de servicio al cliente respetando cualquier ventana de tiempo definida y manteniendo al mismo tiempo los costes operativos y de inversión lo más bajos posible para cada ruta. Las restricciones consisten en completar las rutas con los recursos disponibles y dentro de los límites horarios impuestos por los turnos de trabajo de los conductores, las velocidades máximas y los compromisos con los clientes.
Este servicio se puede usar para encontrar soluciones para estas tareas de administración de flotas complejas.
Considere como ejemplo la distribución de género depositado un almacén central entre una serie de supermercados. El almacén central dispone de una flota de tres camiones El almacén solo funciona en una ventana de tiempo determinada, de 8.00 a. m. a 5.00 p. m.Durante este tiempo, todos los camiones deben regresar al almacén. Cada camión tiene una capacidad de 15,000 libras, que limita el volumen de género que puede transportar. Cada supermercado demanda una determinada cantidad de género (en libras) que se le debe entregar, y también está sujeto a sus propias ventanas de tiempo, que delimitan las horas en las que se pueden realizar las entregas. Por otro lado, el conductor sólo puede trabajar ocho horas al día, requiere una parada para comer y se le paga el tiempo que invierta en conducir el camión y entregar el género en las tiendas. El objetivo consiste en proponer un itinerario (o ruta) para cada conductor tal que permita realizar todas las entregas cumpliendo todos los requisitos de servicio y minimizando el tiempo total que el conductor debe invertir en la ruta. La siguiente imagen muestra tres rutas obtenidas a partir de la resolución de este problema de generación de rutas para vehículos.
Más información sobre la salida de Solucionar problema de generación de rutas para vehículos
Ilustración
Uso
-
Las herramientas EditVehicleRoutingProblem y SolveVehicleRoutingProblem generan rutas para las flotas de vehículos que necesitan visitar muchos lugares para realizar entregas, recogidas o responder a llamadas de servicio. La herramienta SolveVehicleRoutingProblem se ejecuta en modo asíncrono y resulta adecuada para los problemas grandes que tardan más tiempo en resolverse. Si desea resolver problemas pequeños o realizar cambios menores en los resultados de problemas de más envergadura, use la herramienta EditVehicleRoutingProblem.
-
Puede añadir hasta 2000 órdenes y 100 rutas. Además, puede asignar un máximo de 200 órdenes a una ruta.
Puede añadir hasta 250 barreras de punto. Puede añadir cualquier cantidad de barreras de línea o polígono, pero las barreras de línea no se pueden intersecar con más de 500 entidades de calle ni las barreras de polígono se pueden intersecar con más de 2000 entidades.
Puede optar por usar la jerarquía de carreteras al resolver, si desea que los resultados se generen con mayor rapidez, pero la solución podría no ser óptima.
-
Con independencia de que el parámetro use_hierarchy_in_analysis esté activado (True), la jerarquía siempre se usa cuando la distancia en línea recta entre las órdenes o los depósitos o las órdenes y los depósitos supera los 50 millas (80,46 kilómetros).
-
La distancia en línea recta entre cualquier orden o parada no puede ser superior a 50 millas (80.46 kilómetros) cuando travel_mode está establecido en A pie o cuando está establecido en Personalizado y se utiliza la restricción A pie.
Si la distancia entre un punto de entrada y la calle más próxima que se puede atravesar es mayor que 12.42 millas (20 kilómetros), el punto se excluye del análisis.
Esta herramienta está diseñada para funcionar en ArcGIS Pro, ArcMap, ArcGlobe y ArcScene, pero no en ArcCatalog.
Sintaxis
SolveVehicleRoutingProblem_naagol (orders, depots, routes, breaks, time_units, distance_units, {analysis_region}, {default_date}, {uturn_policy}, {time_window_factor}, {spatially_cluster_routes}, {route_zones}, {route_renewals}, {order_pairs}, {excess_transit_factor}, {point_barriers}, {line_barriers}, {polygon_barriers}, {use_hierarchy_in_analysis}, {restrictions}, {attribute_parameter_values}, {populate_route_lines}, {route_line_simplification_tolerance}, {populate_directions}, {directions_language}, {directions_style_name}, {travel_mode}, {impedance}, {time_zone_usage_for_time_fields}, {save_output_layer}, {overrides}, {save_route_data})
Parámetro | Explicación | Tipo de datos |
orders | Especifique una o varias órdenes (hasta 2000). Estas son las ubicaciones que las rutas del análisis de VRP deben visitar. Una orden puede representar una entrega (por ejemplo, una entrega de muebles), una recogida (como un autobús que recoge pasajeros para ir al aeropuerto) o algún tipo de servicio o inspección (un trabajo para cortar un árbol o una inspección de una construcción por ejemplo). Cuando se especifican las órdenes, se pueden definir propiedades para cada una de ellas, como su nombre o la hora del servicio, mediante el uso de atributos. Las órdenes se pueden especificar con los siguientes atributos: ObjectID: campo de Id. administrado por el sistema. Name: nombre de la orden. El nombre debe ser único. Si el nombre queda nulo, en el momento de resolución se genera automáticamente un nombre. ServiceTime: esta propiedad especifica cuánto tiempo se empleará en la ubicación de red cuando la ruta la visite; es decir, almacena el valor de impedancia de la ubicación de red. Un valor de cero o nulo indica que la ubicación de red no requiere ningún tiempo de servicio. La unidad de este valor de campo se especifica en el parámetro time_units. TimeWindowStart1: hora de inicio de la primera ventana de tiempo para la ubicación de red. Este campo puede contener un valor nulo; un valor nulo no indica ningún tiempo inicial. Una ventana de tiempo solo indica cuando puede llegar un vehículo a una orden; no indica cuándo se debe completar el tiempo de servicio. Para contabilizar el tiempo de servicio y partir antes de que la ventana de tiempo se agote, reste ServiceTime del campo TimeWindowEnd1. Los campos de la ventana de tiempo pueden contener un valor de solo hora o un valor de fecha y hora. Si un campo de hora como TimeWindowStart1 tiene un valor solo de hora (por ejemplo, 8:00 AM), se asume que la fecha es la especificada por el parámetro Fecha predeterminada. El uso de valores de fecha y hora (por ejemplo, 7/11/2010 8:00 AM) permite establecer ventanas de tiempo que abarcan varios días. Cuando se resuelve un problema que afecta a varias zonas horarias, los valores de la ventana de tiempo de cada orden hacen referencia a la zona horaria en la que se encuentra la orden. TimeWindowEnd1: hora de finalización de la primera ventana para la ubicación de red. Este campo puede contener un valor nulo; un valor nulo no indica ningún tiempo final. TimeWindowStart2: hora de inicio de la segunda ventana de tiempo para la ubicación de red. Este campo puede contener un valor nulo; un valor nulo indica que no hay segunda ventana de tiempo. Si la primera ventana de tiempo es nula, según lo especificado por los campos TimeWindowStart1 y TimeWindowEnd1, la segunda ventana de tiempo también debe ser nula. Si ambas ventanas de tiempo son no nulas, no pueden superponerse. Además, la segunda ventana de tiempo debe ocurrir después de la primera. TimeWindowEnd2: hora de finalización de la segunda ventana de tiempo para la ubicación de red. Este campo puede contener un valor nulo. Cuando TimeWindowStart2 y TimeWindowEnd2 son ambos nulos, no hay segunda ventana de tiempo. Cuando TimeWindowStart2 no es nulo pero TimeWindowEnd2 es nulo, hay una segunda ventana de tiempo que tiene una hora inicial pero no tiene hora final. Esto es válido. MaxViolationTime1: se considera que se ha infringido una ventana de tiempo si la hora de llegada ocurre cuando la ventana de tiempo ya ha finalizado. Este campo especifica la hora máxima permitida de infracción de la primera ventana de tiempo de la orden. Puede contener un valor cero pero no puede contener valores negativos. Un valor cero indica que no es aceptable una infracción de ventana de tiempo en la primera ventana de tiempo de la orden; es decir, la primera ventana de tiempo es estricta. Por otro lado, un valor nulo indica que no existe ningún límite en el tiempo de infracción permitido. Un valor distinto de cero especifica la cantidad máxima de retraso; por ejemplo, una ruta puede llegar a una orden hasta 30 minutos después del final de su primera ventana de tiempo. La unidad de este valor de campo se especifica en el parámetro Unidades de campo de tiempo. El solucionador puede realizar un seguimiento y ponderación de las infracciones de la ventana de tiempo. Por ello, puede dirigir el solucionador de VRP para que adopte uno de estos tres enfoques:
Al asignar un nivel de importancia para el parámetro Importancia de la violación de la ventana de tiempo, se está eligiendo en esencia uno de estos tres enfoques. En cualquier caso, sin embargo, el solucionador devolverá un error si el valor establecido para MaxViolationTime1 se supera. MaxViolationTime2: hora máxima de infracción permitida para la segunda ventana de tiempo de la orden. Este campo es análogo al campo MaxViolationTime1. InboundArriveTime: Define el momento en que el elemento que se va a entregar a la orden estará listo en el depósito inicial. La orden solo se puede asignar a una ruta si la hora de llegada de la entrada precede al valor de la última hora de inicio; de este modo, la ruta no podrá salir del depósito antes de que el elemento esté preparado para cargarse en ella. Este campo puede resultar útil en escenarios de modelos en los que se producen transbordos de ondas entrantes. Sería el caso, por ejemplo, de un trabajo de una orden que requiere materiales especiales que, en ese momento, no están disponibles en el depósito. Los materiales se están enviando desde otra ubicación y llegarán al depósito a las 11:00. Para asegurarse de que a la orden no se va a asignar ninguna ruta que salga antes de que llegue el envío, la hora de llegada de la entrada de la orden se establece a las 11:00. Los materiales especiales llegan a las 11:00, se cargan en el vehículo y este sale del depósito para visitar las órdenes asignadas. Notas:
OutboundDepartTime: Define el momento en que el elemento que se va a recoger en la orden debe llegar al depósito final. La orden solo se puede asignar a una ruta si esta puede visitar la orden y llegar a su depósito final antes de la hora de partida de la salida que se haya especificado. Este campo puede resultar útil en escenarios de modelos en los que se producen transbordos de ondas salientes. Supongamos que una empresa de transportes envía camiones de reparto para recoger paquetes de órdenes y los entrega en un depósito donde, a continuación, se llevan a otras instalaciones para entregarlos a su destino final. Cada día, a las 15:00, un tráiler para en el depósito para recoger los paquetes urgentes y los lleva directamente a una estación de central de procesamiento. Para evitar retrasar la entrega de los paquetes urgentes hasta las 15:00 del día siguiente, la empresa de transportes intenta que los camiones de reparto recojan los paquetes urgentes de las órdenes y los lleven del depósito antes de las 15:00. Esto se consigue estableciendo la hora de partida de la salida a las 15:00. Notas:
DeliveryQuantities: tamaño de la entrega. Puede especificar el tamaño de cualquier dimensión que desee, como peso, volumen o cantidad. Incluso puede especificar varias dimensiones, por ejemplo, peso y volumen. Introduzca las cantidades de entrega sin indicar unidades. Por ejemplo, si es necesario entregar un objeto de 300 libras a una orden, introduzca 300. Es necesario recordar que el valor es en libras. Si está realizando un rastreo de varias dimensiones, separe los valores numéricos con un espacio. Por ejemplo, si está registrando el peso y el volumen de una entrega que pesa 2,000 libras y tiene un volumen de 100 pies cúbicos, introduzca 2000 100. De nuevo, es necesario recordar las unidades; en este caso, libras y pies cúbicos. También es necesario recordar la secuencia en la que se introducen los valores y sus unidades correspondientes. Asegúrese de que Capacidades para rutas y DeliveryQuantities y PickupQuantities para Órdenes se especifican en la misma manera; esto es, los valores deben estar en las mismas unidades, y si está utilizando varias dimensiones, las dimensiones se deben enumerar en la misma secuencia para todos los parámetros. Por lo tanto, si especifica el peso en libras seguido del volumen en pies cúbicos para DeliveryQuantities, es necesario indicar la capacidad de las rutas y las cantidades de recogida de las órdenes de la misma manera: el peso en libras y el volumen en pies cúbicos. Si mezcla unidades o cambia la secuencia, obtendrá resultados no deseados sin recibir ningún mensaje de advertencia. Una cadena vacía o un valor nulo equivale a que todas las dimensiones que son cero. Si la cadena de caracteres tiene un número de valores insuficiente en relación al recuento de capacidad o dimensiones rastreadas, los valores restantes se tratan como ceros. Las cantidades de entrega no pueden ser negativas. PickupQuantities: tamaño de la recogida. Puede especificar el tamaño de cualquier dimensión que desee, como peso, volumen o cantidad. Incluso puede especificar varias dimensiones, por ejemplo, peso y volumen. No se puede, sin embargo, utilizar valores negativos. Este campo es análogo al campo DeliveryQuantities de órdenes. En el caso de una visita de intercambio, una orden puede tener cantidades de entrega y de recogida. Revenue: ingreso generado si la orden se incluye en una solución. Este campo puede contener un valor nulo (un valor nulo indica una renta de cero), pero no puede tener un valor negativo. Las rentas se incluyen al optimizar el valor de la función objetivo pero no forma parte del coste de explotación de la solución; es decir el campo TotalCost en la clase de ruta nunca incluye las rentas en sus resultados. Sin embargo, las rentas ponderan la importancia relativa de servir las órdenes. SpecialtyNames: una cadena de caracteres separada por espacios que contiene los nombres de las especialidades requeridas por la orden. Un valor nulo indica que la orden no requiere especialidades. La ortografía de cualquier especialidad enumerada para la clase Órdenes y rutas debe coincidir exactamente para que el solucionador de VRP pueda vincularlos de forma conjunta. Para ilustrar qué especialidades son y cómo funcionan, asuma que una empresa de cuidado de céspedes y poda árboles tiene una parte de sus órdenes que requiere un camión recolector a podar árboles altos. La empresa introducirá BucketTruck en el campo SpecialtyNames de estas órdenes para indicar su necesidad especial. SpecialtyNames quedaría como nulo para el resto de órdenes. De manera similar, la empresa también introducirá BucketTruck en el campo SpecialtyNames de las rutas que conducen los camiones con los brazos hidráulicos. Dejará el campo nulo para las otras rutas. En el momento de la resolución, el solucionador de VRP asigna órdenes sin necesidades especiales a cualquier ruta, pero solo se asigna órdenes que necesitan camiones recolectores para las rutas que disponen de ellos. AssignmentRule: este campo especifica la regla para asignar la orden a una ruta. Está restringido por un dominio de valores, que se muestran a continuación (use el código numérico, no el nombre entre paréntesis).
Este campo no puede contener un valor nulo. CurbApproach: especifica la dirección en la que un vehículo puede llegar a la orden y partir de ella. El valor de campo se especifica como uno de los siguientes enteros que se muestran entre paréntesis (use el código numérico, no el nombre entre paréntesis):
La propiedad CurbApproach se ha diseñado para trabajar con los dos tipos de estándares nacionales de circulación: por la derecha (Estados Unidos) y por la izquierda (Reino Unido). En primer lugar, considere una orden que se encuentra en el lado izquierdo de un vehículo. Siempre estará situada el lado izquierdo, independientemente de si el vehículo circula por la mitad izquierda o derecha del camino. Los estándares de circulación nacionales pueden influir en su decisión de aproximarse a la orden por una de las dos direcciones posibles, de modo que quede en el lado derecho o en el lado izquierdo del vehículo. Por ejemplo, si desea llegar a una orden y que no haya un carril entre el vehículo y la orden, elegirá 1 (Lado derecho del vehículo) en Estados Unidos y 2 (Lado izquierdo del vehículo) en el Reino Unido. RouteName: nombre de la ruta a la que se ha asignado la orden. Como campo de entrada, este campo se utiliza para preasignar una orden a una ruta concreta. (Se puede preasignar un máximo de 200 órdenes a un nombre de ruta). Puede contener un valor nulo que indica que la orden no se ha preasignado a ninguna ruta y el solucionador determina la mejor asignación de ruta posible para la orden. Si está establecido en nulo, el campo de secuencia también debe estar establecido en nulo. Después de una operación de resolución, si se enruta la orden, el campo RouteName contiene el nombre de la ruta a la cual se asigna la orden. Sequence: indica la secuencia de la orden en la ruta asignada. Como campo de entrada, este campo se utiliza para especificar la secuencia relativa para una orden en la ruta. Este campo puede contener un valor nulo que especifica que la orden se puede realizar en cualquier parte a lo largo de la ruta. Un valor nulo solo puede darse junto a un valor RouteName nulo. Los valores de secuencia de entrada son positivos y exclusivos para cada ruta (compartida en las visitas al depósito de reanudación, órdenes y descansos), pero no tienen que empezar a partir de 1 ni ser contiguos. Después de una operación de solución, el campo Secuencia contiene el valor de secuencia de la orden en su ruta asignada. Los valores de secuencia de salida para una ruta se comparten en las visitas a depósito, órdenes y descansos; empiezan a partir de 1 (en el depósito de inicio); y son consecutivos. Por tanto, el valor de secuencia de salida más pequeño posible para una orden en una ruta es 2, dado que una ruta siempre comienza en un depósito. | Feature Set |
depots | Especifique uno o varios depósitos para el problema de generación de rutas para vehículos especificado. Un depósito es una ubicación desde la que sale un vehículo al comienzo de su día laborable y a la que vuelve al final del mismo. Los vehículos (para las entregas) se cargan o descargan (para las recogidas) en los depósitos en el inicio de la ruta. En algunos casos, un depósito también puede actuar como ubicación de renovación donde el vehículo puede descargarse o volverse a cargar y seguir realizando entregas y recogidas. Un depósito tiene horas de apertura y cierre, tal y como se especifica en una ventana de tiempo estricta. Los vehículos no pueden llegar a un depósito fuera de esta ventana de tiempo. Cuando se especifican las órdenes, se pueden definir propiedades para cada una de ellas, como su nombre o la hora del servicio, mediante el uso de atributos. Las órdenes se pueden especificar con los siguientes atributos: ObjectID: campo de Id. administrado por el sistema. Name: nombre del depósito. Los campos StartDepotName y EndDepotName del conjunto de registro de las rutas hacen referencia a los nombres que especifique aquí. El conjunto de registros de Reanudaciones de ruta también hace referencia a los mismos, cuando se utiliza. Los nombres de depósitos no hacen distinción entre mayúsculas y minúsculas y tienen que ser únicos y no estar vacíos. TimeWindowStart1: hora de inicio de la primera ventana de tiempo para la ubicación de red. Este campo puede contener un valor nulo; un valor nulo no indica ningún tiempo inicial. Los campos de ventana de tiempo pueden tener un valor de solo hora o un valor de fecha y hora. Si un campo de hora tiene un valor solo de hora (por ejemplo, 8:00 AM), se asume que la fecha es la fecha especificada por el parámetro Fecha predeterminada de la capa de análisis. El uso de valores de fecha y hora (por ejemplo, 7/11/2010 8:00 AM) permite establecer ventanas de tiempo que abarcan varios días. Cuando se resuelve un problema que afecta a varias zonas horarias, los valores de la ventana de tiempo de cada depósito hacen referencia a la zona horaria en la que se encuentra el depósito. TimeWindowEnd1: hora de finalización de la primera ventana para la ubicación de red. Este campo puede contener un valor nulo; un valor nulo no indica ningún tiempo final. TimeWindowStart2: hora de inicio de la segunda ventana de tiempo para la ubicación de red. Este campo puede contener un valor nulo; un valor nulo indica que no hay segunda ventana de tiempo. Si la primera ventana de tiempo es nula, según lo especificado por los campos TimeWindowStart1 y TimeWindowEnd1, la segunda ventana de tiempo también debe ser nula. Si ambas ventanas de tiempo son no nulas, no pueden superponerse. Además, la segunda ventana de tiempo debe ocurrir después de la primera. TimeWindowEnd2: hora de finalización de la segunda ventana de tiempo para la ubicación de red. Este campo puede contener un valor nulo. Cuando TimeWindowStart2 y TimeWindowEnd2 son ambos nulos, no hay segunda ventana de tiempo. Cuando TimeWindowStart2 no es nulo pero TimeWindowEnd2 es nulo, hay una segunda ventana de tiempo que tiene una hora inicial pero no tiene hora final. Esto es válido. CurbApproach: especifica la dirección en la que un vehículo puede llegar al depósito y partir de él. El valor de campo se especifica como uno de los siguientes enteros que se muestran entre paréntesis (use el código numérico, no el nombre entre paréntesis):
La propiedad CurbApproach se ha diseñado para trabajar con los dos tipos de estándares nacionales de circulación: por la derecha (Estados Unidos) y por la izquierda (Reino Unido). En primer lugar, considere un depósito en el lado izquierdo de un vehículo. Siempre estará situada el lado izquierdo, independientemente de si el vehículo circula por la mitad izquierda o derecha del camino. Las normas de circulación nacionales pueden influir en su decisión de aproximarse a un depósito desde una de las dos direcciones posibles, de modo que quede en el lado derecho o en el lado izquierdo del vehículo. Por ejemplo, si desea llegar a un depósito y que no haya un carril entre el vehículo y el depósito, elegirá 1 (Lado derecho del vehículo) en Estados Unidos y 2 (Lado izquierdo del vehículo) en el Reino Unido. Bearing: la dirección en la que se mueve un punto. Las unidades son grados y se miden en el sentido de las agujas del reloj desde el norte verdadero. Este campo se utiliza junto con el campo BearingTol. Los datos de rumbo normalmente se envían de forma automática desde un dispositivo móvil dotado de un receptor GPS. Intente incluir datos que contiene rumbo si está cargando una orden que se mueve, como un peatón o un vehículo. Utilizar este campo tiende a evitar agregar ubicaciones a los bordes equivocados, que puede ocurrir cuando un vehículo está cerca de una intersección o un paso elevado por ejemplo. El rumbo también ayuda a la herramienta a determinar en qué lado de la calle está el punto. Para obtener más información, consulte los temas Rumbo y Tolerancia de rumbo de la Ayuda (http://links.esri.com/bearing-and-bearing-tolerance). BearingTol: el valor de tolerancia de rumbo crea un rango de valores de rumbo aceptables al ubicar los puntos en movimiento en un borde utilizando el campo Bearing. Si el valor en el campo Rumbo está dentro del rango de valores aceptables que se generan a partir de la tolerancia de rumbo en un borde, el punto se puede agregar como una ubicación de red ahí; de lo contrario, el punto más cercano sobre el próximo borde más cercano se evalúa. Las unidades se expresan en grados y el valor predeterminado es 30. Los valores deben ser mayores que cero y menores que 180. Un valor de 30 significa que, cuando Network Analyst intenta añadir una ubicación de red en un borde, un rango de valores de rumbo aceptable se genera 15 grados hacia cada lado del borde (izquierda y derecha) y en ambas direcciones digitalizadas del borde. Para obtener más información, consulte los temas Rumbo y Tolerancia de rumbo en el sistema de ayuda de ArcGIS (http://links.esri.com/bearing-and-bearing-tolerance). NavLatency: este campo se utiliza solo en el proceso de resolución si los campos Bearing y BearingTol también tienen valores; sin embargo, la introducción de un valor NavLatency es opcional, incluso cuando hay valores en los campos Bearing y BearingTol. NavLatency indica cuánto tiempo se espera que transcurra desde el momento en que se envía la información de GPS desde un vehículo en movimiento a un servidor y el momento en que el dispositivo de navegación del vehículo recibe la ruta procesada. Las unidades de tiempo de NavLatency son las mismas que las unidades del atributo de coste especificado por el parámetro Atributo de tiempo. | Feature Set |
routes | Especifique una o varias rutas (hasta 100). Una ruta especifica las características del vehículo y del conductor; después de la resolución, también representa la ruta entre los depósitos y las órdenes. Una ruta puede tener los tiempos de servicio de inicio y fin en el depósito, un tiempo de inicio fijo o flexible, costes operativos basados en el tiempo, costes operativos basados en la distancia, varias capacidades, diversas restricciones en un día laborable del conductor y así sucesivamente. Cuando se especifican las rutas, se pueden definir propiedades para cada una de ellas mediante el uso de atributos. Las rutas se pueden especificar con los siguientes atributos: Name: nombre de la ruta. El nombre debe ser único. La herramienta genera un nombre exclusivo en el momento de la resolución si el valor del campo es nulo; por consiguiente, la introducción de un valor es opcional en la mayoría de los casos. Sin embargo, debe introducir un nombre si su análisis incluye descansos, reanudaciones de ruta, zonas de ruta u órdenes preasignadas porque el nombre de ruta se utiliza como clave externa en estos casos. Tenga en cuenta que los nombres de ruta no distinguen entre mayúsculas y minúsculas. StartDepotName: el nombre del depósito inicial para la ruta. Este campo es una clave externa para el campo Nombre en los Depósitos. Si el valor StartDepotName es nulo, la ruta comenzará desde la primera orden asignada. Omitir el depósito inicial es útil cuando no se conoce la ubicación inicial del vehículo o es irrelevante para el problema. Sin embargo, cuando StartDepotName es nulo, EndDepotName no puede ser nulo tampoco. No se permiten depósitos iniciales virtuales si las órdenes o depósitos están en varias zonas horarias. Si la ruta está realizando entregas y StartDepotName es nulo, se supone que la carga se carga en el vehículo en un depósito virtual antes de que comience la ruta. Para una ruta que no tiene visitas de reanudación, sus órdenes de entrega (aquéllas con valores DeliveryQuantities distintos de cero en la clase Órdenes) se carga en el depósito de inicio o en el depósito virtual. Para una ruta que tiene visitas de reanudación, solo se cargan en el depósito de inicio o en el depósito virtual las órdenes de entrega antes de la primera visita de reanudación. EndDepotName: el nombre del depósito final para la ruta. Este campo es una clave externa para el campo Nombre en la clase Depósitos. StartDepotServiceTime: hora del servicio en el depósito inicial. Esto se puede utilizar para modelar el tiempo dedicado a cargar el vehículo. Este campo puede contener un valor nulo; un valor nulo indica un tiempo de servicio cero. La unidad de este valor de campo se especifica en el parámetro Unidades de campo de tiempo. Los tiempos de servicio en los depósitos inicial y final son valores fijos (dados por los valores de los campos StartDepotServiceTime y EndDepotServiceTime) y no tienen en cuenta la carga real para una ruta. Por ejemplo, el tiempo necesario para cargar un vehículo en el depósito inicial puede depender del tamaño de los pedidos. En consecuencia, los tiempos de servicio de depósito podrían ser valores dados correspondientes a un camión completamente cargado o con una carga media, o podría realizarse una estimación propia del tiempo. EndDepotServiceTime: hora del servicio en el depósito final. Esto se puede utilizar para modelar el tiempo dedicado a descargar el vehículo. Este campo puede contener un valor nulo; un valor nulo indica un tiempo de servicio cero. La unidad de este valor de campo se especifica en el parámetro Unidades de campo de tiempo. Los tiempos de servicio en los depósitos inicial y final son valores fijos (dados por los valores de los campos StartDepotServiceTime y EndDepotServiceTime) y no tienen en cuenta la carga real para una ruta. Por ejemplo, el tiempo necesario para cargar un vehículo en el depósito inicial puede depender del tamaño de los pedidos. En consecuencia, los tiempos de servicio de depósito podrían ser valores dados correspondientes a un camión completamente cargado o con una carga media, o podría realizarse una estimación propia del tiempo. EarliestStartTime: la hora de inicio más temprana permitida para la ruta. El solucionador utiliza esto junto con la ventana de tiempo del depósito inicial para determinar los tiempos de inicio de ruta factibles. Este campo no puede contener valores nulos y tiene un valor solo de hora predeterminado de 8:00 AM; el valor predeterminado se interpreta como 8:00 a.m. en la fecha proporcionada por el parámetro Fecha predeterminada. Cuando se resuelve un problema que abarca varias zonas horarias, la zona horaria de EarliestStartTime coincide con la zona horaria en la que se encuentra el depósito inicial. LatestStartTime: la hora de inicio más tardía permitida para la ruta. Este campo no puede contener valores nulos y tiene un valor solo de tiempo predeterminado de 10:00 AM; el valor predeterminado se interpreta como 10:00 a.m. en la fecha proporcionada por la propiedad Fecha predeterminada de la capa del análisis. Cuando se resuelve un problema que abarca varias zonas horarias, la zona horaria de LatestStartTime coincide con la zona horaria en la que se encuentra el depósito inicial. ArriveDepartDelay: este campo almacena la cantidad de tiempo de viaje necesario para acelerar el vehículo a velocidades de viaje normales, decelerarlo hasta que pare y hacer que entre y salga de la red (por ejemplo, que salga del aparcamiento y entre en él). Incluyendo un valor ArriveDepartDelay, se evita que el solucionador de VRP envíe muchas rutas para dar servicio a órdenes físicamente coincidentes. El coste para esta propiedad se incurre entre visitas a órdenes no coincidentes, depósitos y reanudaciones de ruta. Por ejemplo, cuando una ruta empieza en un depósito y visita la primera orden, el retraso de llegada/salida se agrega al tiempo de viaje. Lo mismo es aplicable al viajar desde la primera orden a la segunda. Si la segunda y tercera órdenes coinciden, el valor ArriveDepartDelay no se añade dado que el vehículo no tiene que desplazarse. Si la ruta viaja a una reanudación de ruta, el valor se añade de nuevo al tiempo de viaje. Aunque un vehículo tiene que reducir la velocidad y detenerse para una interrupción y acelerar después, el solucionador de VRP no puede añadir el valor ArriveDepartDelay para los descansos. Esto significa que si una ruta deja una orden, para durante un descanso y continúa en la siguiente orden, el retardo de llegada/salida se añade solo una vez, no dos veces. Para ilustrar, digamos que hay cinco órdenes coincidentes en un edificio alto y a las que dan servicio tres rutas diferentes. Esto significa que se incurrirían en tres retrasos de llegada/salida; es decir, tres conductores tendrían que buscar estacionamiento por separado y entrar en el mismo edificio. Sin embargo, si solo una ruta pudiera dar servicio a las órdenes en su lugar, solo tendría que aparcar un conductor y entrar en el edificio, solo se incurriría en un retraso de llegada/salida. Dado que el solucionador de VRP intenta minimizar el coste, intentará limitar los retrasos de llegada/salida y, de este modo, elegir la opción de ruta única. (Observe que es posible que sea necesario enviar varias rutas cuando otras restricciones, tales como especialidades, ventanas de tiempo o capacidades, lo requieran.) La unidad de este valor de campo se especifica en el parámetro time_units. Capacities: la capacidad máxima del vehículo. Puede especificar la capacidad de cualquier dimensión que desee, como peso, volumen o cantidad. Incluso puede especificar varias dimensiones, por ejemplo, peso y volumen. Introduzca capacidades sin indicar las unidades. Por ejemplo, suponiendo que el vehículo puede llevar un máximo de 40,000 libras; debe introducir 40000. Es necesario recordar que el valor de referencia para el futuro es en libras. Si está realizando un rastreo de varias dimensiones, separe los valores numéricos con un espacio. Por ejemplo, si está registrando peso y volumen, y su vehículo puede llevar un peso máximo de 40.000 libras y un volumen máximo de 2.000 pies cúbicos, las capacidades se deben introducir como 40000 2000. De nuevo, es necesario recordar las unidades. También es necesario recordar la secuencia en que se introducen los valores y sus unidades correspondientes (en este caso, libras y luego pies cúbicos). Es importante recordar las unidades y la secuencia de las unidades por dos razones: la primera, para interpretar la información más tarde; la segunda, para introducir correctamente los valores de los campos DeliveryQuantities y PickupQuantities para las órdenes. Profundizando en el segundo punto, tenga en cuenta que el solucionador de VRP simultáneamente se refiere a Capacidades, DeliveryQuantities y PickupQuantities para garantizar que no se sobrecargue ninguna ruta. Como las unidades no se pueden introducir en el campo, la herramienta VRP no puede realizar conversiones de unidades, de modo que deberá introducir los valores en los tres campos utilizando las mismas unidades y la misma secuencia de unidades para garantizar que los valores se interpretan correctamente. Si mezcla unidades o cambia la secuencia en cualquiera de los tres campos, obtendrá resultados no deseados sin recibir mensajes de advertencia. Por lo tanto, es buena idea establecer una unidad y una secuencia de unidades estándar de antemano y consultarla continuamente al introducir los valores para estos tres campos. Una cadena vacía o un valor nulo equivale a que todos los valores son cero. Los valores de capacidad no pueden ser negativos. Si la cadena de Capacidades tiene un número insuficiente de valores en relación con los campos DeliveryQuantities o PickupQuantities para las órdenes, los valores restantes se tratan como cero. El solucionador de VRP solo realiza una comprobación booleana simple para determinar si se superan las capacidades. Si el valor de capacidad de una ruta es mayor o igual a la cantidad total transportada, el solucionador de VRP supondrá que la carga cabe en el vehículo. Esto podría ser incorrecto, dependiendo de la forma real de la carga y el vehículo. Por ejemplo, el solucionador de VRP le permite ajustar una esfera de 1.000 pies cúbicos en un camión de 1.000 pies cúbicos que tiene 8 pies de ancho. En realidad, sin embargo, dado que la esfera tiene un diámetro de 12,6 pies, no cabría en el camión de 8 pies de ancho. FixedCost: un coste monetario fijo en el que solo se incurre si la ruta se utiliza en una solución (es decir, tiene órdenes asignadas). Este campo puede contener valores nulos; un valor nulo indica un coste fijo cero. Este coste forma parte del coste operativo de ruta total. CostPerUnitTime: coste monetario incurrido (por tiempo unitario de trabajo) para la duración total de la ruta, incluidos los tiempos de viaje, así como los tiempos de servicio y de espera en órdenes, depósitos y descansos. Este campo no puede contener un valor nulo y tiene un valor predeterminado de 1,0. La unidad de este valor de campo se especifica en el parámetro time_units. CostPerUnitDistance: el coste monetario incurrido, por unidad de distancia viajada, para la longitud de la ruta (distancia de viaje total). Este campo puede contener valores nulos; un valor nulo indica un coste cero. La unidad de este valor de campo se especifica en el parámetro distance_units. OvertimeStartTime: la duración de tiempo de trabajo normal antes de que se inicie el cómputo de horas extra. Este campo puede contener valores nulos; un valor nulo indica que no se aplican horas extraordinarias. La unidad de este valor de campo se especifica en el parámetro time_units. Por ejemplo, si al conductor se le pagan horas extra cuando la duración de la ruta total supera las ocho horas, entonces OvertimeStartTime se especifica como 480 (8 horas * 60 minutos/hora), si el parámetro time_units está establecido en minutos. CostPerUnitOvertime: el coste monetario en el que se incurre por unidad de tiempo de hora extra. Este campo puede contener valores nulos; un valor nulo indica que el valor CostPerUnitOvertime es igual que el valor CostPerUnitTime. MaxOrderCount: el máximo número permitido de órdenes en la ruta. Este campo no puede contener valores nulos y tiene un valor predeterminado de 30. El valor no puede ser mayor que 200. MaxTotalTime: la duración máxima permitida para la ruta. La duración de la ruta incluye los tiempos de viaje, así como los tiempos de servicio y de espera en órdenes, depósitos y descansos. Este campo puede contener valores nulos; un valor nulo indica que no hay ninguna restricción en la duración de la ruta. La unidad de este valor de campo se especifica en el parámetro time_units. MaxTotalTravelTime: el tiempo de viaje máximo permitido para la ruta. El tiempo de viaje incluye solo el tiempo empleado en conducir en la red y no incluye tiempos de servicio o de espera. Este campo puede contener valores nulos; un valor nulo indica que no hay ninguna restricción en el tiempo máximo de viaje permitido. Este valor de campo no puede ser mayor que el valor del campo MaxTotalTime. La unidad de este valor de campo se especifica en el parámetro time_units. MaxTotalDistance: la distancia de viaje máxima permitida para la ruta. La unidad de este valor de campo se especifica en el parámetro distance_units. Este campo puede contener valores nulos; un valor nulo indica que no hay ninguna restricción en la distancia máxima de viaje permitida. SpecialtyNames: una cadena separada por espacios que contiene los nombres de las especialidades admitidas por la ruta. Un valor nulo indica que la ruta no admite ninguna especialidad. Este campo es una clave externa para el campo SpecialtyNames en la clase de órdenes. Para ilustrar qué especialidades son y cómo funcionan, asuma que una empresa de cuidado de céspedes y poda árboles tiene una parte de sus órdenes que requiere un camión recolector a podar árboles altos. La empresa introducirá BucketTruck en el campo SpecialtyNames de estas órdenes para indicar su necesidad especial. SpecialtyNames quedaría como nulo para el resto de órdenes. De manera similar, la empresa también introducirá BucketTruck en el campo SpecialtyNames de las rutas que conducen los camiones con los brazos hidráulicos. Dejará el campo nulo para las otras rutas. En el momento de la resolución, el solucionador de VRP asigna órdenes sin necesidades especiales a cualquier ruta, pero solo se asigna órdenes que necesitan camiones recolectores para las rutas que disponen de ellos. AssignmentRule: esto especifica si se puede utilizar la ruta o no al resolver el problema. Este campo está restringido por un dominio de valores, que se muestran a continuación (use el código numérico, no el nombre entre paréntesis).
| Record Set |
breaks | Son los periodos de pausa o descansos de las rutas en un problema de generación de rutas para vehículos determinado. Un descanso está asociado a una ruta exactamente y puede realizarse después de finalizar una orden, mientras se encuentra en ruta para dar servicio a una orden o antes de dar servicio a una orden. Tiene una hora de inicio y una duración y el conductor puede cobrar o no durante el mismo. Existen tres opciones para establecer cuando comienza un corte: mediante una ventana de tiempo, un tiempo de viaje máximo o un tiempo de trabajo máximo. Cuando se especifican los descansos, se pueden definir propiedades para cada uno de ellos, como su nombre o la hora del servicio, mediante el uso de atributos. Las órdenes se pueden especificar con los siguientes atributos: ObjectID: campo de Id. administrado por el sistema. RouteName: nombre de la ruta a la cual se aplica el descanso. Aunque un descanso se asignado a exactamente una ruta, puede haber muchos descansos asignados a la misma ruta. Este campo es una clave externa para el campo Name del parámetro routes y no puede tener un valor nulo. Precedence: los valores de precedencia ordenan en secuencia los descansos de una ruta. Los descansos con un valor de precedencia de 1 aparecen antes de aquéllos con un valor 2, etc. Todos los descansos deben tener un valor de precedencia, sin tener en cuenta si son descansos de ventana de tiempo, tiempo máximo de viaje o tiempo máximo de trabajo. ServiceTime: la duración del descanso. Este campo puede contener valores nulos; un valor nulo indica que no hay tiempo de servicio. La unidad de este valor de campo se especifica en el parámetro time_units. TimeWindowStart: hora de inicio de la ventana de tiempo del descanso. Si este campo es nulo y TimeWindowEnd tiene un valor de hora del día válido, se permite que el descanso empiece en cualquier momento antes del valor TimeWindowEnd. Si este campo tiene un valor, los campos MaxTravelTimeBetweenBreaks y MaxCumulWorkTime deben ser nulos; además, todos los descansos restantes de la capa del análisis deben tener valores nulos para MaxTravelTimeBetweenBreaks y MaxCumulWorkTime. Durante la resolución aparecerá un error si una ruta tiene varios descansos con ventanas de tiempo solapadas. Los campos de ventana de tiempo en los descansos pueden contener un valor de solo hora o un valor de fecha y hora. Si un campo de hora como TimeWindowStart tiene un valor solo de hora (por ejemplo, 12:00 PM), se asume que la fecha es la especificada por el parámetro default_date. El uso de valores fecha y hora (por ejemplo, 11/7/2012 12:00 PM) le permite especificar ventanas de tiempo que abarquen dos o más días. Esto es especialmente beneficioso cuando se debe realizar un descanso algún tiempo antes y después de la medianoche. Cuando se resuelve un problema que afecta a varias zonas horarias, los valores de la ventana de tiempo de cada descanso hacen referencia a la zona horaria en la que se encuentra la ruta asociada especificada en el campo RouteName. TimeWindowEnd: la hora de finalización de la ventana de tiempo del descanso. Si este campo es nulo y TimeWindowStart tiene un valor válido de hora del día, se permite que el descanso comience en cualquier momento después del valor TimeWindowStart. Si este campo tiene un valor, MaxTravelTimeBetweenBreaks y MaxCumulWorkTime deben ser nulos; es más, todos los demás descansos de la capa del análisis deben tener valores nulos para MaxTravelTimeBetweenBreaks y MaxCumulWorkTime. MaxViolationTime: este campo especifica el tiempo de infracción máximo permitido para un descanso de ventana de tiempo. Se considera que se ha infringido una ventana de tiempo si la hora de llegada fuera del intervalo de tiempo. Un valor cero indica que no se puede infringir la ventana de tiempo; es decir, la ventana de tiempo es estricta. Un valor distinto de cero especifica la cantidad máxima de retraso; por ejemplo, el descanso puede comenzar hasta 30 minutos después del final de su ventana de tiempo, pero el retraso es sancionado según el parámetro Importancia de la violación de la ventana de tiempo. Esta propiedad puede ser nula; un valor nulo con valores TimeWindowStart y TimeWindowEnd indica que no hay ningún límite en el tiempo de infracción permitido. Si MaxTravelTimeBetweenBreaks o MaxCumulWorkTime tiene un valor, MaxViolationTime debe ser nulo. La unidad de este valor de campo se especifica en el parámetro time_units. MaxTravelTimeBetweenBreaks: la cantidad máxima de tiempo de viaje que se puede acumular antes de realizar un descanso. El tiempo de viaje se acumula desde el fin del descanso anterior o, si todavía no se ha realizado un descanso, desde el inicio de la ruta. Si se trata del descanso final de la ruta, MaxTravelTimeBetweenBreaks también indica el tiempo máximo de viaje que se puede acumular desde el descanso final al depósito final. Este campo está diseñado para limitar cuánto tiempo puede conducir una persona hasta que sea necesario un descanso. Por ejemplo, si el parámetro Unidades de campo de tiempo (time_units para Python) del análisis está establecido en minutos, y MaxTravelTimeBetweenBreaks tiene un valor de 120, el conductor obtendrá un corte después de conducir dos horas. Para asignar un segundo descanso después de dos horas más de conducción, la propiedad MaxTravelTimeBetweenBreaks del segundo descanso debería ser 120. Si este campo tiene un valor, TimeWindowStart, TimeWindowEnd, MaxViolationTime y MaxCumulWorkTime deben ser nulos que el análisis se resuelva correctamente. La unidad de este valor de campo se especifica en el parámetro time_units. MaxCumulWorkTime: La cantidad máxima de tiempo de trabajo que se puede acumular antes de realizar un descanso. El tiempo de trabajo siempre se acumula desde el inicio de la ruta. El tiempo de trabajo es la suma de tiempo de viaje y de los tiempos de servicio en órdenes, depósitos y descansos. Tenga en cuenta, sin embargo, que esto excluye el tiempo de espera, que es el tiempo que una ruta (o conductor) espera en una orden o depósito a que comience una ventana de tiempo. Este campo está diseñado para limitar el tiempo que puede trabajar una persona hasta que sea necesario un descanso. Por ejemplo, si el parámetro time_units está establecido en minutos, MaxCumulWorkTime tiene un valor de 120 y ServiceTime tiene un valor de 15, el conductor disfrutará de un descanso de 15 minutos tras dos horas de trabajo. Continuando con el último ejemplo, suponga que se necesita un segundo corte después de tres horas más de trabajo. Para especificar este descanso, introduciría 315 (cinco horas y 15 minutos) como valor MaxCumulWorkTime del segundo descanso. Este número incluye los valores de MaxCumulWorkTime y ServiceTime del descanso anterior, junto con las tres horas adicionales de trabajo antes de conceder el segundo descanso. Para evitar realizar descansos de tiempo de trabajo máximo prematuramente, recuerde que acumulan el tiempo de trabajo desde el principio de la ruta y ese tiempo de trabajo incluye el tiempo de servicio en los depósitos, órdenes y descansos visitados previamente. Si este campo tiene un valor, TimeWindowStart, TimeWindowEnd, MaxViolationTime y MaxTravelTimeBetweenBreaks deben ser nulos que el análisis se resuelva correctamente. La unidad de este valor de campo se especifica en el parámetro time_units. IsPaid: un valor booleano que indica si se paga o no durante el descanso. Un valor True indica que el tiempo dedicado en el descanso está incluido en el cálculo de coste de la ruta y la determinación de horas extra. Un valor False indica lo contrario. El valor predeterminado es True. Sequence: como campo de entrada, indica la secuencia del descanso en su ruta. Este campo puede contener valores nulos. Los valores de secuencia de entrada son positivos y únicos para cada ruta (compartida en las visitas a depósito de renovación, órdenes y descansos), pero no tienen que empezar a partir de 1 o ser contiguos. El solucionador modifica el campo de secuencia. Después de la resolución, este campo contiene el valor de secuencia del descanso en su ruta. Los valores de secuencia de salida para una ruta se comparten en las visitas a depósito, órdenes y descansos; empiezan a partir de 1 (en el depósito de inicio); y son consecutivos. | Record Set |
time_units | Las unidades de tiempo para todos los valores de campo basados en el tiempo para el análisis. Muchas entidades y registros de un análisis de VRP tienen campos para almacenar valores de tiempo, como ServiceTime para las órdenes y CostPerUnitTime para las rutas. Para minimizar los requisitos de entrada de datos, estos valores de campo no incluyen unidades. En lugar de ello, todos los valores de campo basados en la distancia, se deben introducir en las mismas unidades y este parámetro se utiliza para especificar las unidades de esos valores. Tenga en cuenta que los campos de salida basados en el tiempo utilizan las mismas unidades especificadas por este parámetro. | String |
distance_units | Las unidades de distancia para todos los valores de campo basados en la distancia para el análisis. Muchas entidades y registros en un análisis de VRP tienen campos para almacenar los valores de distancia, como MaxTotalDistance y CostPerUnitDistance para las rutas. Para minimizar los requisitos de entrada de datos, estos valores de campo no incluyen unidades. En lugar de ello, todos los valores de campo basados en la distancia, se deben introducir en las mismas unidades y este parámetro se utiliza para especificar las unidades de esos valores. Tenga en cuenta que los campos de salida basados en la distancia utilizan las mismas unidades especificadas por este parámetro. | String |
analysis_region (Opcional) | Especifique la región en la que desea realizar el análisis. Si no se especifica un valor para este parámetro, la herramienta calcula automáticamente el nombre de la región en función de la ubicación de los puntos de entrada. Se recomienda establecer el nombre de la región para acelerar la ejecución de la herramienta. Para especificar una región, utilice uno de los siguientes valores:
| String |
default_date (Opcional) | La fecha predeterminada para los valores del campo de hora que especifica una hora del día sin incluir una fecha. Puede encontrar estos campos de hora en diversos parámetros de entrada, como los atributos ServiceTime de los parámetros de las órdenes y los descansos. | Date |
uturn_policy (Opcional) | Use este parámetro para restringir o permitir que en el área de servicio se realicen cambios de sentido en los cruces.Para entender los valores del parámetro, deténgase un momento en la siguiente terminología: un cruce es un punto en el que termina el segmento de una calle y puede conectar con uno o varios segmentos distintos; un pseudocruce es un punto en el que dos calles se conectan entre sí; una intersección es un punto en el que confluyen tres o más calles y un callejón sin salida es el punto en el que un segmento de calle acaba sin conectar con otro. Dada esta información, el parámetro puede tener los siguientes valores:
El valor introducido para este parámetro se ignora a menos que el parámetro Modo de viaje esté establecido en Personalizado, que es el valor predeterminado. | String |
time_window_factor (Opcional) | Califica la importancia de respetar las ventanas de tiempo. A continuación se describen tres opciones.
| String |
spatially_cluster_routes (Opcional) |
| Boolean |
route_zones (Opcional) | Delinea los territorios de trabajo para determinadas rutas. Una zona de ruta es una entidad poligonal que se utiliza para restringir rutas para que den servicio solo a las órdenes que quedan dentro o cerca del área especificada. Aquí se muestran algunos ejemplos que indican cuándo pueden ser útiles las zonas de ruta:
Cuando se especifican zonas de ruta, se deben definir propiedades para cada una de ellas, como la ruta asociada, mediante el uso de atributos. Las zonas de ruta se pueden especificar con los siguientes atributos: ObjectID: campo de Id. administrado por el sistema. RouteName: el nombre de la ruta a la que corresponde esta zona. Una zona de ruta puede tener un máximo de una ruta asociada. Este campo no puede contener valores nulos y es una clave externa del campo Name del parámetro routes. IsHardZone: un valor booleano que indica una zona de ruta estricta o no. Un valor True indica que la zona de ruta es estricta; es decir, una orden que caiga fuera del polígono de la zona de ruta no se puede asignar a la ruta. El valor predeterminado es 1 (Verdadero). Un valor Falso (0) indica que tales órdenes se pueden seguir asignando, pero el coste de dar servicio a la orden se pondera mediante función basada en la distancia euclidiana desde la zona de ruta. Básicamente, esto significa que como la distancia en línea recta desde la zona no estricta a la orden aumenta, disminuye la probabilidad de asignar la orden a la ruta. | Feature Set |
route_renewals (Opcional) | Especifica los depósitos intermedios que las rutas pueden visitar para volver a cargar o descargar la carga que están entregando o recogiendo. Concretamente, una reanudación de ruta vincula una ruta a un depósito. La relación indica que la ruta se puede reanudar (volver a cargar o descargar en ruta) en el depósito asociado. Las renovaciones de ruta se pueden utilizar para modelar escenarios en los que un vehículo recoge una carga completa de entregas en el depósito inicial, da servicio a las órdenes, vuelve al depósito para reanudar su carga de entregas y sigue dando servicio a más órdenes. Por ejemplo, en la entrega de gas propano, el vehículo podría realizar varias entregas hasta que el depósito se quede casi vacío o vacío por completo, visita un punto de recarga y realiza más entregas. Aquí hay algunas reglas y opciones a tener en cuenta al trabajar también con puntos de semilla de ruta:
Cuando se especifican renovaciones de ruta, se deben definir propiedades para cada una de ellas, como el nombre del depósito en el que puede producirse la renovación de ruta, mediante el uso de atributos. Las renovaciones de ruta se pueden especificar con los siguientes atributos: ObjectID: campo de Id. administrado por el sistema. DepotName: el nombre del depósito donde tiene lugar esta renovación. Este campo no puede contener un valor nulo y es una clave externa del campo Name del parámetro depots. RouteName: nombre de la ruta a la que corresponde esta renovación. Este campo no puede contener un valor nulo y es una clave externa del campo Name del parámetro routes. ServiceTime: el tiempo del servicio para la renovación. Este campo puede contener un valor nulo; un valor nulo indica un tiempo de servicio cero. La unidad de este valor de campo se especifica en el parámetro time_units. El tiempo que tarda en cargarse un vehículo en un depósito de reanudación puede depender del tamaño del vehículo y de lo lleno o vacío que esté el vehículo. Sin embargo, el tiempo de servicio para una reanudación de ruta es un valor fijo y no tiene en cuenta la carga real. En consecuencia, al tiempo de servicio de reanudación se le debería dar un valor correspondiente a un camión completamente cargado, con una carga media o podría realizar otra estimación de tiempo propia. | Record Set |
order_pairs (Opcional) | Este parámetro empareja las órdenes de recogida y entrega de modo que sean atendidas en la misma ruta. A veces se requiere que se emparejen la recogida y entrega de las órdenes. Por ejemplo, una compañía de mensajería podría necesitar tener una ruta para recoger un paquete de alta prioridad de una orden y entregarlo a otra sin volver a un depósito o estación de ordenamiento para minimizar el tiempo de entrega. Estas órdenes relacionadas pueden estar asignadas a la misma ruta con la secuencia adecuada utilizando pares de órdenes. Además, las restricciones sobre cuánto tiempo puede permanecer el paquete en el vehículo también se pueden asignar; por ejemplo, el paquete puede ser una muestra de sangre que tiene que ser transportada desde la consulta del médico al laboratorio en un plazo de dos horas. Cuando se especifican los pares de órdenes, se deben definir propiedades para cada una de ellas, como los nombres de las dos órdenes, mediante el uso de atributos. Los pares de órdenes se pueden especificar con los siguientes atributos: ObjectID: campo de Id. administrado por el sistema. FirstOrderName: el nombre de la primera orden del par. Este campo es una clave externa del campo Name del parámetro orders. SecondOrderName: el nombre de la segunda orden del par. Este campo es una clave externa del campo Name del parámetro orders. La primera orden del par debe ser una orden de recogida; es decir, el valor del campo DeliveryQuantities es nulo. La segunda orden del par debe ser una orden de entrega; es decir, el valor del campo PickupQuantities es nulo. La cantidad que se recoge en la primera orden debe coincidir con la cantidad que se entrega en la segunda orden. Como caso especial, ambas órdenes pueden tener cantidades cero para escenarios donde no se utilizan las capacidades. Las cantidades de órdenes no se cargan o descargan en los depósitos. MaxTransitTime: el tiempo máximo de tránsito para el par. El tiempo de tránsito es la duración de tiempo desde la hora de salida de la primera orden a la hora de llegada en la segunda orden. Esta restricción limita el tiempo en vehículo o tiempo de trayecto, entre las dos órdenes. Cuando un vehículo lleva personas o bienes perecederos, el tiempo de trayecto suele ser más corto que el de un vehículo que transporta paquetes o bienes no perecederos. Este campo puede contener valores nulos; un valor nulo indica que no hay ninguna restricción en el tiempo de trayecto. La unidad de este valor de campo se especifica en el parámetro time_units. El solucionador puede realizar el seguimiento y ponderar el tiempo de tránsito en exceso (medido con respecto al tiempo de viaje directo entre pares de órdenes). Por ello, puede dirigir el solucionador de VRP para que adopte uno de estos tres enfoques:
Al asignar un nivel de importancia para el parámetro excess_transit_factor, está eligiendo, de hecho, uno de estos tres enfoques. Sin tener en cuenta el nivel de importancia, el solucionador devolverá un error siempre si se supera el valor MaxTransitTime. | Record Set |
excess_transit_factor (Opcional) | Valora la importancia de reducir el exceso de tiempo de tránsito de los pares de órdenes. 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 puede ser causado por los descansos del conductor descansos o por viajes a las órdenes y los depósitos intermedios. A continuación encontrará los tres valores puede elegir.
| String |
point_barriers (Opcional) | Especifique uno o varios puntos para que actúen como restricciones temporales o representen el tiempo o la distancia adicional que se puede necesitar para viajar en las calles subyacentes. Por ejemplo, una barrera de punto se puede usar para representar un árbol caído en una calle o el retraso acumulado en un cruce de ferrocarril. La herramienta impone un límite de 250 puntos que se pueden añadir como barreras. Cuando se especifican las barreras de punto, se pueden definir propiedades para cada una de ellas, como su nombre o el tipo de barrera, mediante el uso de atributos. Las barreras de punto se pueden especificar con los siguientes atributos: Name: nombre de la barrera. BarrierType: especifica si la barrera de punto restringe el viaje completamente o agrega tiempo o distancia cuando se cruza. El valor de este atributo se especifica como uno de los siguientes enteros (use el código numérico, no el nombre entre paréntesis):
Additional_Time: indica cuánto tiempo de viaje se agrega al atravesar la barrera. Este campo solo es aplicable para barreras con coste añadido y solo si las unidades de medida se basan en el tiempo. El valor de este campo debe ser mayor o igual que cero, y sus unidades son las mismas que las especificadas en el parámetro Unidades de medida. Additional_Distance: indica cuánta distancia se agrega al atravesar la barrera. Este campo solo se aplica a barreras con coste agregado y solo si las unidades de medida se basan en distancias. El valor de este campo debe ser mayor o igual que cero, y sus unidades son las mismas que las especificadas en el parámetro Unidades de medida. | Feature Set |
line_barriers (Opcional) | Especifique una o varias líneas que prohíban viajar a cualquier ubicación en la que las líneas se intersequen con las calles. Por ejemplo, un desfile o una protesta que bloquee el tráfico por varios segmentos de calle se puede modelar con una barrera de línea. Una barrera de línea también puede cercar rápidamente varios caminos para que no se puedan atravesar, alejando así las posibles rutas de las partes no deseadas de la red de calles. La herramienta impone un límite en el número de calles que puede restringir usando el parámetro Barreras de línea. Aunque no existe un límite para el número de líneas que se pueden especificar como barreras de línea, el número combinado de calles que se intersecan con todas las líneas no puede ser superior a 500. Cuando se especifican las barreras de línea, se puede definir una propiedad de nombre para cada una de ellas utilizando el siguiente atributo: Name: nombre de la barrera. | Feature Set |
polygon_barriers (Opcional) | Especifique polígonos que restrinjan completamente el viaje o ajusten de una forma proporcional el tiempo o la distancia que se requieren para viajar por las calles que se intersecan con los polígonos. El servicio impone un límite en el número de calles que se pueden restringir usando el parámetro Barreras de polígono. Aunque no existe un límite para la cantidad de polígonos que se pueden especificar como barreras de polígono, la cantidad combinada de calles que se intersecan con todos los polígonos no puede ser superior a 2000. Cuando se especifican las barreras de polígono, se pueden definir propiedades para cada una de ellas, como su nombre o el tipo de barrera, mediante el uso de atributos. Las barreras de polígono se pueden especificar con los siguientes atributos: Name: nombre de la barrera. BarrierType: especifica si la barrera restringe el viaje completamente o ajusta el tiempo o la distancia para atravesarla. El valor de campo se especifica como uno de los siguientes enteros (use el código numérico, no el nombre entre paréntesis):
ScaledTimeFactor: este es el factor por el cual se multiplica el tiempo de viaje de las calles que se intersecan con la barrera. Este campo solo tiene validez para barreras con coste en escala y solo si las unidades de medida se basan en el tiempo. El valor del campo debe ser mayor que cero. ScaledDistanceFactor: este es el factor por el cual se multiplica la distancia de las calles que se intersecan con la barrera. Este atributo solo tiene validez para barreras con coste en escala y solo si las unidades de medida se basan en distancias. El valor del atributo debe ser mayor que cero. | Feature Set |
use_hierarchy_in_analysis (Opcional) | Especifique si la jerarquía se debe usar para buscar las mejores rutas.
La herramienta siempre vuelve automáticamente al uso de la jerarquía si la distancia en línea recta entre las órdenes o los depósitos o las órdenes y los depósitos es mayor de 50 millas, aunque este parámetro se haya definido de modo que no use la jerarquía. El valor introducido para este parámetro se ignora a menos que el parámetro Modo de viaje esté establecido en Personalizado, que es el valor predeterminado. | Boolean |
restrictions (Opcional) | Especifique qué restricciones debe cumplir la herramienta para buscar las mejores rutas. El valor introducido para este parámetro se ignora a menos que el parámetro Modo de viaje esté establecido en Personalizado, que es el valor predeterminado. Una restricción representa una preferencia o un requisito de conducción. En la mayoría de los casos, las restricciones ocasionan la prohibición de carreteras. Por ejemplo, al usar una restricción Evitar carreteras con peaje, se generará una ruta que solo incluirá carreteras con peaje cuando sea absolutamente necesario viajar por ellas para llegar a un incidente o a una instalación. Restricción de altura permite circular evitando cualquier altura que sea inferior a la altura de su vehículo. Si está transportando materiales corrosivos en el vehículo, utilizar la restricción Prohibidos todos los materiales peligrosos impide transportar los materiales en las carreteras en las que está marcado como ilegal hacerlo. Abajo se ofrece una lista de las restricciones disponibles junto con una descripción breve. La herramienta admite las siguientes restricciones:
| String |
attribute_parameter_values (Opcional) | Especifique los valores adicionales requeridos por algunas restricciones, como el peso del vehículo para una restricción de peso. También puede usar el parámetro de atributos para especificar si una restricción prohíbe, evita o prefiere el recorrido por las carreteras que usan la restricción. Si la restricción se ha ideado para evitar carreteras o darles preferencia, puede especificar en qué medida se deben evitar o se les debe dar preferencia usando este parámetro. Por ejemplo, puede elegir que nunca se usen carreteras de peaje, que se eviten en la medida de lo posible o que se les dé una preferencia clara. El valor introducido para este parámetro se ignora a menos que el parámetro Modo de viaje esté establecido en Personalizado, que es el valor predeterminado. Si especifica el parámetro Valores de los parámetros de atributos de una clase de entidad, los nombres de los campos de la clase de entidad deben coincidir con los campos que se describen a continuación: AttributeName: muestra el nombre de la restricción. ParameterName: muestra el nombre del parámetro asociado con la restricción. Una restricción puede tener uno o varios valores de campo ParameterName dependiendo del uso previsto para ella. ParameterValue: el valor de ParameterName que la herramienta usará cuando evalúe la restricción. Valores de los parámetros de atributos depende del parámetro Restricciones. El campo ParameterValue solo se usa si el nombre de la restricción se ha especificado como valor del parámetro Restricciones. En Valores de los parámetros de atributos, cada restricción (mostrada como AttributeName) tiene un valor de campo ParameterName, Uso con restricciones, que especifica si la restricción prohíbe, evita o prefiere los viajes por las carreteras asociadas con la restricción y en qué medida las carreteras se evitan o tienen preferencia. El ParameterName Uso de restricción se puede asignar a cualquiera de los siguientes valores de cadenas de texto o a los valores numéricos equivalentes que se muestran entre paréntesis:
En la mayoría de los casos, puede usar el valor predeterminado, PROHIBITED, para Uso de restricción si la restricción depende de una característica del vehículo como su altura. Sin embargo, en algunos casos, el valor de Uso de restricción depende de las preferencias de creación de rutas del usuario. Por ejemplo, la restricción Evitar carreteras con peaje tiene el valor predeterminado AVOID_MEDIUM para el parámetro Uso de restricción. Esto significa que, cuando se utilice la restricción, la herramienta intentará circular fuera de las carreteras con peaje siempre que sea posible. AVOID_MEDIUM también indica lo importante que es evitar las carreteras con peaje al buscar la mejor ruta; tiene una prioridad media. Si se selecciona AVOID_LOW, se dará una importancia menor a evitar los peajes, mientras que si se selecciona AVOID_HIGH se le dará más importancia y, por lo tanto, será más aceptable que el servicio genere rutas más largas para evitar los peajes. Elegir PROHIBITED no permitirá viajar en las carreteras con peaje y hará imposible que una ruta viaje por cualquier parte de una carretera de peaje. Tenga en cuenta que evitar o prohibir carreteras con peaje, y evitando así los pagos de peaje, es el objetivo para algunos; en cambio, otros prefieren conducir en las carreteras con peaje porque evitar el tráfico es más valioso para ellos que el dinero gastado en los peajes. En el último caso, elegiría PREFER_LOW, PREFER_MEDIUM o PREFER_HIGH como valor de Uso de la restricción. Cuanto más alta sea la preferencia, más se apartará la herramienta de su camino para viajar por las carreteras asociadas con la restricción. | Record Set |
populate_route_lines (Opcional) |
Cuando el parámetro Forma de la ruta se ha definido como Forma verdadera, la generalización de la forma de la ruta se puede controlar mejor usando los valores apropiados para los parámetros Tolerancia de simplificación de línea de ruta. Sea cual sea el valor elegido para el parámetro Forma de la ruta, las mejores rutas siempre se determinan minimizando el viaje por las calles, nunca usando la distancia en línea recta. Esto significa que solo las formas de la ruta son diferentes, no las calles subyacentes en las que se realizan las búsquedas para encontrar la ruta. | Boolean |
route_line_simplification_tolerance (Opcional) | Especifique cuánto desea simplificar la geometría de las líneas de salida de las rutas e indicaciones. El valor introducido para este parámetro se ignora a menos que el parámetro Modo de viaje esté establecido en Personalizado, que es el valor predeterminado. La herramienta también ignora este parámetro si el parámetro populate_route_lines está desactivado (Falso). La simplificación mantiene puntos críticos de una ruta, como los giros en intersecciones, para definir la forma esencial de la ruta y quita el resto de los puntos. La distancia de simplificación que especifique será el desplazamiento máximo permisible que puede apartarse la línea simplificada de la línea original. La simplificación de una línea reduce el número de vértices que forman parte de la geometría de la ruta. Esto mejora el tiempo de ejecución de la herramienta. | Linear Unit |
populate_directions (Opcional) | Especifique si la herramienta debe generar indicaciones de conducción para cada ruta.
| Boolean |
directions_language (Opcional) | Especifique el idioma que se debe utilizar para generar las indicaciones de conducción. Este parámetro solo se usa cuando el parámetro populate_directions está activado o definido como True. El valor del parámetro se puede especificar usando uno de los siguientes códigos de idiomas de dos o cinco caracteres:
Si se especifica un código de idioma no admitido, la herramienta devuelve las indicaciones en el idioma predeterminado, el inglés. | String |
directions_style_name (Opcional) | Especifique el nombre del estilo de formato para las indicaciones. Este parámetro solo se usa cuando el parámetro Completar direcciones está activado o definido como True. El parámetro se puede especificar usando los valores siguientes:
| String |
travel_mode (Opcional) | Especifique el modo de transporte que se debe modelar en el análisis. Los modos de viaje se administran en ArcGIS Online y el administrador de su organización puede configurarlos para reflejar mejor los flujos de trabajo de la organización. Debe especificar el nombre de un modo de viaje compatible con su organización. Para obtener una lista de los nombres de modos de viaje admitidos, use la misma conexión de servidor SIG que utilizó para acceder a esta herramienta y, desde la caja de herramientas Utilidades, ejecute GetTravelModes. La herramienta GetTravelModes agrega una tabla, Supported Travel Modes, a la aplicación. Cualquier valor del campo Nombre del modo de viaje de la tabla Supported Travel Modes se puede especificar como entrada. También puede especificar el valor del campo Configuración del modo de viaje como entrada. Esto acelera la ejecución de la herramienta, ya que esta no tiene que buscar la configuración a partir del nombre del modo de viaje. El valor predeterminado, Personalizado, le permite configurar su propio modo de viaje usando los parámetros de modo de viaje personalizado (Giros en U en cruces, Utilizar jerarquía, Restricciones, Valores de los parámetros de atributos e Impedancia). Los valores predeterminados de los parámetros de modo de viaje personalizado se basan en viajes en coche. Puede elegir el modo Personalizado y establecer los parámetros de modo de viaje personalizado enumerados para modelar un peatón con una velocidad de caminata rápida o un camión con una altura y un peso determinados y con una carga de ciertos materiales peligrosos. Puede elegir esta opción para probar distintas configuraciones con el fin de obtener los resultados de análisis que desee. Una vez que haya identificado la configuración de análisis, debe trabajar con el administrador de su organización y guardar esta configuración como parte de un modo de viaje nuevo o existente para que todos los usuarios de su organización puedan volver a ejecutar el análisis con la misma configuración. | String |
impedance (Opcional) | Especifique la impedancia, que es un valor que representa el esfuerzo o el coste de viajar a lo largo de segmentos de carretera o en otras partes de la red de transporte. El tiempo de viaje es una impedancia; un coche que tarda un minuto en recorrer un kilómetro a lo largo de una carretera vacía es un ejemplo de impedancia. Los tiempos de viaje pueden variar según el modo de viaje: un peatón puede tardar más de 20 minutos en recorrer el mismo kilómetro, por lo que resulta importante elegir la impedancia correcta para el modo de viaje que esté modelando. Elija de entre los valores de impedancia siguientes:
El valor introducido para este parámetro se ignora a menos que el parámetro Modo de viaje esté establecido en Personalizado, que es el valor predeterminado. | String |
time_zone_usage_for_time_fields (Opcional) | Especifica la zona horaria para los campos de fecha/hora de entrada que se admiten en la herramienta. Este parámetro especifica la zona horaria para los campos siguientes: TimeWindowStart1, TimeWindowEnd1, TimeWindowStart2, TimeWindowEnd2, InboundArriveTime y OutboundDepartTime en órdenes. TimeWindowStart1, TimeWindowEnd1, TimeWindowStart2 y TimeWindowEnd2 en depósitos. EarliestStartTime y LatestStartTime en rutas. TimeWindowStart y TimeWindowEnd en descansos.
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 siempre como GEO_LOCAL. | string |
save_output_layer (Opcional) | Especifique si la herramienta debe guardar la configuración del análisis como un archivo de capa de análisis de red. No puede trabajar directamente con este archivo aunque lo abra en una aplicación de ArcGIS Desktop como ArcMap. Se debe enviar al Soporte técnico de Esri para diagnosticar la calidad de los resultados devueltos por la herramienta.
| Boolean |
overrides (Opcional) | Especifique cualquier parámetro adicional que pueda influir en el comportamiento del solucionador al buscar soluciones para problemas de análisis de red. Se debe especificar el valor para este parámetro en la notación de objetos JavaScript (JSON). Por ejemplo, un valor válido tiene el siguiente formato {"overrideSetting1" : "value1", "overrideSetting2" : "value2"}. El nombre del parámetro de invalidación siempre está incluido entre comillas dobles. Los valores pueden ser un número, operador booleano o cadena de caracteres. El valor predeterminado para este parámetro es ningún valor, lo que indica que no se debe invalidar ningún parámetro del solucionador. Las invalidaciones son parámetros avanzados que se deben utilizar solamente después de un análisis cuidadoso de los resultados obtenidos antes y después de aplicar los parámetros. Puede ponerse en contacto con Soporte técnico de Esri para obtener una lista de los parámetros de invalidación compatibles para cada solucionador y los valores aceptables. | String |
save_route_data (Opcional) | Elija si la salida incluye un archivo zip que contiene una geodatabase de archivos con las entradas y salidas del análisis en un formato que se puede utilizar para compartir capas de ruta con ArcGIS Online o Portal for ArcGIS.
| Boolean |
Muestra de código
Ejemplo de SolveVehicleRoutingProblem
La siguiente secuencia de comandos de Python muestra cómo utilizar la herramienta SolveVehicleRoutingProblem en una secuencia de comandos.
'''
The script shows how to use the SolveVehicleRoutingProblem tool in a script. It demonstrates how to obtain the schema for
the inputs, populate the inputs, excute the tool and save the results.
'''
import time
import sys
import arcpy
#Change the username and password applicable to your own ArcGIS Online account
username = "<your user name>"
password = "<your password>"
vrp_service = "https://logistics.arcgis.com/arcgis/services;World/VehicleRoutingProblem;{0};{1}".format(username, password)
#Add the geoprocessing service as a toolbox. The alias will be the service name
arcpy.ImportToolbox(vrp_service)
vrp_tool_name = "SolveVehicleRoutingProblem_VehicleRoutingProblem"
#Set the variables to store results from the tool. Overwrite the results if they already exist.
arcpy.env.overwriteOutput = True
output_routes = "C:/data/Results.gdb/Routes"
assigned_orders = "C:/data/Results.gdb/AssignedOrders"
unassigned_orders = "C:/data/Results.gdb/UnassignedOrders"
#Get the schema for input orders, depots and routes
input_orders = arcpy.GetParameterValue(vrp_tool_name, 0)
input_depots = arcpy.GetParameterValue(vrp_tool_name, 1)
input_routes = arcpy.GetParameterValue(vrp_tool_name, 2)
#Create two orders as input. The coordinate values are in WGS84 spatial reference.
#AssignmentRule for orders is 3 which specifies that the tool should assign a new
#sequence and route for every order.
orders = [(-122.51, 37.7724), (-122.4889, 37.7538)]
sr = arcpy.SpatialReference(4326)
with arcpy.da.InsertCursor(input_orders, ("SHAPE@", "Name", "AssignmentRule")) as cursor:
for i, order in enumerate(orders):
order_shape = arcpy.PointGeometry(arcpy.Point(order[0], order[1]), sr)
row = (order_shape, "O{}".format(i + 1), 3)
cursor.insertRow(row)
#Create one depot as input. The coordinate values are in WGS84 spatial reference
depots = [(-122.3943, 37.7967)]
with arcpy.da.InsertCursor(input_depots, ("SHAPE@", "Name")) as cursor:
for i, depot in enumerate(depots):
depot_shape = arcpy.PointGeometry(arcpy.Point(depot[0], depot[1]), sr)
row = (depot_shape, "D{}".format(i + 1))
cursor.insertRow(row)
#Create one route as input. Ensure that the StartDepotName and EndDepotName fields on routes has same
#value as the Name field on input depots. AssignmentRule for routes is 1 which specifies that the tool
#must include the route. CostPerUnitTime and MaxOrderCount are fields that cannot have null values if
#the route is to be considered as a valid route.
with arcpy.da.InsertCursor(input_routes, ("Name", "StartDepotName", "EndDepotName", "AssignmentRule", "CostPerUnitTime", "MaxOrderCount")) as cursor:
row = ("R1", "D1", "D1", 1, 1, 10)
cursor.insertRow(row)
#Call the tool
result = arcpy.SolveVehicleRoutingProblem_VehicleRoutingProblem(input_orders, input_depots, input_routes)
arcpy.AddMessage("Running the analysis with result ID: {}".format(result.resultID))
#Check the status of the result object every 1 seconds until it has a value of 4(succeeded) or greater
while result.status < 4:
time.sleep(1)
#Print any warning or error messages returned from the tool
result_severity = result.maxSeverity
if result_severity == 2:
arcpy.AddMessage("An error occured when running the tool")
arcpy.AddMessage(result.getMessages(2))
sys.exit(2)
elif result_severity == 1:
arcpy.AddMessage("Warnings were returned when running the tool")
arcpy.AddMessage(result.getMessages(1))
#Get the output routes and orders and save to a local geodatabase
result.getOutput(0).save(unassigned_orders)
result.getOutput(1).save(assigned_orders)
result.getOutput(2).save(output_routes)
Entornos
Esta herramienta no utiliza ningún entorno de geoprocesamiento.