集荷と配送の停車場所注文の基本的な最適化

このシナリオでは、車両に割り当てられる停車地の順序を最適化します。 使用します。これはルート最適化オペレーションの最もシンプルなモードで、指定された時間内にすべての停留所を訪問します。

次の例は、1 台の車両と 3 台の車両を使用した基本的なシナリオを示しています。 すべて配送と呼ばれる 1 つの場所から発送されます。

リクエストの例を見る

      {
        "populatePolylines": true,
        "populateTransitionPolylines": true,
        "model": {
          "globalStartTime": "2023-01-13T16:00:00-08:00",
          "globalEndTime": "2023-01-14T16:00:00-08:00",
          "shipments": [
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.789456,
                    "longitude": -122.390192
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            },
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.789116,
                    "longitude": -122.395080
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            },
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.795242,
                    "longitude": -122.399347
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            }
          ],
          "vehicles": [
            {
              "endLocation": {
                "latitude": 37.794465,
                "longitude": -122.394839
              },
              "startLocation": {
                "latitude": 37.794465,
                "longitude": -122.394839
              },
              "costPerKilometer": 10.0,
              "costPerHour": 40.0
            }
          ]
        }
      }
    

ルート最適化リクエストのフィールド

概要で説明したように、最も重要なルート最適化リクエストは プロパティは vehiclesshipments です。

車両と配送に加えて、リクエストには以下が含まれます。 フィールド:

ポリライン

populatePolylinespopulateTransitionPolylines は、Routes を 最適化するとポリラインが返されます。

このサービスは、Maps JS ポリライン コーデックを使用してポリラインをエンコードします。このコーデックは、 印刷可能な ASCII 文字を使用したバイナリ ポリライン データ。こちらの インタラクティブ ポリライン エンコーダ ユーティリティ: ルートの最適化。このガイドの例では、populatePolylinespopulateTransitionPolylines が true に設定されていますが、他のガイドでは false に設定して、 レスポンスのサイズを小さくします

エンコードの詳細については、エンコード ポリライン アルゴリズム形式をご覧ください。 使用できます。

グローバルな時間の制約

model.globalStartTimemodel.globalEndTime は任意の 24 に設定されます。 できます。これにより、出力タイムスタンプが解釈しやすくなります。

店舗を訪問

このリクエストの例では、model.shipments[].pickups[].arrivalLocationmodel.shipments[].deliveries[].arrivalLocation。また、 車両が特定の場所から出発する状況の departureLocation プロパティ (入り口のある複合駐車場など) もう 1 つは出口です今回と以降の 出発点と到着地は同じであると想定されます。

latLng の代替として、到着と出発の waypoint もあります。Waypoint フィールドでは、LatLng の代わりに Google プレイス ID を使用できます。 車両の角度も指定できます。詳細については、リファレンス ドキュメント(RESTgRPC)をご覧ください。

例の制約

このシナリオでは、いくつかの点でオプティマイザーが制限されます。

  1. すべてのアクティビティは、グローバルの開始時間から終了時間までに完了する必要があります。 このシナリオでは、開始時間と終了時間が 荷物の近くにいるため、世界的にも時間帯が広いことが理想です。
  2. すべての配送が完了している必要があります。これがデフォルトの動作です。 ペナルティ費用は shipments で指定されていません。
  3. 車両に costPerKilometercostPerHour が設定されています。

費用については費用モデル パラメータをご覧ください。

ルート最適化のレスポンス プロパティ

