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

本指南說明轉場屬性的可能用途。本章將透過兩個範例說明如何模擬實際情境:將停車時間納入最佳化路線,並確保每條路線都會在特定地點結束。

事前準備

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

轉換是路線的片段,可連結一個地點與下一個地點。

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

  • 路線的起點。
  • 乘客上下車的停靠站。
  • 路線的終點。

您可以將轉場屬性新增至清單 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_tagTransitionAttributes.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. 請挑選兩個在模型中未使用的新代碼,例如 CLEANEDROUTE_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_tagTransitionAttributes.excluded_src_tag,以及一個 TransitionAttributes.dst_tagTransitionAttributes.excluded_dst_tag

不過,您可以將 TransitionAttributes.excluded_src_tagTransitionAttributes.excluded_dst_tag 設為模型中未使用的標記,藉此比對所有標記。這會比對所有未使用此標記的地點,但由於您刻意選擇了任何地點都不會使用的標記,這些轉場屬性會比對所有地點。

延伸閱讀