VehicleRoutingProblem

描述

此 ArcPy 类用于执行车辆配送问题分析。

讨论

车辆配送问题分析可用于计算车队的最佳路径。

了解有关车辆配送问题分析的详细信息

语法

VehicleRoutingProblem (in_network, {version})
参数说明数据类型
in_network

将用于网络分析的网络数据集或服务。可以使用网络数据集的目录路径、网络数据集图层对象、网络数据集图层的字符串名称或网络分析服务的门户 URL 来指定参数。网络必须包含至少一个出行模式

要使用门户 URL,您必须使用具有路径选择权限的帐户登录门户。

当对象使用 ArcGIS Online 作为 in_network 时,求解分析将消耗配额。有关详细信息,请参阅服务配额概述

String
version

分析中要使用的方案版本。应使用 VehicleRoutingProblemSchemaVersion 枚举指定此参数。

ArcGIS Pro 2.7 中引入了更新的 VehicleRoutingProblem 对象方案,可提供增强的可用性以及更紧密地匹配 ArcGIS Pro 2.6 中引入的车辆配送图层方案。

如果可能,建议所有新分析均使用方案版本 Two。但是,门户 URL 网络数据源目前不支持方案版本 Two。如果分析将使用门户 URL 作为网络数据源,或者脚本需要与 ArcGIS Pro 2.7 之前的软件版本兼容,请使用方案版本 One

默认值为方案版本 One

Object

属性

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

指定是否允许在结果对象上使用 saveAsLayerFile 方法将分析结果另存为图层文件。值为 True 表示可以保存图层文件。值为 False 表示无法保存图层文件。如果分析引用网络数据集,则默认设置为 True;如果其引用门户服务,则为 False。如果分析引用门户服务,则允许保存图层文件可能会降低分析速度。

Boolean
allowSaveRouteData
(可读写)

指定是否允许在结果对象上使用 saveRouteData 方法将分析结果保存为 ZIP 文件。值为 True 表示可以保存路径数据。值为 False 表示无法保存图层文件。如果分析引用网络数据集,则默认设置为 True;如果其引用门户服务,则为 False。如果分析引用门户服务,则允许保存路径数据可能会降低分析速度。

Boolean
defaultDate
(可读写)

指定一天中的时间(不包含日期)的时间字段值的默认日期。默认为 None,其表示所有日期时间字段都包含日期和时间值。

DateTime
directionsDistanceUnits
(可读写)

报告输出转弯方向的行驶距离时使用的单位。该属性将返回并被设置为 DistanceUnits 枚举的成员,且仅在 returnDirections 属性为 True 时可用。默认值是分析时使用的出行模式中距离属性的单位。

Object
directionsLanguage
(可读写)

将显示输出转弯方向文本的语言。返回该属性并将表示受支持方向语言的两个或五个字符的语言代码之一设置为字符串。可从 arcpy.nax.ListDirectionsLanguages 函数中获得可用的方向语言列表。默认值为 en(英语)或当前激活的语言包的语言。此属性仅在 returnDirections 属性为 True 时可用。

String
directionsStyle
(可读写)

用于输出转弯方向文本的样式。该属性将返回并被设置为 DirectionsStyle 枚举的成员,且仅在 returnDirections 属性为 True 时可用。

默认值为 Desktop

Object
distanceUnits
(可读写)

报告分析输出中的行驶距离时使用的单位。无论网络数据集中成本属性的单位如何,输出都将转换为此属性中设置的单位并以该单位进行报告。该属性将返回并被设置为 DistanceUnits 枚举的成员。默认设置为 DistanceUnits.Kilometers

Object
excessTransitFactor
(可读写)

对减少停靠点对的额外行驶时间的重要性作出评价。额外行驶时间是指超出停靠点对间直线行驶所需时间的数量。额外时间可能由司机休息或前往中间停靠点和站点造成。

该属性将返回并被设置为 Importance 枚举的成员。默认设置为 Importance.Medium

当设置为 Importance.Low 时,求解程序尝试找到最小化总体解决方案成本的结果(不考虑额外行驶时间)。此设置通常应用于快递服务。由于快递运输的是包裹而不是人员,因此无需担心行驶时间。使用此设置时,快递可以按照最适合的顺序为停靠点对提供服务,并且总体解决方案成本最低。