サンプル リクエストへのレスポンスを確認する

    {
      "routes": [
        {
          "vehicleStartTime": "2023-01-14T00:00:00Z",
          "vehicleEndTime": "2023-01-14T00:36:41Z",
          "visits": [
            {
              "shipmentIndex": 2,
              "isPickup": true,
              "startTime": "2023-01-14T00:00:00Z",
              "detour": "0s"
            },
            {
              "shipmentIndex": 1,
              "isPickup": true,
              "startTime": "2023-01-14T00:02:30Z",
              "detour": "150s"
            },
            {
              "isPickup": true,
              "startTime": "2023-01-14T00:05:00Z",
              "detour": "300s"
            },
            {
              "startTime": "2023-01-14T00:11:25Z",
              "detour": "0s"
            },
            {
              "shipmentIndex": 1,
              "startTime": "2023-01-14T00:19:29Z",
              "detour": "503s"
            },
            {
              "shipmentIndex": 2,
              "startTime": "2023-01-14T00:29:02Z",
              "detour": "1324s"
            }
          ],
          "transitions": [
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:00:00Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:02:30Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:05:00Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "235s",
              "travelDistanceMeters": 795,
              "waitDuration": "0s",
              "totalDuration": "235s",
              "startTime": "2023-01-14T00:07:30Z",
              "routePolyline": {
                "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@"
              }
            },
            {
              "travelDuration": "234s",
              "travelDistanceMeters": 793,
              "waitDuration": "0s",
              "totalDuration": "234s",
              "startTime": "2023-01-14T00:15:35Z",
              "routePolyline": {
                "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@"
              }
            },
            {
              "travelDuration": "323s",
              "travelDistanceMeters": 1204,
              "waitDuration": "0s",
              "totalDuration": "323s",
              "startTime": "2023-01-14T00:23:39Z",
              "routePolyline": {
                "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@"
              }
            },
            {
              "travelDuration": "209s",
              "travelDistanceMeters": 665,
              "waitDuration": "0s",
              "totalDuration": "209s",
              "startTime": "2023-01-14T00:33:12Z",
              "routePolyline": {
                "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
              }
            }
          ],
          "routePolyline": {
            "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@RWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@STY@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
          },
          "metrics": {
            "performedShipmentCount": 3,
            "travelDuration": "1001s",
            "waitDuration": "0s",
            "delayDuration": "0s",
            "breakDuration": "0s",
            "visitDuration": "1200s",
            "totalDuration": "2201s",
            "travelDistanceMeters": 3457
          },
          "travelSteps": [
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "227s",
              "distanceMeters": 794,
              "routePolyline": {
                "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@"
              }
            },
            {
              "duration": "233s",
              "distanceMeters": 791,
              "routePolyline": {
                "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@"
              }
            },
            {
              "duration": "322s",
              "distanceMeters": 1205,
              "routePolyline": {
                "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@"
              }
            },
            {
              "duration": "208s",
              "distanceMeters": 666,
              "routePolyline": {
                "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
              }
            }
          ],
          "vehicleDetour": "2201s",
          "routeCosts": {
            "model.vehicles.cost_per_hour": 24.455555555555556,
            "model.vehicles.cost_per_kilometer": 34.57
          },
          "routeTotalCost": 59.025555555555556
        }
      ],
      "totalCost": 59.025555555555556,
      "metrics": {
        "aggregatedRouteMetrics": {
          "performedShipmentCount": 3,
          "travelDuration": "1001s",
          "waitDuration": "0s",
          "delayDuration": "0s",
          "breakDuration": "0s",
          "visitDuration": "1200s",
          "totalDuration": "2201s",
          "travelDistanceMeters": 3457
        },
        "usedVehicleCount": 1,
        "earliestVehicleStartTime": "2023-01-14T00:00:00Z",
        "latestVehicleEndTime": "2023-01-14T00:36:41Z",
        "totalCost": 59.025555555555556,
        "costs": {
          "model.vehicles.cost_per_kilometer": 34.57,
          "model.vehicles.cost_per_hour": 24.455555555555556
        }
      }
    }
    

ルート最適化のレスポンスには、最上位の routes フィールドが含まれます。 は提案されたルートを表し、車両ごとに 1 つのルートが使用されます。この例では、 このガイドのリクエストでは車両が 1 台のみ示されており、routes には車両が 1 台含まれています。 ShipmentRoute 件のメッセージがあります。

ShipmentRoute 件の宿泊施設

ShipmentRoute メッセージ タイプの最も重要なプロパティは、次の 2 つです。 visitstransitions

Visit は、いずれかの店舗受け取りまたは配送の完了を表します。 リクエスト メッセージの VisitRequest です。訪問は、車両が特定の場所と時間に完了する作業を割り当てていることになります。

Transition は、ある場所から目的地まで走行する車両を表します。 説明します。遷移は、車両の始点、つまり訪問と 車両のエンドポイントです

車両の完全なルートを再構築するには、ShipmentRoutevisitstransitions を組み合わせる必要があります。フィールドの組み合わせにより、 車のアクティビティは次のようになります。

request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation

次のとおり、ShipmentRoute には visits よりも常に 1 つ多い transitions があります。 車両は、出発点から最初の訪問まで走行しなければならない 前回の訪問から終点の終点までの あります車両に開始地点または終了地点がない場合、最初の訪問または最後の訪問の位置情報が車両の開始地点または終了地点として使用されるため、visits よりも transitions が 1 つ多くなります。

この例では、最初の 3 回の乗車場所の間に遷移があります。 距離と所要時間はゼロになります。これは、 リクエスト内の同じ場所を共有しています。

詳細については、ShipmentRoute リファレンス ドキュメント(RESTgRPC)をご覧ください。 表示されます。

ウェイポイントの順序を簡単に最適化する

この例が示すように、ルート最適化モデルは、 独立した ID としてのウェイポイントや停留所の概念がなく、 エンティティです。ただし、停車地や地点を配送として表すことは可能です。 受け取りまたは宅配として VisitRequest を 1 つだけ指定できます。運転中も走行が停止することはありません。 オプティマイザーが見つけるために costPerHour または costPerKilometer を割り当てられる 最適なルートを見つけることです。