發出您的第一個路線最佳化要求

歐洲經濟區 (EEA) 開發人員

本文說明如何使用實際情境,向 Route Optimization API 發出第一個要求。

為求簡單,本範例使用 HTTP 和 JSON 示範 REST API。不過,就實際工作環境而言,建議您使用 gRPC,因為效能較佳。不過,gRPC 需要安裝一些項目。詳情請參閱 Route Optimization API 用戶端程式庫

情境

舊金山地圖,標示著科伊特塔、教會區公園和南日落遊樂場公園

你在舊金山經營狗狗托育服務,時間為上午 7 點至下午 7 點。今天早上,您需要在市區的不同地點接送兩隻狗。兩位狗主人的取貨時間都是上午 7:30 到 9:30。

你有一輛廂型車,並以每小時 27 美元的價格聘請司機。司機和廂型車會在早上 7:00 從幼兒園出發,並在中午 12:00 前完成上午的接送行程,以便休息吃午餐。

今天是 2024 年 2 月 13 日,駕駛員有下列工作:

  • 在科伊特塔附近撿起伯恩山犬。
  • 在 South Sunset Playground Park 領取吉娃娃。
  • 將兩隻狗都送到 Mission Dolores Park 的狗狗托育中心。

您需要規劃路線,盡量縮短狗狗待在車上的時間,同時符合接送規定。

事前準備

如要在這個範例情境中執行程式碼,請先完成「設定 Route Optimization API」中的操作說明。

1. 選擇路線最佳化做法

視最佳化問題的複雜程度而定,路徑最佳化 API 提供多種方法供您選擇。

由於這個狗狗托兒所情境是簡單的小型要求,因此請使用 optimizeTours 等封鎖方法,快速傳回小型要求的結果。如要進一步瞭解 Route Optimization API 方法,請參閱同步和非同步端點

