VehicleRoutingProblemSolverProperties

摘要

用于访问车辆配送 (VRP) 网络分析图层中的分析属性。GetSolverProperties 函数用于从车辆配送 (VRP) 网络分析图层中获取 VehicleRoutingProblemSolverProperties 对象。

说明

VehicleRoutingProblemSolverProperties 对象提供对车辆配送 (VRP) 网络分析图层中所有分析属性的读取和写入权限。该对象可用于修改车辆配送 (VRP) 图层的分析属性,并可重新求解相应图层以确定合适结果。使用 创建车辆配送分析图层地理处理工具可创建新的车辆配送图层。通过从新的车辆配送图层获取 VehicleRoutingProblemSolverProperties 对象,可重新对现有图层进行后续分析,而无需每次分析都创建一个新图层,这将非常耗时。

修改 VehicleRoutingProblemSolverProperties 对象的属性后,相应的图层可立即与其他函数和地理处理工具配合使用。无需刷新或更新图层,通过上述对象进行的修改便可生效。

属性

属性说明数据类型
attributeParameters
(可读写)

用于获取或设置将在分析中使用的参数化属性。该属性返回一个 Python 字典。该字典关键字是由属性名称和参数名称这两个值组成的元组。字典中每个项目的值均为参数值。

参数化的网络属性用于对属性值的某个动态方面进行建模。例如,可使用某个参数对高度限制为 12 英尺的隧道进行建模。在这种情况下,应将以英尺为单位的车辆高度指定为参数值。如果车辆高度超过 12 英尺,此限制条件将评估为 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 a.m. 并且 defaultDatedatetime.date(2012, 3, 6),则其字段的整个时间值为 2012 年 3 月 6 日 9:00 a.m.。默认日期不影响已具有日期的时间字段值。

也可以使用以下日期将一周中的某天指定为默认日期:

  • 今天 - 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 图层所引用的求解程序的名称。从 VehicleRoutingProblemSolverProperties 对象访问时,该属性始终返回字符串值 Vehicle Routing Problem Solver

String
streetDirectionsProperties
(可读写)

StreetDirectionsProperties 提供读写访问,使您可自定义车辆配送图层的方向输出。

Object
timeAttribute
(可读写)

用于获取或设置定义沿网络元素的遍历时间所用的基于时间的网络成本属性。查找解决方案时,利用求解程序使成本属性最小化。

String
timeFieldUnits
(可读写)

用于获取或设置分析图层的子图层和表(网络分析类)的时态字段所用的时间单位。单位不必与指定为 timeAttribute 属性值的网络成本属性的单位相同。

  • Days
  • Hours小时
  • Minutes
  • Seconds
String
timeWindowViolationImportance
(可读写)

用于获取或设置遵循时间窗且不引起冲突的重要性。如果路径在时间窗关闭后才到达停靠点、站点或休息点,将会产生时间窗冲突。该冲突是时间窗关闭与路径到达时间之间的时间间隔。以下是可能值列表:

  • High求解程序尝试找到最小化时间窗冲突的解决方案(以增加总体行驶时间为代价)。如果对您而言按时到达停靠点要比最小化总体解决方案成本更加重要,请选择此选项。您可能会在以下情况下选择此设置:您要在自己的停靠点会见客户,且不想因为迟到给客户带来不便(另一种方法是使用根本不会出现冲突的硬性时间窗)。假设还要考虑车辆配送 (VRP) 的其他约束,可能无法在它们的时间窗内访问所有停靠点。在这种情况下,即使选择此选项也可能会产生冲突。
  • 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
(可读写)

用于获取或设置策略,该策略指示交汇点处的 U 形转弯在求解程序处理停靠点之间的遍历期间可如何出现。以下是可能值列表:

  • ALLOW_UTURNS无论在交汇点处有几条连接的边,均允许 U 形转弯。
  • NO_UTURNS在所有交汇点处均禁止 U 形转弯,不管交汇点原子价如何。不过请注意,即使已选择该设置,在网络位置仍允许 U 形转弯;但是也可以通过设置个别网络位置的 CurbApproach 属性来禁止 U 形转弯。
  • ALLOW_DEAD_ENDS_ONLY除仅有一条相邻边的交汇点(死角)外,其他交汇点均禁止 U 形转弯。
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLY在恰好有两条相邻边相遇的交汇点处禁止 U 形转弯,但是交叉点(三条或三条以上相邻边的交汇点)和死角(仅有一条相邻边的交汇点)处允许。通常,网络在路段中间有多余的交汇点。此选项可防止车辆在这些位置出现 U 形转弯。
String

方法概述

方法说明
applyTravelMode (travel_mode)

根据出行模式对象更新网络分析图层的分析属性。随后可对更新的网络分析图层进行求解以完成分析。

方法

applyTravelMode (travel_mode)
参数说明数据类型
travel_mode

该变量引用一个源自网络数据集的出行模式对象。可通过调用 arcpy.na.GetTravelModes 函数获得出行模式对象的列表。

VRP 将仅使用基于时间的阻抗进行求解,因此将仅允许基于时间的阻抗出行模式。

Object

创建网络分析图层后,将为其分配所有分析属性的默认值。可使用从网络分析图层获得的求解程序属性对象更新各个分析属性。出行模式存储了一组预定义的分析设置,用于帮助执行特定分析,例如,步行时间出行模式存储了执行基于时间的步行分析所需的分析设置。

使用 applyTravelMode 方法,可一次性应用在一个出行模式中定义的所有分析设置。在分析属性完成更新后,可对网络分析图层进行求解以完成分析。

如果在更新求解程序属性时出错,例如,当提供的出行模式所引用的属性在当前网络数据集中不存在,或不再适用于创建求解程序属性对象的相应网络分析图层所使用的网络数据集时,不会产生任何异常。此方法将成功执行,但当您尝试求解此类网络分析图层时会出现错误。

如果 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)

相关主题