求解车辆配送 (VRP) 的输出

求解车辆配送 (VRP) 地理处理工具生成以下表和要素类作为输出:停靠点、未分配停靠点、路径和方向。下面各小节描述了输出表和要素类及其对应字段属性。

Routes 要素类

路径线要素类表示车辆配送中的司机、车辆及车辆路径。此输出要素类的默认名称为 Routes,但是可以在求解之前通过更改输出路径名称参数(Python 中的 output_routes_name)更改其名称。

ArcGIS 分配的坐标系与基础网络数据集用于 Routes 要素类的坐标系相同。这可以通过为输出坐标系地理处理环境指定一个数值来控制。

下面列出并描述了 Routes 要素类的字段名称。

字段名称说明

ObjectID

系统管理的 ID 字段。

Name

路径的名称。

Shape

指示路径形状的几何字段。

使用填充路径线参数(Python 中的 populate_route_lines)可选择是否填充此字段。

执行求解车辆配送 (VRP) 期间,总是用数据创建和填充 Routes 要素类。不过,填充路径线参数(Python 中的 populate_route_lines)允许您选择是否为线要素生成和保存 Shape 字段值。不填充 Shape 字段值能够更快进行求解运算并减小服务器与客户端之间的数据交换量;但是人们通常想在地图上显示路径,因此可能需要填充 Shape 字段。

ViolatedConstraints

该字段包含约束冲突的汇总,并在求解操作之后进行设置。如果因某条路径而导致与约束发生冲突,则可将下列一个冲突或多个冲突的组合分配给该字段。

抢先版本:

表示文本描述的编码值以加括号的形式显示在以下列表中。 请注意,编码值是通过将最后一个值增加一倍来增加的几何序列的一部分。 可以对要编码的冲突进行各种组合。 例如,将“超出容量 (2)”和“硬性路径区 (128)”的组合编码为 130 (2 +128)。

  • 超出 MaxOrderCount (1) - 预分配的停靠点无法分配给路径,因为分配停靠点会超出路径的 MaxOrderCount 字段值所指定的可分配给路径的最大停靠点数。
  • 超出 Capacities (2) - 预分配的停靠点无法分配给路径,因为分配停靠点会超出路径的 Capacities 字段值指定的总路径容量。
  • 超出 MaxTotalTime (4) - 从起始站点到终止站点的行驶时间加上在两个站点的服务和等待时间以及任何休息时间,这几个时间的总和超出了路径的 MaxTotalTime 字段值指定的路径总时间。
  • 超出 MaxTotalTravelTime (8) - 从起始站点到终止站点的行驶时间超出了路径的 MaxTotalTravelTime 字段值指定的路径总行驶时间。
  • 超出 MaxTotalDistance (16) - 从起始站点到终止站点的行驶距离超出了路径的 MaxTotalDistance 字段值指定的路径总行驶距离。
  • 硬性时间窗 (32) - 在与路径关联的起始站点、终止站点或休息点上存在硬性时间窗冲突。
  • 不匹配的特殊要求 (64) - 在目标路径上未找到停靠点所需的特殊要求。
  • 硬性路径区 (128) - 预分配给路径的停靠点未落在硬性路径区内。
  • 超出停靠点对 MaxTransitTime (256) - 存在预分配给路径的停靠点对,而分配该停靠点对中的停靠点会超出停靠点对的 MaxTransitTime 字段值所指定的停靠点对的最长行驶时间。
  • 停靠点对冲突 (512) - 停靠点属于某个停靠点对,但无法分配给预分配的路径。
  • 不能到达 (1024) - 预分配的停靠点位于路径无法到达的网络元素上。
  • 无法插入所需的休息点 (2048) - 在存在预分配的停靠点时,路径的休息点的 sequence 值为空,且在未引入其他冲突的情况下,该休息点不能插入到任何位置。
  • 无法插入所需更新 (4096) - 路径超出其容量并且需要访问货物补给点;然而,在存在预分配的停靠点时,关联的货物补给点的 sequence 值为空,且在未引入其他冲突的情况下,关联的货物补给点不能插入到任何位置。
  • 超出 MaxTravelTimeBetweenBreaks (8192) - 求解程序不能在休息点的 MaxTravelTimeBetweenBreaks 字段所指定的时间内插入休息点。这通常是因为预先为休息点分配了一个顺序,而使得无法在最长行驶时间内到达休息点。

  • 超出休息点 MaxCumulWorkTime (16384) - 求解程序不能在休息点的 MaxCumulWorkTime 字段所指定的时间内插入休息点。这通常是因为预先为休息点分配了一个顺序,而使得无法在最长工作时间内到达休息点。
  • InboundArriveTime 或 OutboundDepartTime 停靠点冲突 (32768) - 无法在入站到达时间或出站离开时间约束内为该停靠点提供服务。当所有路径的 LatestStartTime 字段值早于 InboundArriveTime 值,或所有路径都无法在停靠点的 OutboundDepartTime 值之前到达站点时,便会发生这种冲突。
  • 无法固定第一个/最后一个停靠点 (65536) - 停靠点具有固定第一个或固定最后一个分配规则,但求解程序无法遵循此约束。当固定第一个停靠点数或固定最后一个停靠点数超过可用路径数时便会发生这种冲突。