当设置为 Importance.Medium 时,求解程序在减少超出行驶时间和减少总体解决方案成本之间寻求一种平衡。

当设置为 Importance.High 时,求解程序尝试找到停靠点对之间额外行驶时间最少的解决方案(以增加总体行驶成本为代价)。如果您正在停靠点对间运载乘客并且想缩短他们的乘车时间,则这种情况适合使用此设置。这是出租车服务的特征。

Object
ignoreInvalidLocations
(可读写)

指定是否忽略无效的输入位置。值为 True 表示忽略无效的输入位置,仅使用有效位置即可成功进行分析。值为 False 表示不会忽略无效位置,从而导致分析失败。

Boolean
networkDataSource
(只读)

分析时使用的网络数据集的完整目录路径。

String
overrides
(可读写)

求解网络分析问题时,指定可影响求解程序行为的其他设置。

必须在 JavaScript 对象表示法 (JSON) 中指定此参数的值。例如,有效值的格式如下:{"overrideSetting1" : "value1", "overrideSetting2" : "value2"}。覆盖设置名称始终以双引号括起。该值可以是数字、布尔值或字符串。

此参数的默认值为无值,表示不覆盖任何求解程序设置。

覆盖是高级设置,应仅在谨慎分析应用设置前后得到的结果之后使用。要获得每个求解程序支持的覆盖设置及其可接受值的列表,请联系 Esri 技术支持。

String
returnDirections
(可读写)

指定是否将生成转弯方向。值为 True 表示在求解分析时将生成转弯方向。值为 False 表示不会生成转弯方向。生成方向可能会降低分析速度。默认值为 False

Boolean
returnStopShapes
(可读写)

当设置为 True 时,求解程序将为输出停靠点生成点状。当设置为 False 时,输出停靠点将以表格格式返回。默认设置为 False

当分析使用 VehicleRoutingProblemSchemaVersion.Two 方案版本时,该参数不适用并将忽略该参数。

Boolean
routeShapeType
(可读写)

要生成的表示输出路径的形状类型。路径始终沿网络计算;但是,您可以选择使用不反映网络路径的形状来表示它们。该属性将返回并被设置为 RouteShapeType 枚举的成员。默认设置为 RouteShapeType.TrueShapeWithMeasures

Object
searchQuery
(可读写)

当在网络中定位输入时,指定查询以将搜索范围限制在源要素类的要素子集内。这在不想查找可能不适合网络位置的要素时很有用。例如,如果正在加载面的质心,但不想定位在地方道路上,则可定义一个仅搜索主要道路的查询。

了解有关在网络中定位输入的详细信息

该参数值被指定为具有嵌套列表的列表。嵌套列表由两个值组成,分别表示所有网络源的名称和 SQL 表达式。对于不同的网络源要素类类型,SQL 表达式的语法略有不同。例如,如果要查询存储在文件或企业级地理数据库中的源要素类、shapefile 或 SDC,需将字段名用双引号括起:"CFCC"。如果要查询存储在个人地理数据库中的源要素类,需将字段用方括号括起:[CFCC]

如果您不想指定特定源的查询,请使用 "#" 作为 SQL 表达式的值,或者将源名称和 SQL 表达式从参数值中排除。如果您不想指定所有网络源的查询,请使用 "#" 作为参数值。

例如,参数值 [["Streets","\"CFCC\" = 'A15'"], ["Streets_ND_Junctions",""]] 指定了 Streets 源要素类的 SQL 表达式,而没有指定 Streets_ND_Junctions 源要素类的表达式。注意:用于括字段名 CFCC 的双引号通过反斜杠字符进行转义,以避免 Python 解释程序出现分析错误。

默认情况下不使用查询。

List
searchTolerance
(可读写)

在网络上定位输入要素所需的最大搜索距离。返回该属性并将其设置为双精度,然后通过 searchToleranceUnits 属性访问该值的单位。默认值为 5000。

了解有关在网络中定位输入的详细信息

