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
}
}
}