簡體   English   中英

使用 Python(多背包)中的 OR-Tools CP Solver 進行包裹運輸(包裹合並)

[英]Packages shipment (packages consolidation) with OR-Tools CP Solver in Python (multi-knapsack)

我正在使用 OR-Tools CP Solver 實施包裹整合解決方案(基於護士問題解決方案)。

有一家工廠生產一些需要郵寄給客戶的小包裹。 將一些 mini_Packages 合並為更大的 Packages 是最佳選擇(例如,如果我們遵守總重量限制,我們可以將 3 個輕型 mini_Packages 合並為一個 Package 並支付一次而不是 3 次的運輸費用)。

Mini_Packages 在數據源中有一些重要的屬性(固定目的地、重量、可接受的交貨日期范圍)。

我的主要 0-1 integer 變量如下所示:

x[mini_package_source_number, destination, optimal_shipment_date, package_number]

它 == 1 如果 mini_package 應該 go 到某個目的地,在某天,合並到某個 Package_number。

我已經設法構建了大部分 model,除了:

1.主要挑戰
如何進行約束以確保當求解器分配最佳 package 編號時,它不能與任何其他目的地或裝運日期一起使用? (它的意思是物理上一個合並的package去某個地方)

潛在代碼:

for package_number in range(Packages):
  model.Add(sum(x[mini_package_source_number, destination, optimal_shipment_date, package_number] for ...) <= 1)

會錯的,因為分配的Package_number可以存在很多次,合並幾個mini_Packages。 它可以存在多次,但必須始終分配給相同的目的地和日期。

潛在的求解器解決方案:

x[1, Place67, 2019-01-01, 8] = 1
x[2, Place124, 2019-01-04, 119] = 1
x[3, Place124, 2019-01-04, 119] = 1

還可以,mini_Packages 2 和 3 被合並到 Package 119 到相同的目的地(和日期)。

x[4, Place55, 2019-01-05, 119] = 1

將是錯誤的,因為 mini_Package 4 也被合並到 Package 119 中,這是之前由求解器決定的 go 到另一個目的地(和另一個日期)。

怎么可能編碼? 我真的很感激任何解決方案的建議。

2.加法

@Stradivari 感覺(下面的答案)是准確的。 我很可能使用了過多的變量。

3. 沖突產品挑戰

第 2-3 點移至:
https://or.stackexchange.com/questions/2786/shipments-consolidation-with-or-tools-cp-solver-in-python-multi-knapsack

為每個 [pkg, destination] 對創建一個布爾變量。

for package_number in range(Packages):
    for destination in destinations:
        model.AddBoolOr(v for k, v in x.items() if k[1] == destination and k[3] == package_number).OnlyEnforceIf(pkg_dest[package_number, destination])
        model.AddBoolAnd(v.Not() for k, v in x.items() if k[1] == destination and k[3] == package_number).OnlyEnforceIf(pkg_dest[package_number, destination].Not())
    model.Add(sum(pkg_dest[package_number, destination] for destination in destinations) == 1)

日期的邏輯相同。

順便說一句,我覺得你可能用這個公式創造了很多無用的變量,你真的能決定一個小包裝的目的地和/或日期嗎? 或者只是它的 package,然后,對於每個 package,它的目的地和日期?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM