ルートプランのライフサイクル

このページでは、Route Optimization API を使用したルートプランのライフサイクルについて説明します。このライフサイクルは、ルートのニーズの特定から始まり、システムに統合されたルートプランで終了します。

ルートプランのステージに沿って進むと、次の目標を達成できます。

  • フリート オペレーションをマッピングする: 物理的なフリート、複雑な制約、ビジネス目標を API のコードに変換します。
  • ビジネスに合わせてルート計画を最適化する: ルート計画を調整して、目標を達成し、日常業務を改善する方法を理解します。
  • 本番環境にデプロイする: ルートプランを日常業務に組み込んで実装します。

次の図は、ルートプランのライフサイクルを示しています。

以下のテキストで説明されているルートプランのライフサイクルを示すフロー図

ルートプランの実装フェーズは、API を初めて統合するとき、またはビジネス要件が大幅に変更されたときに発生します。ステージ 1 ~ 5 が対象です。

日常業務フェーズはより軽量で、改良は最小限に抑えられます。ステージ 2 から 4 までを対象としています。

ルートのライフサイクルの各段階は次のとおりです。

  1. 問題をスコープする: API の使用を開始する前に、目標、リソース、タスク、制約を特定して整理し、オペレーションの全体像を把握します。
  2. データをマッピングする: ビジネスの実態を API パラメータに変換して、ルートプランにフリートの運用方法が反映されるようにします。
  3. リクエストを作成してルートプランを取得する: API にデータを入力して、最適化されたルートプランを取得します。
  4. ルートプランを改良する: ルートプランをテストし、制約と目標を調整して、すべてのニーズに対応できるようにします。
  5. ルートプランを統合する: ルートプランを既存のシステムに接続して、実用的なナビゲーションを提供します。

問題の範囲を特定する

API を使用する前に、日々の運用の詳細を明確なデータ カテゴリに整理する必要があります。これにより、現在のリソースとタスク、それらの制約、フリートで達成したい目標を明確にして、実装プロセスを開始できます。

リソースとタスクを特定する

ルートプランを計画するうえで重要なステップは、リソースとタスク(車両と配送)を特定することです。

車両 配送
  • 台数: 車両の台数
  • 場所: 車両の出発地と目的地はどこですか?
  • 時間: 車両の運転手の勤務時間はどのくらいですか?
  • 容量: 車両の制限は何ですか?
  • 費用: フリートの運用費用はどのくらいですか?
  • 場所: 集荷場所と配達場所はどこですか?
  • 要件: 荷物の重量またはサイズはどのくらいですか?
  • 制約: 納品に特定の期間はありますか?
  • サービス時間: ドライバーが駐車して荷物を降ろすのに必要な時間。
  • 要件: 配送に特定の車両タイプやドライバーが必要かどうか。

制約を特定する

制約とは、車両の使用方法と配送の処理方法に関する制限です。ほとんどのオペレーションを決定し、最適化されたルートプランを作成するうえで不可欠です。

制約は一般に次の 2 つのカテゴリに分類されます。

厳格な制約 ソフト制約
これらは破ることができない上限です。たとえば、トラックは最大積載量を超える荷物を運ぶことはできません。また、ドライバーは店舗の閉店後に集荷することはできません。 これらは、必要に応じて違反できる設定であり、通常はペナルティ費用が発生します。たとえば、トラックの積載量を 80% に抑えたい、目標時間より前に配達したいといった希望があるものの、より良いルートが見つかるなら、これらの制限を超えても構わない、といった場合です。

一般的な制約には、次のようなものがあります。

  • 容量制限: 車両が運搬できるアイテムの最大重量、最大容量、最大数。
  • 時間枠: 訪問可能な特定の時間帯、または運転手の特定の勤務時間。
  • 費用: 車両の運行費用または配送のスキップ費用。この API の主な目的の一つは、費用対効果の高いルートプランを生成することです。
  • ドライバーの休憩: 通常、労働法で定められている、一定の労働時間後のドライバーの休憩時間。