Double
searchToleranceUnits
(可读写)

searchTolerance 属性的单位。该属性将返回并被设置为 DistanceUnits 枚举的成员。默认设置为 DistanceUnits.Meters

Object
spatiallyClusterRoutes
(可读写)

当设置为 True 时,分配给路径的停靠点将在空间上聚类。对停靠点进行聚类往往在较小区域保持路径,并减小路径线彼此相交的频率;然而,聚类可能会增加总行程时间。当设置为 False 时,求解器不会对空间聚类停靠点进行优先排序,并且路径可能会相交。如果指定了路径区,请使用此选项。

默认设置为 True

Boolean
timeUnits
(可读写)

报告分析输出中的行驶时间时使用的单位。无论网络数据集中成本属性的单位如何,输出都将转换为使用在此属性中设置的单位并以该单位进行报告。该属性将返回并被设置为 TimeUnits 枚举的成员。默认设置为 TimeUnits.Minutes

Object
timeWindowFactor
(可读写)

对支持时间窗的重要性作出评价。

该属性将返回并被设置为 Importance 枚举的成员。默认设置为 Importance.Medium

当设置为 Importance.Low 时,求解程序将提高减少驾驶时间的重要性,降低按时到达停靠点的重要性。如果积压的服务请求逐渐增多,则可以使用此设置。如果为了在当日内为更多的停靠点提供服务并减少积压的订单数,则可选择此设置,即使迟到可能会为客户带来不便。

当设置为 Importance.Medium 时,求解程序将平衡减少驾驶时间的重要性与在时间窗内到达的重要性。

当设置为 Importance.High 时,求解程序将提高按时到达停靠点的重要性,降低减少驾驶时间的重要性。进行时间紧迫的配送或非常注重客户服务的组织将选择此设置。

Object
timeZoneForTimeFields
(可读写)

指示输入数据中的时间字段是否解释为输入位置的本地时间或协调世界时间 (UTC)。该属性将返回并被设置为 TimeZoneUsage 枚举的成员。默认设置为 TimeZoneUsage.LocalTimeAtLocations

Object
travelMode
(可读写)

要用于分析的出行模式。

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

返回值并将其设置为 arcpy.nax.TravelMode 对象,但也可以使用出行模式的字符串名称或包含出行模式的有效 JSON 表示的字符串进行设置。默认为用于分析的网络数据集上定义的默认出行程模式。

了解有关出行模式的详细信息

Object

方法概述

方法说明
addFields (input_type, field_description)

将自定义字段添加到指定的输入类。

count (input_type)

返回为输入类型添加的行数。

fieldMappings (input_type, {use_location_fields}, {list_candidate_fields})

生成将输入类型名称字段映射到 arcpy.nax.NAClassFieldMap 对象的字典,以允许您将字段从输入数据映射到求解程序属性。字典可以用作 load 方法 field_mappings 参数的输入。

fieldNames (input_type, {use_location_fields})

获取指定输入类型支持的字段名称列表。

insertCursor (input_type, field_names)

在指定的输入类型上建立写入光标。此游标可用于将行直接添加到输入。

load (input_type, features, {field_mappings}, {append}, {max_features})

设置用于分析的输入要素。

solve ()

使用在 VehicleRoutingProblem 对象上设置的属性和已加载的输入执行车辆配送问题分析。

方法

addFields (input_type, field_description)
参数说明数据类型
input_type

应添加字段的输入的类型。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本时,应使用 VehicleRoutingProblemInputDataType 枚举设置此参数;在使用 VehicleRoutingProblemSchemaVersion.Two 方案版本时,应使用 VehicleRoutingProblemInputDataType2 枚举设置此参数。

Object
field_description
[field_description,...]

将添加到输入类的字段及其属性。该值应构造为列表的列表,其中每行包含以下各项:

  • 字段名称 - 将添加到输入类的字段的名称。
  • 字段类型 - 新字段的类型。
  • 字段别名 - 指定给字段名称的备用显示名称。
  • 字段长度 - 要添加的字段的长度。它为字段的每条记录设置最大允许字符数。此选项仅适用于文本类型的字段;默认长度为 255。
  • 默认值 - 字段的默认值。
  • 字段域 - 将分配到字段的地理数据库域。

