Route Optimization API は、対応するリクエストで車両のルートを返します。配送は車両に割り当てられるか、リクエストのプロパティに応じてスキップされます。
OptimizeToursResponse
メッセージ(REST、gRPC)には、次の 2 つの主要なトップレベル プロパティがあります。
routes[]
は、各車両に配送が割り当てられているルートです。各Route
には、個々のルートのプロパティを反映する指標が含まれています。metrics
は、すべての車両とルートプランにわたるレスポンス全体の集計指標です。トップレベル指標には、ルートごとの指標と同じプロパティが含まれ、値はすべて Route で集計されます。
最適化の結果によっては、一部のプロパティに値が入力されない場合があります。
skippedShipments[]
は、どの車両でも実施されていない配送を一覧表示します。 指定した制約内で配送を実行できない場合、または配送にかかる費用がペナルティ費用を超えた場合、配送はスキップできます。たとえば、荷物の集荷または配達のtimeWindow
が非常に狭い場合、必要な時間枠内に車両が訪問を行うことは不可能であるか、費用対効果がない可能性があります。validationErrors[]
は、リクエストのsolvingMode
がVALIDATE_ONLY
に設定されている場合に、リクエストを無効にするエラーまたは解決できないエラーを指定します。通常のDEFAULT_SOLVE
モードでは、検証エラーはレスポンスの本文ではなくエラー メッセージに表示されます。VALIDATE_ONLY
解決モードでは、複数のエラーを一度に報告できるため、リクエストを迅速にデバッグできます。
ルートのプロパティ
各 routes[]
エントリは ShipmentRoute
メッセージ(REST、gRPC)です。各 ShipmentRoute
は、リクエストによる特定の車両のルート割り当てを表します。対応する Vehicle
に関連する重要な ShipmentRoute
プロパティは次のとおりです。
vehicleIndex
は、対応するリクエスト メッセージのVehicle
のゼロベースのインデックスです。値がゼロの場合、REST のレスポンスではこのプロパティが省略されます。vehicleStartTime
は、車両がルートを開始する必要がある時刻です。vehicleEndTime
は、車両がルートを完了する予定時刻です。
レスポンスでは、routes
は次のようになります。
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
...
],
"transitions": [
...
],
"metrics": {
...
},
...
}
],
...
}
各 ShipmentRoute
には、車両が完成する visits
の順序付きリストが含まれています。各 Visit
(REST、gRPC)は、対応するリクエストからの VisitRequest
(REST、gRPC)を表します。重要な Visit
プロパティは次のとおりです。
shipmentIndex
は、この訪問が対応するリクエストで属している配送のゼロベースのインデックスです。isPickup
は、訪問が受け取りの場合は true、訪問が配達の場合は false です。値が false の場合、REST レスポンスではこのプロパティが省略されます。visitRequestIndex
は、Visit
が表す対応するリクエストのShipment.pickups
またはShipment.deliveries
からのVisitRequest
のゼロベースのインデックスです。値がゼロの場合、REST レスポンスではこのプロパティが省略されます。startTime
は訪問の開始予定時刻です。loadDemands
は、Visit
を完了するために要求される読み込み量に読み込みタイプをマッピングします。配達訪問の積荷量は負であり、車両から取り除かれている荷物の負荷を表します。
Visit
の例を次に示します。
{
"routes": [
{
...
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
...
],
},
...
],
...
}
各 ShipmentRoute
には、特定の車両の visits
間の移動を表す transitions
の順序付きリストが含まれます。重要な Transition
メッセージ(REST、gRPC)プロパティには次のものがあります。
startTime
は車両が遷移を開始する時刻です。travelDuration
は、遷移を完了するために車両が走行しなければならない時間です。travelDistanceMeters
は、遷移を完了するために車両が移動する必要がある距離(メートル単位)です。trafficInfoUnavailable
は、移行でトラフィック データを使用できるかどうかを示します。waitDuration
は、次のVisit
が開始されるまでに車両が待機しているアイドル時間を表します。これは、次のVisit
のstart_time
が原因で発生する可能性があります。totalDuration
は、移動時間、待機時間、ブレーク時間、遅延時間を含む、遷移の合計時間です。vehicleLoads
は、この遷移中に車両が担う負荷に負荷タイプをマッピングします。
Transition
の例を次に示します。
{
"routes": [
{
...
"transitions": [
...
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
...
],
...
}
],
...
}
vists
と transitions
の関係は、受け取りと配達の停止順序の最適化と、ShipmentRoute
リファレンス ドキュメント(REST、gRPC)で説明されています。
指標のプロパティ
Metrics
メッセージ(REST、gRPC)にはソリューション全体の要約が表示されます。重要な Metrics
プロパティは次のとおりです。
totalCost
は、ルートの完了にかかる合計費用です。費用の詳細については、コストモデル パラメータをご覧ください。usedVehicleCount
は、ソリューションで使用される車両の総数です。オプティマイザーがルートの使用が必要ではないと判断した場合、車両は空のルートを持つことがあります。skippedMandatoryShipmentCount
は、「必須」のスキップされた配送の数です。必須の配送では、配送がスキップされた場合に発生するpenaltyCost
は指定されていません。必須の配送は、指定された制約の下でパフォーマンスを実現できない場合はスキップできます。費用の詳細については、費用モデル パラメータをご覧ください。
追加の指標は、AggregatedMetrics
メッセージ(REST、gRPC)として報告されます。AggregatedMetrics
メッセージ タイプは Metrics.aggregatedRouteMetrics
プロパティに使用され、ShipmentRoute.metrics
プロパティ Metrics.aggregatedRouteMetrics
には OptimizeToursResponse
のすべての ShipmentRoute
から集計された指標が含まれます。各 ShipmentRoute.metrics
プロパティには、特定の ShipmentRoute
の指標が含まれます。
重要な AggregatedMetrics
プロパティは次のとおりです。
performedShipmentCount
は、ルート全体で車両が行った出荷の回数です。travelDuration
は、ルートが完了するまでの車両の移動の合計時間です。waitDuration
は、車両がルートを完了するまでの待機時間の合計です。delayDuration
は車両の合計遅延時間です。リクエストでTransitionAttributes
が使用されている場合を除き、この値は通常ゼロになります。breakDuration
は、車両がルートを完了するまでの休憩時間の合計です。visitDuration
は、車両がルートを完了するまでに訪問した合計時間です。これは実質的に、該当する車両に割り当てられたVisit
に対応するVisitRequest
のすべてのVisitRequest.duration
値の合計です。totalDuration
は、車両のルートを完了するために必要な合計時間です。travelDistanceMeters
は、ルートの完成までに車両が走行した合計距離です。maxLoads
は、ルート上の任意の地点で車両が運ぶ最大積荷量に負荷タイプをマッピングします。
Metrics
メッセージの例を次に示します。
{
"routes": [
...
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}
完全なサンプルコード
リクエストの作成でのリクエストに対するレスポンスの完全な例は、以下のようになります。
{
"routes": [
{
"vehicleStartTime": "2024-02-13T00:00:00Z",
"vehicleEndTime": "2024-02-13T00:38:42Z",
"visits": [
{
"isPickup": true,
"startTime": "2024-02-13T00:00:00Z",
"detour": "0s"
},
{
"startTime": "2024-02-13T00:19:31Z",
"detour": "0s"
}
],
"transitions": [
{
"travelDuration": "0s",
"waitDuration": "0s",
"totalDuration": "0s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1171s",
"travelDistanceMeters": 9004,
"waitDuration": "0s",
"totalDuration": "1171s",
"startTime": "2024-02-13T00:00:00Z"
},
{
"travelDuration": "1151s",
"travelDistanceMeters": 9599,
"waitDuration": "0s",
"totalDuration": "1151s",
"startTime": "2024-02-13T00:19:31Z"
}
],
"metrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"routeCosts": {
"model.vehicles.cost_per_kilometer": 18.603
},
"routeTotalCost": 18.603
}
],
"metrics": {
"aggregatedRouteMetrics": {
"performedShipmentCount": 1,
"travelDuration": "2322s",
"waitDuration": "0s",
"delayDuration": "0s",
"breakDuration": "0s",
"visitDuration": "0s",
"totalDuration": "2322s",
"travelDistanceMeters": 18603
},
"usedVehicleCount": 1,
"earliestVehicleStartTime": "2024-02-13T00:00:00Z",
"latestVehicleEndTime": "2024-02-13T00:38:42Z",
"totalCost": 18.603,
"costs": {
"model.vehicles.cost_per_kilometer": 18.603
}
}
}