ビジネスの目標を確立する

リソース、タスク、制限を確立したら、ビジネスにとって最も重要な指標を確立します。これらの目標は制約と密接に関連しており、ルートを計画する際に最も重要なことを判断するのに役立ちます。

ビジネス目標の例としては、次のようなものがあります。

規模 距離 時間 費用
使用する車両の数を最小限に抑えるか、すべての車両を使用して作業日を早く終わらせるかを選択します。 燃料を節約するために最短ルートを選択しますか?それとも、高速道路を使用するため距離は長くなるものの、より速いルートを選択しますか? 合計作業時間を最小限に抑えたいですか?それとも、特定の時間に到着することを優先して、ルートに費やす時間を長くしたいですか? 賃金や燃料などの運用費用を最小限に抑えたいですか?それとも、厳しい納期に間に合わせるために、より高い費用を受け入れますか?

データをマッピングする

データを収集したら、API のプロパティに一致するようにマッピングします。これにより、最適化ツールはビジネスの現実を考慮したルートプランを返すためのすべての情報を取得します。

次の表のパラメータを使用して、問題の範囲を特定するセクションでマッピングしたリソース、タスク、制約、目標をマッピングします。

変数のマッピング

実際のコンセプト API パラメータ 説明
ドライバーまたは車両 model.vehicles[] フリート内の 1 台の車両を表します。
デポの場所 vehicles[].startWaypoint
vehicles[].endWaypoint
車両がルートを開始および終了する場所。
営業時間 model.globalStartTime
model.globalEndTime
フリート全体のオペレーションの最も早い開始時刻と最も遅い終了時刻。
タスクまたはパッケージ model.shipments[] ジョブを表します。pickup、delivery、またはその両方を指定できます。
タスクの場所 pickups[].arrivalWaypoint
deliveries[].arrivalWaypoint
ジョブが行われる地理的位置。
サービス時間 pickups[].duration
deliveries[].duration
タスクを完了するためにその場所で費やした時間(荷降ろしなど)。移動時間は含まれません。

制約マッピング

現実世界の制約 API パラメータ 説明
車両の容量 vehicles[].loadLimits 車両の定員の上限(ハードまたはソフト)を設定します。荷物の loadDemand が残りの上限を超えている場合、割り当てられません。
パッケージ サイズ shipments[].loadDemands 配送が消費する車両容量。
車両の制限 shipments[].allowedVehicleIndices 特定の車両またはドライバーのみが荷物を集荷または配達できるように、配送を制限します。
営業時間 shipments[].pickups[].timeWindows または shipments[].deliveries[].timeWindows 場所を訪問できる時間を設定します。車両がこの時間枠内に到着できない場合、配送はスキップされます。
シフトの長さの上限 vehicles[].routeDurationLimit グローバルな終了時間に関係なく、特定のドライバーが作業できる時間(例: 最大 8 時間)にハードまたはソフトの上限を設定します。
ドライバーの休憩 vehicles[].breakRule 特定の労働時間後の休憩の義務など、特定の休憩ルールを適用します。
道路の規制 vehicles[].travelMode 移動手段(DRIVE、BICYCLE など)を指定します。これにより、ルートが合法的な道路に制限され、移動時間の計算に使用される速度が決定されます。

目標のマッピング

実世界の目標 API パラメータ 説明
フリートサイズを最小化する vehicles[].fixedCost 車両の使用に 1 回限りの費用を適用します。固定費が高いと、合計距離や作業時間を増やすよりも、使用する車両を減らすことが優先されます。
距離を最小限に抑える vehicles[].costPerKilometer 走行距離 1 キロメートルごとに費用を適用します。燃料の節約と摩耗の軽減のために、より短いルートを優先します。
合計時間を最小化する vehicles[].costPerHour 車両が稼働している時間(移動時間と待ち時間を含む)ごとに費用を適用します。完了までの時間を短縮することを優先します。
Minimize drive time vehicles[].costPerTraveledHour 移動に費やした時間に対して費用を適用します。これにより、渋滞に巻き込まれている(費用が高い)場合と、停留所で待機している(費用が安い可能性がある)場合を区別できます。
特定のタスクを優先する shipments[].penaltyCost 特定の配送がスキップされた場合に費用を適用します。この値を高く設定すると、重要なタスクがオプションのタスクよりも優先されます。

