VehicleRoutingProblemSolverProperties

Сводка

Предоставляет доступ к свойствам из слоя задачи выбора маршрута транспорта Network Analyst. Функция GetSolverProperties используется для получения объекта VehicleRoutingProblemSolverProperties из слоя задачи выбора маршрута транспорта Network Analyst.

Описание

Объект VehicleRoutingProblemSolverProperties предоставляет доступ для чтения и записи ко всем свойствам слоя задачи выбора маршрута транспорта Network Analyst. Этот объект можно использовать для изменения свойств анализа слоя задачи выбора маршрута транспорта, а соответствующий слой можно повторно рассчитать для получения необходимых результатов. Новый слой задачи выбора маршрута транспорта можно создать с помощью инструмента геообработки Создать слой анализа задачи маршрута транспортного средства. Получение объекта VehicleRoutingProblemSolverProperties из нового слоя задачи выбора маршрута транспорта позволяет повторно использовать существующий слой для последующего анализа, а не создавать новый слой для каждого анализа, что может замедлять работу.

После изменения свойств объекта VehicleRoutingProblemSolverProperties, соответствующий слой можно немедленно использовать с другими функциями и инструментами геообработки. Обновлять слой для внесения изменения не требуется.

Свойства

ВладениеОбъяснениеТип данных
attributeParameters
(чтение и запись)

Дает возможность получать или задавать параметризированные атрибуты для использования их в анализе. Это свойство возвращает словарь Python. Ключом в словаре является кортеж двух значений – имени атрибута и имени параметра. Значение каждого элемента в словаре является значением параметра.

Параметризованные сетевые атрибуты используются для моделирования некоторого динамического аспекта значения атрибута. Например, туннель с ограничением высоты 12 футов может быть смоделирован с использованием параметра. В этом случае высоту транспорта в футах нужно указать как значение параметра. Если транспортное средство выше 12 футов (3,7 м), то это ограничение будет оценено как True, ограничивающее, таким образом, проезд по туннелю. Аналогично у моста может быть параметр, указывающий ограничение по весу.

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

Не стоит изменять свойство attributeParameters на месте; этот метод кодировки не будет работать.

solverProps.attributeParameters[('HeightRestriction', 'RestrictionUsage')] = "PROHIBITED"

Измените свойство attributeParameters используя новый объект словарь.

params = solverProps.attributeParameters params[('HeightRestriction', 'RestrictionUsage')] = "PROHIBITED"
solverProps.attributeParameters = params
Если слой сетевого анализа не имеет параметризованных атрибутов, это свойство вернет значение None.

Dictionary
defaultDate
(чтение и запись)

Дает возможность получать или задавать дату, принимаемую для тех полей временных значений, в которых указано только время. Если поле времени для какого-либо объекта заказов, например, поле TimeWindowStart1, имеет значение времени без даты, принимается дата по умолчанию из свойства defaultDate. Например, если для параметра TimeWindowStart1 задано 9:00 утра, а defaultDate установлена на datetime.date(2012, 3, 6), то все значения времени будут иметь вид 9:00 A.M., March 6, 2012. Дата по умолчанию не влияет на значения в поле времени, для которых указана дата.

Также в качестве даты по умолчанию можно указать день недели, при помощи следующих условных дат:

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

Например, если в качестве неявной даты для полей времени должен выступать день недели – вторник, следует указать для этого свойства значение 1/2/1900.

DateTime
distanceAttribute
(чтение и запись)

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

String
distanceFieldUnits
(чтение и запись)

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

  • CentimetersСантиметры
  • DecimetersДециметры
  • FeetФуты
  • InchesДюймы
  • KilometersКилометры
  • MetersМетры
  • MilesМили
  • MillimetersМиллиметры
  • NauticalMilesМорские мили
  • YardsЯрды
String
excessTransitTimeImportance
(чтение и запись)

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

Этот параметр имеет значение только при использовании Пары заказов.

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

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

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

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

String
solverName
(только чтение)

Возвращает название механизма расчета, на который ссылается слой Network Analyst, использующийся для получения объекта свойств механизма расчета. Это свойство всегда возвращает строковое значение Vehicle Routing Problem Solver при обращении к нему из объекта VehicleRoutingProblemSolverProperties.

String
streetDirectionsProperties
(чтение и запись)

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

Object
timeAttribute
(чтение и запись)

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

String
timeFieldUnits
(чтение и запись)

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

  • DaysДни
  • HoursЧасы
  • MinutesМинуты
  • SecondsСекунды
String
timeWindowViolationImportance
(чтение и запись)

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

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

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

  • GEO_LOCALЗначения даты и времени для временных окон заказа заданы по времени часового пояса, в котором расположен этот заказ.
  • UTCЗначения даты и времени для временных окон заказов указаны по универсальному глобальному времени (UTC).
String
spatialClustering
(чтение и запись)

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

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

Доступ к режиму движения устанавливается для слоя сетевого анализа как объект arcpy.na.TravelMode.

