純手工打造每一篇開源資訊與技術干貨,數十萬程序員和Linuxer已經關注。
導讀 | 前幾天雙 11 下的單,都已經收到包裹了吧?為什么 2016 年雙 11 的快遞來得比以往都及時?今天,就來給大家分享一下物流與背后的數據庫技術。 |
物流行業是被電子商務催生的產業之一。
快件的配送和攬件的調度算法是物流行業一個非常重要的課題,直接關系到配送或攬件的時效,以及物流公司的運作成本。
好的算法,可以提高時效,降低成本,甚至可以更好的調動社會資源。
本文將以物流行業為例,給大家分析一下 PostgreSQL 與 Greenplum 在地理位置信息處理,最佳路徑算法,機器學習等方面的物流行業應用方法。
物流的要素分析物流做的事情很簡單,寄件,送件(但是后面蘊藏著很多高精尖的黑科技呢,比如怎么調度,怎么獲得最佳路徑)。
物流環節的要素有幾個,都與位置有關。
寄件人
攬件員(攬件人通常不是直接將貨收到倉庫,而是網點。所以網點到倉庫也是需要調度的,本文未涉及。)
調度方法與配送差不太多。
貨物
倉庫
運輸工具
派件員
收件人
我們這里先從簡單的入手,假設現在只關心位置信息,剖析一下從寄件到收到包裹,整個過程串起來,看看背后的技術。
1. 寄件
貨物從寄件人到攬件員,通常是預約的操作,而且寄件人可以直接去網點辦理寄件,所以沒有太多的算法在里面。
如果派件和攬件混合在一起的話,可以用 KNN 算法來解決,再結合派件點路徑調度,選出最佳的攬件人。
例如,寄件人當前位置,與快遞員調度的下一個位置,進行 KNN 運算,因此 B 來攬件是成本最低的。
2. 貨物在倉庫之間流轉的物流調度
假設上圖為倉庫的位置,兩個倉庫之間如果開通了線路的話,就以線段連接起來。
每個倉庫負責一個區域,這個區域是一個幾何的圖形。
通過寄件人和收件人的位置,與倉庫的區域進行點面判斷,找出寄件人的倉庫與收件人的倉庫。
快件為點,倉庫為面,寄件時根據寄件人填寫的寄件和收件信息轉換為寄件和收件兩個經緯度,通過這兩個經緯度與快遞公司的倉庫表進行點面包含的判斷匹配,就可以找出快件對應的起點和終點的倉庫。
點面判斷。
有了源和目標就可以通過 pgrouting 提供的各種最佳路徑算法算出每件貨物的最佳路徑。
本文后面會有 demo 來講解如何使用 pgrouting 計算最佳路徑。
倉庫之間的貨車的工作就簡單了,裝滿就走或分波次(考慮到時效) 的原則,負責好兩個直連節點的來回運輸,并不是一輛車完成整個貨物的從起點到終點的運輸。
例如負責 A 和 B 之間線路的貨車,只在 AB 之間跑運輸。
3. 貨物從終點倉庫到網點的物流調度
貨物在抵達目標倉庫后,首先要將貨物分揀到派件的網點。
其實也是一個點面判斷的過程,網點覆蓋的派件范圍為面,快件則為點,點面判斷找出對應的網點。
從倉庫到網點,也可以使用倉庫建流轉的原理,計算出最佳線路。貨車只負責2個網點之間的貨物流轉即可。
4. 派件
進入派件的流程,也就是貨物在抵達收件人手中的最后一公里要做的事情。
為了更好的實現派件調度,需要對快件進行聚合操作,根據位置進行聚合。
原理和前面類似,還是要做點面判斷,只是目標更加精確,例如精確到小區或者很小的區域。
派件除了要考慮快件的目的地(聚合后的),還需要考慮快件的體積,重量,以及快遞員的運貨能力(體積與重量) 。
假設一個網點當前收到的快件覆蓋了以下需要派送的點(聚合后的),同時每個點的貨物體積總和如數字所表示。
路徑規劃與前面不一樣的地方,這里規劃的是多個點作為目標。
多點目標的最佳路徑,用意是確保相鄰目標的連續性,確保切分不同網點的快件后,拿到快件的人跑的依舊是相鄰的點。
例如中心是網點的位置,其他點是目標位置,目標位置的數字是體積,假設每個快遞員一次運輸的體積是 7000,虛線是一個快遞員拿到的一趟的快件。
這種方法確保了每趟的快件是連續的。
多點目標的最佳路徑規劃,在本文后面的部分也會有 DEMO。
地址轉換成坐標如何將地址轉換成坐標,不在本文的討論范圍,很多做導航的公司都可以輸出這個能力。
但是作為快遞公司,還有一種方法可以獲得精確的坐標信息,例如快遞員的手持GPS終端,收件時掃個條碼,同時上報位置信息。
有了一定的基數后,通過文本分析和機器學習,也可以輸出地址轉坐標的能力。
如果基數非常龐大,可以選擇基于 PostgreSQL 的 Greenplum 數據倉庫,進行文本分析與機器學習(支持 MADlib 庫,支持R,python,java)。
PS:
Greenplum 支持文本分析,支持地理位置信息處理,支持 MADlib 機器學習庫,還支持 R 語言自定義函數,python 函數,支持分布式并行計算。
最重要的是它開源,絕對是有文本和地理位置分析需求的用戶最好的選擇。
你可以使用熟悉的 R、Python、Java 自定義數據庫端的 UDF,滿足靈活的業務需求。
路徑規劃以倉庫之間的數據流轉為例:
需要用到 PostgreSQL 數據庫的 PostGIS 與 pgrouting。
首先是基礎數據的錄入,即道路數據,用來表示開通了運輸航線的倉庫之間的線段數據,以及線段的屬性信息。
1. 生成拓撲
有了道路信息還不夠,要生成最佳路徑,首先要生成合法的拓撲,否則怎么生成路徑呢?
生成拓撲前,需要添加兩個字段,用來存儲線段的首尾編號。
調用 pgr_createTopology 生成拓撲,也就是生成線段的首位編號的過程
例如,ABC 三條線段,其中 B 線段的兩端都沒有和 AC 完全吻合,誤差分別為 1 米和 10 米,所以需要設置容錯。
生成線段,實際上就是設置 source 和 target 的 ID,設置完后,可能就變成這樣的了。
2. 生成最佳路徑
我們知道道路是有坡度,有彎度的,還有顛簸程度,是否單行線,過路費,擁堵程度,怎么送貨效率最高,不能只看路程。
想象一下你打車去機場的場景,如果時間比較緊的話,就要靠司機了。
一個優秀的出租車司機是會幫你選擇最佳路徑的,算上擁堵費,繞路其實可能更省。
pgrouting 支持的最佳路徑算法很多
你可以根據不同的算法,輸入當時每條路段相關的因素(例如坡度,彎度,顛簸程度,是否單行線,過路費,擁堵程度 數字化的 weight 系數),生成最佳路徑。
支持的內置算法如圖
小結一下物流配送都用到了哪些技術:
1. 根據寄件人和收件人地址轉換成坐標,需要用到公共的轉換庫,當基數達到一定程度后,可以自建轉庫。
自建地址和坐標轉換庫,需要用到機器學習的技術,PostgreSQL 與 Greenplum 都支持 MADlib 庫,對于 Greenplum 的 R 用戶,可以使用 Greenplum 進行隱式的并行數據挖掘,處理大數據量的挖掘很有幫助。
2. 根據寄件人和收件人的坐標,與快遞公司倉庫覆蓋的的電子圍欄進行點面判斷, 找到匹配的倉庫。
3. 得到最佳運送路徑,規劃算法參考 pgrouting 的手冊以及 workshop
4. 根據寄件人或收件人的坐標,以及最后一公里的網格信息進行點面聚合,得到配送位置。
5. 聚類算法
如果小區信息在數據庫中存儲的不是面,而是點,那么派件的點面判斷,可以用 PostgreSQL 或者 Greenplum 的 K-Means 聚類算法,將快件與小區進行聚合,達到同樣的目的。
根據指定的種子數組,即網點覆蓋的小區或寫字樓等組成的點值數組,生成聚類數據(即目標包裹),從而實現最后一公里的高效率配送。
PostgreSQL 在地理位置處理的領域一直處于非常領先的地位,用戶群體也非常的龐大,PostGIS 和 pgrouting 只是這個領域的兩個插件。
PostGIS 和 pgrouting 在阿里云的 RDS PostgreSQL 數據庫都有提供,想要了解更多https://www.aliyun.com/product/rds/postgresql。
原文來自:https://linux.cn/article-7962-1.html
本文地址:http://www.linuxprobe.com/express-black-tech.html編輯員:常津,審核員:岳永
《Linux就該這么學》是由資深運維專家劉遄及全國多名紅帽架構師(RHCA)基于最新RHEL7系統共同編寫的高質量Linux技術自學教程,極其適合用于Linux技術入門教程或講課輔助教材。
? 劉遄老師QQ:5604241
? 學員助教QQ:5604674
? Linux技術交流A群(滿):560843
? Linux技術交流B群:340829
? Linux技術交流C群:463590
? 官方站點:www.linuxprobe.com
? 電腦在線閱讀效果更佳:
http://www.linuxprobe.com/chapter-00.html
按住圖片3秒,即可自動關注。
點擊左下角查看更多熱門技術