蘇寧場景實踐:小包裹背後的大智慧

AI前線發表於2019-02-28
​​​本文由 【AI前線】原創,原文連結:t.cn/RTp9eO3

AI 前線導讀: “近年來,我國快遞行業隨著網際網路和電子商務的發展而成長起來,其發展勢頭迅猛,國家郵政局統計資料顯示,2016 年全國快遞業務量達 312.8 億件,同比增長 51.7%,中國快遞業已經連續六年每年增長超過 50%,中國已成全球第一快遞大國。隨著快遞量的持續增長,快遞在給我們每個人生活帶來很大便利的同時,也帶來了快遞企業包裝成本的上升和嚴重的快遞包裹材料浪費汙染問題,2016 年全國快遞共消耗編織袋約 32 億條、塑料袋約 68 億個、37 億個包裝箱以及 3.3 億卷膠帶。包裝過度,大材小用,回收使用率低造成了包裝成本的上升、使用者體驗的降低和資源的極大浪費,包裝耗材的低碳化、環保化亟待加強”。

蘇寧物流研發大資料團隊,利用歷史資料分析和大資料演算法技術,推出“智慧包裝解決方案”,結合客戶訂單資訊、商品主資料,包裝耗材資料等相關資料進行大資料演算法模型優化,自動為顧客商品確認包裝材料型別、包裝應用、確定裝箱順序和裝箱位置,實現包裝的智慧化應用。通過智慧包裝解決方案在倉庫包裝的應用,每年可為蘇寧物流節約包裝成本近千萬。同時,通過新包裝材料(可回收利用“漂流箱”)的推廣使用,促進了包裝減量化和迴圈利用,不僅僅節約包裝成本,提升使用者體驗,更重要的是能夠保護環境和節約資源。每個漂流箱迴圈使用 2000 次,大約可節約 1 棵 10 年樹齡的樹木。漂流箱在全國範圍投放,每年節省下來的快遞盒可繞地球一圈。

蘇寧智慧包裝解決方案技術

合單與拆包

合單與拆包可以理解為兩個“相反”的操作,簡而言之,合單是將同一時間視窗內的相同收貨地址的訂單合併化零為整,拆包則是再將一個訂單根據業務邏輯拆成多個包裹進行派送。兩個操作的目的都是為了提高客戶收貨體驗。

為了保證合單的效率,我們只考慮同一個時間視窗內產生的訂單進行合併而不是對全天的訂單進行合併。在同一時間視窗內,每個訂單將會與其他訂單做匹配,如果發現多個訂單共用一個收貨地址,系統將自動將這些訂單合併到一起,化零為整。由於商品有不同的屬性以及包裝材料大小的限制,同一訂單需要拆分成多個包裹進行打包。例如,客戶在大促時買了大量廁所清潔產品和食品兩類商品,如果將兩類商品混合打包到一個包裹中,將大大降低客戶體驗,因此我們將兩類商品分開,分別打包到不同的包裹中進行派送。同時,如果兩個包裹裝不下客戶的所有商品,那我們再將商品分裝到多個包裹中。

完成合單與拆包並確定包裝材料的數量與種類後,下一步系統將會呼叫包裝推薦演算法推薦合適大小的包裝材料。

包裝推薦

裝箱問題在物流與生產系統中是一個經典並且非常重要的優化問題。系統通過包裝推薦功能找到合適大小的包裝材料推薦給業務操作人員來包裝客戶的商品,而包裝推薦就是裝箱問題的一個典型應用,其本質就是如何合理的放置商品以達到包裝箱的裝填率最大化。2 維裝箱問題已被證明是個 NP-hard(Coffman et al., 1980)問題,NP 是指非確定性多項式(non-deterministic polynomial,縮寫 NP)。所謂的非確定性是指,可用一定數量的運算去解決多項式時間內可解決的問題。NP-hard 問題通俗來說是其解的正確效能夠被“很容易檢查”的問題,這裡“很容易檢查”指的是存在一個多項式檢查演算法。相應的,若 NP 中所有問題到某一個問題是圖靈可歸約的,則該問題為 NP 困難問題。同理可得,3 維裝箱問題也是個 NP-hard 問題。

三維裝箱數學模型

