什麼是近似算法?它適用於哪些問題?這篇文章給你答案

2021-01-07 澎湃新聞

選自Medium

機器之心編譯

作者:Aryan Gupta

編輯:魔王

羅素曾說:所有精確科學都被近似思想所主宰。本文介紹了近似算法及其對某些標準問題的適用性。

新冠大流行給世界帶來了巨大的改變,全球科學家和研究人員在研製有效的疫苗。他們正在做的就是從廣闊的樣本空間中近似地收緊可能性範圍,並盡力得到一些有效解。近似在我們的生活中發揮了重要作用。

以在線食品配送為例,我們經常從網上訂購食物,享受快速送達的服務。但你想過這些 app 後端運行的什麼算法讓快遞員在更短時間內抵達目的地嗎?答案是近似算法。這類問題就是「旅行商問題」。

食品配送:旅行商問題的現實應用。

本文將介紹近似算法及其對某些標準問題的適用性,以及哪些因素會影響到特定算法的選擇。

什麼是近似算法?

近似算法是一種處理優化問題 NP 完全性的方式,它無法確保最優解。近似算法的目標是在多項式時間內儘可能地接近最優值。

它雖然無法給出精確最優解,但可以將問題收斂到最終解的近似值。其目標滿足以下三個關鍵特性:

能夠在多項式時間內高效運行;

能夠給出最優解;

對於每個問題實例均有效。

背景

數學表達式的評估常伴隨常量、變量分析和方程的階,可用于衡量近似的複雜度。此類評估將問題分解為 P 和 NP 難問題。

P 問題和 NP 問題的策略

P 問題是指可以在多項式時間內求解的問題。

NP 表示不確定性多項式時間(nondeterministic polynomial time),NP 問題是指在多項式時間內近似驗證答案的問題。但目前人們發現,很多此類問題需要指數時間才能求解。

P 和 NP 策略。

真正的爭論在於 P=NP 還是 P≠NP。之前的一些研究證明這兩種都是對的。如果一個問題是多項式次方,則存在多個最優算法。因此,在 NP 完全問題中,存在兩種方法找到近優解,然後選擇最適合的算法。

如果輸入的大小比較小,則具備指數運行時間的算法可能會比較適合。

其次,通過用近似算法替代確定性算法,我們仍然能夠在多項式時間內找到近優解。

近似算法的複雜度可以從輸入大小和近似因子中推斷出來。接下來,我們通過一些示例,深入探索這些算法如何應用到現實問題中。

分區問題(Partition Problem)

在計算機科學領域,該問題的定義是:給定多重正整數集 X,它可以被分割為兩個元素之和相等的子集 X1 和 X2,即每個子集的數值之和與另一個子集相等。

例如,X={3,4,1,3,3,2,3,2,1} 可以被分割為 X1={3,3,2,3} 和 X2={4,2,3,1,1},二者的數值之和都是 11。

類似地,X={1,3,1,2,1,2} 可以被分成 X1={2,1,1,1} 和 X2={3,2},兩個子集的數值之和都是 5。有趣的是,這不是唯一解。X1={1,3,1} 和 X2={2,1,2} 的數值之和也為 5,這表明存在多個可能的子集。

這就是 NP 完全問題,存在偽多項式時間動態規劃解,可獲得該問題的近優解。

方法和決定步驟

現在,我們開始分析這個問題,把它分解成數個單獨的標準問題。這裡,我們想要找出多重集的元素之和相等的子集,那麼該問題就可以分解成以下兩個問題:

子集和問題:子集 X 的元素之和等於數字 W。

多路數字分割:給定整數參數 W,確定如何將 X 分割成 W 個等額子集。

近似算法

如上所述,將分區問題分解為多路分割與子集和問題後,我們就可以考慮為這些問題而開發的算法,包括:

貪婪數字分割(Greedy number Partitioning)

該算法循環遍歷所有數字,將每個數字分配給總和最小的子集。如果數字未以排序方式排列,則其運行時複雜度為 O(n),近似率約為 3/2。其 Python 偽代碼如下:

