![](/img/trans.png)
[英]Adding an or-statement to an OR-Tools constraint (CP-SAT 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. 沖突產品挑戰
為每個 [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.