約束條件(1),(2),(3)和(4)一起用來確保放置商品時,不會存在不同商品位置重疊的情況。約束條件(5),(6)和(7)確保商品不會被放置到包裝材料外面。對於同個商品,不同的放置方式,將會有不一樣的長、寬、高。,約束條件(8),(9)和(10)用來重定義商品 i 長、寬、高。在本段開頭,我們已經假設所有商品為規則的長方體,而一個長方體商品一共有三個不同的面,每個面為底有兩種擺法,所以一個商品一共有 6 種不同的放置方式。6 种放置方式如下圖所示

由模型可見該問題為一個混合整數非線性規劃問題,由於該類問題的複雜性,其不可能在合理時間內獲得精確解。簡而言之,該問題很難在合理的時間內被求解出來,不能滿足我們業務實時計算反饋推薦的需求,因此我們開發了自己的包裝推薦演算法去尋找較好的可行解。

包裝推薦演算法

對於裝箱問題,直接影響到裝填率的因素有兩個,分別是商品裝箱順序和商品裝箱位置。針對這兩個因素,我們分別使用了不同的優化演算法進行求解。首先,我們使用了遺傳演算法對商品裝箱順序進行優化計算,然後我們使用了 3 維裝箱演算法對商品裝箱位置進行優化計算。

整體流程

整個包裝推薦演算法流程如下圖所示。我們首先將包裝箱按最長邊降序排列,篩選出符合最長邊和體積要求的包裝材料。

包裝推薦演算法流程圖

                                      包裝推薦演算法流程圖

然後我們初始化商品裝箱序列,並使用遺傳演算法對商品裝箱序列進行調整。在評估當前順序的適應度時,我們呼叫 3D 裝箱演算法對商品進行放置,若裝箱演算法依照當前裝箱順序能將所有商品打包進包裝材料,則停止計算。否則,繼續遺傳演算法對裝箱順序進行調整,再評估新順序的適應度。在往同一個包裹放置多於一件商品的情況下,由於只依靠最長邊與體積無法確定商品是否都能裝下,因此我們需要用遍歷的方式把所有的包材依照上面的邏輯全部計算一遍,然後找出裝填率最高的一種包材。

前面我們大致介紹了下包裝推薦演算法的整體計算流程,接下來我們將深入到細節,給大家詳細介紹下演算法每個模組的實現邏輯。

裝箱順序優化

在打包多件商品的情況下,通過改變商品的裝箱順序能獲得不同的裝箱效果。如下圖所示先放置小件商品和先放置大件商品會得到不同的裝箱結果。

裝箱順序對比圖

裝箱順序對比圖

遺傳演算法具有很好的全域性尋優能力,因此我們選擇了該演算法去優化裝箱順序。遺傳演算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜尋最優解的方法。我們使用了實數編碼方式生成代表裝箱順序的基因種群。然後在進化的過程中,我們對選中的父代基因進行交叉(Crossover)與變異(Mutation)操作。如下圖所示,基因的交叉就是對選中的兩條基因進行元素交換以生成新的子代。交叉的方式有很多種,在此我們羅列出比較常用的幾種方式。

基因交叉示例圖基因交叉示例圖

交叉操作主要是使種群內的資訊能夠進行區域性交換獲得新的子代,而變異操作是為了使種群內能夠加入新的隨機資訊。由於這個隨機的新資訊有可能是有利於向最優解收斂的有益資訊,也有可能是使搜尋偏離最優解的誤導資訊,因此我們需要慎重地使用變異操作。我們使用了概率值來控制變異操作,當達到一定概率時,變異操作才會被啟用從而獲取新的隨機資訊。相對於交叉操作,變異操作是針對於單條基因進行變換操作。變異的方式也有很多,下圖中展示了最常用的幾種變異方式。

基因變異示例圖基因變異示例圖

完成交叉與變異操作後,我們需要對新獲得的基因組進行評估。我們依據新獲得的基因即裝箱順序,呼叫 3 維裝箱演算法去嘗試裝箱。

裝箱位置優化

除了裝箱順序外,在打包商品時,商品的放置位置也直接影響到最終的裝箱效果。裝箱位置包含了商品在包裝箱內的放置位置與放置方式兩個子問題。下面兩個對比圖分別展現了商品不同放置位置與不同放置方式最終對裝箱結果的影響。

不同放置位置與不同放置方式對比圖

不同放置位置與不同放置方式對比圖

在已知裝箱順序後,3 維裝箱演算法決定如何尋找合適的商品放置位置與放置方式。每次放置一個商品時,我們會嘗試 6 種不同的商品放置方式,看哪種能在箱子裡放得下。每放置一個商品到一個長方形空間裡時,我們稱未被商品佔去位置的空閒空間為殘存空間(residual space)。演算法對殘存空間進行切割,保留能留下最大殘存空間的切割方式。因為留下的殘存空間越大,那之後更有可能裝下剩下的商品。演算法將貪婪得采用 6 種商品放置方式當中能生成最大殘存空間的放置方式,以保證剩下的商品能順利裝箱。