def find_partition(numbers): """Separate the available numbers into two eqal sum series.

Args: numbers: collection of numbers, for example list of integers.

Returns: Two lists of numbers. """ X = [] Y = [] sum_X = 0 sum_Y = 0 for n in sorted(numbers, reverse=True): if sum_X < sum_Y: X.append(n) sum_X = sum_X + n else: Y.append(n) sum_Y = sum_Y + n return (X, Y)

將數字排序,則運行時複雜度增加到 O(n logn),近似率增加到 7/6。如果數字在 [0,1] 範圍內均勻分布,則近似率約為 1 + O(log logn/n)。

分區問題圖示。

上圖用二叉樹的形式展示所有分區。樹的根部表示集合中的最大數,每一級對應輸入數字,每個獨立分支對應不同的子集。遍歷這些集合需要深度優先遍歷(depth-first traversal),所需的空間複雜度為 O(n),時間複雜度為 O(2^n)。

適用性:

該算法可以根據情況進行修改,以便改善運行時複雜度。每一級的首要目標是構建一個分支,將當前數字分配給總和最小的子集。首先通過貪婪數字分割找出總和,然後切換到優化,得到全多項式時間近似解。

Karmarkar-Karp 算法

Karmarkar-Karp 算法指以降序方式排列數字的最大差分方法,該方法將差值替換掉原來的數字不斷放進集合中。其 Java 偽代碼實現如下:

int karmarkarKarpPartition(int[] baseArr) { // create max heap PriorityQueueheap = new PriorityQueue(baseArr.length, REVERSE_INT_CMP);

for (int value : baseArr) { heap.add(value); }

while (heap.size() > 1) { int val1 = heap.poll(); int val2 = heap.poll(); heap.add(val1 - val2); }

return heap.poll();}

該算法包含輸入集 S 和參數 k。將 S 分割成 k 個子集,使這些子集中的數字總和相等,從而構建期望輸出。該算法包含如下關鍵步驟:

以降序方式排列數字;

用差值替換掉原來的數字,直到只有一個數字;

採用回溯算法,完成分區。

適用性:

該算法通過構建二叉樹來假設分區。每一級表示一對數字,左側的分支表示用差值替換數字,右側的分支表示將差值放置在同一個子集中。該算法先通過最大差分求得解,然後繼續尋找更好的近似解。它所需的空間複雜度為 O(n),但最糟糕的情況下所需的時間複雜度可能會達到 O(2^n)。

裝箱問題

裝箱問題有多種現實應用。例如,如何從根本上改善印度的垃圾管理系統。這個問題就可以通過裝箱問題來解決,幫助當局決定 x 量的垃圾需要多少個垃圾箱。

貨櫃船:裝箱問題的現實應用。

在計算機科學領域中,該問題可用於多種內存管理技術。在該算法中,我們可以通過去除冗餘和最小化空間浪費來包裝不同形狀和大小的對象。

例如:給定一個包含 n 個項的集合,每個項的大小分別為 s1,s2,..,sn (0<=si<=1, 1<=i<=n),如何將它們裝進最少數量的箱子?

經典方法:

1. 鄰近適應算法 (Next Fit):查看當前項是否適合當前箱子。如果適合,則將物品放置在箱子裡,否則開啟一個新的箱子。

我們來看一個示例:項是 0.5, 0.7, 0.5, 0.2, 0.4, 0.2, 0.5, 0.1, 0.6,箱子大小均為 1。

基於鄰近適應算法的裝箱解決方案(M = 箱子總數 = 6)。

2. 最先匹配法 (First Fit):按順序瀏覽箱子,在第一個箱中放置新的項,直到放不下再啟用新的箱子。

我們來看一個示例:項是 0.5, 0.7, 0.5, 0.2, 0.4, 0.2, 0.5, 0.1, 0.6,箱子的大小均為 1。

基於最先匹配法的裝箱解決方案(M = 箱子總數 = 5)。

3. 最優匹配法 (Best Fit):按順序瀏覽箱子,將每一個新的項放在最適合的箱子裡。如果不適合,則創建一個新的箱子。

我們來看一個示例:項是 0.5, 0.7, 0.5, 0.2, 0.4, 0.2, 0.5, 0.1, 0.6,箱子的大小均為 1。

基於最優匹配法的裝箱解決方案(M = 箱子總數 = 5)。