使用下列網址,對 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,在本情境中,送貨是指將狗送到托兒所。

      • 在取貨行程中,將arrivalWaypoint設為狗狗的取貨地點 (伯恩山犬為科伊特塔,吉娃娃為南日落遊樂場公園),並將timeWindows設為主人要求的取貨時間 (上午 7:30 至上午 9:30)。

      • 在送貨行程中,將 arrivalWaypoint 設為幼兒園,並將 timeWindows 設為必要送達時間 (上午 9:30 至 11:30)。

      如要進一步瞭解時間範圍,請參閱「時間範圍」。

    2. 你可以使用 label 欄位為每批貨件新增 ID,例如「伯恩山犬」和「吉娃娃」。這有助於您在回覆中找出貨運資訊。

    如要進一步瞭解如何定義出貨,請參閱「出貨」一文。

  3. 定義車輛。vehicles 欄位中,為你的單一廂型車新增 Vehicle 訊息,並以托兒中心做為起點和終點、司機薪資成本,以及廂型車的營運時間。

    1. startWaypointendWaypoint 設為當天的起點和終點,也就是 Mission Dolores Park 附近的幼兒園。

    2. 如要盡量減少營運成本,請務必定義業務的成本限制。將費用參數 costPerHour 設為 27,也就是你支付給司機的狗狗托育車輛駕駛費用。如要進一步瞭解費用參數,請參閱費用模式

    3. 為確保最佳化工具在廂型車的營運時間內建立路線,請將 startTimeWindows 定義為司機可開始駕駛廂型車的時間範圍,並將 endTimeWindows 定義為司機必須返回托兒中心的時間範圍。如要進一步瞭解時間範圍,請參閱「時間範圍」。

  4. 設定全域時間區間。全球時間範圍代表廂型車可能在一天內接送幼兒園學童的時間範圍。在這個情境中,請將 2024 年 2 月 13 日的 globalStartTime 設為上午 7:00,globalEndTime 設為下午 7:00,代表狗狗托育中心的營業時間。

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
                }
              }
            },
            "timeWindow": [
              {
                "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
                }
              }
            },
            "timeWindow": [
              {
                "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 object (ShipmentModel) 這是要求的核心內容。您可以在單一物件中定義整個問題,包括需要接送的所有狗狗 (shipments) 和車隊中的廂型車 (vehicles)。您可以將其視為需要最佳化問題的完整藍圖。
timeout 時間長度 這個參數指定伺服器處理要求並傳回回應的時間上限。使用這個參數可縮短等待時間。如果是小型快速要求 (例如這個狗狗托育中心情境),請將這個值設為 2 秒。
ShipmentModel shipments[] 物件陣列 (Shipment) 這是物件陣列,每個物件代表需要接送的狗。
vehicles[] 物件陣列 (Vehicle) 這是物件陣列,每個物件都會定義車隊中的車輛。您可以在這裡說明資源,例如負責取貨和送貨的貨車。您必須定義至少一輛車輛,才能取得最佳化路線。
globalStartTime 時間戳記 這是整個模型中任何事件可能發生的最早時間。這個參數可縮短最佳化問題的時間,這對準確計算流量和路線至關重要。以這間狗狗托兒所為例,請將這個時間設為司機當天最早可駕駛廂型車的時間,也就是 2024 年 2 月 13 日的上午 7:00。
globalEndTime 時間戳記 這是整個模型中任何事件可能發生的最晚時間。以這間狗狗安親班為例,請將此時間設為廂型車預計結束營運的時間,也就是 2024 年 2 月 13 日下午 7 點。
Shipment pickups[] 物件陣列 (VisitRequest) 這份清單列出貨件的所有可能取貨選項。最佳化工具會選擇最適合的選項來解決問題。以這間狗狗托兒所為例,請列出每位狗主人為每隻狗狗提供的接送地點和時間範圍。
deliveries[] 物件陣列 (VisitRequest) 這份清單列出所有可能的貨件交貨選項。最佳化工具會選擇最適合的選項來解決問題。在這個狗狗托兒所情境中,請列出狗狗托兒所設施的位置,以及司機必須返回為每隻狗提供午餐的時間範圍。
label 字串 這是要求中特定貨件的 ID。 您可以在要求中指定標籤,讓回覆內容更容易閱讀。以這間狗狗安親班為例,請使用「吉娃娃」、「伯恩山犬」或狗狗的名字等描述性字串,在收到 API 回應時,將解決方案與輸入內容相符。
VisitRequest arrivalWaypoint[] object (Waypoint) 這是路線上特定拜訪行程的位置。您可以使用經緯度座標、地點 ID 或方位定義這個位置。在這個狗狗托兒所情境中,請將此值設為擁有者提供的 pickups 位置,並設為托兒所地址的 deliveries
timeWindows[] 物件陣列 (TimeWindow) 這是物件陣列,用於定義取貨或送貨的時間限制。在這個情境中,請使用這項功能為每隻狗定義取貨時間,以及將狗送到托兒中心的合適時間。
Vehicle startWaypoint[] object (Waypoint) 這是車輛路線的起點,以經緯度座標或地點 ID 定義。這項參數會告知最佳化工具車輛必須從何處開始路線。如果未定義這個中途點,最佳化工具會選擇其中一個取貨或送貨地點做為起點。在這個狗狗托兒所情境中,由於司機從托兒所開始一天的工作,因此請使用 Mission Dolores Park 的座標。
endWaypoint[] object (Waypoint) 這是車輛路線的最終目的地,以經緯度座標或地點 ID 定義。這項參數會告知最佳化工具車輛必須結束路線的位置。如未定義這個路線控點,最佳化工具會選擇其中一個取貨或送貨地點做為路線終點。在這個狗狗托兒所情境中,由於司機必須在托兒所結束一天的工作,因此請使用 Mission Dolores Park 的座標。
costPerHour 數字 無論車輛是否正在行駛或停放,只要使用車輛,每小時都會產生這筆費用。在本狗狗托兒所情境中,請使用這項功能模擬司機的時薪。
startTimeWindows[] 物件陣列 (TimeWindow) 這是司機可接受的時間範圍,他們可以在這段時間內開始駕駛廂型車,進行上午的狗狗接送行程。
endTimeWindows[] 物件陣列 (TimeWindow) 這是司機完成駕駛廂型車並返回狗狗托育中心的合理時間範圍。

繼續

解讀回覆