6.18 狂歡背後,站著算法和程式設計師們

力扣leetcode 發佈 2020-06-16T03:04:52+00:00

1998 年 6 月 18 日,劉強東在中關村創業,成立京東公司。2010 年 10 月 25 日,英國一項研究表明,在花叢中飛來飛去的小蜜蜂顯示出了輕易破解「旅行商問題」的能力,他們利用人工控制的假花進行了實驗,結果顯示,不管怎樣改變花的位置,蜜蜂在稍加探索後,很快就可以找到在不同花朵間飛行的最短路徑,這是首次發現能解決這個問題的動物。


1998 年 6 月 18 日,劉強東在中關村創業,成立京東公司。

從此,每年的 6 月成為了京東的店慶月。在店慶月,京東會推出一系列大型促銷活動,其中 6 月 18 日是促銷力度最大的一天。電商讓利、營銷炒作與廣大剁手黨共同形成了得天獨厚的天時地利人和三大條件,6.18 迅速崛起,與雙十一遙相呼應,成為又一大全民購物狂歡節。去年的 6.18 與雙十一銷售額均突破 2000 億大關,今年戰況如何,我們拭目以待。

每年的購物節來臨前,由於網購訂單瞬間激增,多家快遞公司均會通過緊急增調飛機來解決訂單貨運問題。在物流行業,京東後來居上,已經做到了行業先驅地位,京東物流自 2018 年起,90% 的自營訂單就已實現當日達或次日達。今年南通機場集團入股京東航空,進一步為京東物流提速。

有趣的是,每年的購物狂歡節前,不少快遞員通過辭職或轉行規避風頭。全民購物狂歡順帶引爆出一場電商基層離職潮。

物聯網時代

物聯網,簡稱 IOT(The Internet of Things),是指通過信息傳感器、射頻識別技術、全球定位系統、紅外感應器、雷射掃描器等裝置與技術,實時採集需要監控、 連接、互動的物體或過程,再通過網絡接入,實現物與物、物與人的連接,實現對物品和過程的智能化感知、識別和管理。

在智能物流管理過程中,大量運用了物聯網技術。在科技賦能的浪潮下,人工智慧的應用越來越廣泛,無人化倉儲、無人化配送越來越多,各種算法應用到物流領域的每一個細節。包括:

  • 供應鏈網絡優化算法:商家在全國範圍內,選擇合適的倉庫入倉,並確定倉庫的覆蓋範圍,工廠的鋪貨線路,使用的是混合整數規劃模型算法;
  • 供應鏈分倉補貨 / 調撥算法:確定每個倉庫是否需要補貨,同時確定每個倉的補貨量,減少跨區域發貨的訂單;
  • 倉儲算法:負責倉庫內所有未完成訂單揀選任務,合併同一個揀選單,規劃出最短行走距離;
  • 箱型推薦算法:對於每一個訂單的所有商品,推薦用幾個快遞箱、哪種型號的快遞箱。目的是最小化成本,提升包裝效率,減少包裝浪費。由此問題還引申出一個新的問題:根據歷史訂單數量,提前設計每個倉庫最合適的箱型。
  • 車輛的路徑規劃問題:根據要配送的包裹(或者是需要攬收的貨物),在地理上分布的不同位置,計算出需要從物流中心派幾輛車、走什麼路線,分別去派送(或者分別去攬收)這些包裹,才能最省時省力。

正是在大量算法的支撐下,機器逐漸替代人工,無人物流帶來的提升也顯而易見:

  • 運輸量越大,機器相對人工的成本也就越低;
  • 無人物流可實現全天派送,防風雨,方便高效、節省資源;
  • 對於偏遠地區和急件,無人物流能大大提高物流配送效率;
  • 無人物流準確率高達 99%,有效避免了人為的失誤。


物流配送算法

雖然物流行業在近些年隨著電商的火爆才逐漸興起,但在數學中,物流相關算法早已有相關的研究。最早的物流算法可追溯到 1759 年歐拉研究的騎士環遊問題:即對於西洋棋棋盤中的 64 個方格,按照馬走 「日」 字的規則走訪 64 個方格一次且僅一次,並且最終返回到起始點。

對於騎士環遊問題,通常的做法是採用回溯算法求解。

  • 從起點開始,依次嘗試跳到下一個位置,並記錄騎士已走的步數;
  • 如果所有的下一個位置都已經走過一次,且騎士已走步數少於 63, 則說明此種走法不可行。回溯到上一步嘗試下一個可走位置;
  • 當騎士不重複地走到 63 步時,判斷下一步能否回到起點,只有下一步能回到起點的方案才是可行方案,否則繼續回溯尋找路線。

回溯雖然能解決這類問題,但這實際上是一種非常暴力的算法,我們必須對比所有可行方案,從而找到最優解。在物流算法中,我們將這類求解算法稱之為精確算法。除此之外的精確算法還有割平面法、分支定界法、動態規劃法等。

