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

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

事前準備

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

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

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

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

如要定義模型的所有轉換屬性,請將這些屬性新增至 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 設為模型中未使用的標記,藉此比對所有標記。這會比對所有不含這個標記的位置,但由於您刻意選擇未用於任何位置的標記,因此這些轉換屬性會比對所有位置。

延伸閱讀