リクエストを作成してレスポンスを取得する

Route Optimization API を使用してルートプランを生成する手順は次のとおりです。

  1. 環境を構成する: Google Cloud プロジェクトを設定し、API を有効にして、認証を構成します。手順については、スタートガイドをご覧ください。この手順は 1 回だけ行ってください。
  2. リクエストを送信する: 前のセクションで定義したデータ マッピングを使用してリクエスト本文を作成します。エンドポイント、ヘッダー、リクエストの形式については、API リクエストを行うをご覧ください。
  3. レスポンスを理解する: API からレスポンスを受け取ったら、ルートプランと各パラメータの意味を理解します。レスポンスを解釈するをご覧ください。

ルートプランを調整する

現実世界のロジスティクスを API の費用と制約に変換するのは複雑な作業です。最初のルート計画は、ビジネス目標やドライバーの期待と一致しない可能性があります。ルートプランの調整は、返されたルートをテストし、目標を達成する設定が見つかるまでパラメータを調整する反復プロセスです。

目標と制約を調整する

生成されたルートプランがニーズに合わない場合は、特定のパラメータを変更して異なる結果を得ることができます。パラメータを厳しくしたり緩めたりすると、ルートプランで競合する目標の解決方法が変わります。パラメータを緩めることは、ルートプランでエラーの原因となっているパラメータを効率的に見つける方法です。

次の表に、一般的なルーティングの問題と、それらを解決するために調整できるパラメータを示します。

シナリオ パラメータ 調整 説明
重要な配送がスキップされた shipments[].penaltyCost 価値を高めるか、他の配送にペナルティ料金を追加する 配送がオプションの場合は、ペナルティ費用を増やして優先度を上げます。配送が必須(ペナルティ費用がない)の場合は、重要度の低い配送のその他にペナルティ費用を追加します。これにより、これらの配送はオプションとなり、重要な配送のために車両の時間と容量を確保できます。
タイミングにより配送がスキップされた softStartTime / softEndTime ソフト タイム ウィンドウを追加する ハード タイム ウィンドウでは、1 分でも遅れたタスクはドロップされます。ソフト ウィンドウを使用すると、ドライバーは割り当てに失敗するのではなく、「コスト」を支払うことで、スケジュールから少し遅れて到着できます。
重量が原因で配送がスキップされた loadLimits[].softMaxLoad、costPerUnitAbove ソフトロードの需要を追加する 荷物を残すのではなく、車両が理想的な容量をわずかに超えることを許可します(ペナルティあり)。
フリートの過負荷により配送がスキップされた model.vehicles[] または shipments[].timeWindows 車両または休憩時間枠を追加する 現在の車両数では配送が多すぎる場合は(特にピーク時間)、車両を追加するか、配送時間帯を広げてワークロードを分散します。
ルートが長すぎる、または非効率的である vehicles[].costPerKilometer / costPerHour 費用を追加するか、価値を高める 移動に費用がかかることを API に伝え、遠く離れた孤立した停車地を削除して、フリートのルートを短縮するように促します。
ドライバーのシフトが長すぎる vehicles[].routeDurationLimit または model.vehicles[] 期間制限を追加する、または車両と制限を追加する ドライバーが道路で費やす合計時間に上限(8 時間など)を適用します。車両を追加するだけでは、ルートは短縮されません。期間制限を適用して、ソルバーがより大きなフリートにワークロードを分散するように強制する必要があります。

ルートプランを更新する

多くの場合、アクティブなドライバーのスケジュールに集荷を追加するなど、ベースを同じに保ちながらルートプランを更新する必要があります。これを行うには、挿入パラメータを使用します。挿入パラメータは、以前のソリューションに基づいて API に開始を提供し、新しいプランをゼロから計算するのではなく、既存のプランを変更できるようにします。

