创建车辆配送 (VRP) 图层 (Network Analyst)

许可等级:BasicStandardAdvanced

摘要

创建车辆配送 (VRP) 网络分析图层并设置其分析属性。车辆配送 (VRP) 分析图层可用于在使用一支车队时对一组路径进行优化。

注注:

创建车辆配送图层求解车辆配送工具类似,只是目的不同而已。如果正在设置地理处理服务,请使用求解车辆配送工具;这将会简化设置过程。否则,请使用创建车辆配送图层工具。

如要使用求解车辆配送图层创建 VRP 地理处理服务,只需设置一个工具并将其发布为服务。与此相反,您需要使用创建车辆配送图层创建模型,将其正确连接到其他不同的工具,并发布此模型以创建服务。要考虑的另一个选项是 ArcGIS Online 多路径配送服务。该服务与 ArcMap 中地理处理工具的运行方式类似,可通过其他应用程序进行访问,并包含世界上大部分地区的高质量道路数据。

用法

语法

MakeVehicleRoutingProblemLayer_na (in_network_dataset, out_network_analysis_layer, time_impedance, {distance_impedance}, {time_units}, {distance_units}, {default_date}, {capacity_count}, {time_window_factor}, {excess_transit_factor}, {UTurn_policy}, {restriction_attribute_name}, {hierarchy}, {hierarchy_settings}, {output_path_shape})
参数说明数据类型
in_network_dataset

将在其中执行车辆配送 (VRP) 分析的网络数据集。由于 VRP 求解程序要尽量缩短配送时间,因此网络数据集必须具有基于时间的成本属性。

Network Dataset Layer
out_network_analysis_layer

要创建的车辆配送 (VRP) 网络分析图层的名称。

String
time_impedance

用于定义沿网络元素的遍历时间的时间成本属性。时间成本属性是必选项,因为车辆配送 (VRP) 求解程序主要是基于最小化时间。

String
distance_impedance
(可选)

用于定义沿网络元素的长度的距离成本属性。距离成本属性是可选的。

String
time_units
(可选)

分析图层的子图层和表(网络分析类)的时态字段所用的时间单位。此单位不必与时间成本属性的单位相同。

  • 分钟
  • 小时
String
distance_units
(可选)

分析图层的子图层和表(网络分析类)的距离字段所用的距离单位。此单位不必与可选距离成本属性的单位相同。

  • 英里
  • 千米
  • 英尺
  • 英寸
  • 厘米
  • 毫米
  • 分米
  • 海里
String
default_date
(可选)

未用时间指定日期的时间字段值的隐式日期。如果某个停靠点对象的时间字段(如 TimeWindowStart1)只有时间值,则假定该日期为“默认日期”。例如,如果某个停靠点的 TimeWindowStart1 值为 9:00 AM 并且“默认日期”为 2013 年 3 月 6 日,那么其字段的整个时间值为 2013 年 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

如果网络数据集包含流量数据,则分析结果可根据此处指定的日期发生相应的变化。例如,您的路线在星期日 8:00 a.m.(此时交通不太拥堵)开始与在星期一 8:00 a.m.(交通高峰时段)开始相比,星期一会花费更长的时间。此外,最佳路径会根据交通状况发生相应的变化。

Date
capacity_count
(可选)

用于描述有关车辆限制的容量维限制。在订单配送实例中,根据物理和法律制约,每台车辆的可装载重量和体积可能会同时受到限制。这种情况下,如果追踪了停靠点的体积和重量,则可以使用这两种容量来避免车辆超载。此时,容量计数为 2(体积和重量)。根据问题的不同,您可能需要追踪不同类型或数目的容量。容量字段(“停靠点”类的 DeliveryQuantities 和 PickupQuantities 以及“路径”类的 Capacities)中输入的容量值是以空格分隔的数字字符串,这些字符串最多可包含“容量计数”中指定的数值个数。同一 VRP 分析图层中的每个容量维都应以相同的排序方式显示。容量本身没有名称,所以,为避免意外调换了容量的维度,请确保始终按相同的顺序为所有容量字段值输入以空格分隔的容量列表。

Long
time_window_factor
(可选)

此参数可用于评定遵循时间窗且不引起冲突的重要性。如果路径在时间窗关闭后才到达停靠点、站点或休息点,将会产生时间窗冲突。该冲突是时间窗关闭与路径到达时间之间的时间间隔。