OrderCount

分配给路径的停靠点数。

TotalCost

路径的总体运营成本,是以下字段值的总和:

  • FixedCost
  • RegularTimeCost
  • OvertimeCost
  • DistanceCost

RegularTimeCost

除任何不需支付酬金的休息时间外的规定工作时间的成本。

OvertimeCost

除任何不需支付酬金的休息时间外的加班时间的成本。

DistanceCost

通过将 TotalDistanceCostPerUnitDistance 字段值相乘得出的距离成本部分。如果求解之前未指定距离属性,那么此字段值将设置为零。

TotalTime

路径总持续时间。该持续时间包括行驶时间以及在停靠点、站点和休息点的服务和等待时间。TotalTime 值等于以下字段值的总和:

  • StartDepotServiceTime
  • EndDepotServiceTime
  • TotalOrderServiceTime
  • TotalBreakServiceTime
  • TotalRenewalServiceTime
  • TotalWaitTime
  • TotalTravelTime

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

TotalOrderServiceTime

在路径上的所有停靠点处所用的总服务时间。

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

TotalBreakServiceTime

在路径上的所有休息点处所用的总服务时间。

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

TotalTravelTime

路径的总行驶时间。

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

TotalDistance

路径的总行驶距离。

该字段值的单位由距离字段单位参数(Python 的 distance_units)指定。

如果求解之前未指定距离属性,那么此字段值将设置为零。

StartTime

路径的开始时间。路径可能会在起始站点的时间窗打开之前开始,在这种情况下,起始站点处存在一个等待时间。

使用跨越多个时区的流量数据时,该时刻的时区将采用起始站点所处网络元素所在的时区。

EndTime

路径的结束时间。路径在终止站点处完成服务后结束。

使用跨越多个时区的流量数据时,该时刻的时区将采用终止站点所处网络元素所在的时区。

TotalWaitTime

在路径上的所有停靠点、站点和休息点处的总等待时间。

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

TotalViolationTime

在路径上的所有停靠点和休息点处的总冲突时间。

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

RenewalCount

对于具有货物补给点的路径,该字段相当于车辆为了进行货物补给(即车辆装卸)而在站点停靠的次数。

TotalRenewalServiceTime

对于具有货物补给点的路径,该字段表示在路径上所有货物补给点所用的总服务时间。

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

Directions 要素类

Directions 是一个表示转弯说明的线要素类,帮助司机按照指定的路径驾驶车辆。此输出要素类的默认名称为 Directions,但是可以在求解之前通过更改输出方向名称参数(Python 中的 output_directions_name)更改其名称。而且,求解车辆配送 (VRP) 工具总是创建 Directions 要素类;不过,您可以使用填充方向参数(Python 中的 populate_directions)选择是否在求解期间使用要素填充要素类。默认情况下不填充。如果您不需要方向,则可以大幅减少求解时间及服务器与客户端之间传输的数据量。

ArcGIS 分配的坐标系与基础网络数据集用于 Directions 要素类的坐标系相同。这可以通过为输出坐标系地理处理环境指定一个数值来控制。

下面列出并描述了 Directions 要素类的字段名称。

字段名称说明

