Route Optimization API は、対応するリクエストの車両のルートを返します。リクエストのプロパティに応じて、配送が車両に割り当てられるか、スキップされることがあります。
OptimizeToursResponse メッセージ(REST、gRPC)には、主に 2 つのトップレベル プロパティがあります。
routes[]は、割り当てられた荷物を含む各車両のルートです。各Routeには、個々のルートのプロパティを反映する指標が含まれています。metricsは、すべての車両とルートプランにわたるレスポンス全体の集計指標です。トップレベルの指標には、ルートごとの指標と同じプロパティが含まれており、値はすべてのルートで集計されます。
最適化の結果によっては、一部のプロパティが常に設定されるとは限りません。
skippedShipments[]には、車両によって実行されていない配送が一覧表示されます。指定された制約内で実行できない場合や、配送の実行費用がペナルティ費用を超える場合は、配送をスキップできます。たとえば、荷物の集荷または配達のtimeWindowが非常に狭い場合、車両が指定された時間枠内に訪問を実行することが不可能または費用対効果が低い可能性があります。validationErrors[]は、リクエストのsolvingModeがVALIDATE_ONLYに設定されている場合に、リクエストを無効にするか、解決不可能にするエラーを指定します。通常のDEFAULT_SOLVEモードでは、検証エラーはレスポンス本文ではなくエラー メッセージに表示されます。VALIDATE_ONLY解決モードでは、複数のエラーを一度に報告できます。これは、リクエストを迅速にデバッグする場合に便利です。
ルート プロパティ
各 routes[] エントリは ShipmentRoute メッセージ(REST、gRPC)です。各 ShipmentRoute は、リクエストの特定の車両のルート割り当てを表します。対応する Vehicle に関連する重要な ShipmentRoute プロパティは次のとおりです。
vehicleIndexは、対応するリクエスト メッセージ内のVehicleのゼロから始まるインデックスです。値が 0 の場合、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は、この訪問が属する配送の 0 ベースのインデックスです。isPickupは、訪問が集荷の場合は true、配達の場合は false です。値が false の場合、REST レスポンスではこのプロパティは省略されます。visitRequestIndexは、Visitが表す対応するリクエストのShipment.pickupsまたはShipment.deliveriesからのVisitRequestのゼロベースのインデックスです。値が 0 の場合、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)をご覧ください。Transition メッセージの routePolyline プロパティと routeToken プロパティの詳細については、トランジション ポリラインとルートトークンをご覧ください。
指標のプロパティ
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が使用されていない限り、この値は 0 です。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
}
}
}