VRP 解决方案可根据您选择的时间窗冲突重要性参数值进行更改。下面的列表介绍了这些值的含义以及如何更改生成的 VRP 解决方案:

  • 高值求解程序尝试找到最小化时间窗冲突的解决方案(以增加总体行驶时间为代价)。如果对您而言按时到达停靠点要比最小化总体解决方案成本更加重要,请选择“高”。您可能会在以下情况下选择“高值”:您要在自己的停靠点会见客户,但不想因为迟到给客户带来不便(另一种方法是使用根本不会出现冲突的硬性时间窗)。假设还要考虑车辆配送 (VRP) 的其他约束,可能无法在它们的时间窗内访问所有停靠点。在这种情况下,即使选择“高”设置也可能会产生冲突。
  • 中值这是默认设置。求解程序在满足时间窗和减少总体解决方案成本之间寻求一种平衡。
  • 低值求解程序尝试找到最小化总体行驶时间的解决方案(不考虑时间窗)。如果减少您的总体解决方案成本要比满足时间窗更重要,请选择“低”。如果积压的服务请求逐渐增多,则可以使用此设置。如果为了在当日内为更多的停靠点提供服务并减少积压的订单,则可选择“低”,即使车队迟到会为客户带来不便。
String
excess_transit_factor
(可选)

此参数可用于评定减少超出行驶时间的重要性。额外行驶时间是指超出需求点对间直线行驶所需时间的数量。额外时间是由于在需求点对的访问期间进行休息或者行驶至其他停靠点或站点而导致的。

VRP 解决方案可根据您选择的“额外行驶时间重要性”参数值进行更改。下面的列表介绍了这些值的含义以及所生成的 VRP 解决方案会如何发生变化:

  • 高值求解程序尝试找到需求点对之间超出行驶时间较短的解决方案(以增加总体行驶成本为代价)。如果您正在需求点对间运载乘客并且想缩短他们的乘车时间,则这种情况适合使用此设置。这是出租车服务的特征。
  • 中值这是默认设置。求解程序在减少超出行驶时间和减少总体解决方案成本之间寻求一种平衡。
  • 低值求解程序尝试找到最小化总体解决方案成本的结果(不考虑额外行驶时间)。此设置通常应用于快递服务。由于快递运输的是包裹而不是人员,因此无需担心行驶时间。使用“低值”时,快递可以按照最适合的顺序为需求点对提供服务,并且总体解决方案成本最低。
String
UTurn_policy
(可选)

交汇点的 U 形转弯策略。允许 U 形转弯表示求解程序可以在交汇点处转向并沿同一街道往回行驶。 考虑到交汇点表示街道交叉路口和死角,不同的车辆可以在某些交汇点转弯,而在其他交汇点则不行 - 这取决于交汇点是交叉路口还是死角。为适应此情况,U 形转弯策略参数由连接到交汇点的边数隐性指定,这称为交汇点原子价。此参数可接受的值如下所列;每个值的后面是根据交汇点原子价对其含义的描述。

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

如果您需要定义更加精确的 U 形转弯策略,可以考虑在网络成本属性中添加一个通用转弯延迟赋值器,或者如果存在的话,调整其设置,并特别注意反向转弯的配置。还要考虑设置网络位置的 CurbApproach 属性。

String
restriction_attribute_name
[restriction_attribute_name,...]
(可选)

分析过程中要应用的限制属性的列表。

String
hierarchy
(可选)
  • USE_HIERARCHY 使用等级属性进行分析。使用等级的结果是,求解程序更偏好高等级的边而不是低等级的边。分等级求解的速度更快,并且可用于模拟驾驶员在可能的情况下选择在高速公路而非地方道路上行驶(即使行程可能更远)的偏好。只有输入网络数据集具有等级属性时,此选项才有效。
  • NO_HIERARCHY不使用等级属性进行分析。如果不使用等级属性,则会为网络数据集生成精确的路径。

如果未在用于执行分析的网络数据集中定义等级属性,该参数将不可用。在这种情况下,使用 "#" 作为参数值。

Boolean
hierarchy_settings
(可选)

法律声明法律声明:

在版本 10 之前,可使用此参数将网络数据集中建立的默认等级范围更改为其他范围以用于分析。而版本 10 中不再支持此参数,并且应将其指定为空字符串。如果您要更改等级范围以进行分析,请更新网络数据集中的默认等级范围。

Network Analyst Hierarchy Settings
output_path_shape
(可选)
  • TRUE_LINES_WITH_MEASURES输出路径将具有基础网络源的精确形状。而且,输出还包括线性参考的路径测量值。测量值从第一个停靠点增加并将记录到达指定位置的累积阻抗。
  • TRUE_LINES_WITHOUT_MEASURES输出路径将具有基础网络源的精确形状。
  • STRAIGHT_LINES输出路径形状将是连接停靠点和站点访问的直线(按路线顺序)。
  • NO_LINES将不会为输出路径生成任何形状。您也将无法生成驾车指示。
String

代码实例

创建车辆配送 (VRP) 图层 (MakeVehicleRoutingProblemLayer) 示例 1(Python 窗口)

仅使用必需参数执行此工具。