ObjectID

系统管理的 ID 字段。

Shape

指示线形状的几何字段。

RouteName

驾驶操作所应用到的路径的名称。

ArriveTime

每天启动给定驾驶操作的时间。如果路径跨越多天,将显示日期和时间。

Type

此字段适用于想要自定义行驶方向文本的高级用户。 大多数用户可通过忽略此字段并参考 Text 字段来满足其要求。

Type 引用下列两个枚举中的一个常量:esriDirectionsManueverTypeesriDirectionsStringType。(有关 Type 值所引用的枚举,请参阅 SubItemType 字段描述。)

SubItemType

此字段适用于想要自定义行驶方向文本的高级用户。 大多数用户可通过忽略此字段并参考 Text 字段来满足其要求。

SubItemTypeType 配合使用以创建 Text 字段中显示的行驶方向。SubItemType 字段可指定 Type 字段是引用 esriDirectionsManueverType 枚举中的常量值还是引用 esriDirectionsStringType 枚举中的常量值。

  • 如果 SubItemType 值为 1,则 Type 值将引用 esriDirectionsManeuverType
  • 如果 SubItemType 值为 2,则 Type 值将引用 esriDirectionsStringType

Text

行驶方向的文本描述。

ElapsedTime

当前行驶方向开始到下一行驶方向开始之时,或到上一行驶方向的路径结束之时所经历的时间。

某些行驶方向还额外记录了服务时间、冲突时间等等。在这种情况下,每条记录的经历时间是重复的。要对总经历时间求和,请选择 Type 值为 1 的记录,然后对这些记录求和。

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

DriveDistance

当前行驶方向开始到下一行驶方向开始,或到上一行驶方向的路径结束之时所行驶的距离。

如果行驶方向与下一次行驶方向开始的位置相同,则此值为零。

停靠点表

Stops 表提供了有关在站点、停靠点及休息点停靠的信息。这些信息包括哪些路径包含停靠,到达和离开时间以及停靠顺序。

此输出表的默认名称为 Stops,但是可以在求解之前通过更改输出停靠点名称参数(Python 中的 output_stops_name)更改其名称。

下面列出并描述了 Stops 表中的字段名。

字段名称说明

ObjectID

系统管理的 ID 字段。

Name

停靠点的名称。这是输入要素集和记录集中站点、停靠点或休息点的名称的外键。输入要素或记录集由 StopType 字段指定。

PickupQuantities

从停靠点接收的货物量或人员数量。如果停靠点接收多个维度,请用空格分隔每个数量。

此字段的单位不作保存。应当根据输入输入路径的 Quantities 字段及输入停靠点的 PickupQuantitiesDeliveryQuantities 字段的方式来解释这些单位。(所有这些字段都应当使用相同的维度单位和数量进行输入。)

DeliveryQuantities

停靠点接收的货物量或人员数量。如果停靠点接收多个维度,请用空格分隔每个数量。

此字段的单位不作保存。应当根据输入输入路径的 Quantities 字段及输入停靠点的 PickupQuantitiesDeliveryQuantities 字段的方式来解释这些单位。(所有这些字段都应当使用相同的维度单位和数量进行输入。)

StopType

指示停靠点表示站点、停靠点或休息点。

此字段保存可用如下方式解释的编码值:

  • 停靠点 (0)
  • 站点 (1)
  • 休息点 (2)

RouteName

包含停靠的路径的名称。

Sequence

指定路径访问停靠点的相对顺序。

RouteNameSequence 字段排序可创建每个路径的有序停靠点列表。

FromPreviousTravelTime

从路径的上一个停靠点到当前停靠点所经历的行程时间。

该字段值的单位由时间字段单位参数(Python 中的 time_units)指定。

FromPreviousDistance

沿着路径从上一个停靠点到当前停靠点的距离。

该字段值的单位由距离字段单位参数(Python 的 distance_units)指定。

ArriveCurbApproach

指示车辆到达停靠点时路边通道位于车辆哪一侧。

DepartCurbApproach

指示车辆离开停靠点时路边通道位于车辆哪一侧。

ArriveTime

路径每天到达停靠点的时间。

使用时区配置网络数据集时,时间值对应于停靠点所在的时区;否则,其将与求解分析的电脑上配置的时区对应。