該方法的輸出與最先匹配法相同,但該方法的優點是實現速度比 FFD 快,即時間複雜度為 O(nlogn)。

自然方法:

如果我們提前知道所有項的大小,那麼自然的解決方案就是首先按照從大到小排序,然後應用以下啟發式方法:

最先匹配遞減法

最優匹配遞減法

假設有相同的示例 0.7, 0.6, 0.5, 0.5, 0.5, 0.4, 0.2, 0.2, 0.1,則排序為 0.7, 0.6, 0.5, 0.5, 0.5, 0.4, 0.2, 0.2, 0.1。

優化方法(M = 箱子總數 = 4)。

參考文獻:

1. https://cutt.ly/4hSDx2Y

2. https://cutt.ly/xhSDhEM

3. https://shorturl.at/hxCO5

4.https://en.wikipedia.org/wiki/Bin_packing_problem#Approximation_algorithms_for_bin_packing

5. https://en.wikipedia.org/wiki/Partition_problem

6.https://www.javatpoint.com/daa-approximate-algorithms#:~:text=An%20Approximate%20Algorithm%20is%20a,at%20the%20most%20polynomial%20time

原文連結:https://medium.com/aryan-gupta18/how-to-decide-suitability-of-approximation-algorithms-d8e45b90e530

© THE END

轉載請聯繫本公眾號獲得授權

投稿或尋求報導:content@jiqizhixin.com

原標題:《什麼是近似算法?它適用於哪些問題?這篇文章給你答案》

閱讀原文

