快遞背后的黑科技,你造嗎?


純手工打造每一篇開源資訊與技術干貨,數十萬程序員和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秒,即可自動關注。

點擊左下角查看更多熱門技術


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • About:PostgreSQL About 《PostgreSQL 源碼分析系列》 PostgreSQL 源碼分...
    ty4z2008閱讀 8,219評論 1 40
  • (寫在文前的只言片語、意書情殤)長歌破曉穿云過,響徹碧霄振九天.)------Jason Zhang web開發已...
    Jason_Zhang_閱讀 5,356評論 0 1
  • 霧凇 一直聽說衡山有霧凇,雖說老家是湖南的,卻一直沒有機會去看一看。2016年的春節,終于去了一趟5年沒有回去的老...
    TonyQZeng閱讀 2,439評論 0 0
  • 《禮記·中庸》有言:凡事豫則立,不豫則廢。言前定則不跲,事前定則不困,行前定則不疚,道前定則不窮。(豫,亦作“預”...
    容氏阿楠Vi閱讀 183評論 2 5
  • 為了向The ABCs of Death致敬,我打算寫26個小故事,故事與字母無關,僅作計數。 L先生在超市買了一...
    九大人閱讀 298評論 0 0