DepartTime

路径每天离开停靠点的时间。

使用时区配置网络数据集时,时间值对应于停靠点所在的时区;否则,其将与求解分析的电脑上配置的时区对应。

ArriveTimeUTC

路径每天到达停靠点的时间。时间值以协调世界时间 (UTC) 形式给出。

如果未在网络数据集中配置时区,此字段为空。

DepartTimeUTC

路径每天离开停靠点的时间。时间值以协调世界时间 (UTC) 形式给出。

如果未在网络数据集中配置时区,此字段为空。

WaitTime

在停靠点的等待时间或短暂停留时间。例如,如果路径必须在停靠点等待时间窗打开,将会产生一个等待时间。

ViolationTime

从停靠点的时间窗结束到路径车辆到达所经历的时间间隔。

显示停靠点

“停靠点”表不是要素类,这就是说无法通过在地图中添加此表来查看停靠点的位置。相反,需要采取额外的步骤才能在地图上显示停靠点。(下面提供了相关操作指导。) 如果需要在地图上显示路径的停靠点,这种设计似乎并不必要而且困难;但是,请记住此工具的用途是创建 VRP web 服务。同样地,输出的设计也尽可能简洁,从而最大程度减少服务器处理和数据传输。尽管如此,输出不会太简洁;输出仍然提供了将停靠点显示为点要素所需的基本信息。

例如,要查看停靠点发生停靠的位置,将“停靠点”表与原始“停靠点”要素集(用作输入)链接。您可以通过“停靠点”表的 StopTypeName 字段及“停靠点”要素集的 Name 字段来选择和合并这些数据集。您可以使用类似方法查看在站点发生停靠的位置。

提示:

求解车辆配送 (VRP) 创建多个输入要素集,包括停靠点要素集和站点要素集。随着工具的求解,这些内存中的要素集将从 ArcMap 移除。不过,您也可以将它们添加回来。为此,请执行以下步骤:

  1. 地理处理菜单打开结果窗口。
  2. 结果窗口中,转至您想要查看的要素集操作的结果。
  3. 展开合适的求解车辆配送 (VRP) 结果。
  4. 展开输入
  5. 右键单击您想要查看的要素集,然后选择添加至显示。要素集将显示在地图及内容列表中。
  6. 或者,单击内容列表窗口上的按源列出按钮,查看数据的存储位置。

与停靠点和站点不同,休息点并不与输入要素集关联。您需要使用不同方法来显示它们。可以在分析中生成方向,选择表示要素的线,然后使用要素折点转点工具将其转换成点。

UnassignedStops 表

UnassignedStops 表列出了任何路径都无法访问的停靠点。此表还说明了停靠点无法访问的原因,以便修复这一问题。

此输出表的默认名称为 Stops,但是可以在求解之前通过更改输出未分配的停靠点名称参数 (output_unassigned_stops_name) 更改其名称。

下面列出并描述了 Stops 表中的字段名。

字段名称说明

ObjectID

系统管理的 ID 字段。

StopType

指示停靠点表示站点、停靠点或休息点。此字段保存可用如下方式解释的编码值:

  • 停靠点 (0)
  • 站点 (1)
  • 休息点 (2)

Name

停靠点的名称。

这是输入要素集和记录集中站点、停靠点或休息点的名称的外键。输入要素或记录集由 StopType 字段指定。

ViolatedConstraints

该字段包含约束冲突的汇总,并在求解操作之后进行设置。如果某个约束存在冲突,则可将下列一个或多个冲突的组合分配给该字段。

抢先版本:

