摘要
该 ArcGIS Online 服务用于求解车辆配送 (VRP) 问题以便找到车队的最佳路径。
通常,要求车队的调度员做出有关车辆配送的决策。此类决策包括如何将一组客户以最佳方式分配给一支车队,以及安排他们的访问顺序和日程。解决此类 VRP 的目标是通过遵循所有时间窗并使每个路径的整体运营和投资成本降至最低,为客户提供一个高水准的服务。约束条件是在司机倒班、行进速度和客户承诺所施加的时间限制内,利用可用资源完成路径。
该服务可用于确定此类复杂车队管理任务的解决方案。
以将货物从中心仓库位置运送到杂货店为例。在仓库所在位置有三辆卡车可用。此仓库的营业时间为上午 8:00 至下午 5:00- 所有卡车均必须在此期间内返回仓库。每辆卡车的载重量为 15,000 磅,这对其所能运送的货物量进行了限制。每个商店对需要运送的货物都有具体的数量要求(磅),而且每个商店都对交货时限有具体的要求。另外,司机每天只能工作八小时,要求有午餐时间,且依据驾驶时间和为商店提供服务的时间来领取薪水。目标是既能得出每个司机的行驶线路(或路径),以便交货时既能够满足所有服务要求,又能够将司机花在特定路径上的总时间降至最低。下图显示了求解上述车辆配送问题所得到的三条路径。
插图
用法
-
EditVehicleRoutingProblem 和 SolveVehicleRoutingProblem 工具生成车队的路径,该路径需访问多个停靠点才能进行配送、接收或服务调用。SolveVehicleRoutingProblem 工具在异步模式下运行,非常适合需要更长时间解决的较大问题。如果您正在解决较小问题或对较大问题的结果进行少量编辑,请使用 EditVehicleRoutingProblem。
-
最多可添加 2,000 个停靠点和 100 条路径。同时,最多可将 200 个停靠点分配给一条路径。
最多可以添加 250 个点障碍。您可以添加任意数量的线障碍或面障碍,但线障碍的相交数不能超过 500 个街道要素,面障碍的相交数不能超过 2,000 个要素。
求解时可选择使用道路等级以更快地生成结果,但解决方案可能欠佳。
-
无论是否选中 use_hierarchy_in_analysis 参数 (True),只要停靠点之间、站点之间或站点和停靠点之间的直线距离大于 50 英里(80.46 公里),便会始终使用等级。
-
当 travel_mode 设置为步行时或者设置为自定义并且使用步行约束条件时,任何停靠点或站点之间的直线距离不得大于 50 英里(80.46 千米)。
如果输入点与其最近的可穿过街道之间的距离大于 12.42 英里(20 千米),则将从分析中排除该点。
此工具可在 ArcGIS Pro、ArcMap、ArcGlobe 和 ArcScene 中运行,但不适用于 ArcCatalog。
语法
SolveVehicleRoutingProblem_naagol (orders, depots, routes, breaks, time_units, distance_units, {analysis_region}, {default_date}, {uturn_policy}, {time_window_factor}, {spatially_cluster_routes}, {route_zones}, {route_renewals}, {order_pairs}, {excess_transit_factor}, {point_barriers}, {line_barriers}, {polygon_barriers}, {use_hierarchy_in_analysis}, {restrictions}, {attribute_parameter_values}, {populate_route_lines}, {route_line_simplification_tolerance}, {populate_directions}, {directions_language}, {directions_style_name}, {travel_mode}, {impedance}, {time_zone_usage_for_time_fields}, {save_output_layer}, {overrides}, {save_route_data})
参数 | 说明 | 数据类型 |
orders | 指定一个或多个停靠点(最多 2,000)。它们是 VRP 分析的路径应访问的位置。停靠点可以表示送货(例如配送家具)、接收(例如机场巴士接送乘客)或某种类型的服务或检查(例如,树木修剪作业或建筑物检查)。 指定停靠点后,可通过使用特性为每个停靠点设置属性,例如其名称或服务时间。可通过以下属性指定停靠点: ObjectID:系统管理的 ID 字段。 Name:停靠点的名称。名称必须唯一。如果该名称为空,则求解过程中会自动生成一个名称。 ServiceTime:该属性指定了路径访问网络位置所花费的时间;也就是说,它存储了网络位置的阻抗值。零值或空值表示网络位置不需要任何服务时间。 此字段值的单位由 time_units 参数指定。 TimeWindowStart1:网络位置的第一时间窗开始时间。该字段可以包含空值;空值指示没有开始时间。 时间窗仅说明车辆何时可以到达停靠点,并不说明服务时间必须何时结束。要将服务时间考虑在内并需要在时间窗关闭之前离开,请将 TimeWindowEnd1 字段的值减去 ServiceTime 的值。 时间窗字段可以包含“仅时间”值或“日期和时间”值。如果像 TimeWindowStart1 这样的时间字段具有“仅时间”值(例如 8:00 AM),则假定日期由“默认日期”参数指定。使用“日期和时间”值(例如 7/11/2010 8:00 AM)允许您设置持续多天的时间窗。 解决跨越多个时区的问题时,每个停靠点时间窗的值均采用停靠点所处位置的时区。 TimeWindowEnd1:网络位置的第一时间窗结束时间。该字段可以包含空值;空值指示没有结束时间。 TimeWindowStart2:网络位置的第二时间窗开始时间。该字段可以包含空值;空值指示没有第二时间窗。 如果第一时间窗为空,正如 TimeWindowStart1 和 TimeWindowEnd1 字段所指定的那样,第二时间窗也必须为空。 如果两个时间窗都为非空,则二者不可以重叠。而且,第二个时间窗必须在第一个之后出现。 TimeWindowEnd2:网络位置的第二时间窗结束时间。该字段可以包含空值。 如果 TimeWindowStart2 和 TimeWindowEnd2 均为空,则不存在第二时间窗。 如果 TimeWindowStart2 不为空,但是 TimeWindowEnd2 为空,则存在具有开始时间但没有结束时间的第二时间窗。这种情况是有效的。 MaxViolationTime1:如果到达时间出现在时间窗结束后,则认为与时间窗发生了冲突。该字段为停靠点的第一个时间窗指定允许的最长冲突时间。它可包含零值,但不能包含负值。零值表示停靠点的第一个时间窗不能接受时间窗冲突;即,第一个时间窗是硬性的。另一方面,空值表示对允许的冲突时间没有限制。非零值指定最长延迟时间;例如,路径可在第一个时间窗结束之后最多 30 分钟内到达停靠点。 该字段值的单位由“时间字段单位”参数指定 时间窗冲突可通过求解程序进行追踪和加权。因此,您可指示 VRP 求解程序采用以下三种方法之一:
通过指定“时间窗冲突重要性”参数的重要性级别,实际上就是从这三种方法中任选其中一种。不过,无论在什么情况下,只要超过了为 MaxViolationTime1 设置的值,求解程序就会返回错误。 MaxViolationTime2:停靠点的第二个时间窗允许的最长冲突时间。该字段与 MaxViolationTime1 字段相似。 InboundArriveTime: 定义要配送到停靠点的项在起始站点准备就绪的时间。 仅当入站到达时间早于路径的最晚开始时间值时,才能将该停靠点分配给此路径;这样,在项已准备就绪,可以进行装载之前,路径无法离开站点。 此字段有助于对涉及入站中转的情景进行建模。例如,停靠点的某项作业需要一些特殊材料,但该站点当前并不具备这些材料。现在正从另一位置运送这些材料,预计将在上午 11:00 到达该站点。为了确保不会将在货物到达之前离开的路径分配给此停靠点,停靠点的入站到达时间被设置为上午 11:00。这些特殊材料在上午 11:00 到达后会被装载到车辆上,随后车辆离开该站点,驶向指派的停靠点。 注:
OutboundDepartTime: 定义要在停靠点接收的货物必须到达终止站点的时间。 仅当路径能够访问停靠点且到达终止站点的时间早于指定的出站离开时间时,才能将该停靠点分配给路径。 此字段有助于对涉及出站中转的情景进行建模。例如,货运公司派出运货车去接收停靠点的包裹,并将其运送至采用其他设施的转运站点,然后将其送往最终目的地。每天下午 3:00 会有一辆半挂车停靠在该站点,接收高优先级包裹并将其直接送往中转站。为了避免将这些高优先级包裹的配送延迟至第二天下午 3:00 的行程,货运公司尝试让运货车在下午 3:00 之前接收停靠点的高优先级包裹,同时在该截止时间之前将其运送至中转站。这完全可以通过将出站离开时间设置为下午 3:00 来实现。 注:
DeliveryQuantities:配送量。可以按任何度量单位(如重量、体积或数量)来指定大小。也可以指定多个度量单位,例如,重量和体积。 输入未指明单位的配送量数值。例如,如果需要将一个 300 磅的对象配送到某个停靠点,请输入 300。您需要记住,该值的单位是磅。 如果您正在追踪的是具有多个维度的对象,请以空格分隔各维度的值。例如,如果您在记录一次重 2,000 磅,体积为 100 立方英尺的配送业务,请输入 2000 100。同样地,您需要记住单位,在此示例中,单位分别是磅和立方英尺。您还需要记住值及其对应单位的输入顺序。 确保以同样的方式指定“路径”的 Capacities、“停靠点”的 DeliveryQuantities 和 PickupQuantities;换言之,值的单位必须相同,如果使用多个度量单位,则需要按照相同顺序列出所有参数的度量单位。因此,对于 DeliveryQuantities,若以磅为单位指定重量,后面以立方英尺为单位指定体积,那么需要按照相同的方式指定路径的容量和停靠点的接收量:以磅为单位指定重量,后面以立方英尺为单位指定体积。如果使用的单位不同或顺序发生变化,那么您将得到意外结果,但不会收到任何警告消息。 空字符串或空值相当于所有度量单位值均为零。如果字符串中值的个数相对于容量计数或追踪的度量单位来说不足,则其余的值将被视为零。注意,配送量不能为负数。 PickupQuantities:接收的大小。可以按任何度量单位(如重量、体积或数量)来指定大小。也可以指定多个度量单位,例如,重量和体积。但是,不可以使用负值。该字段与“停靠点”的 DeliveryQuantities 字段相似。 在交互访问的情况下,停靠点可同时具有配送量和接收量。 Revenue:解决方案中包含停靠点时产生的收入。该字段可包含空值(空值表示收入为零),但是它不能具有负值。 Revenue 会包含在优化目标函数值的过程中,但并不属于解决方案的运行成本。也就是说路径类中的 TotalCost 字段决不会在输出中包含收入。不过,通过收入可对服务停靠点的相对重要性进行加权。 SpecialtyNames:一个以空格分隔的字符串,其中包含了停靠点特性要求的名称。空值表示停靠点没有特性要求。 “Orders”和“Routes”类中列出的所有特性的拼写必须完全匹配,这样 VRP 求解程序才能将它们链接起来。 为了说明什么是特殊要求及其工作方式,假设草坪护理及树木修剪公司都有一部分停靠点需要使用斗式铲车来修剪所有树木。公司可以在 SpecialtyNames 字段中为这些停靠点输入“斗式铲车”来表示其特殊要求。对于其他停靠点,SpecialtyNames 将留为空值。同样,公司也可以在带液压吊杆的铲车路径的 SpecialtyNames 字段中输入“斗式铲车”。对于其他路径该字段将留为空值。求解时,VRP 求解程序会将无任何特殊要求的停靠点分配给任意路径,而将需要斗式铲车的停靠点分配给有斗式铲车的路径。 AssignmentRule:该字段指定将停靠点分配给路径时所要遵循的规则。该字段受到下面所列值域的约束(使用数值代码而非括号中的名称)。
该字段不能包含空值。 CurbApproach:指定车辆到达和离开停靠点的方向。字段值可指定为括号中显示的以下整数之一(请使用数值代码而非括号中的名称):
CurbApproach 属性是专为使用以下两种国家驾驶标准而设计的:右侧通行(美国)和左侧通行(英国)。首先,考虑位于车辆左侧的停靠点。不管车辆行驶在左车道还是右车道,停靠点始终位于车辆的左侧。决定从其中任一方向到达停靠点可能会随国家驾驶标准更改,也就是说,从车辆的右侧或左侧靠近停靠点。例如,如果要到达一个停靠点并且在车辆与停靠点之间不存在其他交通车道,那么在美国应该选择 1(车辆的右侧),而在英国应该选择 2(车辆的左侧)。 RouteName:分配给停靠点的路径的名称。 该输入字段用于将停靠点预先分配给特定的路径。(最多可将 200 个停靠点预分配给一个路径名称。) 它可包含空值,空值表示停靠点未预先分配给任何路径,而求解程序会为停靠点确定可能的最佳路径分配。如果将该字段设为空,则顺序字段也必须设为空。 执行求解操作后,如果为停靠点分配了路径,则 RouteName 字段将包含分配给停靠点的路径的名称。 Sequence:该字段指示停靠点在其分配到的路径上的顺序。 该输入字段用于指定停靠点在路径上的相对顺序。该字段可包含空值,空值表示停靠点可位于路径上的任意位置。RouteName 值为空时,该字段值才能为空。 输入 sequence 值应为正且对于各路径均唯一(在更新站点访问、停靠点和休息点之间分配),但是不需要从 1 开始,也不需要连续。 执行求解操作后,Sequence 字段中会包含停靠点在其分配到的路径上的顺序值。路径的输出 sequence 值在货物补给点、停靠点和中断点之间分配;从 1 开始(在起始站点处);并且是连续的。所以,安排了路径的停靠点可能的最小输出顺序值为 2,因为路径始终从站点处开始 | Feature Set |
depots | 对给定的车辆配送 (VRP) 指定一个或多个站点。站点是指车辆在工作时间开始时离开并在工作时间结束后返回的位置。在求解路径开始时,车辆在站点装货(对于配送)或卸货(对于接收)。在某些情况下,站点还可以作为一个货物补给或货物更新的位置,车辆可以在此处卸货或重新装货,然后继续进行配送和接收。站点具有打开时间和关闭时间,这由硬性时间窗指定。车辆不能在该时间窗以外的时刻到达站点。 指定停靠点后,可通过使用特性为每个停靠点设置属性,例如其名称或服务时间。可通过以下属性指定停靠点: ObjectID:系统管理的 ID 字段。 Name:站点的名称。“路径”记录集的 StartDepotName 和 EndDepotName 字段引用了您在此处指定的名称。使用“路径货物补给点”记录集时,也会对其进行引用。 站点名称不区分大小写,但必须非空且唯一。 TimeWindowStart1:网络位置的第一时间窗开始时间。该字段可以包含空值;空值指示没有开始时间。 时间窗字段可以包含只有时间的值,也可以包含同时具有日期和时间的值。如果时间字段是一个只具有时间的值(例如 8:00 AM),则假定日期为分析图层的“默认日期”参数所指定的日期。使用“日期和时间”值(例如 7/11/2010 8:00 AM)允许您设置持续多天的时间窗。 解决跨越多个时区的问题时,每个站点时间窗的值均采用站点所处位置的时区。 TimeWindowEnd1:网络位置的第一时间窗结束时间。该字段可以包含空值;空值指示没有结束时间。 TimeWindowStart2:网络位置的第二时间窗开始时间。该字段可以包含空值;空值指示没有第二时间窗。 如果第一时间窗为空,正如 TimeWindowStart1 和 TimeWindowEnd1 字段所指定的那样,第二时间窗也必须为空。 如果两个时间窗都为非空,则二者不可以重叠。而且,第二个时间窗必须在第一个之后出现。 TimeWindowEnd2:网络位置的第二时间窗结束时间。该字段可以包含空值。 如果 TimeWindowStart2 和 TimeWindowEnd2 均为空,则不存在第二时间窗。 如果 TimeWindowStart2 不为空,但是 TimeWindowEnd2 为空,则存在具有开始时间但没有结束时间的第二时间窗。这种情况是有效的。 CurbApproach:指定车辆到达和离开站点的方向。字段值可指定为括号中显示的以下整数之一(请使用数值代码而非括号中的名称):
CurbApproach 属性是专为使用以下两种国家驾驶标准而设计的:右侧通行(美国)和左侧通行(英国)。首先,考虑位于车辆左侧的站点。不管车辆行驶在左车道还是右车道,停靠点始终位于车辆的左侧。决定从其中任一方向到达站点可能会随国家驾驶标准更改,也就是说,从车辆的右侧或左侧靠近事件点。例如,如果要到达一个站点并且在车辆与站点之间不存在其他交通车道,那么在美国应该选择 1(车辆的右侧),而在英国应该选择 2(车辆的左侧)。 Bearing:点移动的方向。单位为度,并且从正北方向开始按顺时针方式进行测量。该字段与 BearingTol 字段结合使用。 方位角数据通常会从配有 GPS 接收器的移动设备自动发送。如果正在加载移动的停靠点(例如行人或车辆),则尝试包括方位角数据。 使用该字段可以防止将位置添加到错误的边上,例如,车辆刚好在交叉路口或天桥附近时。方位角也可帮助工具确定点在街道的哪一边上。 有关详细信息,请参阅“方位角和方位角容差帮助”主题 (http://links.esri.com/bearing-and-bearing-tolerance)。 BearingTol:使用 bearing 字段在边上定位移动点时,方位角容差值将创建一个可接受方位角值的范围。如果“方位角”字段中的值在可接受值范围(由边上的方位角容差生成)内,则可以将该点作为网络位置添加在此处,否则,将计算下一个最近边上的最近点。 单位为度,默认值为 30。值必须大于零且小于 180。 值为 30 表示,Network Analyst 尝试在边上添加网络位置时,在边的每一侧(左侧和右侧)的两个数字化方向上都将生成一个 15º 的可接受方位角值。 有关详细信息,请参阅 ArcGIS 帮助系统中“方位角和方位角容差”主题 (http://links.esri.com/bearing-and-bearing-tolerance)。 NavLatency:如果 Bearing 和 BearingTol 也具有值,则该字段只在求解过程中使用;但是,即使当 Bearing 和 BearingTol 字段中有值时,NavLatency 值的输入也是可选的。NavLatency 表示 GPS 信息从移动的车辆上发送到服务器以及车辆导航设备接收到处理后路径这两个时刻之间预期要经过的时间。NavLatency 的时间单位与“时间属性”参数指定的成本属性的单位相同。 | Feature Set |
routes | 指定一条或多条路径(最多为 100)。路径指定了车辆和驾驶员的特征;求解后,路径还表示站点和停靠点之间的路径。 路径可以具有开始和结束站点服务时间、固定或灵活的起始时间、基于时间的运行成本、基于距离的运行成本、多个容量、对驾驶员工作时间的各种约束等等。在指定路径时,可使用此特性为每条路径设置属性。可通过以下属性指定路径: Name:路径的名称。名称必须唯一。 如果字段值为空,则工具会在求解时生成唯一的名称。因此,在大多数情况下,可自行选择是否输入值。但是,如果您的分析中包括向路径预分配的中断、路径货物补给点、按区域配送或停靠点,则您必须输入名称,因为在这些情况下路径名称将用作外键。请注意,路径名称不区分大小写。 StartDepotName:路径的起始站点名称。该字段是“Depots”类中“Name”字段的外键。 如果 StartDepotName 值为空,则路径会将分配的第一个停靠点作为起始点。车辆的起始位置未知或者与您的问题不相关时,可以忽略起始站点。不过,如果 StartDepotName 为空,EndDepotName 不能也为空。 如果停靠点或站点跨多个时区,则不允许使用虚拟起始站点。 如果路径正在进行配送并且 StartDepotName 为空,则假设在路径开始前,在一个虚拟站点处进行装货。如果路径不具有货物补给点,它的配送停靠点(“停靠点”类中 DeliveryQuantities 值为非零的停靠点)会在起始站点或虚拟站点处进行装货。如果路径具有更新访问,则只有第一个更新访问之前的配送停靠点才会在起始站点或虚拟站点处进行装货。 EndDepotName:路径的终止站点名称。该字段是“Depots”类中 Name 字段的外键。 StartDepotServiceTime:在起始站点的服务时间。该字段可用于为车辆装货所用的时间建立模型。该字段可以包含空值;空值表示没有服务时间。 该字段值的单位由“时间字段单位”参数指定。 起始和结束站点处的服务时间是固定值(由 StartDepotServiceTime 和 EndDepotServiceTime 字段值指定),因此不必考虑路径的实际载荷。例如,在起始站点处装载车辆所花费的时间取决于订单大小。因此,站点服务时间是与货车满载或货车平均装载对应的指定值,或者也可以设置自行估计的时间值。 EndDepotServiceTime:在终止站点的服务时间。该字段可用于为车辆卸货所用的时间建立模型。该字段可以包含空值;空值表示没有服务时间。 该字段值的单位由“时间字段单位”参数指定。 起始和结束站点处的服务时间是固定值(由 StartDepotServiceTime 和 EndDepotServiceTime 字段值指定),因此不必考虑路径的实际载荷。例如,在起始站点处装载车辆所花费的时间取决于订单大小。因此,站点服务时间是与货车满载或货车平均装载对应的指定值,或者也可以设置自行估计的时间值。 EarliestStartTime:路径允许的最早开始时间。求解程序通过将该字段与起始站点的时间窗结合使用来确定可行的路径开始时间。 该字段不能包含空值,其默认值只有时间,为 8:00 AM;该默认值被解释为“默认日期”参数所指定日期的 8:00 AM。 解决跨越多个时区的问题时,EarliestStartTime 的时区与起始站点所在时区相同。 LatestStartTime:路径允许的最晚开始时间。该字段不能包含空值,其默认值只有时间,为上午 10:00;该默认值被解释为分析图层的“默认日期”属性所指定日期的上午 10:00。 解决跨越多个时区的问题时,LatestStartTime 的时区与起始站点所在时区相同。 ArriveDepartDelay:该字段存储将车辆加速到正常行驶速度、减速到停止状态以及离开和进入网络(例如,出入停车场)所需的行驶时间。通过包含 ArriveDepartDelay 值,可防止 VRP 求解程序发送多条路径来为完全重合的停靠点提供服务。 该属性的成本是因为对不重合的停靠点、站点和货物补给点进行访问而产生的。例如,如果路径从站点处开始,然后访问第一个停靠点,则总的到达/离开延迟会计入行驶时间。这同样适用于从第一个停靠点行驶到第二个停靠点的情况。如果第二个停靠点与第三个停靠点重合,则不会在它们之间添加 ArriveDepartDelay 值,因为车辆并不需要移动。如果路径行驶到一个货物补给点,则该值会再次计入行驶时间。 尽管车辆需要减速、停下来休息,然后再加速,但 VRP 求解程序也不能将 ArriveDepartDelay 值计入休息时间。这表示如果路径离开某个停靠点、停下休息,然后继续行驶到下一个停靠点,则仅计入一次到达/离开延迟,而不是两次。 为了说明,假设在一幢高层建筑物中有五个重合停靠点,而且可通过三条不同的路径来为它们提供服务。这意味着将产生三个到达/离开延迟;也就是说,三名驾驶员需要分别寻找停车位并进入同一栋建筑物。不过,如果可以仅通过一条路径来为这些停靠点提供服务,则只有一名驾驶员需要寻找停车位并进入该建筑物,这样只会产生一个到达/离开延迟。由于 VRP 求解程序会尝试将成本降至最低,所以它将尝试限制到达/离开延迟,因而会选择使用单一路径。(请注意,其他约束(例如,特殊要求、时间窗或容量)可能要求发送多条路径。) 此字段值的单位由 time_units 参数指定。 Capacities:车辆的最大容量。可以按任何度量单位(如重量、体积或数量)来指定容量。也可以指定多个度量单位,例如,重量和体积。 输入未指明单位的容量。例如,假定您车辆的最大载重为 40,000 磅;您可输入 40000。为了用作后续参考,您需要记住该值的单位是磅。 如果您正在追踪的是具有多个维度的对象,请以空格分隔各维度的值。例如,如果您要记录重量和体积,而您的车辆最大载重为 40,000 磅,最大容量为 2,000 立方英尺,则应在 Capacities 中输入 40000 2000。同样地,您需要记住单位。您还需要记住值及其对应单位的输入顺序(在此情况下,前者是磅,后者是立方英尺)。 鉴于以下原因,记住单位和单位顺序非常重要:第一,您可以在稍后重新解释信息;第二,您可以在停靠点的 DeliveryQuantities 和 PickupQuantities 字段中输入正确的值。为了详细描述第二点,请注意 VRP 求解程序会同时引用 Capacities、DeliveryQuantities 和 PickupQuantities,以确保路径不会超载。由于字段中不能输入单位,VRP 工具不能转换单位,因此您需要以相同的单位和单位顺序在这三个字段中输入值,以确保能正确地解释值。如果在这三个字段的任意字段中使用的单位不同或顺序发生变化,那么您将得到意外结果,但不会收到任何警告消息。因此,事先设置单位和单位顺序标准,并在这三个字段中输入值时始终参考此标准是一个好办法。 空字符串或空值相当于所有值均为零。容量值不能为负数。 如果 Capacities 字符串中值的个数相对于停靠点的 DeliveryQuantities 或 PickupQuantities 字段来说数量不足,则其余的值将被视为零。 VRP 求解程序仅执行简单的布尔测试来判定是否超出容量。如果路径的容量值大于或等于装载总量,则 VRP 求解程序将假定货物适宜用该车辆装载。这可能并不正确,但具体要取决于货物和车辆的实际形状。例如,VRP 求解程序允许将 1000 立方英尺的球形物装到容积为 1000 立方英尺、宽为 8 英尺的货车中。但实际上由于球形物的直径为 12.6 英尺,所以它无法装到 8 英尺宽的货车中。 FixedCost:仅当解决方案中使用路径(即,路径分配有停靠点)时才产生的固定货币成本。该字段可以包含空值;空值表示没有固定成本。该成本属于路径总运行成本的一部分。 CostPerUnitTime:路径总持续时间(包括行驶时间以及在停靠点、站点和休息点的服务时间和等待时间)中每单位工作时间产生的货币成本。该字段不能包含空值,其默认值为 1.0。 此字段值的单位由 time_units 参数指定。 CostPerUnitDistance:路径长度(总行驶距离)中每单位行驶距离产生的货币成本。该字段可以包含空值;空值表示没有成本。 此字段值的单位由 distance_units 参数指定。 OvertimeStartTime:开始计算加班时间之前的规定工作时间。该字段可以包含空值;空值表示没有加班时间。 此字段值的单位由 time_units 参数指定。 例如,如果路径总持续时间超过八小时,要为驾驶员支付加班费,假定 time_units 参数设置为“分钟”,则 OvertimeStartTime 将被指定为 480(8 小时 * 60 分钟/小时)。 CostPerUnitOvertime:每单位加班工作时间产生的货币成本。该字段可以包含空值;空值表示 CostPerUnitOvertime 值与 CostPerUnitTime 值相同。 MaxOrderCount:路径上允许的最大停靠点数。该字段不能包含空值,其默认值为 30。此值不能超过 200。 MaxTotalTime:允许的最长路径持续时间。路径持续时间包括行驶时间以及在停靠点、站点和休息点的服务和等待时间。该字段可以包含空值;空值表示对路径持续时间无限制。 此字段值的单位由 time_units 参数指定。 MaxTotalTravelTime:路径允许的最长行驶时间。行驶时间只包括在网络上行驶时所用的时间,不包括服务或等待时间。 该字段可以包含空值;空值表示对允许的最长行驶时间无限制。该字段值不能大于 MaxTotalTime 字段值。 此字段值的单位由 time_units 参数指定。 MaxTotalDistance:路径允许的最长行驶距离。 此字段值的单位由 distance_units 参数指定。 该字段可以包含空值;空值表示对允许的最长行驶距离无限制。 SpecialtyNames:一个以空格分隔的字符串,其中包含路径所支持的特殊要求的名称。空值表示路径不支持任何特殊要求。 该字段是停靠点类中 SpecialtyNames 字段的外键。 为了说明什么是特殊要求及其工作方式,假设草坪护理及树木修剪公司都有一部分停靠点需要使用斗式铲车来修剪所有树木。公司可以在 SpecialtyNames 字段中为这些停靠点输入“斗式铲车”来表示其特殊要求。对于其他停靠点,SpecialtyNames 将留为空值。同样,公司也可以在带液压吊杆的铲车路径的 SpecialtyNames 字段中输入“斗式铲车”。对于其他路径该字段将留为空值。求解时,VRP 求解程序会将无任何特殊要求的停靠点分配给任意路径,而将需要斗式铲车的停靠点分配给有斗式铲车的路径。 AssignmentRule:该字段指定解决问题时是否可以使用路径。该字段受到下面所列值的属性域的约束(使用数值代码而非括号中的名称)。
| Record Set |
breaks | 给定车辆配送问题 (VRP) 中路径的休息时段或中断。一个中断只与一条路径相关联,而且可在以下情况下获得:完成停靠点服务后、去往停靠点的途中或在为停靠点提供服务之前。中断具有一个起始时间和持续时间,该时间段内可能会为驾驶员支付报酬,也可能不支付。中断开始时可通过三种方式来建立:使用时间窗、最长行驶时间或最长工作时间。 指定中断后,可通过使用特性为每个事件点设置属性,例如其名称或服务时间。可通过以下属性指定停靠点: ObjectID:系统管理的 ID 字段。 RouteName - 此休息时间所适用的路径名称。尽管一个休息点只会被分配给一条路径,但是也可将多个休息点分配给同一路径。 该字段是路径参数中 Name 字段的外键,所以不能具有空值。 Precedence:Precedence 值用来指定休息点在给定路径上的顺序。precedence 值为 1 的休息点会出现在 precedence 值为 2 的休息点之前,依此类推。 无论休息点是时间窗休息点、最长行驶时间休息点还是最长工作时间休息点,所有休息点都必须具有 precedence 值。 ServiceTime:休息点的持续时间。该字段可以包含空值;空值表示没有服务时间。 此字段值的单位由 time_units 参数指定。 TimeWindowStart:休息点时间窗的开始时间。 如果该字段为空,并且 TimeWindowEnd 具有有效的时间值,则允许在 TimeWindowEnd 值之前的任何时间开始休息。 如果该字段中存在值,则 MaxTravelTimeBetweenBreaks 和 MaxCumulWorkTime 字段值必须为空;此外,分析图层中所有其他休息点的 MaxTravelTimeBetweenBreaks 和 MaxCumulWorkTime 必须也为空值。 如果路径具有时间窗相互重叠的多个休息点,就会在求解时出现错误。 中断的时间窗字段可以包含“仅时间”值或“日期和时间”值。如果像 TimeWindowStart 这样的时间字段仅具有时间值(例如 12:00 PM),则假定日期由 default_date 参数指定。使用“日期和时间”值(例如 7/11/2012 12:00 PM)可以指定时长为两天或两天以上的时间窗。这尤其适用于应在午夜前后的某个时间中断的情况。 解决跨越多个时区的问题时,每个中断时间窗的值均采用相关路径(由 RouteName 字段指定)所处位置的时区。 TimeWindowEnd:休息点时间窗的结束时间。 如果该字段为空,并且 TimeWindowStart 具有有效的时间值,则允许在 TimeWindowStart 值之后的任何时间结束休息。 如果该字段中存在值,则 MaxTravelTimeBetweenBreaks 和 MaxCumulWorkTime 必须为空;此外,分析图层中所有其他休息点的 MaxTravelTimeBetweenBreaks 和 MaxCumulWorkTime 必须也为空值。 MaxViolationTime:该字段为时间窗休息点指定允许的最长冲突时间。如果到达时间不在该时间范围内,则认为与时间窗发生冲突。 零值表示不能与时间窗发生冲突;即时间窗是硬性的。非零值指定最长延迟时间;例如,中断可在其时间窗结束后最多 30 分钟内开始,但会按照“时间窗冲突重要性”参数对延迟进行惩罚。 该属性可以为空;TimeWindowStart 和 TimeWindowEnd 为空值表示对允许的冲突时间没有限制。如果 MaxTravelTimeBetweenBreaks 或 MaxCumulWorkTime 中存在值,那么 MaxViolationTime 必须为空。 此字段值的单位由 time_units 参数指定。 MaxTravelTimeBetweenBreaks:休息之前可累积的最长行驶时间。行驶时间从上一个休息点的结束时间开始累积,或者从路径的起始点开始累积(如果还未休息过)。 如果这是路径的最后一个休息点,则 MaxTravelTimeBetweenBreaks 还会指明从最后一个休息点到终止站点可累积的最长行驶时间。 该字段用于限制可在驾驶多长时间之后才需要中断。例如,如果分析的“时间字段单位”参数(time_units for Python)设为“分钟”,而且 MaxTravelTimeBetweenBreaks 的值为 120,则司机将在驾驶两个小时之后中断驾驶以得到休息。如果要再驾驶两个小时后中断一次,则第二个中断的 MaxTravelTimeBetweenBreaks 属性应为 120。 如果该字段中存在值,那么为了能够顺利求解分析,TimeWindowStart、TimeWindowEnd、MaxViolationTime 和 MaxCumulWorkTime 必须都为空。 此字段值的单位由 time_units 参数指定。 MaxCumulWorkTime: 休息之前可累积的最长工作时间。工作时间始终从路径的起始点开始累积。 工作时间等于行驶时间加上在停靠点、站点和休息点的服务时间。不过请注意,该时间不包括等待时间,等待时间是指路径(或驾驶员)在停靠点或站点处等待时间窗打开所用的时间。 该字段用于限制可在工作多长时间之后才需要中断。例如,如果 time_units 参数设为“分钟”,而且 MaxCumulWorkTime 的值为 120,ServiceTime 的值为 15,则司机将在工作两个小时之后获得 15 分钟的休息时间。 继续以上一个示例来进行说明,假设工作了三个小时之后又需要休息。那么,要指定该休息点,需要输入 315(5 小时 15 分钟)作为第二个休息点的 MaxCumulWorkTime 值。这个数字包括前一个休息点的 MaxCumulWorkTime 值和 ServiceTime 值,以及准许进行第二次休息之前的另外三个小时工作时间。为避免过早经过最长工作时间休息点,应该记住:此类休息点是从路径的起始点开始累积工作时间,并且工作时间包括在之前访问的站点、停靠点和休息点处的服务时间。 如果该字段中存在值,那么为了能够顺利求解分析,TimeWindowStart、TimeWindowEnd、MaxViolationTime 和 MaxTravelTimeBetweenBreaks 必须都为空。 此字段值的单位由 time_units 参数指定。 IsPaid:用来指示是否为休息点支付报酬的布尔值。值为 True 表示在计算路径成本和判定加班时间时将包括在休息点处所花费的时间。值为 False 表示的情况与 True 值相反。默认值为 True。 Sequence:该输入字段用于指示休息点在其路径上的顺序。该字段可包含空值。输入 sequence 值应为正且对于各路径均唯一(在货物补给点、停靠点和休息点之间分配),但是不需要从 1 开始,也不需要连续。 求解程序会修改 sequence 字段。执行求解后,该字段会包含休息点在其路径上的 sequence 值。路径的输出 sequence 值在货物补给点、停靠点和休息点之间分配;从 1 开始(在起始站点处);并且是连续的。 | Record Set |
time_units | 分析中所有基于时间的字段值的时间单位。VRP 分析中的许多要素和记录都具有用于存储时间值的字段,例如用于停靠点的 ServiceTime 和用于路径的 CostPerUnitTime。为了最大程度减少数据输入的要求,这些字段值不包含单位。相反,所有基于距离的字段值都必须以相同单位输入,而此参数用于指定这些值的单位。 注意,基于时间的输出字段使用此参数指定的相同单位。 | String |
distance_units | 分析中所有基于距离的字段值的距离单位。VRP 分析中许多要素和记录都有用于存储距离值的字段,例如路径的 MaxTotalDistance 和 CostPerUnitTime。为了最大程度减少数据输入的要求,这些字段值不包含单位。相反,所有基于距离的字段值都必须以相同单位输入,而此参数用于指定这些值的单位。 注意,基于距离的输出字段使用此参数指定的相同单位。 | String |
analysis_region (可选) | 指定要进行分析的区域。如果未对此参数指定值,工具会基于输入点的位置自动计算区域名称。为加快工具执行,建议设置区域名称。要指定区域,请使用以下值之一:
| String |
default_date (可选) | 指定一天中的时间(不包含日期)的时间字段值的默认日期。您可以在各种输入参数中查找这些时间字段,例如停靠点的 ServiceTime 属性和中断参数。 | Date |
uturn_policy (可选) | 使用此参数限制或允许服务区在交汇点处 U 形转弯。为理解这些参数值,请考虑下列术语:交汇点是在路段的尽头且可能与其他一条或多条路段相连的点;伪交汇点是指两条街道确实在此处相连的点;交叉点是指三条或更多街道在此处相连的点;死角是指一条不与其他路段相连的路段的尽头。鉴于这些信息,参数可能具有以下值:
除非将出行模式设置为自定义(这是默认值),否则会忽略您为此参数提供的值。 | String |
time_window_factor (可选) | 对支持时间窗的重要性作出评价。存在以下三个选项。
| String |
spatially_cluster_routes (可选) |
| Boolean |
route_zones (可选) | 描绘给定路径的工作区域。路径区属于面要素,用来对路径施加约束,以使路径仅为某一指定区域内或附近的停靠点提供服务。以下示例说明了路径区非常有用的情况:
在指定路径区时,您需要使用特性为每一个设置属性,例如其相关路径。可通过以下属性指定路径区: ObjectID:系统管理的 ID 字段。 RouteName:该区域所应用到的路径的名称。按区域配送最大可覆盖一条关联路径。该字段不能包含空值,而且是路径参数的要素中 Name 字段的外键。 IsHardZone:用来指示按区域配送中的区域是硬性还是软性的布尔值。值为 True 表示区域是硬性的;也就是说,落在区域面以外的停靠点不能分配给该路径。默认值为 1 (True)。值为 False (0) 表示这样的停靠点仍可进行分配,但是为停靠点提供服务的成本要根据一个函数进行加权得到,该函数基于与区域的欧氏距离。实际上,这意味着,随着软性区域到停靠点的直线距离的增加,停靠点被分配给路径的可能性将会降低。 | Feature Set |
route_renewals (可选) | 指定路径可以访问的中间站点,以重新装载或卸载正在配送或接收的货物。具体而言,货物补给点将把路径链接到站点。这一关系表明路径可在关联的站点处进行更新(在途中重新装载或卸载)。 货物补给可用于为以下情景建立模型:车辆在起始站点接收满载的配送量、到各停靠点提供服务、返回到该站点更新配送量,然后继续为更多停靠点提供服务。例如,在丙烷气配送中,车辆可能需要进行多次交货才能将气罐排空,而且需要访问加气点并继续进行配送。 以下是使用补给点时要考虑的几项规则和选择:
在指定路径更新时,您需要使用特性为每条路径设置属性,例如发生路径更新的站点名称。可通过以下属性指定路径更新: ObjectID:系统管理的 ID 字段。 DepotName:进行该更新时所在站点的名称。该字段不能包含空值,而且是站点参数中 Name 字段的外键。 RouteName:该更新所应用到的路径名称。该字段不能包含空值,而且是路径参数中 Name 字段的外键。 ServiceTime:更新的服务时间。该字段可以包含空值;空值表示没有服务时间。 此字段值的单位由 time_units 参数指定。 在补给站点处装载车辆所花费的时间可能取决于车辆大小和车辆装载量。不过,货物补给点的服务时间是固定值,并且不考虑实际载荷。因此,为更新服务时间指定的值应与货车满载量、平均装载量或所选的其他估计时间相对应。 | Record Set |
order_pairs (可选) | 将接收此参数对,使其可由同一路径提供服务。 有时,要求停靠点的接收和配送是成对的。例如,快递公司可能需要让路径从一个停靠点接收高优先级包裹并送往另一个停靠点,而不返回站点或分拣站,以减少送货时间。可以通过使用停靠点对,按照相应的顺序将这些相关的停靠点分配给同一路径。而且,还可以对包裹在车辆上停留的时间进行限制;例如,包裹可能是血液样本,必须在两个小时内从医生办公室运送到实验室。 在指定停靠点对时,您需要使用特性为每一停靠点对设置属性,例如两个停靠点的名称。可通过以下属性指定停靠点对: ObjectID:系统管理的 ID 字段。 FirstOrderName:停靠点对中第一个停靠点的名称。该字段是停靠点参数中 Name 字段的外键。 SecondOrderName:停靠点对中第二个停靠点的名称。该字段是停靠点参数中 name 字段的外键。 停靠点对中的第一个停靠点必须为接收停靠点;也就是说,它的 DeliveryQuantities 字段值为空。停靠点对中的第二个停靠点必须为配送停靠点;也就是说,它的 PickupQuantities 字段值为空。第一个停靠点处的接收量必须与第二个停靠点处的配送量一致。有一种特殊情况是,在未使用容量时,两个停靠点的数量可能都为零。 停靠点数量在站点处不进行装载或卸载。 MaxTransitTime:停靠点对的最长行驶时间。行驶时间是指离开第一个停靠点至到达第二个停靠点的持续时间。该约束限制两个停靠点之间的车上时间(或行驶时间)。车辆携带人员或易腐烂货物时,行驶时间通常比携带包裹或不易腐烂的货物的时间要短。该字段可以包含空值;空值表示对行驶时间无限制。 此字段值的单位由 time_units 参数指定。 求解程序可对额外行驶时间(相对于停靠点对之间的直线行驶时间来测量)进行追踪和加权。因此,您可指示 VRP 求解程序采用以下三种方法之一:
通过指定 excess_transit_factor 参数的重要性级别,实际上就是从这三种方法中任选其中一种。无论重要性级别如何,只要超过 MaxTransitTime 值,求解程序就会返回错误。 | Record Set |
excess_transit_factor (可选) | 对减少停靠点对的额外行驶时间的重要性作出评价。额外行驶时间是指超出停靠点对间直线行驶所需时间的数量。额外时间可能由司机休息或前往中间停靠点和站点造成。下面列出了可选的三个值。
| String |
point_barriers (可选) | 指定一个或多个点作为临时限制,或显示在基础街道上行驶可能需要的附加时间或距离。例如,点障碍可用来显示一棵沿街倒下的树或是铁路道口上的时间延迟。 工具限制了可添加为障碍的点不得超过 250 个。 指定点障碍后,可通过使用特性为每个事件点设置属性,例如其名称或障碍类型。可通过以下属性指定点障碍: Name:障碍名称。 BarrierType:指定点障碍是完全限制通行还是增加通过障碍时的时间或距离。此特性值可指定为以下整数之一(请使用数值代码而非括号中的名称):
Additional_Time:表示穿越障碍时会增加的行驶时间。此字段仅适用于增加成本型障碍且仅在测量单位基于时间时适用。此字段的值必须大于或等于零,并且其单位与“测量单位”参数中指定的单位相同。 Additional_Distance:表示穿越障碍时会增加的距离。此字段仅适用于增加成本型障碍且仅在测量单位基于距离时适用。此字段的值必须大于或等于零,并且其单位与“测量单位”参数中指定的单位相同。 | Feature Set |
line_barriers (可选) | 指定一条或多条线,这些线相交的街道上禁止通行。例如,线障碍可用于对阻塞若干个路段交通的游行或抗议队伍进行建模。线障碍还可用于快速隔离多条道路使其禁止被穿越,从而在可能的路径中去除不符合要求的街道网络部分。 该工具限制了您可以使用“线障碍”参数限制的街道数量。可指定为线障碍的线数没有限制时,所有线的相交街道的合并数不能超过 500。 指定线障碍时,可使用以下特性为每个障碍设置名称属性: Name:障碍名称。 | Feature Set |
polygon_barriers (可选) | 指定面,该面完全限制通行或按比例调整行驶在面相交的街道上所需的行驶时间或距离。 该服务限制了您可以使用“面障碍”参数限制的街道数量。可指定为面障碍的面数没有限制时,所有面的相交街道的合并数不能超过 2,000。 指定面障碍时,可通过使用特性为每个面障碍设置属性,例如名称或障碍类型。可通过以下属性指定面障碍: Name:障碍名称。 BarrierType:指定障碍的存在会完全禁止通行还是按比例调整行程时间或距离。该字段值可指定为以下整数之一(请使用数值代码而非括号中的名称):
ScaledTimeFactor:它是与障碍相交街道的行驶时间要乘以的因子。此字段仅适用于调整成本型障碍且仅在测量单位基于时间时适用。该字段值必须大于零。 ScaledDistanceFactor:它是与障碍相交街道的距离要乘以的因子。此属性仅适用于调整成本型障碍且仅在测量单位基于距离时适用。该属性值必须大于零。 | Feature Set |
use_hierarchy_in_analysis (可选) | 指定在查找最佳路径时是否使用等级。
如果停靠点之间、站点之间、或停靠点与站点之间的直线距离大于 50 英里,即使您已设置此参数为不使用等级,工具也会自动转换为使用等级。 除非将出行模式设置为自定义(这是默认值),否则会忽略您为此参数提供的值。 | Boolean |
restrictions (可选) | 指定在查找最佳路径时工具应使用的限制。 除非将出行模式设置为自定义(这是默认值),否则会忽略您为此参数提供的值。 限制表示行驶偏好或要求。大多数情况下,限制条件会导致道路禁行。例如,使用“避开收费公路”限制的结果是,仅在访问某一事件点或设施点必须借道收费公路时,才会生成一条包含该收费公路的路径。高度限制则使您可以绕开低于车辆高度的间隙。如果车辆上装载着腐蚀性物质,使用“禁止任何危险物品”限制可以防止在标记着运输腐蚀性材料为非法行为的路上运输这些材料。 以下是可用限制的列表和简短描述。 该工具支持以下限制:
| String |
attribute_parameter_values (可选) | 指定某些限制需要的其他值,例如“重量限制”要求的车辆重量。您也可以使用属性参数指定限制对使用限制的行程是禁止、避免还是首选。如果该限制要避免或首选道路,您可以使用此参数进一步指定要避免或首选的程度。例如,您可以选择从不使用收费公路,尽可能地避开它们,或甚至格外倾向于使用它们。 除非将出行模式设置为自定义(这是默认值),否则会忽略您为此参数提供的值。 如果指定了要素类的“属性参数值”参数,则要素类上的字段名称必须如下所示与字段相匹配: AttributeName:列出限制名称。 ParameterName:列出与限制相关的参数名称。限制根据其用途可有一个或多个 ParameterName 字段值。 ParameterValue:工具在评估限制时使用的 ParameterName 的值。 “属性参数值”取决于“限制”参数。仅当限制名称指定为“限制”参数值时,ParameterValue 字段才可用。 在“属性参数值”中,每个限制(以 AttributeName 形式列出)具有一个 ParameterName 字段值,指定限制的行程是禁止、避免还是首选的“限制用法”与道路选择避免或首选的限制和程度相关联。可为限制用法 ParameterName 分配下列字符串值,或在括号内列出等效数值:
大多数情况下,如果限制取决于车辆特征(如车辆高度),则可以使用“限制用法”的默认值 PROHIBITED。但是在某些情况下,“限制用法”的值取决于您的路径偏好。例如,“避开收费公路”限制具有“限制用法”参数的默认值 AVOID_MEDIUM。这表示在使用限制时,在可能的情况下工具会试图绕开收费公路。AVOID_MEDIUM 也表示查找最佳路径时避开收费公路的重要性,即优先级为中等。选择 AVOID_LOW 会降低避开收费公路的重要性;而选择 AVOID_HIGH 则会增加其重要性,因此服务为避开收费公路而生成更长的路径时更容易为人所接受。选择 PROHIBITED 则会完全不允许在收费公路上行驶,因此路径不可能经过收费公路的所有部分。但是请注意,避开或禁止收费公路并由此避开公路通行费只是一部分人的目的;对另外一部分人来说,因为避开拥堵的交通比交一些公路通行费更为重要,会宁愿走收费公路。在后一种情况中,您可以选择 PREFER_LOW、PREFER_MEDIUM 或 PREFER_HIGH 作为“限制用法”的值。首选的等级越高,工具为了在与限制相关的道路上行驶就会绕行更远的路程。 | Record Set |
populate_route_lines (可选) |
当“路径形状”参数设置为“实际形状”时,路径形状的概化可以使用适当的“路径简化容差”参数值进行进一步控制。 无论为“路径形状”参数选择了什么值,最佳路径总是通过最大限度地缩短沿街行驶的路程来确定,而不是使用直线距离来确定。这意味着只有路径形状是不同的,而非查找路径时搜索的基础街道。 | Boolean |
route_line_simplification_tolerance (可选) | 指定要对路径和方向的输出线几何进行简化的程度。 除非将出行模式设置为自定义(这是默认值),否则会忽略您为此参数提供的值。 如果未选中 (False) populate_route_lines 参数,则工具还将忽略该参数。 简化将保留路径上定义路径基本形状所需的关键点(例如交点处的转弯)而删除其他点。指定的简化距离为简化线偏离原始线的最大允许偏移。简化线将减少路径几何中的折点数。这将改善工具的执行时间。 | Linear Unit |
populate_directions (可选) | 指定工具是否应为每条路径生成行驶方向。
| Boolean |
directions_language (可选) | 指定在生成行驶方向时使用的语言。 仅在选中 参数或将其设为 True 时,使用此参数。 可使用下列两位或五位字符语言代码指定参数值:
如果指定了某种不支持的语言代码,该工具将会使用默认语言(英语)返回方向。 | String |
directions_style_name (可选) | 指定方向的格式化样式名称。此参数仅在选中填充方向参数或设置为 True 时使用。可以使用以下值指定此参数:
| String |
travel_mode (可选) | 指定用于在分析中建模的交通模式。出行模式在 ArcGIS Online 中进行管理,组织管理员可通过对其进行配置更好地反映组织工作流。您需要指定组织所支持的出行模式名称。 要获取受支持出行模式名称的列表,请使用与访问此工具时使用的相同 GIS 服务器连接,并在实用程序工具箱中运行 GetTravelModes。GetTravelModes 会将表和支持的出行模式添加到应用程序中。可将“支持的出行模式”表中“出行模式名称”字段的任何值指定为输入。您还可以将“出行模式设置”字段中的值指定为输入。由于工具不必查找基于出行模式名称的设置,因而加快了工具执行。 默认值,自定义,可以使用自定义出行模式参数(在交汇点处 U 形转弯、应用等级、限制、属性参数值和阻抗)配置您自己的出行模式。自定义出行模式参数的默认值对使用汽车的出行方式建模。您可能希望选择自定义并设置上述自定义出行模式参数,从而以快速步行速度对行人建模,或以给定高度、重量和特定危险材料货物对卡车建模。您可以选择执行此操作来尝试不同的设置以获取想得到的分析结果。一旦确定了分析设置,您应该使用组织管理员身份并将这些设置保存为新建或现有出行模式的一部分,以便您组织中的所有人均返回相同设置的分析。 | String |
impedance (可选) | 指定阻抗,其值表示沿交通网络的路段或其他部分行进所需的精力或成本。 行程时间是阻抗,比如,汽车花费一分钟沿空无一人的道路行驶一公里。行程时间会随出行模式的不同而不同(行人可能需要 20 多分钟才能走完一公里),所以在建模时为出行模式选择正确的阻抗非常重要。 从以下阻抗值中选择:
除非将出行模式设置为自定义(这是默认值),否则会忽略您为此参数提供的值。 | String |
time_zone_usage_for_time_fields (可选) | 为工具支持的输入日期时间字段指定时区。该参数用于为以下字段指定时区:停靠点的 TimeWindowStart1、TimeWindowEnd1、TimeWindowStart2、TimeWindowEnd2、InboundArriveTime 和 OutboundDepartTime。站点的 TimeWindowStart1、TimeWindowEnd1、TimeWindowStart2 和 TimeWindowEnd2。路径的 EarliestStartTime 和 LatestStartTime。中断点的 TimeWindowStart 和 TimeWindowEnd。
如果不知道停靠点或站点所在的时区,或者停靠点或站点处在多个时区内并且您想要所有的日期时间值同时启动,那么在 UTC 中指定日期时间值非常有用。UTC 选项仅在您的网络数据集定义了时区属性时才可用。否则,所有的日期时间值将始终被视为 GEO_LOCAL。 | string |
save_output_layer (可选) | 指定工具是否应将分析设置保存为网络分析图层文件。即使在 ArcGIS Desktop 应用程序(例如 ArcMap)中打开文件,仍然无法直接使用此文件。需要将其发送至 Esri 技术支持以诊断工具所返回结果的质量。
| Boolean |
overrides (可选) | 求解网络分析问题时,指定可影响求解程序行为的其他设置。 需要在 JavaScript 对象表示法 (JSON) 中指定此参数的值。例如,有效值的格式如下:{"overrideSetting1" : "value1", "overrideSetting2" : "value2"}。覆盖设置名称始终以双引号括起。该值可以是数字、布尔值或字符串。 此参数的默认值为无值,表示不覆盖任何求解程序设置。 覆盖是高级设置,应仅在谨慎分析应用设置前后得到的结果之后使用。要获得每个求解程序支持的覆盖设置及其可接受值的列表,请联系 Esri 技术支持。 | String |
save_route_data (可选) | 选择输出中是否包括含有某类文件地理数据库的 zip 文件,该类文件地理数据库通过可与 ArcGIS Online 或 Portal for ArcGIS.共享路径图层的格式保存分析的输入和输出。
| Boolean |
代码示例
SolveVehicleRoutingProblem 示例
以下 Python 脚本演示了如何在脚本中使用 SolveVehicleRoutingProblem 工具。
'''
The script shows how to use the SolveVehicleRoutingProblem tool in a script. It demonstrates how to obtain the schema for
the inputs, populate the inputs, excute the tool and save the results.
'''
import time
import sys
import arcpy
#Change the username and password applicable to your own ArcGIS Online account
username = "<your user name>"
password = "<your password>"
vrp_service = "https://logistics.arcgis.com/arcgis/services;World/VehicleRoutingProblem;{0};{1}".format(username, password)
#Add the geoprocessing service as a toolbox. The alias will be the service name
arcpy.ImportToolbox(vrp_service)
vrp_tool_name = "SolveVehicleRoutingProblem_VehicleRoutingProblem"
#Set the variables to store results from the tool. Overwrite the results if they already exist.
arcpy.env.overwriteOutput = True
output_routes = "C:/data/Results.gdb/Routes"
assigned_orders = "C:/data/Results.gdb/AssignedOrders"
unassigned_orders = "C:/data/Results.gdb/UnassignedOrders"
#Get the schema for input orders, depots and routes
input_orders = arcpy.GetParameterValue(vrp_tool_name, 0)
input_depots = arcpy.GetParameterValue(vrp_tool_name, 1)
input_routes = arcpy.GetParameterValue(vrp_tool_name, 2)
#Create two orders as input. The coordinate values are in WGS84 spatial reference.
#AssignmentRule for orders is 3 which specifies that the tool should assign a new
#sequence and route for every order.
orders = [(-122.51, 37.7724), (-122.4889, 37.7538)]
sr = arcpy.SpatialReference(4326)
with arcpy.da.InsertCursor(input_orders, ("SHAPE@", "Name", "AssignmentRule")) as cursor:
for i, order in enumerate(orders):
order_shape = arcpy.PointGeometry(arcpy.Point(order[0], order[1]), sr)
row = (order_shape, "O{}".format(i + 1), 3)
cursor.insertRow(row)
#Create one depot as input. The coordinate values are in WGS84 spatial reference
depots = [(-122.3943, 37.7967)]
with arcpy.da.InsertCursor(input_depots, ("SHAPE@", "Name")) as cursor:
for i, depot in enumerate(depots):
depot_shape = arcpy.PointGeometry(arcpy.Point(depot[0], depot[1]), sr)
row = (depot_shape, "D{}".format(i + 1))
cursor.insertRow(row)
#Create one route as input. Ensure that the StartDepotName and EndDepotName fields on routes has same
#value as the Name field on input depots. AssignmentRule for routes is 1 which specifies that the tool
#must include the route. CostPerUnitTime and MaxOrderCount are fields that cannot have null values if
#the route is to be considered as a valid route.
with arcpy.da.InsertCursor(input_routes, ("Name", "StartDepotName", "EndDepotName", "AssignmentRule", "CostPerUnitTime", "MaxOrderCount")) as cursor:
row = ("R1", "D1", "D1", 1, 1, 10)
cursor.insertRow(row)
#Call the tool
result = arcpy.SolveVehicleRoutingProblem_VehicleRoutingProblem(input_orders, input_depots, input_routes)
arcpy.AddMessage("Running the analysis with result ID: {}".format(result.resultID))
#Check the status of the result object every 1 seconds until it has a value of 4(succeeded) or greater
while result.status < 4:
time.sleep(1)
#Print any warning or error messages returned from the tool
result_severity = result.maxSeverity
if result_severity == 2:
arcpy.AddMessage("An error occured when running the tool")
arcpy.AddMessage(result.getMessages(2))
sys.exit(2)
elif result_severity == 1:
arcpy.AddMessage("Warnings were returned when running the tool")
arcpy.AddMessage(result.getMessages(1))
#Get the output routes and orders and save to a local geodatabase
result.getOutput(0).save(unassigned_orders)
result.getOutput(1).save(assigned_orders)
result.getOutput(2).save(output_routes)
环境
此工具不使用任何地理处理环境。