最初のルート最適化リクエストを行う

欧州経済領域(EEA)のデベロッパー

このドキュメントでは、実際のユースケース シナリオを使用して、Route Optimization API に最初のリクエストを行う方法について説明します。

わかりやすくするために、この例では HTTP と JSON を使用して REST API を示します。ただし、本番環境では、パフォーマンス上のメリットからgRPC を使用することをおすすめ します。ただし、gRPC を使用するにはインストールが必要です。詳細については、 Route Optimization API クライアント ライブラリをご覧ください。

シナリオ

コイトタワー、ミッション ドロレス パーク、サウス サンセット プレイグラウンド パークのピンが表示されたサンフランシスコの地図

サンフランシスコで午前 7 時から午後 7 時まで犬の託児サービスを運営しています。今朝は、市内の別の場所から 2 匹の犬を迎えに行く必要があります。どちらの犬の飼い主も、午前 7 時 30 分から午前 9 時 30 分までの間に迎えに来てほしいと希望しています。

仕事用のバンが 1 台あり、運転手には 1 時間あたり 27 ドルを支払っています。運転手とバンは午前 7 時に託児所を出発し、昼食休憩のために午前中の迎えを終えて午後 12 時までに戻る必要があります。

今日は 2024 年 2 月 13 日で、運転手には次のタスクがあります。

  • コイト タワーの近くでバーニーズ マウンテン ドッグを迎えに行く。
  • サウス サンセット プレイグラウンド パークでチワワを迎えに行く。
  • ミッション ドロレス パークの犬の託児所に両方の犬を送る。

迎えと送りの要件を満たしながら、犬がバンに乗っている時間を最小限に抑えるルートが必要です。

始める前に

このシナリオ例のコードを実行するには、まず Route Optimization API を設定するの手順を完了する必要があります。

1. ルート最適化のアプローチを選択する

Route Optimization API には、最適化問題の複雑さに応じて選択できる複数のメソッドがあります。

この犬の託児所のシナリオは、小規模で簡単なリクエストであるため、 optimizeToursなどのブロッキング メソッドを使用します。このメソッドは、小さなリクエストに対して迅速に結果を返します 。Route Optimization API メソッドの詳細については、同期エンドポイントと非同期エンドポイントをご覧ください。

次の URL を使用して、optimizeTours メソッドに HTTP POST リクエストを行います。

https://routeoptimization.googleapis.com/v1/projects/PROJECT_OR_ID:optimizeTours

不要な待ち時間を短縮するために、タイムアウトと期限の設定を短くする必要があります。この犬の託児所のシナリオでは、オプティマイザーがリクエストに応答するのに多くの時間は必要ないため、次の設定を使用します。

  • timeout パラメータを 2 秒に設定します。
  • 期限の設定はデフォルトのままにします。REST リクエストの場合は 60 秒です。

2. リクエスト メッセージの本文を作成する

ブロッキング optimizeTours メソッドを選択し、タイムアウト と期限の設定を定義したら、次のステップとしてリクエスト メッセージの本文を作成します。

このシナリオでは、リクエストは REST API で JSON としてエンコードされた OptimizeToursRequest メッセージです。