在實際應用中,由於精確算法的計算量會跟隨問題規模的增大呈指數級增長,導致這類算法在現有計算設備中無法用於複雜的組合優化問題的求解。

長久以來,人們一直在尋找一種這類問題的通用解,使得我們不需要窮舉所有的情況,就能直接找出問題的答案。比如:

  • 如果一個人告訴你 13,717,421 可以寫成兩個較小的數的乘積,你想要知道這個說法是否正確的話,必須枚舉出所有的情況,挨個數字嘗試。但如果他告訴你,這個數可以寫成 3607 乘上 3803,你只需要計算一次便可以知道他說的是對的。
  • 在求質數時,我們可以用與 n 依次相除來判斷 n 是否是質數,或者用篩掉質數的倍數的方式來過濾出質數,但我們並不能找到一個通用的公式,能直接計算出下一個質數是多少。

這類問題都屬於不確定問題,由此引申出一個重要的數學難題 —— NP 完全問題。


# NP 完全問題

NP 完全問題(NP-C 問題),是世界七大數學難題之一。NP-C 的英文全稱是 Non-deterministic Polynomial Complete,即多項式複雜程度的非確定性問題。簡單的寫法是 NP=P?,問題就在這個問號上,到底有沒有讓 NP=P 的算法,或是如何證明 NP≠P。

再舉一個通俗的例子:當我們用數字密碼解鎖手機時,如果我們不知道密碼是多少,必須將所有的數字組合依次嘗試。但如果知道了密碼,我們可以輕易地驗證這個密碼是對是錯。

這聽起來像是一句廢話,如果將它抽象一點的表述,就是:能用電腦快速驗證一個解的問題,是否也能夠用電腦快速地求出解。

如果能解決 NP 問題,世界上所有的密碼都將被輕易破解。雖然直覺告訴我們不可能,但 NP 完全問題至今還沒有被下定論。近年來人工智慧、機器學習的發展均與這個猜想有些關係。人們嘗試用啟發式算法替代精確算法,使得 NP 逐漸趨近於 P。

啟發式算法的思想是:在不斷解決問題的過程中尋找解決問題的最優方案。啟發式算法實際上是通過不斷地選擇調優,以尋找到近似的最優解。在物流算法中,人們也是以此來解決經典的旅行商問題。


# 旅行商問題

旅行商問題,又稱為 TSP 問題(Traveling Salesman Problem),是一個經典的組合優化問題。描述為:一個商品推銷員要去若干個城市推銷商品,該推銷員從一個城市出發,需要經過所有城市後,回到出發地。他應如何選擇行進路線,以使總的行程最短。

從圖論的角度來看,該問題實質是在一個帶權完全無向圖中,找一個權值最小的哈密頓迴路。

哈密頓迴路:由天文學家哈密頓提出,由指定的起點前往指定的終點,途中經過所有其他節點且只經過一次。

上文已說到,該問題的可行解就是所有頂點的全排列,隨著頂點數的增加,可行解的數量會呈指數級增長,也就是組合爆炸,它本質上是一個 NP 完全問題。

TSP 問題在交通運輸、電路板線路設計以及物流配送等領域內有著廣泛的應用,國內外學者對其進行了大量的研究。由於這類問題數據規模太大,想要用精確算法求解往往顯得無能為力。因此,在後來的研究中,國內外學者重點使用啟發式算法來尋找近似最優解,這類算法主要有模擬退火算法、遺傳算法、蟻群算法等。


# 模擬退火算法

模擬退火算法由 N. Metropolis 等人於 1953 年提出,簡稱 SA(Simulated Annealing)。它是對局部搜索算法的一種擴展,模擬了金屬從高溫降到低溫的過程中,分子狀態逐漸趨於穩定的過程。

退火是一種物理過程,當金屬物體在加熱至一定溫度後,它的所有分子在其狀態空間中自由運動,處於高能量狀態。隨著溫度的下降,這些分子逐漸停留在低能量狀態,此時結構趨於穩定。

在退火過程中,所有的分子狀態並不是完全相同的,而是有一定的機率處於高能量狀態或低能量狀態。溫度越高,分子處於高能量狀態的機率就越大;溫度越低,分子處於低能量狀態的機率就越大。

模擬退火算法便是基於這一點,它在尋找最優解的過程中,有機率的接受比當前最優解差一點的次等解,這個機率值隨著搜索深度的增加逐漸減少。如果每一步都選擇當前最優解,它就變成了貪心算法,而貪心算法極有可能陷入局部最優。模擬退火算法接受次等解的過程中,隨著搜索深度的增加,次等解有機率超過局部最優解,從而跳出局部最優,獲得全局最優解。