切割方案對比圖

切割方案對比圖

上圖為兩種不同的切割方式對比圖。灰色區域為前一個商品放置位置,A、B、A’和 B’為兩種不同切割方式所產生的不同的殘存空間,由於 A’的面積大於 B,所以我們傾向保留切割方案 B。

在放置商品的過程中,完整的空間被不斷得切割成更小的殘存空間,當剩餘的商品在所有的殘存空間裡放不下時,演算法就考慮調整一些殘存空間以獲得更合適的空間來放置商品。調整的方式可以千變萬化,但是計算時間有限,因此我們人為縮小了搜尋空間:只有兩個在同一水平面並共享一個頂點和一條邊的殘存空間演算法才嘗試調整。演算法從所有的殘存空間裡挑出滿足條件的兩個殘存空間嘗試進行調整,即在同一水平面並且共享一個頂點及一條邊。如下圖所示,調整前的殘存空間分別為 A 和 B,兩個空間共享一個頂點及一條邊。演算法將會嘗試將殘存空間進行調整,生成新的殘存空間 A’ 和 B’來嘗試裝箱。若新產生的殘存空間可以放置一個商品,那我們保留該調整方案,否則我們嘗試調整其餘殘存空間。通過對殘存空間的調整,我們更有效的利用了包裝箱的空間。

殘存空間調整前後對比圖

殘存空間調整前後對比圖

如上圖所示調整前,殘存空間 A’ 和 B’共享邊(a, b)和頂點 b 並在同一水平面上。經過調整後我們獲得新的空間 A 和 B,其中 B 能裝入之前 A’和 B’無法裝入的狹長型商品。

Spark 平行計算

蘇寧全國擁有 47 個倉庫,每天有大量包裹需要實時推薦包材,單機版的演算法並不能滿足業務要求。因此我們使用 Spark Streaming 實現演算法並行化。如下圖所示,上游系統實時將批次資料寫入 Kafka。Spark Streaming 從 Kafka 不同分割槽實時獲取資料生成 RDD 存放在記憶體中,然後根據包裹號對記憶體裡的 RDD 進行拆分,分發到不同的 Executor (執行器)。在各個單獨的 Executor 中,呼叫實時推薦包材演算法對分配到的相應資料進行計算。完成計算後,每個 Executor 將計算結果即推薦結果寫入 Kafka 不同分割槽中。下游系統再從 Kafka 中實時取走推薦結果。

演算法並行執行架構圖演算法並行執行架構圖

蘇寧智慧包裝解決方案已經在蘇寧倉庫執行,通過統一包裝耗材標準,將包裝耗材種類從 30 種縮減到 14 種,在提高包裝效率的基礎上包裝填充率總體提高 59%。同時,可迴圈的塑料箱—“漂流箱”已經在北京、上海、廣州、南京、深圳、杭州、武漢、成都八大城市上線投入 10000 餘個,長約 0.3 米,寬 0.2 米的“漂流箱”,用它代替普通紙箱裝載消費者購買的產品,由快遞員進行“最後一公里”投遞。使用者可以在蘇寧自提點、社群代收點自提快遞,取出商品後將“漂流箱”放回自提點回收。此外,使用者還可以選擇送貨上門,當面拆箱驗貨簽收後,將漂流箱交由快遞員帶回作迴圈使用。為了增強使用者體驗,這些漂流箱還特意設計了牢固的“封箱釦”,保證商品安全,保障使用者隱私。蘇寧智慧包裝解決方案的推行,每年可節約 1000 萬元的包裝成本,同時,“漂流箱”及各種隱私包裝的應用,保障客戶的購物隱私,增強了客戶的購物體驗。

作者介紹

葉夢賢,運籌學與定量物流碩士研究生,蘇寧物流研發中心演算法工程師,主要負責物流優化,運籌學、優化演算法在蘇寧物流的應用。曾任埃森哲資深分析師,負責與物流相關演算法設計與開發。專注於物流優化,運籌學,優化演算法研究與應用,希望藉助運籌學、優化演算法,把握技術變革,助推智慧零售。

關注我們的微訊號”AI前線“,後臺回覆“AI”可獲得《AI前線》系列PDF電子書​​​​

相關文章