リクエスト メッセージを作成する手順は次のとおりです。

  1. 基本的なリクエスト構造から始めます。これは次のとおりです。

    {
      "timeout": ...,
      "model": {
        "shipments": [...],
        "vehicles": [...],
        "globalStartTime": "...",
        "globalEndTime": "..."
      }
    }
    

    構造の詳細については、 基本構造(ShipmentModel、Shipment、Vehicle)の主要コンセプト ガイドをご覧ください。

  2. 配送を定義します。shipments フィールドに、午前中に迎えに行って送る必要のある犬ごとに Shipment メッセージを追加します。ここでは、犬の飼い主が希望する迎えの場所と時間、犬を送る託児所の場所と時間を定義します。

    1. 犬ごとに、迎え用の VisitRequest と送り用の 用の VisitRequest を作成します。このシナリオでは、送りは託児所への 送りとなります。

      • 迎えでは、arrivalWaypoint を犬の 迎えの場所(バーニーズ マウンテン ドッグの場合はコイト タワー、チワワの場合はサウス サンセット プレイグラウンド パーク)に設定し、 timeWindows を飼い主が希望する迎車時間(午前 7 時 30 分~ 午前 9 時 30 分)に設定します。

      • 送りでは、arrivalWaypoint を 託児所に設定し、timeWindows を必要な送りの 時間(午前 9 時 30 分~午前 11 時 30 分)に設定します。

      時間枠の詳細については、時間枠をご覧ください。

    2. label フィールドを使用して、配送ごとに「バーニーズ マウンテン ドッグ」や「チワワ」などの識別子を追加できます。これにより、レスポンスで配送を識別しやすくなります。

    配送の定義の詳細については、配送をご覧ください。

  3. 車両を定義します。vehicles フィールドに、託児所を始点と終点とする 1 台のバン、運転手の賃金の費用、バンの稼働時間を示す Vehicle メッセージを追加します。

    1. バンの startWaypointendWaypoint を、 1 日の始点と終点の場所( ミッション ドロレス パーク近くの託児所)に設定します。

    2. 運用コストを最小限に抑えるには、ビジネスの費用制約を定義する必要があります。費用パラメータ costPerHour を 27 に設定します。これは、犬の託児所のバンを運転する運転手に支払う金額です。費用パラメータの詳細については、 費用モデルをご覧ください。

    3. オプティマイザーがバンの稼働時間内にルートを作成するようにするには、startTimeWindows を運転手がバンの運転を開始できる許容範囲に定義し、endTimeWindows を運転手が託児所に戻る必要がある許容範囲に定義します。時間枠の詳細については、時間枠をご覧ください。

    車両の定義の詳細については、車両をご覧ください。

  4. グローバル時間枠を設定します。グローバル時間枠は、バンが 1 日を通して託児所の迎えと送りを実行できる時間枠を表します。このシナリオでは、2024 年 2 月 13 日の globalStartTime を午前 7 時、globalEndTime を午後 7 時に設定します。これは、犬の託児所の稼働時間を表します。

3. リクエストを送信する

犬の託児所のシナリオに基づく簡単な curl リクエストを次に示します。ブロッキング optimizeTours メソッドを使用します。

リクエストを送信する前に、サンプルコードの PROJECT_NUMBER_OR_ID を Google Cloud プロジェクト ID に置き換えます。

curl -X POST 'https://routeoptimization.googleapis.com/v1/projects/PROJECT_NUMBER_OR_ID:optimizeTours' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
--data @- << EOM
{
  "timeout": "2s",
  "model": {
    "shipments": [
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.802395,
                  "longitude": -122.405822
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T07:30:00Z",
                "endTime": "2024-02-13T09:30:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.760202,
                  "longitude": -122.426796
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00Z",
                "endTime": "2024-02-13T11:30:00Z"
              }
            ]
          }
        ],
        "label": "Bernese mountain dog"
      },
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.738067,
                  "longitude": -122.498593
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T07:30:00Z",
                "endTime": "2024-02-13T09:30:00Z"
              }
            ]
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.760202,
                  "longitude": -122.426796
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00Z",
                "endTime": "2024-02-13T11:30:00Z"
              }
            ]
          }
        ],
        "label": "Chihuahua"
      }
    ],
    "vehicles": [
      {
        "startWaypoint": {
          "location": {
            "latLng": {
              "latitude": 37.760202,
              "longitude": -122.426796
            }
          }
        },
        "endWaypoint": {
          "location": {
            "latLng": {
              "latitude": 37.760202,
              "longitude": -122.426796
            }
          }
        },
        "costPerHour": 27,
        "startTimeWindows": [
          {
            "startTime": "2024-02-13T07:00:00Z",
            "endTime": "2024-02-13T07:15:00Z"
          }
        ],
        "endTimeWindows": [
          {
            "startTime": "2024-02-13T11:45:00Z",
            "endTime": "2024-02-13T12:00:00Z"
          }
        ]
      }
    ],
    "globalStartTime": "2024-02-13T07:00:00Z",
    "globalEndTime": "2024-02-13T19:00:00Z"
  }
}
EOM

リクエストで使用されるリクエスト パラメータ

次の表に、シナリオ例のリクエスト本文で使用されるリクエスト パラメータを示します。コンテンツは、親またはテキスト検索でフィルタできます。

