索引
RouteOptimization(接口)AggregatedMetrics(消息)BatchOptimizeToursMetadata(消息)BatchOptimizeToursRequest(消息)BatchOptimizeToursRequest.AsyncModelConfig(消息)BatchOptimizeToursResponse(消息)BreakRule(消息)BreakRule.BreakRequest(消息)BreakRule.FrequencyConstraint(消息)DataFormat(枚举)DistanceLimit(消息)GcsDestination(消息)GcsSource(消息)InjectedSolutionConstraint(消息)InjectedSolutionConstraint.ConstraintRelaxation(消息)InjectedSolutionConstraint.ConstraintRelaxation.Relaxation(消息)InjectedSolutionConstraint.ConstraintRelaxation.Relaxation.Level(枚举)InputConfig(消息)Location(消息)OptimizeToursLongRunningMetadata(消息)OptimizeToursRequest(消息)OptimizeToursRequest.SearchMode(枚举)OptimizeToursRequest.SolvingMode(枚举)OptimizeToursResponse(消息)OptimizeToursResponse.Metrics(消息)OptimizeToursUriMetadata(消息)OptimizeToursUriRequest(消息)OptimizeToursUriResponse(消息)OptimizeToursValidationError(消息)OptimizeToursValidationError.FieldReference(消息)OutputConfig(消息)RouteModifiers(消息)Shipment(消息)Shipment.Load(消息)Shipment.VisitRequest(消息)ShipmentModel(消息)ShipmentModel.DurationDistanceMatrix(消息)ShipmentModel.DurationDistanceMatrix.Row(消息)ShipmentModel.Objective(消息)ShipmentModel.Objective.Type(枚举)ShipmentModel.PrecedenceRule(消息)ShipmentRoute(消息)ShipmentRoute.Break(消息)ShipmentRoute.EncodedPolyline(消息)ShipmentRoute.Transition(消息)ShipmentRoute.VehicleLoad(消息)ShipmentRoute.Visit(消息)ShipmentTypeIncompatibility(消息)ShipmentTypeIncompatibility.IncompatibilityMode(枚举)ShipmentTypeRequirement(消息)ShipmentTypeRequirement.RequirementMode(枚举)SkippedShipment(消息)SkippedShipment.Reason(消息)SkippedShipment.Reason.Code(枚举)TimeWindow(消息)TransitionAttributes(消息)Uri(消息)Vehicle(消息)Vehicle.DurationLimit(消息)Vehicle.LoadLimit(消息)Vehicle.LoadLimit.Interval(消息)Vehicle.LoadLimit.LoadCost(消息)Vehicle.TravelMode(枚举)Vehicle.UnloadingPolicy(枚举)VehicleFullness(消息)Waypoint(消息)
RouteOptimization
用于优化车辆行程的服务。
某些类型字段的有效性:
google.protobuf.Timestamp- 时间采用 Unix 时间格式:自 1970-01-01T00:00:00+00:00 以来的秒数。
- 秒数必须介于 [0, 253402300799] 之间,即介于 [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00] 之间。
- 必须将 nanos 设置为未设置状态或 0。
google.protobuf.Duration- 秒数必须介于 [0, 253402300799] 之间,即介于 [1970-01-01T00:00:00+00:00, 9999-12-31T23:59:59+00:00] 之间。
- 必须将 nanos 设置为未设置状态或 0。
google.type.LatLng- 纬度必须在 [-90.0, 90.0] 范围内。
- 经度必须在 [-180.0, 180.0] 范围内。
- 纬度和经度中至少有一个不能为零。
| BatchOptimizeTours |
|---|
|
以批处理方式优化一个或多个 此方法是一项长时间运行的操作 (LRO)。优化输入( 用户可以轮询 如果 LRO 如果 LRO 的
|
| OptimizeTours |
|---|
|
发送包含
目标是提供一种将
|
| OptimizeToursLongRunning |
|---|
|
此方法是 返回的 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/otlr/make-request。
|
| OptimizeToursUri |
|---|
|
此方法是 客户端指定存储在 Google Cloud Storage 中的 对于耗时超过几分钟且输入/输出大小超过 8MB 的优化,应优先使用此方法,不过它也可用于耗时较短且输入/输出大小较小的优化。 返回的 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/otlr/make-request。
|
AggregatedMetrics
ShipmentRoute(相应地,所有 Transition 和/或 Visit [相应地,所有 ShipmentRoute] 元素)的汇总指标为 OptimizeToursResponse。
| 字段 | |
|---|---|
performed_shipment_count |
执行的配送次数。请注意,取货和送货配对仅计为一次。 |
travel_duration |
路线或解决方案的总行程时间。 |
wait_duration |
路线或解决方案的总等待时长。 |
delay_duration |
路线或解决方案的总延迟时长。 |
break_duration |
路线或解决方案的总中断时长。 |
visit_duration |
路线或解决方案的总访问时长。 |
total_duration |
总时长应等于上述所有时长的总和。对于路线,它还对应于: |
travel_distance_meters |
路线或解决方案的总出行距离。 |
max_loads |
整个路线(相应地,解决方案)上达到的最大负荷,针对相应路线(相应地,解决方案)上的每种数量计算,计算方式为所有 |
performed_mandatory_shipment_count |
执行的强制性配送次数。 实验性:此字段的行为或存在状态将来可能会发生变化。 |
performed_shipment_penalty_cost_sum |
已完成的货件的 实验性:此字段的行为或存在状态将来可能会发生变化。 |
BatchOptimizeToursMetadata
此类型没有字段。
针对 BatchOptimizeToursRequest 调用的操作元数据。
BatchOptimizeToursRequest
请求以异步操作方式批量优化行程。每个输入文件应包含一个 OptimizeToursRequest,每个输出文件将包含一个 OptimizeToursResponse。请求包含用于读取/写入和解析文件的信息。所有输入和输出文件都应位于同一项目下。
| 字段 | |
|---|---|
parent |
必需。定位项目和位置以进行呼叫。 格式:
如果未指定位置,系统将自动选择区域。 |
model_configs[] |
必需。每个购买模型的输入/输出信息,例如文件路径和数据格式。 |
AsyncModelConfig
用于异步求解一个优化模型的信息。
| 字段 | |
|---|---|
display_name |
可选。用户定义的模型名称,可供用户用作别名来跟踪模型。 |
input_config |
必需。有关输入模型的信息。 |
output_config |
必需。所需的输出位置信息。 |
BatchOptimizeToursResponse
此类型没有字段。
对 BatchOptimizeToursRequest 的响应。此值会在操作完成后返回到长时间运行的操作中。
BreakRule
用于为车辆生成时间中断(例如午休时间)的规则。休息是指车辆在当前位置保持空闲状态且无法执行任何访问的连续时间段。可能会出现中断的情况:
- 在两次访问之间的行程期间(包括访问之前或之后的这段时间,但不包括访问期间),在这种情况下,它会延长两次访问之间的相应行程时间,
- 或在车辆启动之前(车辆可能不会在休息期间启动),在这种情况下,它不会影响车辆启动时间。
- 或车辆结束时间之后(同样,使用车辆结束时间)。
| 字段 | |
|---|---|
break_requests[] |
休息顺序。看到 |
frequency_constraints[] |
可能适用多个 |
BreakRequest
必须预先知道适用于每辆车的休息序列(即休息次数和顺序)。重复的 BreakRequest 定义了该序列,并指明了它们必须发生的顺序。它们的时间窗口(earliest_start_time / latest_start_time)可能会重叠,但必须与顺序兼容(系统会检查这一点)。
| 字段 | |
|---|---|
earliest_start_time |
必需。中断开始时间的下限(含)。 |
latest_start_time |
必需。休止开始时间的上限(含)。 |
min_duration |
必需。休息时长的下限。必须为正值。 |
FrequencyConstraint
还可以通过强制执行最小中断频率来进一步限制上述指定的中断频率和时长,例如“每 12 小时必须至少中断 1 小时”。假设这可以解读为“在任何 12 小时的滑动时间窗口内,必须至少有一次时长至少为 1 小时的休息”,那么该示例将转换为以下 FrequencyConstraint:
{
min_break_duration { seconds: 3600 } # 1 hour.
max_inter_break_duration { seconds: 39600 } # 11 hours (12 - 1 = 11).
}
解决方案中休息的时间和时长将遵守所有此类限制,以及 BreakRequest 中已指定的时间窗口和最短时长。
实际上,FrequencyConstraint 可能适用于非连续中断。例如,以下时间表符合“每 12 小时 1 小时”的示例:
04:00 vehicle start
.. performing travel and visits ..
09:00 1 hour break
10:00 end of the break
.. performing travel and visits ..
12:00 20-min lunch break
12:20 end of the break
.. performing travel and visits ..
21:00 1 hour break
22:00 end of the break
.. performing travel and visits ..
23:59 vehicle end
| 字段 | |
|---|---|
min_break_duration |
必需。相应限制的广告插播时长下限。非负。请参阅 |
max_inter_break_duration |
必需。路线中任何时间区间的最大允许跨度,该时间区间不包含至少部分 |
DataFormat
输入和输出文件的数据格式。
| 枚举 | |
|---|---|
DATA_FORMAT_UNSPECIFIED |
值无效,格式不得为 UNSPECIFIED。 |
JSON |
JavaScript 对象表示法。 |
PROTO_TEXT |
Protocol Buffers 文本格式。请参阅 https://protobuf.dev/reference/protobuf/textformat-spec/ |
DistanceLimit
用于定义可行驶的最大距离的限制。可以是硬性或软性。
如果定义了软限制,则必须定义 soft_max_meters 和 cost_per_kilometer_above_soft_max,且这两个值必须为非负数。
| 字段 | |
|---|---|
max_meters |
一种硬性限制,用于将距离限制为最多 max_meters。限值必须是非负数。 |
soft_max_meters |
一种不强制执行最大距离限制的软限制,但如果违反该限制,则会产生费用,该费用会与模型中定义的其他费用相加,单位相同。 如果定义了 soft_max_meters,则该值必须小于 max_meters,并且必须为非负数。 |
cost_per_kilometer_below_soft_max |
每公里产生的费用,最高可增加至
|
cost_per_kilometer_above_soft_max |
如果距离超过 费用必须为非负数。 |
GcsDestination
将写入输出文件的 Google Cloud Storage 位置。
| 字段 | |
|---|---|
uri |
必需。Google Cloud Storage URI。 |
GcsSource
将从中读取输入文件的 Google Cloud Storage 位置。
| 字段 | |
|---|---|
uri |
必需。Google Cloud Storage 对象的 URI,格式为 |
InjectedSolutionConstraint
注入到请求中的解决方案,包括有关必须限制哪些访问以及必须如何限制这些访问的信息。
| 字段 | |
|---|---|
routes[] |
要注入的解决方案的路由。原始解决方案可能会省略部分路线。路线和跳过配送的商品必须满足 |
skipped_shipments[] |
要注入的解决方案的跳过发货。部分内容可能已从原始解决方案中省略。请参阅 |
constraint_relaxations[] |
针对零个或多个车辆组,指定何时以及在多大程度上放宽限制条件。如果此字段为空,则所有非空车辆路线都会受到完全限制。 |
ConstraintRelaxation
对于一组车辆,指定在哪些阈值下访问次数限制会放宽,以及放宽到什么程度。skipped_shipment 字段中列出的配送会被限制为跳过,也就是说,无法执行。
| 字段 | |
|---|---|
relaxations[] |
将应用于 |
vehicle_indices[] |
指定访问限制 如果 |
娱乐
如果 relaxations 为空,则 routes 上所有访问的开始时间和顺序都受到完全限制,并且不得在这些路线中插入或添加新的访问。此外,除非车辆为空(即没有访问,并且在模型中将 used_if_route_is_empty 设置为 false),否则 routes 中车辆的开始时间和结束时间会受到完全限制。
relaxations(i).level 指定应用于满足以下条件的访问会话 #j 的限制放宽级别:
route.visits(j).start_time >= relaxations(i).threshold_time和j + 1 >= relaxations(i).threshold_visit_count
同样,如果车辆启动满足以下条件,则放松到 relaxations(i).level:
vehicle_start_time >= relaxations(i).threshold_time和relaxations(i).threshold_visit_count == 0,如果满足以下条件,则车辆端放宽至relaxations(i).level:vehicle_end_time >= relaxations(i).threshold_time和route.visits_size() + 1 >= relaxations(i).threshold_visit_count
如果访问满足 threshold_visit_count 或 threshold_time,则应用放松级别:添加两个具有相同 level 的 relaxations:一个仅设置了 threshold_visit_count,另一个仅设置了 threshold_time。如果某次访问满足多个 relaxations 的条件,系统会应用最宽松的级别。因此,从车辆启动到按顺序访问路线中的各个地点,再到车辆结束,放松程度会越来越高,即放松程度会随着路线的推进而保持不变或增加。
不满足任何 relaxations 的阈值条件的路线访问的时间和顺序完全受限,并且不得在这些序列中插入任何访问。此外,如果车辆的开始或结束时间不满足任何放宽条件,则时间是固定的,除非车辆为空。
| 字段 | |
|---|---|
level |
当满足 |
threshold_time |
可应用放松时间 |
threshold_visit_count |
可应用放松 如果值为 |
级别
表示不同的约束放宽级别,这些级别会在访问满足阈值条件时应用于相应访问及后续访问。
以下枚举按宽松程度递增的顺序列出。
| 枚举 | |
|---|---|
LEVEL_UNSPECIFIED |
隐式默认放松级别:不放松任何限制,即所有访问都完全受限。 不得在 |
RELAX_VISIT_TIMES_AFTER_THRESHOLD |
到访开始时间和车辆开始/结束时间将放宽,但每次到访仍与同一车辆相关联,并且必须遵守到访顺序:不得在它们之间或之前插入任何到访。 |
RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD |
与 RELAX_VISIT_TIMES_AFTER_THRESHOLD 相同,但访问序列也放宽了:访问只能由相应车辆执行,但可能会变为未执行。 |
RELAX_ALL_AFTER_THRESHOLD |
与 RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD 相同,但车辆也处于宽松状态:在阈值时间或之后,访问完全免费,并且可能会变为未执行。 |
InputConfig
为 [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] 指定输入。
| 字段 | |
|---|---|
data_format |
必需。输入数据格式。 |
联合字段 source。必需。source 只能是下列其中一项: |
|
gcs_source |
Google Cloud Storage 位置。这必须是单个对象(文件)。 |
位置
封装位置信息(地理点和可选的航向)。
| 字段 | |
|---|---|
lat_lng |
途经点的地理坐标。 |
heading |
与交通流量方向相关的罗盘方向。此值用于指定上下车时要使用的道路一侧。航向值可以介于 0 到 360 之间,其中 0 表示正北航向,90 表示正东航向,依此类推。 |
OptimizeToursLongRunningMetadata
此类型没有字段。
针对 OptimizeToursLongRunning 调用的操作元数据。
OptimizeToursRequest
要提供给行程优化求解器的请求,用于定义要解决的配送模型以及优化参数。
| 字段 | |
|---|---|
parent |
必需。定位项目或位置以进行呼叫。 格式:
如果未指定位置,系统将自动选择区域。 |
timeout |
如果设置了此超时时间,服务器会在超时时间段结束之前或同步请求的服务器截止时间到达之前(以较早者为准)返回响应。 对于异步请求,服务器会在超时时间结束之前生成解决方案(如果可能)。 |
model |
要解决的运输模型。 |
solving_mode |
默认情况下,求解模式为 |
search_mode |
用于解决请求的搜索模式。 |
injected_first_solution_routes[] |
引导优化算法找到与之前解决方案类似的首个解决方案。 在构建第一个解决方案时,模型会受到限制。在第一个解决方案中,未在路线中执行的任何配送都会被隐式跳过,但在后续解决方案中可能会执行这些配送。 解决方案必须满足一些基本有效性假设:
如果注入的解不可行,系统不一定会返回验证错误,而是可能会返回指示不可行的错误。 |
injected_solution_constraint |
限制优化算法,使其找到与之前解决方案类似的最终解决方案。例如,这可用于冻结已完成或将要完成但不得修改的部分路线。 如果注入的解不可行,系统不一定会返回验证错误,而是可能会返回指示不可行的错误。 |
refresh_details_routes[] |
如果不为空,则会刷新给定的路线,而不会修改其基础访问序列或出行时间:只会更新其他详细信息。这并不能解决模型。 截至 2020 年 11 月,此方法仅填充非空路线的折线,并且要求 传入路线的 此字段不得与
|
interpret_injected_solutions_using_labels |
如果为 true:
此解释适用于 如果为 true,则以下类别的标签在其类别中最多只能出现一次:
如果注入的解决方案中的 从注入的解决方案中移除路线访问或整个路线可能会影响隐含的限制,从而导致解决方案发生变化、出现验证错误或不可行。 注意:调用方必须确保每个 |
consider_road_traffic |
在计算 |
populate_polylines |
如果为 true,则会在响应 |
populate_transition_polylines |
如果为 true,则会在响应 |
allow_large_deadline_despite_interruption_risk |
如果设置了此参数,则请求的截止时间(请参阅 https://grpc.io/blog/deadlines)最长可达 60 分钟。否则,最长截止期限仅为 30 分钟。请注意,长时间运行的请求被中断的风险会明显更高(但仍很小)。 |
use_geodesic_distances |
如果为 true,则使用测地线距离(而非 Google 地图距离)计算出行距离,并使用测地线距离和由 |
label |
可用于标识此请求的标签,会在 |
geodesic_meters_per_second |
当 |
max_validation_errors |
截断返回的验证错误数量。除非 solving_mode=VALIDATE_ONLY,否则这些错误通常会作为 BadRequest 错误详情 (https://cloud.google.com/apis/design/errors#error_details) 附加到 INVALID_ARGUMENT 错误载荷。请参阅 |
SearchMode
用于定义搜索行为的模式,可在延迟时间和解决方案质量之间进行权衡。在所有模式下,系统都会强制执行全局请求截止时间。
| 枚举 | |
|---|---|
SEARCH_MODE_UNSPECIFIED |
未指定搜索模式,相当于 RETURN_FAST。 |
RETURN_FAST |
找到第一个合适的解决方案后停止搜索。 |
CONSUME_ALL_AVAILABLE_TIME |
花费所有可用时间来寻找更好的解决方案。 |
SolvingMode
定义求解器应如何处理请求。在 VALIDATE_ONLY 以外的所有模式下,如果请求无效,您会收到 INVALID_REQUEST 错误。请参阅 max_validation_errors 以限制返回的错误数量。
| 枚举 | |
|---|---|
DEFAULT_SOLVE |
求解模型。警告可能会在 [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors] 中发出。 |
VALIDATE_ONLY |
仅验证模型,不求解:尽可能填充 OptimizeToursResponse.validation_errors。 |
DETECT_SOME_INFEASIBLE_SHIPMENTS |
仅填充 重要提示:并非所有不可行的配送都会在此处返回,只有在预处理期间检测为不可行的配送才会在此处返回。 |
TRANSFORM_AND_RETURN_REQUEST |
只有当 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。 |
OptimizeToursResponse
解决旅游优化问题后的响应,其中包含每辆车行驶的路线、已跳过的货件以及解决方案的总费用。
| 字段 | |
|---|---|
routes[] |
为每辆车计算的路线;第 i 条路线对应于模型中的第 i 辆车。 |
request_label |
|
skipped_shipments[] |
所有跳过的配送的列表。 |
validation_errors[] |
我们能够独立检测到的所有验证错误的列表。请参阅 |
processed_request |
在某些情况下,我们会先修改传入的请求(即添加费用),然后再解决问题。如果 solving_mode == TRANSFORM_AND_RETURN_REQUEST,则在此处返回修改后的请求。 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。 |
metrics |
此解决方案的时长、距离和使用情况指标。 |
指标
汇总了所有路线的总体指标。
| 字段 | |
|---|---|
aggregated_route_metrics |
按路线汇总。每个指标都是所有同名 |
skipped_mandatory_shipment_count |
跳过的强制性配送次数。 |
used_vehicle_count |
使用的车辆数。注意:如果车辆路线为空且 |
earliest_vehicle_start_time |
二手车的最早开始时间,计算方式为所有二手车的 |
latest_vehicle_end_time |
二手车的最新结束时间,计算方式为所有二手车的 |
costs |
解决方案的费用,按与费用相关的请求字段细分。键是相对于输入 OptimizeToursRequest 的 proto 路径,例如“model.shipments.pickups.cost”,值是相应费用字段生成的总费用,汇总了整个解决方案。换句话说,费用 ["model.shipments.pickups.cost"] 是整个解决方案中所有取件费用的总和。模型中定义的所有费用都会在此处详细报告,但与 TransitionAttributes 相关的费用除外,这些费用自 2022 年 1 月起仅以汇总方式报告。 |
total_cost |
解决方案的总费用。费用映射中所有值的总和。 |
OptimizeToursUriMetadata
此类型没有字段。
针对 OptimizeToursUri 调用的操作元数据。
OptimizeToursUriRequest
OptimizeToursUri 方法使用的请求。
| 字段 | |
|---|---|
parent |
必需。定位项目或位置以进行呼叫。 格式:
如果未指定位置,系统将自动选择区域。 |
input |
必需。包含 |
output |
必需。将包含 |
OptimizeToursUriResponse
OptimizeToursUri 方法返回的响应。
| 字段 | |
|---|---|
output |
可选。包含 资源的 |
OptimizeToursValidationError
用于描述验证 OptimizeToursRequest 时遇到的错误或警告。
| 字段 | |
|---|---|
code |
验证错误由始终存在的 ( 此部分后面的字段提供了有关错误的更多背景信息。 多个错误:如果存在多个错误,验证过程会尝试输出其中的几个。与编译器类似,这是一个不完善的过程。某些验证错误是“致命”的,这意味着它们会停止整个验证过程。 稳定性: |
display_name |
错误显示名称。 |
fields[] |
错误上下文可能涉及 0 个、1 个(大多数情况下)或多个字段。例如,如需指明车辆 4 和货件 2 的首次取货,可以按如下方式操作: 不过请注意,对于给定的错误代码, |
error_message |
直观易懂的字符串,用于描述错误。 稳定性:不稳定:与给定 |
offending_values |
可能包含相应字段的值。此功能并非总是可用。您绝对不应依赖它,而应仅将其用于手动模型调试。 |
FieldReference
指定验证错误的上下文。FieldReference 始终是指此文件中的给定字段,并遵循相同的层次结构。例如,我们可以使用以下代码指定车辆 5 的 start_time_windows 的元素 2:
name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }
不过,我们会省略 OptimizeToursRequest 或 ShipmentModel 等顶级实体,以免消息过于拥挤。
| 字段 | |
|---|---|
name |
字段的名称,例如 “车辆”。 |
sub_field |
递归嵌套的子字段(如果需要)。 |
联合字段
|
|
index |
如果字段重复,则为字段的索引。 |
key |
如果相应字段是映射,则为键。 |
OutputConfig
为 [BatchOptimizeTours][google.maps.routeoptimization.v1.RouteOptimizationService.BatchOptimizeTours] 结果指定目的地。
| 字段 | |
|---|---|
data_format |
必需。输出数据格式。 |
联合字段 destination。必需。destination 只能是下列其中一项: |
|
gcs_destination |
要向其中写入输出的 Google Cloud Storage 位置。 |
RouteModifiers
封装了一组在计算车辆路线时要满足的可选条件。这与 Google Maps Platform Routes Preferred API 中的 RouteModifiers 类似;请参阅:https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers。
| 字段 | |
|---|---|
avoid_tolls |
指定是否在合理的情况下避开收费公路。系统会优先选择不包含收费公路的路线。仅适用于机动出行方式。 |
avoid_highways |
指定是否在合理的情况下避开高速公路。系统会优先选择不包含高速公路的路线。仅适用于机动出行方式。 |
avoid_ferries |
指定是否在合理的情况下避开轮渡。系统会优先选择不包含轮渡行程的路线。仅适用于机动出行方式。 |
avoid_indoor |
可选。指定是否在合理的情况下避免室内导航。系统会优先选择不包含室内导航的路线。仅适用于 |
发货
单个商品的运输,从取货点到送货点。只有当一辆唯一的车辆访问过某个取货地点(并相应地减少其剩余运力),然后稍后访问过某个送货地点(并相应地重新增加其剩余运力)后,相应货件才会被视为已完成。
| 字段 | |
|---|---|
display_name |
用户定义的货件显示名称。不得超过 63 个字符,可以使用 UTF-8 字符。 |
pickups[] |
与相应配送相关联的一组自提替代方案。如果未指定,车辆只需前往与配送对应的位置。 |
deliveries[] |
与相应货件相关的一组配送替代方案。如果未指定,车辆只需前往与上车点对应的位置。 |
load_demands |
货件的装载需求(例如重量、体积、托盘数量等)。映射中的键应是描述相应负载类型的标识符,最好还包含单位。例如:“weight_kg”“volume_gallons”“pallet_count”等。如果给定键未出现在映射中,则相应载荷将被视为 null。 |
allowed_vehicle_indices[] |
可能执行相应配送的一组车辆。如果为空,则所有车辆都可以执行该操作。车辆由其在 |
costs_per_vehicle[] |
指定每辆车在运送相应货物时产生的费用。如果指定,则必须具有以下任一值:
这些费用必须与 |
costs_per_vehicle_indices[] |
|
pickup_to_delivery_absolute_detour_limit |
指定与从上车点到送达点的最短路径相比,最长的绝对绕行时间。如果指定,则必须为非负值,并且相应配送必须至少包含取货和送货。 例如,假设 t 是从所选取货替代方案直接前往所选送货替代方案所需的最短时间。然后,设置 如果同一批货件同时指定了相对限制和绝对限制,则对于每个可能的取货/送货对,系统会使用限制更严格的那个。截至 2017 年 10 月,仅当出行时长不取决于车辆时,系统才支持绕行。 |
pickup_to_delivery_time_limit |
指定从取件开始到送达开始的货件最长时长。如果指定,则必须为非负值,并且相应货件必须至少包含取货和送货。这并不取决于为取货和送货选择的替代方案,也不取决于车辆速度。此参数可与绕行距离上限约束条件一起指定:解决方案将同时满足这两项规范。 |
shipment_type |
非空字符串,用于指定相应货件的“类型”。此功能可用于定义 与为单次访问指定的 |
label |
为相应配送指定标签。此标签会在相应 |
ignore |
如果为 true,则跳过相应配送,但不应用 如果模型中存在任何 允许忽略在 |
penalty_cost |
如果未完成配送,此罚款将添加到路线的总费用中。如果某个配送方案的取货和送货替代方案之一被访问,则该配送方案被视为已完成。费用可以采用模型中所有其他费用相关字段所用的相同单位表示,并且必须为正值。 重要提示:如果未指定此罚款,则视为无限期,即必须完成配送。 |
pickup_to_delivery_relative_detour_limit |
指定与从上车点到送达点的最短路径相比,最长的相对绕行时间。如果指定,则必须为非负值,并且相应配送必须至少包含取货和送货。 例如,假设 t 是从所选取货替代方案直接前往所选送货替代方案所需的最短时间。然后,设置 如果同一批货件同时指定了相对限制和绝对限制,则对于每个可能的取货/送货对,系统会使用限制更严格的那个。截至 2017 年 10 月,仅当出行时长不取决于车辆时,系统才支持绕行。 |
加载
在执行访问时,如果访问是取货,则可能会在车辆负荷中添加预定义量;如果访问是送货,则可能会减去预定义量。此消息定义了相应金额。请参阅 load_demands。
| 字段 | |
|---|---|
amount |
执行相应访问的车辆的负载量会有所不同。由于它是整数,因此建议用户选择合适的单位,以免损失精度。必须大于等于 0。 |
VisitRequest
车辆可完成的访问请求:具有地理位置(或两个,见下文)、以时间窗口表示的营业时间和结束时间,以及服务时长(车辆到达取货或送货地点后所花费的时间)。
| 字段 | |
|---|---|
arrival_location |
执行此 |
arrival_waypoint |
执行此 |
departure_location |
车辆在完成此 |
departure_waypoint |
车辆在完成此 |
tags[] |
指定附加到访问请求的标记。不允许使用空字符串或重复的字符串。 |
time_windows[] |
限制访问到达时间的时间窗口。请注意,车辆可能会在到达时间窗口之外出发,也就是说,到达时间 + 时长不必在时间窗口内。如果车辆在 缺少 时间窗口必须是不相交的,也就是说,任何时间窗口都不得与其他时间窗口重叠或相邻,并且必须按递增顺序排列。 只有在单个时间窗口的情况下才能设置 |
duration |
访问时长,即车辆从到达到离开所花费的时间(将添加到可能的等待时间;请参阅 |
cost |
在车辆路线中服务此访问请求的费用。此属性可用于为货件的每种替代自提或送货方式支付不同的费用。此费用必须与 |
load_demands |
加载相应访问请求的需求。此字段与 |
visit_types[] |
指定访问类型。这可用于分配车辆完成此访问所需的额外时间(请参阅 一种类型只能出现一次。 |
label |
为此 |
avoid_u_turns |
指定是否应避免在此位置的驾车路线中出现掉头。系统会尽力避免掉头,但无法保证完全避免。这是一项实验性功能,其行为可能会发生变化。 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request。 |
ShipmentModel
配送模型包含一组必须由一组车辆执行的配送任务,同时尽可能减少总费用,即以下各项的总和:
- 车辆的路线规划费用(所有车辆的总时间费用、出行时间费用和固定费用之和)。
- 未履行的配送违规处置。
- 全球货运时长的成本
| 字段 | |
|---|---|
shipments[] |
必须在模型中执行的一组货件。 |
vehicles[] |
可用于执行拜访的一组车辆。 |
objectives[] |
此模型的目标集,我们将将其转换为费用。如果非空,则输入模型必须是无成本的。如需获取修改后的请求,请使用 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。 |
global_start_time |
模型的全局开始时间和结束时间:超出此范围的时间均视为无效。 模型的跨度必须小于一年,即 使用 |
global_end_time |
如果未设置,则使用 1971 年 1 月 1 日 00:00:00 UTC(即秒数:31536000,纳秒数:0)作为默认值。 |
global_duration_cost_per_hour |
整个方案的“全局时长”是指所有车辆的最早有效开始时间与最晚有效结束时间之间的差值。用户可以为该数量分配每小时费用,以尝试优化最早完成作业的时间。此费用必须与 |
duration_distance_matrices[] |
指定模型中使用的时长和距离矩阵。如果此字段为空,系统会改用 Google 地图或测地线距离,具体取决于 用法示例:
|
duration_distance_matrix_src_tags[] |
用于定义时长矩阵和距离矩阵来源的标记; 标记对应于 |
duration_distance_matrix_dst_tags[] |
用于定义时长和距离矩阵的目的地的标记; 标记对应于 |
transition_attributes[] |
向模型添加了过渡属性。 |
shipment_type_incompatibilities[] |
一组不兼容的 shipment_types(请参阅 |
shipment_type_requirements[] |
一组 |
precedence_rules[] |
必须在模型中强制执行的一组优先级规则。 重要提示:使用优先级规则会限制可优化的问题的规模。使用包含大量货件的优先规则的请求可能会被拒绝。 |
max_active_vehicles |
限制有效车辆的最大数量。如果车辆的路线至少执行一次运输,则该车辆处于有效状态。如果司机数量少于车辆数量,且车辆类型各不相同,则可以使用此参数来限制路线数量。然后,优化功能会选择要使用的最佳车辆子集。必须严格为正。 |
DurationDistanceMatrix
指定从访问和车辆起始位置到访问和车辆结束位置的时长和距离矩阵。
| 字段 | |
|---|---|
rows[] |
指定时长和距离矩阵的行。它必须具有与 |
vehicle_start_tag |
用于定义相应时长和距离矩阵适用于哪些车辆的标记。如果为空,则表示适用于所有车辆,并且只能有一个矩阵。 每次车辆启动都必须与一个矩阵完全匹配,也就是说,车辆启动的 所有矩阵都必须具有不同的 |
行
指定时长和距离矩阵的一行。
| 字段 | |
|---|---|
durations[] |
指定行的时长值。它必须具有与 |
meters[] |
指定行的距离值。如果模型中没有任何费用或限制条件涉及距离,则可将此参数留空;否则,此参数的元素数量必须与 |
目标
目标会完全取代费用模型,因此与预先存在的费用不兼容。每个目标都会映射到一些预定义的费用,例如车辆、货件或过渡属性的费用。
实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/objectives/make-request。
| 字段 | |
|---|---|
type |
目标的类型。 |
weight |
相应目标相对于其他目标的权重。可以是任何非负数,权重不必总和为 1。权重默认为 1.0。 |
类型
将映射到一组费用的目标类型。
| 枚举 | |
|---|---|
DEFAULT |
系统将使用一组默认费用,以确保提供合理的解决方案。注意:此目标可以单独使用,但如果用户指定的目标中尚无此目标,系统也会始终以 1.0 的权重将其添加为基准目标。 |
MIN_DISTANCE |
“MIN”目标。最大限度地缩短总行驶距离。 |
MIN_WORKING_TIME |
最大限度地缩短所有车辆的总工作时间。 |
MIN_TRAVEL_TIME |
与上述相同,但仅关注出行时间。 |
MIN_NUM_VEHICLES |
尽量减少所用车辆的数量。 |
PrecedenceRule
两个事件(每个事件都是货件的取件或送货)之间的优先规则:“第二个”事件必须在“第一个”事件开始后至少 offset_duration 开始。
多个优先关系可以指代同一(或相关)事件,例如,“B 的取件时间在 A 的送达时间之后”以及“C 的取件时间在 B 的取件时间之后”。
此外,优先级仅在执行这两项运输时适用,否则会被忽略。
| 字段 | |
|---|---|
first_is_delivery |
表示“第一个”事件是否为送达事件。 |
second_is_delivery |
指示“第二个”事件是否为交付。 |
offset_duration |
“第一个”事件与“第二个”事件之间的偏移量。可以为负数。 |
first_index |
“第一个”事件的货件指数。必须指定此字段。 |
second_index |
“第二个”事件的货件指数。必须指定此字段。 |
ShipmentRoute
车辆的路线可以沿时间轴分解,如下所示(假设有 n 次访问):
| | | | | T[2], | | |
| Transition | Visit #0 | | | V[2], | | |
| #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
| aka T[0] | V[0] | | | V[n-2],| | |
| | | | | T[n-1] | | |
^ ^ ^ ^ ^ ^ ^ ^
vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
start (arrival) (departure) start end start end end
请注意,我们会区分以下情况:
- “准时事件”,例如车辆的开始和结束以及每次访问的开始和结束(也称为到达和离开)。它们发生在给定的秒数。
- “时间间隔”,例如访问本身以及访问之间的过渡。虽然时间间隔有时可能持续时间为零(即开始和结束时间在同一秒),但通常具有正持续时间。
不变量:
- 如果有 n 次访问,则有 n+1 次转化。
- 访问始终位于之前的过渡(相同索引)和之后的过渡(索引 + 1)之间。
- 车辆启动后始终会执行过渡 #0。
- 车辆结束时间始终位于过渡时间 #n 之前。
放大来看,在 Transition 和 Visit 期间会发生以下情况:
---+-------------------------------------+-----------------------------+-->
| TRANSITION[i] | VISIT[i] |
| | |
| * TRAVEL: the vehicle moves from | PERFORM the visit: |
| VISIT[i-1].departure_location to | |
| VISIT[i].arrival_location, which | * Spend some time: |
| takes a given travel duration | the "visit duration". |
| and distance | |
| | * Load or unload |
| * BREAKS: the driver may have | some quantities from the |
| breaks (e.g. lunch break). | vehicle: the "demand". |
| | |
| * WAIT: the driver/vehicle does | |
| nothing. This can happen for | |
| many reasons, for example when | |
| the vehicle reaches the next | |
| event's destination before the | |
| start of its time window | |
| | |
| * DELAY: *right before* the next | |
| arrival. E.g. the vehicle and/or | |
| driver spends time unloading. | |
| | |
---+-------------------------------------+-----------------------------+-->
^ ^ ^
V[i-1].end V[i].start V[i].end
最后,以下是过渡期间 TRAVEL、BREAKS、DELAY 和 WAIT 的安排方式。
- 它们不会重叠。
- 延迟时间是唯一的,并且必须是下一次访问(或车辆结束)之前的连续时间段。因此,只需知道延迟时长,即可知道延迟的开始时间和结束时间。
- BREAKS 是连续且不重叠的时间段。响应会指定每个广告插播的开始时间和时长。
- TRAVEL 和 WAIT 是“可抢占”的:在此过渡期间,它们可能会多次中断。客户端可以假设出行“尽快”发生,而“等待”则填补剩余时间。
一个(复杂)示例:
TRANSITION[i]
--++-----+-----------------------------------------------------------++-->
|| | | | | | | ||
|| T | B | T | | B | | D ||
|| r | r | r | W | r | W | e ||
|| a | e | a | a | e | a | l ||
|| v | a | v | i | a | i | a ||
|| e | k | e | t | k | t | y ||
|| l | | l | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
| 字段 | |
|---|---|
vehicle_index |
执行路线的车辆,由其在来源 |
vehicle_label |
执行此路线的车辆的标签,如果指定,则等于 |
vehicle_start_time |
车辆开始行驶路线的时间。 |
vehicle_end_time |
车辆完成路线的时间。 |
visits[] |
表示路线的有序到访序列。visits[i] 是路线中的第 i 次到访。如果此字段为空,则表示相应车辆未被使用。 |
transitions[] |
相应路由的有序转换列表。 |
has_traffic_infeasibilities |
当 由于交通状况导致出行时间估计值增加 |
route_polyline |
路线的编码多段线表示法。只有当 |
breaks[] |
执行此路线的车辆的预定休息时间。 |
metrics |
相应路线的时长、距离和负荷指标。 |
vehicle_fullness |
用于计算封顶指标与相应车辆限额的接近程度的 实验性:此字段的行为或存在状态将来可能会发生变化。 |
route_costs |
路线的费用,按与费用相关的请求字段细分。键是相对于输入 OptimizeToursRequest 的 proto 路径,例如“model.shipments.pickups.cost”,值是相应费用字段生成的总费用(在整个路线中汇总)。换句话说,costs["model.shipments.pickups.cost"] 是路线中所有取货费用的总和。模型中定义的所有费用都会在此处详细报告,但与 TransitionAttributes 相关的费用除外,这些费用自 2022 年 1 月起仅以汇总方式报告。 |
route_total_cost |
路线的总费用。费用地图中所有费用的总和。 |
休息时间
表示中断执行的数据。
| 字段 | |
|---|---|
start_time |
休息的开始时间。 |
duration |
休息时长。 |
EncodedPolyline
多段线的编码表示法。如需详细了解折线编码,请访问以下网址:https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding。
| 字段 | |
|---|---|
points |
表示多段线的编码点的字符串。 |
过渡
路线上的两个事件之间的过渡。请参阅 ShipmentRoute 的说明。
如果车辆没有 start_location 和/或 end_location,则相应的出行指标为 0。
| 字段 | |
|---|---|
travel_duration |
在此过渡期间的旅行时长。 |
travel_distance_meters |
过渡期间的行驶距离。 |
traffic_info_unavailable |
当通过 |
delay_duration |
应用于相应过渡的延迟时长的总和。如果有延迟,则延迟会在下一个事件(到访或车辆结束)开始前 |
break_duration |
相应过渡期间发生的插播时长总和(如有)。有关每个中断的开始时间和时长的详细信息存储在 |
wait_duration |
在此过渡期间花费的等待时间。等待时长对应于空闲时间,不包括休息时间。另请注意,此等待时间可能会分为几个不连续的时间段。 |
total_duration |
过渡的总时长,为方便起见而提供。它等于:
|
start_time |
相应过渡的开始时间。 |
route_polyline |
过渡期间所遵循路线的编码多段线表示法。只有当 |
route_token |
仅限输出。一个不透明的令牌,可传递给 Navigation SDK,以便在导航期间重建路线,并在重新规划路线时遵循创建路线时的原始意图。将此令牌视为不透明的 blob。请勿跨请求比较其值,因为即使服务返回完全相同的路线,其值也可能会发生变化。只有当 |
vehicle_loads |
相应车辆在过渡期间的载重,针对的是该车辆的 首次过渡期间的装载是车辆路线的起始装载。然后,在每次访问后,系统会根据访问是取货还是送货,将访问的 |
VehicleLoad
报告车辆在路线上的某个时间点的实际载重,适用于指定类型(请参阅 Transition.vehicle_loads)。
| 字段 | |
|---|---|
amount |
车辆上给定类型的负荷量。负载的单位通常由类型指示。请参阅 |
访问
在路线期间进行的拜访。此访问对应于 Shipment 的取件或送件。
| 字段 | |
|---|---|
shipment_index |
来源 |
is_pickup |
如果为 true,则表示相应访问是 |
visit_request_index |
|
start_time |
访问的开始时间。请注意,车辆可能会比此时间更早到达访问地点。时间与 |
load_demands |
总访问负荷需求,即运输和访问请求 |
detour |
由于在访问之前路线上的货件以及时间窗口可能造成的等待时间而产生的额外绕行时间。如果相应访问是送货访问,则绕行距离是从相应的取货访问计算得出的,等于: 否则,该值将根据车辆 |
shipment_label |
相应 |
visit_label |
相应 |
injected_solution_location_token |
一个不透明的令牌,表示有关访问位置的信息。 如果相应访问的 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/u-turn-avoidance/make-request。 |
ShipmentTypeIncompatibility
指定了不同货件(具体取决于其 shipment_type)之间的不兼容性。系统会根据不兼容模式限制同一路线中不兼容货件的显示。
| 字段 | |
|---|---|
types[] |
不兼容的类型列表。如果两批货件的 |
incompatibility_mode |
应用于不兼容性的模式。 |
IncompatibilityMode
用于定义如何限制同一路线上的不兼容货件的外观的模式。
| 枚举 | |
|---|---|
INCOMPATIBILITY_MODE_UNSPECIFIED |
未指定不兼容模式。不应使用此值。 |
NOT_PERFORMED_BY_SAME_VEHICLE |
在此模式下,类型不兼容的两批货物永远无法共用同一辆车。 |
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY |
在此模式下,两种不兼容类型的货物绝不能同时装在同一辆车上:
|
ShipmentTypeRequirement
根据货件的 shipment_type 指定货件之间的要求。要求的具体内容由要求模式定义。
| 字段 | |
|---|---|
required_shipment_type_alternatives[] |
|
dependent_shipment_types[] |
如果配送的类型在 注意:不允许出现 |
requirement_mode |
应用于要求的模式。 |
RequirementMode
用于定义路线上的相关货件外观的模式。
| 枚举 | |
|---|---|
REQUIREMENT_MODE_UNSPECIFIED |
未指定要求模式。不应使用此值。 |
PERFORMED_BY_SAME_VEHICLE |
在此模式下,所有“相关”货件都必须与至少一个“必需”货件共用同一辆车。 |
IN_SAME_VEHICLE_AT_PICKUP_TIME |
在 因此,“相关”取件必须满足以下条件之一:
|
IN_SAME_VEHICLE_AT_DELIVERY_TIME |
与之前相同,但“相关”货件在送达时需要随车携带“必需”货件。 |
SkippedShipment
指定解决方案中未执行的货件的详细信息。对于微不足道的情况和/或如果我们能够确定跳过的原因,我们会在此处报告原因。
| 字段 | |
|---|---|
index |
该指数对应于来源 |
label |
相应 |
reasons[] |
说明跳过相应配送的原因列表。请参阅上文中的注释 |
penalty_cost |
这是 实验性:此字段的行为或存在状态将来可能会发生变化。 |
estimated_incompatible_vehicle_ratio |
因以下至少一个原因而无法执行相应配送任务的车辆的估计比率。注意:仅当原因涉及车辆时才填写此字段。 实验性:此字段的行为或存在状态将来可能会发生变化。 |
原因
如果我们能说明为什么跳过相应配送,原因会列在此处。如果所有车辆的原因不尽相同,reason 将包含多个元素。跳过的配送不能有重复原因,即除了 example_vehicle_index 之外的所有字段都相同。示例:
reasons {
code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
example_vehicle_index: 1
example_exceeded_capacity_type: "Apples"
}
reasons {
code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
example_vehicle_index: 3
example_exceeded_capacity_type: "Pears"
}
reasons {
code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
example_vehicle_index: 1
}
跳过的配送与所有车辆都不兼容。每辆车超出容量或距离限制的原因可能各不相同,但至少有一辆车(包括车辆 1)的“苹果”容量会超出,至少有一辆车(包括车辆 3)的“梨”容量会超出,并且至少有一辆车(包括车辆 1)的距离限制会超出。
| 字段 | |
|---|---|
code |
请参阅代码的注释。 |
example_vehicle_indices[] |
与 实验性:此字段的行为或存在状态将来可能会发生变化。 |
example_exceeded_capacity_type |
如果原因代码为 |
example_vehicle_index |
如果原因是与货件-车辆不兼容相关,则此字段会提供相关车辆的索引。 |
代码
用于标识原因类型的代码。这里的顺序无关紧要。特别是,它不会指示在解决方案中,如果两个原因都适用,哪个原因会出现在另一个原因之前。
| 枚举 | |
|---|---|
CODE_UNSPECIFIED |
不应使用此值。 |
NO_VEHICLE |
模型中没有车辆导致所有配送都不可行。 |
DEMAND_EXCEEDS_VEHICLE_CAPACITY |
货件的需求超过了车辆的某些容量类型(包括 example_exceeded_capacity_type)的容量。 |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT |
执行此配送任务所需的最小距离(即从车辆的 请注意,在此计算中,我们使用的是测地线距离。 |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT |
执行此配送任务所需的最短时间(包括行驶时间、等待时间和服务时间)超过了车辆的 注意:出行时间是在最佳情况下计算的,即测地线距离 x 36 米/秒(大约 130 公里/小时)。 |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT |
与上述相同,但我们仅比较最短旅行时间和车辆的 travel_duration_limit。 |
CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS |
如果车辆在最早的开始时间开始配送,则在最佳情况下(有关时间计算,请参阅 CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT),车辆也无法完成此配送任务:总时间会导致车辆在最晚的结束时间之后结束配送。 |
VEHICLE_NOT_ALLOWED |
相应货件的 allowed_vehicle_indices 字段不为空,但相应车辆不属于该字段。 |
VEHICLE_IGNORED |
车辆的 实验性:此字段的行为或存在状态将来可能会发生变化。 |
SHIPMENT_IGNORED |
相应货件的 实验性:此字段的行为或存在状态将来可能会发生变化。 |
SKIPPED_IN_INJECTED_SOLUTION_CONSTRAINT |
在 实验性:此字段的行为或存在状态将来可能会发生变化。 |
VEHICLE_ROUTE_IS_FULLY_SEQUENCE_CONSTRAINED |
实验性:此字段的行为或存在状态将来可能会发生变化。 |
ZERO_PENALTY_COST |
相应货件的违规罚款为零。虽然这可以作为一种高级建模选择,但事后也可能解释了为什么跳过某次配送。 实验性:此字段的行为或存在状态将来可能会发生变化。 |
TimeWindow
时间窗口用于限制事件的时间,例如访问的到达时间或车辆的开始时间和结束时间。
硬时间窗口边界 start_time 和 end_time 会强制执行事件的最早时间和最晚时间,使得 start_time <= event_time <=
end_time。软时间窗口下限 soft_start_time 表示希望事件发生在 soft_start_time 或之后,但如果事件发生在 soft_start_time 之前,则会产生与发生时间早于 soft_start_time 的时长成正比的费用。软时间窗口上限 soft_end_time 表示希望事件在 soft_end_time 或之前发生,如果事件在 soft_end_time 之后发生,则会产生与发生时间成正比的费用。start_time、end_time、soft_start_time 和 soft_end_time 应在全局时间限制内(请参阅 ShipmentModel.global_start_time 和 ShipmentModel.global_end_time),并应遵守以下规则:
0 <= `start_time` <= `end_time` and
0 <= `start_time` <= `soft_start_time` and
0 <= `soft_end_time` <= `end_time`.
| 字段 | |
|---|---|
start_time |
硬性时间段的开始时间。如果未指定,则会设置为 |
end_time |
硬性时间段的结束时间。如果未指定,则会设置为 |
soft_start_time |
时间窗口的软开始时间。 |
soft_end_time |
时间窗口的软结束时间。 |
cost_per_hour_before_soft_start_time |
如果相应事件发生在 soft_start_time 之前,则添加到模型中其他费用的每小时费用,计算方式如下: 此费用必须为正值,并且只有在设置了 soft_start_time 的情况下才能设置此字段。 |
cost_per_hour_after_soft_end_time |
如果事件发生在 此费用必须为正数,并且只有在已设置 |
TransitionAttributes
指定路线中两次连续访问之间的过渡属性。同一过渡可能适用多个 TransitionAttributes:在这种情况下,所有额外费用都会累加,并应用最严格的限制(遵循自然的“AND”语义)。
| 字段 | |
|---|---|
src_tag |
用于定义这些属性所适用的 (src->dst) 过渡的标记。 当来源访问或车辆启动的 |
excluded_src_tag |
请参阅 |
dst_tag |
当目的地访问或车辆结束的 |
excluded_dst_tag |
请参阅 |
cost |
指定执行此过渡的费用。此值与模型中的所有其他费用采用相同的单位,且不得为负值。此费用是在所有其他现有费用的基础上收取的。 |
cost_per_kilometer |
指定在执行此过渡时,按行驶距离计算的每公里费用。它会累加车辆上指定的所有 |
distance_limit |
指定在执行此过渡时行驶的距离限制。 截至 2021 年 6 月,仅支持软限制。 |
delay |
指定执行此过渡时产生的延迟。 此延迟始终发生在完成来源访问之后和开始目标访问之前。 |
URI
指向可由路线优化 API 读取和写入的资源的通用资源标识符。
| 字段 | |
|---|---|
uri |
资源的 URI。资源可能尚不存在。 资源的内容编码为 JSON 或 textproto。仅支持 Google Cloud Storage 资源。如果资源以 JSON 格式编码,则资源名称必须以 |
交通工具
用于表示运送问题中的车辆。解决配送问题将为相应车辆构建一条从 start_location 开始到 end_location 结束的路线。路线是一系列访问(请参阅 ShipmentRoute)。
| 字段 | |
|---|---|
display_name |
用户定义的车辆显示名称。不得超过 63 个字符,可以使用 UTF-8 字符。 |
travel_mode |
出行模式,会影响车辆可行驶的道路及其行驶速度。另请参阅 |
route_modifiers |
一组需要满足的条件,这些条件会影响指定车辆的路线计算方式。 |
start_location |
车辆在取货前开始行驶的地理位置。如果未指定,车辆将从第一个上车点开始。如果配送模型具有时长和距离矩阵,则不得指定 |
start_waypoint |
表示车辆在取货前开始行驶的地理位置的途经点。如果未指定 |
end_location |
车辆在完成最后一次 |
end_waypoint |
航点,表示车辆在完成最后一次 |
start_tags[] |
指定附加到车辆路线起点的标记。 不允许使用空字符串或重复的字符串。 |
end_tags[] |
指定附加到车辆路线末尾的标记。 不允许使用空字符串或重复的字符串。 |
start_time_windows[] |
车辆可以从起始地点出发的时间段。它们必须在全局时间限制内(请参阅 属于同一重复字段的时间窗口必须是不相交的,即任何时间窗口都不能与另一个时间窗口重叠或相邻,并且它们必须按时间顺序排列。 只有在单个时间窗口的情况下才能设置 |
end_time_windows[] |
车辆可能到达最终位置的时间窗口。它们必须在全局时间限制内(请参阅 属于同一重复字段的时间窗口必须是不相交的,即任何时间窗口都不能与另一个时间窗口重叠或相邻,并且它们必须按时间顺序排列。 只有在单个时间窗口的情况下才能设置 |
unloading_policy |
在车辆上强制执行的卸货政策。 |
load_limits |
车辆的载重能力(例如重量、体积、托盘数量)。映射中的键是负载类型的标识符,与 |
cost_per_hour |
车辆费用:所有费用加起来必须与 车辆路线每小时的费用。此费用适用于路线的总耗时,包括出行时间、等待时间和游览时间。使用 |
cost_per_traveled_hour |
车辆路线每行驶小时的费用。此费用仅适用于路线所用的出行时间(即 |
cost_per_kilometer |
车辆路线的每公里费用。此费用适用于 |
fixed_cost |
如果使用相应车辆处理货件,则应用固定费用。 |
used_if_route_is_empty |
此字段仅适用于路线不包含任何货件的车辆。它用于指明在这种情况下是否应将车辆视为已使用。 如果为 true,车辆会从起点前往终点,即使它不运送任何货物,并且系统会考虑从起点到终点的行驶所产生的时间和距离成本。 否则,它不会从起始位置行驶到结束位置,并且不会为该车辆安排 |
route_duration_limit |
应用于车辆路线总时长的限制。在给定的 |
travel_duration_limit |
应用于车辆路线的行驶时长的限制。在给定的 |
route_distance_limit |
应用于车辆路线总距离的限制。在给定的 |
extra_visit_duration_for_visit_type |
指定从 visit_types 字符串到时长的映射。时长是指在具有指定 如果访问请求具有多种类型,则系统会为地图中的每种类型添加时长。 |
break_rule |
描述要在此车辆上强制执行的休息时间表。如果为空,则不会为相应车辆安排休息时间。 |
label |
指定相应车辆的标签。此标签会在响应中报告为相应 |
ignore |
如果为 true,则 如果某项配送任务由 如果某次配送由 |
travel_duration_multiple |
指定可用于增加或减少相应车辆的出行时间的乘数。例如,如果将此值设置为 2.0,则表示相应车辆速度较慢,行程时间是标准车辆的两倍。此倍数不会影响访问时长。如果指定了 警告:应用此倍数后,但在执行任何数值运算之前,出行时间将四舍五入到最接近的秒数,因此,较小的倍数可能会导致精度损失。 另请参阅下文中的 |
DurationLimit
用于定义车辆路线的最长时长的限制。可以是硬性或软性。
定义软限制字段时,必须同时定义软上限阈值及其关联的费用。
| 字段 | |
|---|---|
max_duration |
将时长限制为最多 max_duration 的硬性限制。 |
soft_max_duration |
一种不强制执行最长时长限制的软性限制,但违反此限制会导致路线产生费用。此费用会与模型中定义的其他费用相加,单位相同。 如果已定义, |
quadratic_soft_max_duration |
一种不强制执行最长时长限制的软性限制,但如果违反此限制,路线的费用将按时长的二次方计算。此费用会与模型中定义的其他费用相加,单位相同。 如果已定义,
|
cost_per_hour_after_soft_max |
如果违反 费用必须为非负数。 |
cost_per_square_hour_after_quadratic_soft_max |
如果违反 如果时长低于阈值,则额外费用为 0;否则,费用取决于时长,如下所示: 费用必须为非负数。 |
LoadLimit
定义适用于车辆的载重限制,例如“此卡车最多只能载重 3, 500 公斤”。请参阅 load_limits。
| 字段 | |
|---|---|
soft_max_load |
负载的软性限制。请参阅 |
cost_per_unit_above_soft_max |
如果车辆在行驶路线上的任何时间点负载超过 |
start_load_interval |
车辆在路线开始时的可接受载荷区间。 |
end_load_interval |
路线结束时车辆的可接受装载间隔。 |
max_load |
可接受的最大负载量。 |
cost_per_kilometer |
此车辆每移动 1 个单位的负荷 1 公里的费用。这可用作燃料消耗量的代理变量:如果负荷是重量(以牛顿为单位),则负荷*公里具有能量的维度。 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。 |
cost_per_traveled_hour |
此车辆在 1 小时内运输一个单位的负载所需的费用。 实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。 |
间隔
可接受的负载量区间。
| 字段 | |
|---|---|
min |
|
max |
可接受的最大负荷。必须大于等于 0。如果未指定,则此消息不会限制最大负载。如果同时指定了这两个参数,则 |
LoadCost
在 Transition 期间移动一个单位的负载所需的费用。对于给定的负载,费用是以下两部分的总和:
- min(load,
load_threshold) *cost_per_unit_below_threshold - max(0, load -
load_threshold) *cost_per_unit_above_threshold
在这种费用下,解决方案会优先满足高需求,或者等效地最后满足高需求。例如,如果车辆有
load_limit {
key: "weight"
value {
cost_per_kilometer {
load_threshold: 15
cost_per_unit_below_threshold: 2.0
cost_per_unit_above_threshold: 10.0
}
}
}
其路线为:起点、取货点、取货点、送货点、送货点、终点,并包含以下过渡:
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
那么,此 LoadCost 产生的费用为(低于成本 * 低于的负荷 * 公里数 + 高于成本 * 高于的负荷 * 公里数)
- 过渡 0:0.0
- 过渡 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- 过渡 2:2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
- 过渡 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- 过渡 4:0.0
因此,该路线上的 LoadCost 为 120.0。
不过,如果路线是“起点、取货点、送货点、取货点、送货点、终点”,且包含以下过渡:
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
travel_distance_meters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
travel_distance_meters: 1000.0 }
那么此 LoadCost 产生的费用为
- 过渡 0:0.0
- 过渡 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- 过渡 2:0.0
- 过渡 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
- 过渡 4:0.0
这里,路线的 LoadCost 为 40.0。
LoadCost 会使具有繁重过渡的解决方案更加昂贵。
实验性功能:如需了解详情,请参阅 https://developers.google.com/maps/tt/route-optimization/experimental/load-cost/make-request。
| 字段 | |
|---|---|
load_threshold |
负载量,当负载量超过此值时,单位负载的费用将从 cost_per_unit_below_threshold 变为 cost_per_unit_above_threshold。必须大于等于 0。 |
cost_per_unit_below_threshold |
移动一个单位的负载的费用,适用于 0 到阈值之间的每个单位。必须是有限值,且大于等于 0。 |
cost_per_unit_above_threshold |
移动一个单位的负载(对于超出阈值的每个单位)的费用。如果阈值为 0,则表示每单位固定费用。必须是有限值,且大于等于 0。 |
TravelMode
车辆可使用的出行方式。
这些应是 Google Maps Platform Routes API 出行模式的子集,请参阅:https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteTravelMode
注意:WALKING 路线目前处于 Beta 版阶段,有时可能没有明确的人行道或步道。您必须向用户显示此警告,以告知用户您在应用中显示的所有步行路线。
| 枚举 | |
|---|---|
TRAVEL_MODE_UNSPECIFIED |
未指定的出行方式,相当于 DRIVING。 |
DRIVING |
与行车路线(驾车等)对应的出行模式。 |
WALKING |
与步行路线对应的出行方式。 |
UnloadingPolicy
有关如何卸载车辆的政策。仅适用于同时包含取件和送达的货件。
其他货件可以免费在路线上的任何位置发生,不受 unloading_policy 的限制。
| 枚举 | |
|---|---|
UNLOADING_POLICY_UNSPECIFIED |
未指定卸货政策;送货必须在相应的取货之后进行。 |
LAST_IN_FIRST_OUT |
送货必须按取货的相反顺序进行 |
FIRST_IN_FIRST_OUT |
送货顺序必须与取货顺序相同 |
VehicleFullness
VehicleFullness 是一种用于计算车辆满载程度的指标。每个 VehicleFullness 字段的值都介于 0 和 1 之间,计算方式为有上限的指标字段(例如 AggregatedMetrics.travel_distance_meters)与其相关车辆限值(例如 Vehicle.route_distance_limit)的比率(如果存在)。否则,饱腹感比率将保持未设置状态。如果限制为 0,则该字段设置为 1。注意:如果路线存在流量不可行性,某些原始满载率可能会超过 1.0,例如,车辆可能会超出其距离限制。在这些情况下,我们会将饱腹度值上限设为 1.0。
| 字段 | |
|---|---|
max_fullness |
相应消息中所有其他字段的最大值。 |
distance |
|
travel_duration |
[AggregatedMetrics.travel_duration_seconds][] 与 |
active_duration |
[AggregatedMetrics.total_duration_seconds][] 与 |
max_load |
所有类型的 [AggregatedMetrics.max_load][] 及其各自的 |
active_span |
给定车辆的 (vehicle_end_time - vehicle_start_time) / (latest_vehicle_end_time - earliest_vehicle_start_time) 比率。如果不存在分母,则使用 ( |
航点
封装了途经点。途经点用于标记 VisitRequest 的到达和出发位置,以及车辆的起始和结束位置。
| 字段 | |
|---|---|
side_of_road |
可选。表示此航点的位置旨在让车辆优先停靠在道路的特定一侧。设置此值后,路线将经过相应位置,以便车辆停靠在道路中心偏向该位置的一侧。此选项不适用于“步行”出行方式。 |
vehicle_stopover |
表示该航点供车辆停靠,目的是接载或送达乘客。此选项仅适用于“DRIVING”出行模式,且“location_type”为“location”。 实验性:此字段的行为或存在状态将来可能会发生变化。 |
联合字段 location_type。表示位置的不同方式。location_type 只能是下列其中一项: |
|
location |
使用地理坐标指定的点,包括可选的航向。 |
place_id |
与途经点关联的 POI 地点 ID。 使用地点 ID 指定 VisitRequest 的到达或出发地点时,请使用足够具体的地点 ID 来确定前往该地点的导航 LatLng 位置。例如,表示建筑物的地点 ID 适合,但表示道路的地点 ID 不建议使用。 |