可用字段类型如下:

  • TEXT - 任何字符串。
  • FLOAT - 在 -3.4E38 和 1.2E38 之间的小数。
  • DOUBLE介于 -2.2E308 和 1.8E308 之间的小数。
  • SHORT - 在 -32,768 和 32,767 之间的整数。
  • LONG - 在 -2,147,483,648 和 2,147,483,647 之间的整数。
  • DATE - 日期或时间。

如果字段已经存在于表中或任何字段属性无效,则该方法将返回错误。

List
count (input_type)
参数说明数据类型
input_type

用于计数的输入要素类型。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本时,应使用 VehicleRoutingProblemInputDataType 枚举设置此参数;在使用 VehicleRoutingProblemSchemaVersion.Two 方案版本时,应使用 VehicleRoutingProblemInputDataType2 枚举设置此参数。

Object
返回值
数据类型说明
Integer

行数。

fieldMappings (input_type, {use_location_fields}, {list_candidate_fields})
参数说明数据类型
input_type

返回其字段映射的输入类型。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本时,应使用 VehicleRoutingProblemInputDataType 枚举设置此参数;在使用 VehicleRoutingProblemSchemaVersion.Two 方案版本时,应使用 VehicleRoutingProblemInputDataType2 枚举设置此参数。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本VehicleRoutingProblemSchemaVersion.Two 方案版本时,请参阅适用于每种输入类型的字段的描述。

Object
use_location_fields

指示网络位置字段是否应包含在返回的字段映射字典中。网络位置字段可描述网络中对象所在的点。您可以使用网络位置字段更精确地控制分析输入在网络上的定位方式,并且由于求解程序不必从输入的几何计算位置字段,因此在调用 solve 方法时可以节省时间。您可以使用计算位置工具计算要素类的位置字段。

了解有关网络位置字段以及如何在网络中定位输入的详细信息

当此参数设置为 True 时,返回的字段映射字典将包含网络位置字段。默认为 False;字段映射字典不包括网络位置字段。

(默认值为 False)

Boolean
list_candidate_fields
[list_candidate_fields,...]

用于生成映射字段名称的 arcpy.Field 对象列表,可以使用 arcpy.ListFields 函数通过给定的要素类或表获取。尚未与输入类型字段匹配的字段名称也将在映射中返回。使用额外字段调用 load 方法可以将其添加到求解程序的输入要素中,这样字段可以直通至输出并包含在其中。如果未指定此参数,则仅使用适当属性的默认值创建字段映射。

(默认值为 None)

Field
返回值
数据类型说明
Dictionary

如果字典中的键为字段名称和值,则其为 arcpy.nax.NAClassFieldMap 对象。

fieldNames (input_type, {use_location_fields})
参数说明数据类型
input_type

返回其支持的字段名称的输入类型。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本时,应使用 VehicleRoutingProblemInputDataType 枚举设置此参数;在使用 VehicleRoutingProblemSchemaVersion.Two 方案版本时,应使用 VehicleRoutingProblemInputDataType2 枚举设置此参数。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本VehicleRoutingProblemSchemaVersion.Two 方案版本时,请参阅适用于每种输入类型的字段的描述。

Object
use_location_fields

指示网络位置字段是否包含在返回的字段名称列表中。网络位置字段可描述网络中对象所在的点。您可以使用网络位置字段更精确地控制分析输入在网络上的定位方式,并且由于求解程序不必从输入的几何计算位置字段,因此在调用 solve 方法时可以节省时间。您可以使用计算位置工具计算要素类的位置字段。

了解有关网络位置字段以及如何在网络中定位输入的详细信息

当此参数设置为 True 时,返回的字段名称列表将包含网络位置字段。默认为 False;字段名称列表不包括网络位置字段。

(默认值为 False)

Boolean
返回值
数据类型说明
String

指定输入类型支持的字段名称列表。

insertCursor (input_type, field_names)
参数说明数据类型
input_type

