使用轉場屬性模擬商業邏輯

本指南說明轉換屬性的可能用途。本課程將透過兩個範例,說明如何模擬實際情境:將車輛停車時間納入最佳化路線,以及確保每條路線都以造訪特定地點做為結尾。

事前準備

您可以使用轉換屬性,在最佳化路線中的特定轉換中,加入模型專屬的費用和延遲。這些費用和延遲時間會加到根據所用車輛參數,從地圖資料計算出的轉換時間和費用中。

轉場是指連接兩個地點的路徑區段。

「位置」是指車輛路線中的下列任一地點:

  • 路線的起點。
  • 取貨或送貨的停靠點。
  • 路線的終點。

將所有轉場效果屬性新增至 ShipmentModel.transition_attributes 清單,即可為模型定義這些屬性。清單中的每個元素都會定義一組轉場效果屬性,並使用轉場效果開始位置和結束位置的標記,與路徑中的轉場效果相符。如要進一步瞭解轉場效果屬性,請參閱 TransitionAttributes 的參考文件。

模擬實際情境

本節提供兩個小型範例,說明如何使用轉換屬性,實作實際業務限制。

預留停車時間

在這種情況下,駕駛人必須先停車,才能前往 A 地點。地點 B 就在附近,因此司機兩次都能使用同一個停車位。如果駕駛人先前往 A,再前往 B,就能節省時間,因為他們不必離開停車位,也不必再次停車。在 Route Optimization API 中,您可以使用轉換屬性,在司機從一個停車位移動到另一個停車位時,增加額外的停車時間。

如果將停車時間與造訪時間分開模擬,系統會將使用相同停車地點的造訪行程分組,縮短路線時間。您可讓模型更精確,並讓最佳化工具偏好將拜訪行程分組的路線。

如要在 Route Optimization API 要求中執行這項操作,請按照下列步驟操作:

  1. 請僅在執行造訪所需的時間內使用 VisitRequest.duration。例如,將包裹交給顧客並請對方簽名。

  2. 針對模型中使用的每個不同停車位,請使用模型中其他項目未使用的全新標記,例如 PARKING_123。

  3. 將這個標記新增至下列項目:

    1. VisitRequest.tags 所有使用這個停車位的訪客要求。

    2. Vehicle.start_tags 如果車輛從這個停車位開始行駛路線。

    3. Vehicle.end_tags 如果車輛在這個停車位開始或結束路線。

  4. 針對每個新的停車標記,在 ShipmentModel.transition_attributes 中新增一個項目,為來自不同停車地點的停車新增延遲,方法如下:

    1. 將 TransitionAttributes.excluded_src_tag 和 TransitionAttributes.dst_tag 設為 PARKING_123。

    2. 將 TransitionAttributes.delay 設為停放車輛所需的時間。

    舉例來說,如果某個地點的標記是 PARKING_123,且需要 150 秒才能停好車,請在 ShipmentModel.transition_attributes 中加入下列項目:

    {
      "excluded_src_tag": "PARKING_123",
      "dst_tag": "PARKING_123",
      "delay": "150s"
    }
    

路線結束時必須清潔

在這個情境中,車輛必須在路線結束時清潔,並須遵守下列額外限制:

  • 車輛會先送往專門的清潔設施,完成清潔後才會返回車輛停放處。最佳化路線會根據清潔設施的位置,以及車輛取貨和送貨的地點,使用最佳清潔設施。
  • 清潔後,車輛不得再進行任何載客或送貨服務。
  • 駕駛人開車前往該地點和清潔車輛的時間,都算在工作時數內,且必須符合路線的最長時數。

如要模擬這項規定,請只允許空白路線,或最後造訪地點為清潔設施的路線。在 Route Optimization API 中,您可以禁止從任何位置 (清潔設施或路線起點除外) 轉換至路線終點路線控點,藉此達成這項要求:

  1. 挑選兩個模型中未使用的全新標記,例如 CLEANED 和 ROUTE_END。前者用於車輛乾淨或變乾淨的地點,後者則用於路線終點。
  2. 為每輛車新增僅限運送的新貨件,代表前往清潔設施的行程,並提供下列屬性:
    1. 每個清潔設施地點都應代表這項貨物的送達造訪要求。
    2. 在清潔設施運送作業的每項造訪要求中,將 CLEANED 新增至 VisitRequest.tags。表示離開這個地點的車輛已清潔完畢。模型中的其他訪視要求不應使用這個標記,這樣車輛離開時就會被視為「未清潔」。
    3. 如果車輛閒置,請將 penalty_cost 設為較小的數字,讓最佳化工具略過這趟貨運。
  3. 針對每輛車,將 CLEANED 新增至 Vehicle.start_tags。這項設定用於在車輛執行任何取貨或送貨作業前,將車輛標示為乾淨 (假設車輛已在前一個工作日結束時清潔完畢),並允許車輛直接從起始路線控點前往結束路線控點。即使這類路線在實際情況中不會發生,允許這種情況仍有助於最佳化工具更有效率地搜尋最佳化路線。

  4. 為每輛車輛新增 ROUTE_END 至 Vehicle.end_tags。

  5. 在 ShipmentModel.transition_attributes 中新增項目,禁止未清潔的車輛抵達車輛終點路線控點,並設定下列屬性:

    1. 將 TransitionAttributes.excluded_src_tag 設為 CLEANED。

    2. 將 TransitionAttributes.dst_tag 設為 ROUTE_END。

    3. 將 TransitionAttributes.delay 設為較大的值。如果將延遲時間設為超過路徑時間長度上限,最佳化工具就無法在路徑中使用這項轉場效果。

    舉例來說,如果模型的時間刻度為一個工作天,您可以延遲 24 小時 (86400 秒),禁止從清潔設施和路線起點以外的任何位置轉換至路線終點:

    {
      "excluded_src_tag": "CLEANED",
      "dst_tag": "ROUTE_END",
      "delay": "86400s"
    }
    

如何選擇延遲時間和費用

在延遲和成本之間做出選擇,取決於實作的商業邏輯和限制。設定 TransitionAttributes.delay 最適合用於實施硬性限制,或表示時間花費的權衡。TransitionAttributes.cost 則更適合用於實作軟性偏好設定,或以額外成本表示的折衷方案。如果同時考量時間和成本,您可以任意組合延遲和成本。

車輛清潔範例使用非常長的延遲,因為在路線結束時清潔車輛是硬性規定,而長時間的延遲可防止最佳化工具忽略這項規定。如果只設定成本,最佳化工具可能會選擇略過清潔程序,因為它會尋找其他方式來彌補成本,例如在「節省」車輛清潔時間後,運送更多貨物。

停車範例會使用對應車輛停車所需額外時間的短暫延遲。如果司機在收費停車場停車,您也可以將費用與延遲時間搭配使用。

如何新增符合所有造訪要求的轉換屬性

上述範例使用的轉換屬性,會比對具有指定標記的位置,或不具有該標記的位置。但如果需要新增適用於所有轉場效果的轉場效果屬性呢?

您不能直接省略標記,因為每個 TransitionAttributes 訊息都必須包含 TransitionAttributes.src_tag 和 TransitionAttributes.excluded_src_tag 其中之一,以及 TransitionAttributes.dst_tag 和 TransitionAttributes.excluded_dst_tag 其中之一。

不過,您可以將 TransitionAttributes.excluded_src_tag 或 TransitionAttributes.excluded_dst_tag 設為模型中未使用的標記,藉此比對所有標記。這會比對所有不含這個標記的位置,但由於您刻意選擇未用於任何位置的標記,因此這些轉換屬性會比對所有位置。

延伸閱讀