import arcpy
arcpy.env.workspace = "C:/ArcTutor/Network Analyst/Tutorial/SanFrancisco.gdb"
arcpy.na.MakeVehicleRoutingProblemLayer("Transportation/Streets_ND",
                                        "DeliveryRoutes","Minutes")
创建车辆配送 (VRP) 图层 (MakeVehicleRoutingProblemLayer) 示例 2(Python 窗口)

使用所有参数执行此工具。

import arcpy
arcpy.env.workspace = "C:/ArcTutor/Network Analyst/Tutorial/SanFrancisco.gdb"
arcpy.na.MakeVehicleRoutingProblemLayer("Transportation/Streets_ND",
                                        "FridayRoutes","Minutes","Meters",
                                        "Minutes","Miles", "1/2/1900", "1",
                                        "High","Medium","ALLOW_DEAD_ENDS_ONLY",
                                        ["Oneway"],"USE_HIERARCHY","",
                                        "TRUE_LINES_WITHOUT_MEASURES")
创建车辆配送 (VRP) 图层 (MakeVehicleRoutingProblemLayer) 示例 3(工作流)

以下独立 Python 脚本演示了如何使用创建车辆配送 (VRP) 图层 (MakeVehicleRoutingProblemLayer) 工具通过一支车队为一组停靠点提供服务。

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

#Import system modules
import arcpy
from arcpy import env

try:
    #Check out the Network Analyst extension license
    arcpy.CheckOutExtension("Network")

    #Set environment settings
    env.workspace = "C:/data/SanFrancisco.gdb"
    env.overwriteOutput = True
    
    #Set local variables
    inNetworkDataset = "Transportation/Streets_ND"
    outNALayerName = "StoreDeliveryRoute"
    impedanceAttribute = "TravelTime"
    distanceAttribute = "Meters"
    timeUntis = "Minutes"
    distanceUntis = "Miles"
    inOrders = "Analysis/Stores"
    inDepots = "Analysis/DistributionCenter"
    inRoutes = "RoutesTable"
    outLayerFile = "C:/data/output/" + outNALayerName + ".lyr"
    
    #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 unti distance in routes, we have to specify a 
    #distance attribute. The values for CostPerUnitDistance are in miles, so we 
    #specify miles for distance units parameter.
    outNALayer = arcpy.na.MakeVehicleRoutingProblemLayer(inNetworkDataset, outNALayerName,
                                                         impedanceAttribute,
                                                         distanceAttribute, timeUntis,
                                                         distanceUntis, "", 1,
                                                         UTurn_policy = "NO_UTURNS",
                                                         output_path_shape = "STRAIGHT_LINES")
    
    #Get the layer object from the result object. The VRP layer can now be
    #referenced using the layer object.
    outNALayer = outNALayer.getOutput(0)
    
    #Get the names of all the sublayers within the VRP layer.
    subLayerNames = arcpy.na.GetNAClassNames(outNALayer)
    #Stores the layer names that we will use later
    ordersLayerName = subLayerNames["Orders"]
    depotsLayerName = subLayerNames["Depots"]
    routesLayerName = subLayerNames["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.
    candidateFields = arcpy.ListFields(inOrders)
    orderFieldMappings = arcpy.na.NAClassFieldMappings(outNALayer, ordersLayerName,
                                                       False, candidateFields)
    orderFieldMappings["TimeWindowStart1"].mappedFieldName = "TimeStart1"
    orderFieldMappings["TimeWindowEnd1"].mappedFieldName = "TimeEnd1"
    orderFieldMappings["DeliveryQuantities"].mappedFieldName = "Demand"
    orderFieldMappings["MaxViolationTime1"].defaultValue = 0
    arcpy.na.AddLocations(outNALayer, ordersLayerName, inOrders, orderFieldMappings,"")
    
    #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 5PM for TimeWindowEnd2 properties
    depotFieldMappings = arcpy.na.NAClassFieldMappings(outNALayer, depotsLayerName)
    depotFieldMappings["Name"].mappedFieldName = "Name"
    depotFieldMappings["TimeWindowStart1"].defaultValue = "8 AM"
    depotFieldMappings["TimeWindowEnd1"].defaultValue = "5 PM"
    arcpy.na.AddLocations(outNALayer, depotsLayerName, inDepots, depotFieldMappings, "")
    
    #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 same, we will just use the default field mappings
    arcpy.na.AddLocations(outNALayer, routesLayerName, inRoutes, "", "")
    
    #Solve the VRP layer
    arcpy.na.Solve(outNALayer)
    
    #Save the solved VRP layer as a layer file on disk with relative paths
    arcpy.management.SaveToLayerFile(outNALayer,outLayerFile,"RELATIVE")
    
    print "Script completed successfully"

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

环境

相关主题

许可信息

ArcGIS for Desktop Basic: 是
ArcGIS for Desktop Standard: 是
ArcGIS for Desktop Advanced: 是
5/10/2014