表示文本描述的编码值以加括号的形式显示在以下列表中。 请注意,编码值是通过将最后一个值增加一倍来增加的几何序列的一部分。 可以对要编码的冲突进行各种组合。 例如,将“超出容量 (2)”和“硬性路径区 (128)”的组合编码为 130 (2 +128)。

  • 超出 MaxOrderCount (1) - 预分配的停靠点无法分配给路径,因为分配停靠点会超出路径的 MaxOrderCount 字段值所指定的可分配给路径的最大停靠点数。
  • 超出 Capacities (2) - 预分配的停靠点无法分配给路径,因为分配停靠点会超出路径的 Capacities 字段值指定的总路径容量。
  • 超出 MaxTotalTime (4) - 从起始站点到终止站点的行驶时间加上在两个站点的服务和等待时间以及任何休息时间,这几个时间的总和超出了路径的 MaxTotalTime 字段值指定的路径总时间。
  • 超出 MaxTotalTravelTime (8) - 从起始站点到终止站点的行驶时间超出了路径的 MaxTotalTravelTime 字段值指定的路径总行驶时间。
  • 超出 MaxTotalDistance (16) - 从起始站点到终止站点的行驶距离超出了路径的 MaxTotalDistance 字段值指定的路径总行驶距离。
  • 硬性时间窗 (32) - 在与路径关联的起始站点、终止站点或休息点上存在硬性时间窗冲突。
  • 不匹配的特殊要求 (64) - 在目标路径上未找到停靠点所需的特殊要求。
  • 硬性路径区 (128) - 预分配给路径的停靠点未落在硬性路径区内。
  • 超出停靠点对 MaxTransitTime (256) - 存在预分配给路径的停靠点对,而分配该停靠点对中的停靠点会超出停靠点对的 MaxTransitTime 字段值所指定的停靠点对的最长行驶时间。
  • 停靠点对冲突 (512) - 停靠点属于某个停靠点对,但无法分配给预分配的路径。
  • 不能到达 (1024) - 预分配的停靠点位于路径无法到达的网络元素上。
  • 无法插入所需的休息点 (2048) - 在存在预分配的停靠点时,路径的休息点的 sequence 值为空,且在未引入其他冲突的情况下,该休息点不能插入到任何位置。
  • 无法插入所需更新 (4096) - 路径超出其容量并且需要访问货物补给点;然而,在存在预分配的停靠点时,关联的货物补给点的 sequence 值为空,且在未引入其他冲突的情况下,关联的货物补给点不能插入到任何位置。
  • 超出 MaxTravelTimeBetweenBreaks (8192) - 求解程序不能在休息点的 MaxTravelTimeBetweenBreaks 字段所指定的时间内插入休息点。这通常是因为预先为休息点分配了一个顺序,而使得无法在最长行驶时间内到达休息点。

  • 超出休息点 MaxCumulWorkTime (16384) - 求解程序不能在休息点的 MaxCumulWorkTime 字段所指定的时间内插入休息点。这通常是因为预先为休息点分配了一个顺序,而使得无法在最长工作时间内到达休息点。
  • InboundArriveTime 或 OutboundDepartTime 停靠点冲突 (32768) - 无法在入站到达时间或出站离开时间约束内为该停靠点提供服务。当所有路径的 LatestStartTime 字段值早于 InboundArriveTime 值,或所有路径都无法在停靠点的 OutboundDepartTime 值之前到达站点时,便会发生这种冲突。
  • 无法固定第一个/最后一个停靠点 (65536) - 停靠点具有固定第一个或固定最后一个分配规则,但求解程序无法遵循此约束。当固定第一个停靠点数或固定最后一个停靠点数超过可用路径数时便会发生这种冲突。

Status

该字段受到下面列出值的属性域的约束(括号中是它们的编码值)。

  • OK (0) - 成功对网络位置进行了评估。
  • Not located (1) - 该点未在网络上成功定位。
  • Network element not located (2) - 无法找到由该点网络位置字段识别的网络元素。 如果删除了该点应处于的网络元素并且未对网络位置重新进行计算,则可能会出现这种情况。
  • Element not traversable (3) - 该点所在的网络元素不可遍历。 网络元素受到约束属性限制时可能会发生这种情况。
  • Invalid field values (4) - 该点的一个或多个字段值落在分析图层的编码属性域或范围属性域之外。 例如,应该填写正数的位置可能存在负数。
  • Not reached (5) - 求解程序无法到达该点。 该点可能位于独立于其他输入的网络断开连接区域中,或是障碍或限制阻止了往返于该点。
  • Time window violation (6) - 在指定的时间窗内无法到达该点。 此状态仅适用于支持时间窗的分析类型。
  • Not located on closest (7) - 由于限制或障碍致使无法遍历距该点最近的网络位置,因而该点将被置于可遍历网络要素中的最近位置。