ルートプランを挿入パラメータで更新する方法は次のとおりです。

  • 以前のレスポンスから新しいリクエストの injectedFirstSolutionRoutes フィールドにルートを渡します。これにより、最適化検索が高速化され、直前の配送の統合など、日々のオペレーションを開始する前の再計画に役立ちます。
  • injectedSolutionConstraint フィールドを使用して、変化の度合いを制御します。これは、オペレーションがすでに進行中の場合に便利です。ドライバーの現在のシーケンスを保持したり、すでに実行されたプランの一部を修正したりできます。
  • interpretInjectedSolutionsUsingLabels を true に設定して、更新されたルートが正しい車両に割り当てられたままになるようにします。これは、インデックスではなくラベルを使用してルートを照合するため、配送や車両を追加または削除するテストで役立ちます。これには、すべての車両ラベルと配送ラベルが一意である必要があります。

ルートプランを統合する

最終的なルートプランは、制約と目標に従いながら、リソースとタスクの最適化された管理を表すデータ オブジェクトです。このルートプランをシステムに統合して、日々の業務で使用します。通常、フリート マネージャー向けのルートプランの可視化や、ドライバーへのターンバイターン方式の指示の送信が含まれます。

可視化

フリート管理者がルートプランを確認してモニタリングできるように、次の方法でルートプランを可視化できます。

フリート管理者がルートプランを確認してモニタリングできるように、ダッシュボードの地図にルートプランを表示できます。現在の開発ステージに応じて、次の方法でルートプランを可視化できます。

  • コードなしで探索する: オープンソースのルート最適化アプリを使用して、API がデータを地図上の物理パスに変換する方法を確認できます。このウェブ アプリケーションは、コードを記述する前に、シナリオの構築、制約パラメータの調整、結果のルートプランの視覚的なレンダリングを行うことができる探索ツールとして機能します。
  • 訪問順序を表示する: 訪問順序を地図上の番号付きポイントとして表示し、独自のシステムで最適化計画と配送計画を評価できます。これを行うには、API レスポンスの各ルート内にある visits 配列を見つけます。この配列内のアイテムは、ドライバが実行すべき順序で並べられています。このリストを反復処理し、shipmentIndex を使用して各停留所の位置座標を取得し、マッピング ライブラリを使用してリスト内の順序に基づいて番号付きマーカーを地図上にレンダリングできます。
  • 物理ルートを描画する: 計画された正確なパスを地図上に可視化して、オプティマイザーが特定のシーケンスを選択した理由を把握できます。このポリラインは、運転手が実際に走行したリアルタイムのルートではなく、計画と評価のための想定ルートを表します。リクエストで populatePolylines: true を設定して、各ルートの encodedPolyline フィールドを取得し、Maps JavaScript API の google.maps.geometry.encoding.decodePath() メソッドを使用してデコードします。

ドライバーに割り当てる

Navigation SDK を使用してターンバイターン方式の経路案内をドライバー アプリに統合するか、Google マップのユーザーアプリへのディープリンクを提供できます。

  • Navigation SDK: カスタムのドライバー アプリケーションがある場合は、Navigation SDK for Android または iOS を統合して、アプリ内でターンバイターン ナビゲーションを利用できます。API レスポンスから取得したタスク情報をシステムに統合し、SDK を使用してナビゲーションを行うことができます。API レスポンスから SDK にルートを渡すには、リクエストで populateTransitionPolylines: true を設定します。これにより、レスポンス内の各遷移に対して routeToken が生成されます。
  • Fleet Engine: 高度なフリート管理では、API で生成されたルートプランを Fleet Engine にインポートして、ルートの実行をリアルタイムでモニタリングできます。API は評価用の予定ルートのポリラインを提供しますが、Fleet Engine は予定された訪問順序と車両のリアルタイム トラッキングをペア設定します。