游标可用于插入行的输入类型。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本时,应使用 VehicleRoutingProblemInputDataType 枚举设置此参数;在使用 VehicleRoutingProblemSchemaVersion.Two 方案版本时,应使用 VehicleRoutingProblemInputDataType2 枚举设置此参数。

Object
field_names
[field_names,...]

当使用游标插入行时要设置其值的输入类型的字段名称列表。您可以使用 fieldNames 方法获取输入类型支持的字段名称。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本VehicleRoutingProblemSchemaVersion.Two 方案版本时,请参阅适用于每种输入类型的字段的描述。

除常规字段外,还可以使用以下几何令牌之一设置输入的几何:

  • SHAPE@XYA tuple of the feature's centroid x,y coordinates.
  • SHAPE@XYZ
  • SHAPE@JSON The esri JSON string representing the geometry.
  • SHAPE@WKBThe well-known binary (WKB) representation for OGC geometry. It provides a portable representation of a geometry value as a contiguous stream of bytes.
  • SHAPE@WKTThe well-known text (WKT) representation for OGC geometry. It provides a portable representation of a geometry value as a text string.
  • SHAPE@A geometry object for the feature.

基于点的输入类型仅支持 SHAPE@XYSHAPE@XYZ 令牌。在使用 SHAPE@XYSHAPE@XYZ 令牌时,应在分析中所使用的网络数据源的空间参考中指定 x、y 和 z 值。

String
返回值
数据类型说明
Object

可用于写入要素的 SolverInsertCursor 对象。

load (input_type, features, {field_mappings}, {append}, {max_features})
参数说明数据类型
input_type

要加载的输入要素类型。

在使用 VehicleRoutingProblemSchemaVersion.One 方案版本时,应使用 VehicleRoutingProblemInputDataType 枚举设置此参数;在使用 VehicleRoutingProblemSchemaVersion.Two 方案版本时,应使用 VehicleRoutingProblemInputDataType2 枚举设置此参数。

Object
features

要加载的输入要素。此参数接受以下输入类型:

对于图层输入,仅加载所选要素。如果图层具有定义查询,则将仅加载定义查询可见的要素子集。该方法同样支持范围地理处理环境;仅加载指定范围内的要素。

String
field_mappings

将输入类型名称字段映射到 arcpy.nax.NAClassFieldMap 对象的字典,用于表示输入要素字段的映射。可以使用 fieldMappings 方法构造此参数的有效输入。

如果未指定字段映射,则将映射输入要素中与输入类型所支持的字段名称相同的所有字段。

(默认值为 None)

Dictionary
append

指示是否应将正在加载的要素附加到输入类型的现有要素集。True 值表示应附加新要素;并保留现有要素。如果要从多个要素类或表中加载输入以用于单个分析,此功能将非常有用。这是默认设置。False 值表示应删除输入类型的所有现有要素,并替换为当前正在加载的要素。

(默认值为 True)

Boolean
max_features

可以加载到输入类型的最大要素数。如果要创建工具或服务,并且希望在输入大小超出可用资源时返回错误,此功能将非常有用。如果输入要素超出 max_features 限制,则 load 方法将返回 arcpy.nax.LimitError

如果未指定值,则不会对输入要素的计数强制执行限制。

(默认值为 None)

Integer
solve ()
返回值
数据类型说明
Object

arcpy.nax.VehicleRoutingProblemResult 对象可用于访问输出和求解程序消息。

代码示例

VehicleRoutingProblem 示例 1

执行车辆配送问题分析。

# An example showing how to perform vehicle routing problem analysis using inputs from feature classes and tables.
import arcpy
arcpy.CheckOutExtension("network")

nds = "C:/data/NorthAmerica.gdb/Routing/Routing_ND"
nd_layer_name = "Routing_ND"
input_orders = "C:/data/io.gdb/Orders"
input_depots = "C:/data/io.gdb/Depots"
input_routes = "C:/data/io.gdb/Vehicles"
output_stops = "C:/data/io.gdb/AssignedStops"
output_routes = "C:/data/io.gdb/Routes"
output_directions = "C:/data/io.gdb/Directions"
unassigned_stops = "C:/data/io.gdb/UnassignedStops"

