車両のルートを時間軸に沿って分解すると、次のようなようになります(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 を配置する方法について説明します。
- 重複していない。
- DELAY は一意で、次の訪問(または車両の終了)の直前の連続した期間である必要があります。したがって、遅延時間がわかれば、開始時間と終了時間を把握できます。
- 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 | | | | ||
|| | | | | | | ||
--++-----------------------------------------------------------------++-->
JSON 表現 |
---|
{ "vehicleIndex": integer, "vehicleLabel": string, "vehicleStartTime": string, "vehicleEndTime": string, "visits": [ { object ( |
フィールド | |
---|---|
vehicle |
ルートを実行する車両。ソース |
vehicle |
このルートを運行する車両のラベル(指定されている場合は |
vehicle |
車両がルートを開始する時刻。 RFC3339 UTC「Zulu」形式のタイムスタンプ。精度はナノ秒まで、小数点以下は最大 9 桁。例: |
vehicle |
車両がルートを完了した時刻。 RFC3339 UTC「Zulu」形式のタイムスタンプ。精度はナノ秒まで、小数点以下は最大 9 桁。例: |
visits[] |
ルートを表す訪問地の順序付きシーケンス。visits[i] はルートの i 番目の訪問地です。このフィールドが空の場合、車両は未使用と見なされます。 |
transitions[] |
ルートの遷移の順序付きリスト。 |
has |
交通渋滞により推定所要時間 |
route |
ルートのエンコードされたポリライン表現。このフィールドは、 |
breaks[] |
このルートを運行する車両に設定されている休憩。 |
metrics |
このルートの所要時間、距離、負荷の指標。 |
route |
ルートの費用(費用関連のリクエスト フィールド別)。キーは、入力 OptimizeToursRequest を基準としたプロトパスです(例: model.shipments.pickups.cost)。値は、対応する費用フィールドによって生成された合計費用で、ルート全体で集計されます。つまり、costs["model.shipments.pickups.cost"] は、ルート全体の集荷費用の合計です。モデルで定義されているすべての費用が、ここで詳細にレポートされます。ただし、TransitionAttributes に関連する費用は、2022 年 1 月時点では集計された形でのみレポートされます。 |
route |
ルートの合計費用。費用マップ内のすべての費用の合計。 |
アクセス
ルート中に行われた訪問。この訪問は、Shipment
の集荷または配送に対応します。
JSON 表現 |
---|
{
"shipmentIndex": integer,
"isPickup": boolean,
"visitRequestIndex": integer,
"startTime": string,
"loadDemands": {
string: {
object ( |
フィールド | |
---|---|
shipment |
ソース |
is |
true の場合、訪問は |
visit |
|
start |
訪問の開始時間。車両は、この時間より前に訪問先に到着する場合があります。時刻は RFC3339 UTC「Zulu」形式のタイムスタンプ。精度はナノ秒まで、小数点以下は最大 9 桁。例: |
load |
配送と訪問リクエストの合計として、合計訪問負荷需要 |
detour |
配達員が訪問する前にルートで配達された荷物や、時間帯制限による待ち時間によって発生する追加の迂回時間。訪問が配達の場合、迂回距離は対応する集荷訪問から計算され、次のように算出されます。
それ以外の場合は、車両の
|
shipment |
対応する |
visit |
対応する |
移行
ルート上の 2 つのイベント間の遷移。ShipmentRoute
の説明をご覧ください。
車両に startLocation
または endLocation
がない場合、対応する移動指標は 0 になります。
JSON 表現 |
---|
{ "travelDuration": string, "travelDistanceMeters": number, "trafficInfoUnavailable": boolean, "delayDuration": string, "breakDuration": string, "waitDuration": string, "totalDuration": string, "startTime": string, "routePolyline": { object ( |
フィールド | |
---|---|
travel |
この移行期間中の移動時間。
|
travel |
移行中に移動した距離。 |
traffic |
|
delay |
この遷移に適用される遅延時間の合計。遅延がある場合は、次のイベント(訪問または車両の終了)の
|
break |
この移行中に発生した休憩時間の合計(ある場合)。各休憩の開始時間と所要時間の詳細は
|
wait |
この移行中に待機した時間。待ち時間はアイドル時間に対応し、休憩時間は含まれません。また、この待ち時間は連続していない複数の区間に分割される場合があります。
|
total |
移行の合計時間(便宜上提供)。これは次と等しい。
|
start |
この移行の開始時間。 RFC3339 UTC「Zulu」形式のタイムスタンプ。精度はナノ秒まで、小数点以下は最大 9 桁。例: |
route |
遷移中にたどったルートのエンコードされたポリライン表現。このフィールドは、 |
route |
出力専用。Navigation SDK に渡してナビゲーション中にルートを再構築できる不透明なトークン。ルートの再ルーティングが発生した場合、ルートの作成時の元の意図が尊重されます。このトークンは不透明な blob として扱います。サービスがまったく同じルートを返しても値が変更される可能性があるため、リクエスト間で値を比較しないでください。このフィールドは、 |
vehicle |
この移行中の車両の積載量(この車両の 最初の移行中の負荷は、車両ルートの開始負荷です。その後、各訪問後に、訪問の |
EncodedPolyline
ポリラインのエンコード表現。ポリラインのエンコードの詳細については、https://developers.google.com/maps/documentation/utilities/polylinealgorithm https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding をご覧ください。
JSON 表現 |
---|
{ "points": string } |
フィールド | |
---|---|
points |
ポリラインのエンコードされた点を示す文字列。 |
休憩
ブレークの実行を表すデータ。
JSON 表現 |
---|
{ "startTime": string, "duration": string } |
フィールド | |
---|---|
start |
休憩の開始時間。 RFC3339 UTC「Zulu」形式のタイムスタンプ。精度はナノ秒まで、小数点以下は最大 9 桁。例: |
duration |
休憩時間。
|