相關焦點

  • 貪心算法與近似算法
    實際上,算法可能簡單得讓你大吃一驚。具體做法如下。 (1) 選出結束最早的課,它就是要在這間教室上的第一堂課。 (2) 接下來,必須選擇第一堂課結束後才開始的課。同樣,你選擇結束最早的課,這將是要在這間教室上的第二堂課。重複這樣做就能找出答案!下面來試一試。美術課的結束時間最早,為10:00 a.m.,因此它就是第一堂課。
  • 什麼是定速巡航,它有哪些作用?這篇文章來給你答案!
    什麼是定速巡航,它有哪些作用?這篇文章來給你答案!以前的時候,汽車要有定速巡航那一定是豪車了,但是,隨著汽車市場的發展,現在普通車型也也會擁有這個功能。即使沒有安裝後期也是可以加裝的,當然了,針對定速巡航這一功能,大家的看法就出現了分歧,有的人覺得定速巡航能解放右腳,有的人則覺得會影響安全。定速巡航究竟是何方神聖?
  • 它有哪些優缺點?這篇文章來給你答案!
    它有哪些優缺點?這篇文章來給你答案!問題:朋友學術方向是發動機, 有說起寶馬的發動機是最好的(或者是最好的那一擋, 原話記不清了, 大致意思如上). 作為一個外行, 我想了解一下, 寶馬的發動機好, 反應在駕駛體驗上, 具體是什麼樣的?
  • 高爾夫7有哪些優缺點?它的質量如何?這篇文章來給你答案!
    高爾夫7有哪些優缺點?它的質量如何?這篇文章來給你答案!作為一個喜歡汽車,從事汽車行業,並且一個德系車迷來說,可以這麼說,只要是高爾夫的車主,很少有後悔買這個汽車的!真是的車主可以說說自己的想法,不接受任何的反駁,哈哈自從1974年高爾夫這款車就有了,到現在有幾千萬輛的銷量了,在2003年7月時候第四代的高爾夫正式國產,開啟了國內兩廂車市場的高峰期!高爾夫不僅僅有普通的版本,還有高爾夫的R和高爾夫GTI這樣為了極致玩家準備的大玩具。
  • 它有哪些優勢?這篇文章為你帶來答案!
    它有哪些優勢?這篇文章為你帶來答案》。王先生是我的粉絲,更是知名的老司機,他是我的表哥,也是一位10年老司機,公司的傳祺GS4他已然了如指掌。聽了堂弟建議,最近他勒緊褲腰帶入手一輛傳祺GS5,絕對是一時興起,沒選傳祺GS4。在使用了1個月,跑了2100公裡後,他說了五個字:它非常完美!傳祺GS5是什麼地方吸引了他?與傳祺GS4的主要差異在哪裡?
  • 什麼是小樣本學習?這篇綜述文章用166篇參考文獻告訴你答案
    機器之心報導參與:魔王什麼是小樣本學習?它與弱監督學習等問題有何差異?其核心問題是什麼?來自港科大和第四範式的這篇綜述論文提供了解答。這篇綜述論文已被 ACM Computing Surveys 接收,作者還建立了 GitHub repo,用於更新該領域的發展。
  • MCMC、蒙特卡洛近似和Metropolis算法簡介
    許多貝葉斯建模方法都需要計算積分,而我看到的任何工作示例似乎都使用高斯或伯努利分布,原因很簡單如果您嘗試使用比這更複雜的方法,它將成為分析的噩夢。 將貝葉斯模型限制在「表現良好」的分布的小子集中,可能會極大地阻礙你對問題建模的能力,所以我們必須找到克服這一限制的方法。蒙特卡洛近似如果我不想分析計算某個討厭的積分怎麼辦?可以使用蒙特卡洛近似。
  • 它有哪些缺點?這篇文章給你答案
    它有哪些缺點?這篇文章給你答案朗逸是大眾旗下一款緊湊型車,在國內有著較高的知名度,自上市以來獲得了不錯的銷量和口碑,經過了幾次改款外觀內飾都進行了全新升級,外觀方面2018款朗逸採用了最新的家族式設計語言,外觀跟帕薩特有很多相似之處,前進氣格柵與大燈融為一體,並且加入了大量的鍍鉻條裝飾,視覺效果很不錯,車身線條流暢很有運動感,整體看起來還是非常好看。
  • 它有哪些優缺點?這篇文章來給你答案!
    它有哪些優缺點?這篇文章來給你答案!每款車型的配置表時,會發現有一個叫空氣懸架的項目,一直不知道是何物,後來,專門地去了解了下,下面,就著題主的問題,就來和大家一起來聊聊這個空氣懸掛(架)吧。空氣懸掛,顧名思義,也是懸掛的一種形式,它不同於我們平時常常見到的螺旋彈簧加減震筒組成的懸掛,空氣懸掛系統內部裝有壓縮空氣的空氣彈簧和阻尼可變的減震器,它利用氣體的可壓縮性來實現其彈性作用。在懸掛內部,氣壓可以隨著載荷還有道路條件的變化而進行自動調節。那麼它都有什麼好處呢?
  • 它有哪些優點?這篇文章給你答案
    它有哪些優點?這篇文章給你答案乾式雙離合確實在穩定性方面是不如AT變速箱的,這是結構本質所決定的,但是畢竟是小概率事件,現在在雙離合領域除了PDK,大眾汽車的雙離合可以說是做的最好的,沒有之一!雙離合的具體工作原理就不說了,最早就是用於賽車的離合器,有很高的換擋效率,後來被大眾應用於民用車型。
  • 奔馳smart空間小不適用,為啥還有那麼多人開?這篇文章給你答案
    奔馳smart空間小不適用,為啥還有那麼多人開?這篇文章給你答案又是一個問這個問題的,哪有這麼的多為什麼,小巧可愛,就是一個大玩具,買奔馳Smart這個車的一般都是女生接孩子用的,或者是代步用的,而且家裡一般都是第二輛甚至是第N輛車而已!
  • 什麼是讀書的意義,這篇文章告訴你答案
    什麼是讀書的意義?這篇文章告訴你答案。年輕的時候以為不讀書不足以了解人生,直到後來才發現如果不了解人生,是讀不懂書的。讀書的意義大概就是用生活所感去讀書,用讀書所得去生活吧。但我並不將讀專業書視為完整意義上的讀書,在我看來,一個人不論從事什麼行業,都應該讀一些人文社科類的圖書。讀書的意義是使人虛心,較通達,不固陋,不偏執。你要忍,忍到春暖花開;你要走,走到燈火通明;你要看過世界遼闊,再評判是好是壞;你要卯足勁變好,再旗鼓相當站在不敢想像的人身邊;你要變成想像中的樣子,讀書,這件事,一步都不能讓。
  • 新生兒常見5種皮膚問題該怎麼應對?這篇文章告訴你答案
    導讀:新生兒常見5種皮膚問題該怎麼應對?這篇文章告訴你答案各位點開這篇文章的朋友們,想必都是很高的顏值吧,我們真的是很有緣哦,小編每天都會給大家帶來不一樣的育兒資訊,如果對小編的文章或者其他的什麼,有什麼一些意見的話歡迎在下方積極評論哦,小編每條都會認真看的。那麼本期的內容是:新生兒常見5種皮膚問題該怎麼應對?這篇文章告訴你答案!那麼我們就來看看吧!
  • 乙醇汽油有哪些優缺點?這篇文章給了答案,你同意嗎?
    乙醇汽油有哪些優缺點?這篇文章給了答案,你同意嗎?對於乙醇汽油來說,很多人都說不耐燒,對發動機不好等等不好的評價,那麼乙醇汽油真的不好嗎?以下我們就來談論一下乙醇汽油的優缺點。事物都有兩面性,乙醇汽油的一些缺點確實很令人頭疼,但是從它的優點來看,只要選擇質量好的乙醇汽油還是很可取的。乙醇汽油是使用10%的乙醇+90%的純汽油調和的,個人覺得乙醇汽油沒有任何好處,除了會增加車輛油耗,浪費乙醇以外沒有什麼實際作用。
  • 從此篇文章入手,輕輕鬆鬆學算法
    歡迎點擊上方藍字「iOSer」關注我們再點擊右上角「...」菜單,選擇「設為星標
  • 「清華大學」校長是什麼級別?這篇文章告訴你答案
    文/天叔讀史「清華大學」校長是什麼級別?這篇文章告訴你答案大家都知道清華和北大是我們國家最高等級的學府了,而清華和北大每年也會為國家輸出一大批優秀的專業技術人才。今天小編就來給大家介紹這兩所學校校長中的一位——「清華大學」校長,那麼「清華大學」校長是什麼級別呢?帶著這個疑問,這篇文章會告訴你答案。大家都知道「清華大學」是我們國家頂尖的高校,但是可能很少有人知道,「清華大學」也是我們國家34所副部級高校裡的一所,怎麼樣。地位夠高吧。可能有人要問了,什麼叫「副部級高校」呢?其實這個稱謂說的就是目前中國最頂級的重點大學。
  • 尋找生命的基礎算法
    你是如何想出 「大概近似正確」 學習這個主意的?LESLIE VALIANT:我屬於理論計算機科學派,尤其是計算複雜性理論,不過我對人工智慧也挺感興趣。我的第一個問題是:人工智慧的哪個方面能夠變成定量理論?很快我就確定這一定是學習。
  • 關於電磁爐的幾個問題 這篇文章給你答案
    電磁爐作為常用電器,實用頻率很高並且使用時距離人體十分相近,因此近兩年關於電磁爐的電磁安全問題經常被提及。人們經常會討論電磁爐是否有輻射,輻射到底有多大,能否危害健康,孕婦能不能使用電磁爐等與健康相關的問題。     那麼今天我們就為大家對這些日常關注比較多的問題一一來進行解答。
  • 午睡對人體有什麼好處?如何有效的午睡呢?這篇文章告訴你答案
    午睡對人體有什麼好處?如何有效的午睡呢?這篇文章告訴你答案在冬天,酒足飯飽之後,我可以躺在床上午睡一下,這時就會感覺特別幸福。通過這篇文章,我們也許可以在其中找到一些答案。有些人是比較討厭午睡的。很多人不知道為什麼一午睡就會感覺到越來越困,這其實是有原因的。我們在睡眠的時候,需要經歷一個漫長的過程,從剛剛入睡,到真正睡著需要時間。
  • 什麼是算法? - 《我的第一本算法書》
    ▌算法與程序的區別算法就是計算或者解決問題的步驟。我們可以把它想像成食譜。要想做出特定的料理,就要遵循食譜上的步驟;同理,要想用計算機解決特定的問題,就要遵循算法。這裡所說的特定問題多種多樣,比如「將隨意排列的數字按從小到大的順序重新排列」「尋找出發點到目的地的最短路徑」,等等。食譜和算法之間最大的區別就在於算法是嚴密的。