# Create a network dataset layer and get the desired travel mode for analysis
arcpy.nax.MakeNetworkDatasetLayer(nds, nd_layer_name)
nd_travel_modes = arcpy.nax.GetTravelModes(nd_layer_name)
travel_mode = nd_travel_modes["Driving Time"]

# Instantiate a VehicleRoutingProblem solver object
vrp = arcpy.nax.VehicleRoutingProblem(nds)
# Set properties
vrp.travelMode = travel_mode
vrp.distanceUnits = arcpy.nax.DistanceUnits.Miles
vrp.routeShapeType = arcpy.nax.RouteShapeType.TrueShape
vrp.returnDirections = True
vrp.returnStopShapes = True
# Load inputs
vrp.load(arcpy.nax.VehicleRoutingProblemInputDataType.Orders, input_orders)
vrp.load(arcpy.nax.VehicleRoutingProblemInputDataType.Depots, input_depots)
vrp.load(arcpy.nax.VehicleRoutingProblemInputDataType.Routes, input_routes)
# Solve the analysis
result = vrp.solve()

# Export the results to feature classes
if result.solveSucceeded:
    result.export(arcpy.nax.VehicleRoutingProblemOutputDataType.Stops, output_stops)
    result.export(arcpy.nax.VehicleRoutingProblemOutputDataType.Routes, output_routes)
    result.export(arcpy.nax.VehicleRoutingProblemOutputDataType.Directions, output_directions)
    if result.isPartialSolution:
        print("Some of the orders were not assigned.")
        result.export(arcpy.nax.VehicleRoutingProblemOutputDataType.UnassignedStops, unassigned_stops)
else:
    print("Solved failed")
    print(result.solverMessages(arcpy.nax.MessageSeverity.All))
VehicleRoutingProblem 示例 2

可以使用 VehicleRoutingProblemSchemaVersion.Two 方案版本执行车辆配送问题分析。

# An example showing how to perform vehicle routing problem analysis using inputs from feature classes and tables.
import arcpy
arcpy.CheckOutExtension("network")

nds = "C:/data/NorthAmerica.gdb/Routing/Routing_ND"
nd_layer_name = "Routing_ND"
input_orders = "C:/data/io.gdb/Orders"
input_depots = "C:/data/io.gdb/Depots"
input_routes = "C:/data/io.gdb/Vehicles"
output_orders = "C:/data/io.gdb/VisitedOrders"
output_routes = "C:/data/io.gdb/Routes"
output_depots_visits = "C:/data/io.gdb/DepotVisits"

# Create a network dataset layer and get the desired travel mode for analysis
arcpy.nax.MakeNetworkDatasetLayer(nds, nd_layer_name)
nd_travel_modes = arcpy.nax.GetTravelModes(nd_layer_name)
travel_mode = nd_travel_modes["Driving Time"]

# Instantiate a VehicleRoutingProblem solver object using schema version Two
vrp = arcpy.nax.VehicleRoutingProblem(nds, arcpy.nax.VehicleRoutingProblemSchemaVersion.Two)
# Set properties
vrp.travelMode = travel_mode
vrp.distanceUnits = arcpy.nax.DistanceUnits.Miles
vrp.routeShapeType = arcpy.nax.RouteShapeType.TrueShape
vrp.returnDirections = True
# Load inputs
vrp.load(arcpy.nax.VehicleRoutingProblemInputDataType2.Orders, input_orders)
vrp.load(arcpy.nax.VehicleRoutingProblemInputDataType2.Depots, input_depots)
vrp.load(arcpy.nax.VehicleRoutingProblemInputDataType2.Routes, input_routes)
# Solve the analysis
result = vrp.solve()

# Export the results to feature classes
if result.solveSucceeded:
    result.export(arcpy.nax.VehicleRoutingProblemOutputDataType2.Orders, output_orders)
    result.export(arcpy.nax.VehicleRoutingProblemOutputDataType2.Routes, output_routes)
    result.export(arcpy.nax.VehicleRoutingProblemOutputDataType2.DepotVisits, output_depots_visits)
else:
    print("Solve failed")
    print(result.solverMessages(arcpy.nax.MessageSeverity.All))