美中不足的是,模擬退火算法為了獲得全局最優解,要求較高的初始溫度,要求退火的速度足夠慢,要求較低的終止溫度和各種溫度下足夠多次的抽樣,這就使得優化過程長,特別是對於規模大的實際問題。因此,優化效率不高是標準模擬退火算法的主要缺點。其次,由於模擬退火算法對初始溫度很敏感,參數的選擇也是應用該算法的難題之一。


# 遺傳算法

1975 年,John holland 受生物進化論的啟示提出了遺傳算法,簡稱 GA(Genetic Algorithms)。GA 借鑑於「適者生存」的理論,在求解優化問題時,通過可行解的一代代交叉、變異,不斷進化,最終得到最適應環境的個體,從而模擬出問題的近似最優解。

遺傳算法的基本運算過程如下:

  • 初始化:設置最大進化次數,隨機生成 M 個個體作為初始群體 P(0);
  • 交叉、變異:交叉是指把兩個父代個體的部分結構加以替換重組而生成新個體,交叉運算使得遺傳算法具備搜索能力。變異是指隨機替換個體的部分結構,每個個體是否變異是根據提前設置的個體變異機率決定的,變異可以保證個體的多樣性,防止出現「早熟」收斂的情況;
  • 個體評價、選擇:通過計算群體 P(t) 中各個個體的適應度,選擇出適應環境的新一代個體 P(t+1);
  • 終止條件判斷:當進化次數達到初始時設定的最大進化次數時,以進化過程中所得到的具有最大適應度個體作為最優解輸出,終止計算。

遺傳算法是一種高度並行、隨機和自適應的通用的優化算法。遺傳算法的一系列優點使它越來越受到重視,在解決眾多領域的機器學習、模式識別、優化控制、組合優化等優化問題中得到了廣泛的應用。

但遺傳算法的參數選擇比較困難,在避免「早熟」收斂和提高收斂速度方面沒有通用的好方法,只能針對具體問題進行具體設計。


# 蟻群算法

蟻群算法由義大利學者 Dorigo、Maniezzo 等人於 20 世紀 90 年代提出,簡稱 AG(Ant Algorithms)。他們在研究螞蟻覓食的過程中,發現單個螞蟻的行為比較簡單,但是蟻群整體卻可以完成一些智能的行為。例如蟻群可以在不同的環境下,尋找最短到達食物源的路徑。

這是因為螞蟻會在其經過的路徑上釋放一種可以稱之為「信息素」的物質,蟻群內的螞蟻對「信息素」具有感知能力,它們會沿著「信息素」濃度較高路逕行走,而每隻路過的螞蟻都會在路上留下「信息素」,形成了一種正反饋的機制。

假設有兩條路可從蟻窩通向食物,開始時兩條路上的螞蟻數量差不多:當螞蟻到達終點之後會立即返回,距離短的路上的螞蟻往返一次時間短,重複頻率快,在單位時間裡往返螞蟻的數目就多,留下的信息素也多,於是會吸引更多螞蟻過來,導致留下更多信息素。而距離長的路正相反,因此越來越多的螞蟻聚集到最短路徑上來。


物流算法的未來

2010 年 10 月 25 日,英國一項研究表明,在花叢中飛來飛去的小蜜蜂顯示出了輕易破解「旅行商問題」的能力,他們利用人工控制的假花進行了實驗,結果顯示,不管怎樣改變花的位置,蜜蜂在稍加探索後,很快就可以找到在不同花朵間飛行的最短路徑,這是首次發現能解決這個問題的動物。

進行研究的奈傑爾·雷恩博士說,蜜蜂每天都要在蜂巢和花朵間飛來飛去,為了采蜜而在不同花朵間飛行是一件很耗精力的事情,因此實際上蜜蜂每天都在解決「旅行商問題」。儘管蜜蜂的大腦只有草籽那麼大,也沒有電腦的幫助,但它已經進化出了一套很好的解決方案,如果能理解蜜蜂怎樣做到這一點,對人類的生產、生活將有很大幫助。

如同在科學研究發現蝙蝠通過超聲波定位之前,人們理所當然的認為人和動物只能靠眼睛識別方向和位置。我們無法得知,蜜蜂是否在它的小腦袋中枚舉了所有的飛行路線,或是找到了 NP=P 的路線規劃方法。無論是哪種可能,在科學發展的面前,我們永遠應保持謙卑。

另外,硬體的發展也會促進物流算法的優化,當計算效率大幅提升,精確算法也將在物流算法行業一展身手。如今啟發式近似算法百花齊放,機器學習、人工智慧在物流優化中大放異彩。但我們深知,啟發式算法仍有建模難、模擬久、成本高等缺點,物流算法的發展依舊任重而道遠。好在,一代又一代的程式設計師前赴後繼,我們有理由堅信,長路漫漫,未來可期。


本文作者:Alpinist Wang

聲明:本文歸 「力扣」 版權所有,如需轉載請聯繫。文中部分圖片來源於網絡,如有侵權聯繫刪除。

關鍵字: