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

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

事前準備

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

「轉換」是路徑中連接一個地點到下一個地點的區段。

位置是指車輛路線中的任何一點,包括:

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

將所有轉場效果屬性新增至 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 更適合用於實作以額外成本表示的軟性偏好設定或取捨。如果時間和成本都很重要,您可以任意組合延遲和成本。

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

停車範例會使用與車輛停車所需額外時間相應的短暫延遲。如果司機在付費停車場停車,你也可以搭配使用 costs 和延遲時間。

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

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

您無法省略標記,因為每則訊息都必須包含 TransitionAttributes、TransitionAttributes.src_tag、TransitionAttributes.excluded_src_tag、TransitionAttributes.dst_tag 和 TransitionAttributes.excluded_dst_tag。

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

延伸閱讀