パラメータ プロパティ タイプ 説明
OptimizeToursRequest model オブジェクト(ShipmentModel これはリクエストの中核です。迎えと送りが必要なすべての犬(shipments)とフリート内のバン(vehicles)など、問題全体を定義する単一のオブジェクトです。最適化する必要がある問題の完全なブループリントと考えてください。
timeout 所要時間 このパラメータは、サーバーがレスポンスを返す前に リクエストを処理する最大時間を指定します。このパラメータを使用して、 待ち時間を短縮します。この犬の託児所のシナリオのように、小規模で迅速なリクエストの場合は、 この値を 2 秒に設定します。
ShipmentModel shipments[] オブジェクトの配列(Shipment これは、 迎えまたは送りが必要な犬を表す各オブジェクトの配列です。
vehicles[] オブジェクトの配列(Vehicle これは、各オブジェクトがフリート内の車両を定義するオブジェクトの配列です。迎えと送りを行うバンなど、リソースを記述します。最適化されたルートを取得するには、少なくとも 1 台の車両を定義する必要があります。
globalStartTime タイムスタンプ これは、モデル全体のイベントが発生する可能性のある最も早い時間です。このパラメータは、最適化問題を時間内に絞り込みます。これは、正確な交通状況とルートの計算に不可欠です。この犬の託児所のシナリオでは、運転手が 1 日にバンを運転できる最も早い 時間(2024 年 2 月 13 日の午前 7 時)に設定します。
globalEndTime タイムスタンプ これは、モデル全体のイベントが発生する可能性のある最も遅い時間です。この犬の託児所のシナリオでは、バンが運行を終了する予定の時刻(2024 年 2 月 13 日の午後 7 時)に設定します。
Shipment pickups[] オブジェクトの配列(VisitRequest これは、配送の可能な迎えのオプションのリストです。 オプティマイザーは、問題を解決する最適なオプションを選択します。この犬の託児所のシナリオでは、各飼い主が犬ごとに提供した迎えの場所と時間枠を一覧表示します。
deliveries[] オブジェクトの配列(VisitRequest これは、配送の可能な送りのオプションのリストです。 オプティマイザーは、問題を解決する最適なオプションを選択します。この犬の託児所のシナリオでは、犬ごとに、犬の託児所の場所と、運転手が昼食のために戻る必要がある時間枠を一覧表示します。
label 文字列 これは、リクエスト内の特定の配送の識別子です。 リクエストでラベルを指定すると、レスポンスを読みやすくなります。 この犬の託児所のシナリオでは、 「チワワ」、「バーニーズ マウンテン ドッグ」、犬の名前などの説明的な文字列を使用して、 API レスポンスを受信したときにソリューションを入力と照合します。
VisitRequest arrivalWaypoint[] オブジェクト(Waypoint これは、ルート上の特定の訪問場所です。これは、緯度と経度の座標、プレイス ID、見出しを使用して定義できます。この犬の託児所のシナリオでは、 は飼い主が提供した場所に設定し、 pickups は託児所の住所に設定します。 deliveries
timeWindows[] オブジェクトの配列(TimeWindow これは、迎えまたは 送りの時間制約を定義するオブジェクトの配列です。このシナリオでは、これを使用して、犬ごとに迎えの時間枠と、犬を託児所に送る許容範囲の時間枠を定義します。
Vehicle startWaypoint[] オブジェクト(Waypoint これは、車両のルートの開始場所です。 緯度と経度の座標またはプレイス ID で定義されます。このパラメータは、車両がルートを開始する必要がある場所をオプティマイザーに伝えます。このウェイポイントを定義しない場合、オプティマイザーは迎えまたは送りのいずれかを開始場所として選択します。この犬の託児所のシナリオでは、運転手 が託児所から 1 日を始めるため、ミッション ドロレス パークの座標を使用します。
endWaypoint[] オブジェクト(Waypoint これは、車両のルートの最終目的地です。 緯度と経度の座標またはプレイス ID で定義されます。このパラメータは、車両がルートを終了する必要がある場所をオプティマイザーに伝えます。このウェイポイントを定義しない場合、オプティマイザーは迎えまたは送りのいずれかをルートの終点として選択します。この犬の託児所のシナリオでは、運転手が 託児所で 1 日を終える必要があるため、ミッション ドロレス パークの座標を使用します。
costPerHour 数値 これは、車両が移動中か停止中かに関係なく 、車両が使用される 1 時間ごとに発生する費用です。この犬の託児所のシナリオでは、これを使用して運転手の時給をモデル化します。
startTimeWindows[] オブジェクトの配列(TimeWindow これは、運転手が午前中の犬の迎えのためにバンの運転を開始できる許容範囲の時間枠です。
endTimeWindows[] オブジェクトの配列(TimeWindow これは、運転手がバンの運転を終えて 犬の託児所に戻る許容範囲の時間枠です。

次へ

レスポンスを解釈する