Object
useHierarchy
(чтение и запись)

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

  • USE_HIERARCHY Для анализа используется атрибут иерархии. Применение иерархии приводит при расчете к предпочтению ребер высшего порядка по сравнению с ребрами низшего порядка. Расчеты с иерархией выполняются быстрее, и они могут использоваться для моделирования предпочтений водителя, который скорее выберет для проезда автостраду, нежели местную дорогу – даже если это приведет к увеличению длины пути. Эта опция применима только в том случае, если в наборе сетевых данных, на который ссылается слой сетевых данных Network Analyst, имеется атрибут иерархии. Для выбора этой опции также может использоваться значение True.
  • NO_HIERARCHYДля анализа атрибут иерархии не используется. Расчет без применения иерархии дает точный маршрут для набора сетевых данных. Для выбора этой опции также может использоваться значение False.
String
uTurns
(чтение и запись)

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

  • ALLOW_UTURNSРазвороты разрешены в соединениях с любым количеством смежных ребер.
  • NO_UTURNSРазвороты запрещены во всех соединениях, вне зависимости от их валентности. Обратите внимание, что, даже при выборе этой опции развороты в сетевых положениях по-прежнему разрешены. Запретить развороты в отдельных сетевых положениях можно с помощью свойства положения CurbApproach.
  • ALLOW_DEAD_ENDS_ONLYРазвороты запрещены во всех соединениях, кроме тех, у которых имеется только одно смежное ребро (тупик).
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLYРазвороты запрещены в соединениях с ровно двумя смежными ребрами, но разрешены на перекрестках (в соединениях с тремя смежными ребрами или более) и в тупиках (соединениях с ровно одним смежным ребром). Часто сети имеют избыточные соединения в середине сегмента дороги. Эта опция позволяет запретить развороты транспортных средств в таких местах.
String

Обзор метода

МетодОбъяснение
applyTravelMode (travel_mode)

Обновляет свойства анализа слоя network analyst на основе объекта режима передвижения. После этого обновленный слой network analyst может быть рассчитан для завершения анализа.

Методы

applyTravelMode (travel_mode)
ParameterОбъяснениеТип данных
travel_mode

Переменная, ссылающаяся на объект режима передвижения, который был получен на основе слоя сетевых данных. Список объектов режима передвижения можно получить, вызвав функцию arcpy.na.GetTravelModes.

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

Object

При создании слоя network analyst он получит значения по умолчанию для всех своих свойств анализа. Отдельные свойства анализа можно обновлять с помощью объекта свойств механизма расчета, полученного из слоя network analyst. Режим перемещения сохраняет предопределенный набор настроек анализа, который помогает выполнять определенные виды анализа – например, режим передвижения пешком сохраняет настройки анализа, необходимые для выполнения по-временного анализа передвижения пешим ходом.

Используя метод applyTravelMode, за один раз могут применяться сразу все настройки анализа, заданные для режима передвижения. После того, как свойства анализа будут обновлены, слой network analyst может быть рассчитан для завершения анализа.

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

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

Пример кода

VehicleRoutingProblemSolverProperties, пример 1

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

# Name: VehicleRoutingProblemSolverProperties_Workflow.py
# Description: Find the optimal VRP solution solving for today or a day of the
#              week. Uses the SolverProperties to update the existing VRP layer
#              before re-running the analysis.
# Requirements: Network Analyst Extension

# Import system modules
import arcpy
from arcpy import env
import os
import datetime

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 = "C:\Data"
    # The NA layer's data will be saved to the workspace specified here
    env.workspace = os.path.join(output_dir, "Output.gdb")
    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")
    routes_today = os.path.join(output_dir, "Output.gdb", "Routes_Today")
    routes_tuesday = os.path.join(output_dir, "Output.gdb", "Routes_Tuesday")


    # 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["TimeWindowStart1"].mappedFieldName = "TimeStart1"
    order_field_mappings["TimeWindowEnd1"].mappedFieldName = "TimeEnd1"
    order_field_mappings["DeliveryQuantities"].mappedFieldName = "Demand"
    order_field_mappings["MaxViolationTime1"].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["TimeWindowStart1"].defaultValue = "8 AM"
    depot_field_mappings["TimeWindowEnd1"].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
    arcpy.na.AddLocations(layer_object, routes_layer_name, in_routes, "", "")

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

    # Save the resulting Routes sublayer
    arcpy.management.CopyFeatures(routes_layer_name, routes_today)

    # Get the solver properties object from the vehicle routing problem layer
    solverProps = arcpy.na.GetSolverProperties(layer_object)

    # Update the default date to tuesday using the specified day in the above
    # doc (Tuesday - 1/2/1900) for the vehicle routing problem layer using the
    #solver properties object
    solverProps.defaultDate = datetime.date(1900, 1, 2)

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

    # Save the resulting Routes sublayer
    arcpy.management.CopyFeatures(routes_layer_name, routes_tuesday)


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))
ApplyTravelMode пример 2 (рабочий процесс)

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

#Get the VRP layer object from a layer named "VRP" in the map
doc = arcpy.mp.ArcGISProject('current')
map_obj = doc.listMaps()[0]
vrp_layer = map_obj.listLayers('VRP')[0]

#Get the Trucking Time travel mode from the network dataset
desc = arcpy.Describe(vrp_layer)
travel_modes = arcpy.na.GetTravelModes(desc.network.catalogPath)
trucking_mode = travel_modes["Trucking Time"]

#Apply the travel mode to the analysis layer
solver_properties = arcpy.na.GetSolverProperties(vrp_layer)
solver_properties.applyTravelMode(trucking_mode)

Связанные разделы