擬陣理論和貪心算法淺析

1 前言

對於一些NP-Hard問題,我們無法找到一個精確的求解方法。使用貪心思想採取貪心算法來求取近似解就成了常用的選擇。很多算法名著對貪心算法都有很明確的講解,這裏對貪心算法摘取一下重點,然後我們要引出貪心算法背後的理論依據——擬陣理論。對於擬陣理論,可以查找一些入門典籍,如劉桂真,陳慶華著《擬陣》。

2 貪心算法

也稱作貪婪算法(Greedy Algorithm),通過做一系列的選擇來給出某一問題的最優解。對算法中的每一個決策點做一個在當時看起來是最佳的選擇。這是貪心算法的核心思想。但是這種啓發式策略不是總能產生出最優解,但常常能給出最優解。貪心算法以動態規劃作爲基礎,大致遵循着這樣的步驟:
1.確定待解決問題的最優子結構;
2.設計遞歸求解方式;
3.證明在遞歸的任一階段,最優選擇之一總是貪心的。那麼做貪心選擇是合適的;
4.證明通過做貪心選擇,所有的子問題都爲空(除一個以外);
5.設計實現貪心策略的遞歸算法;
6.將設計好的遞歸算法轉換成迭代算法。

2.1 貪心選擇性

一個全局最優解可以通過局部最優(貪心)選擇來達到。換言之,當考慮做何種選擇時,我們只考慮對當前問題的選擇而不考慮子問題的結果。貪心算法不同於動態規劃之處就在於此,在動態規劃中,每一步都要做出選擇,但是這些選擇依賴於子問題的解,解動態規劃問題一般是自底向上,從小問題處理到大問題。而貪心算法中,我們所做的總是當前看似最佳的選擇,然後在解決經過貪心選擇之後所出現的子問題。其作出的當前的選擇可能要依賴於已經做出的所有選擇,但不依賴於未做出的選擇或子問題的解。貪心算法採取的貪婪策略往往是自頂向下的。核心所在就是要證明每一步所做的貪心選擇最終能產生一個全局最優解。

2.2 最優子結構

對於一個問題,如果它的一個最優解包含了其子問題的最優解,則稱該問題具有最優子結構。

2.3 設計貪心算法的一般步驟

1.將優化問題轉化爲:先做出選擇,再解決剩下的一個子問題;
2.證明原問題總是有一個最優解是做貪心選擇而得到的,從而證明貪心選擇的安全性;
3.說明做出貪心選擇之後,剩餘的子問題具有一個性質:如果將子問題的最優解和所做的貪心選擇聯合,可以得到原問題的一個最優解。

3 擬陣

首先請明確:擬陣理論不能完全覆蓋所有的貪心算法(如赫夫曼編碼問題),但它可以覆蓋大多數具有實際意義的情況。首先介紹擬陣的概念。(有些文獻也稱作矩陣胚)

3.1 定義 擬陣

擬陣(Matroid)是滿足如下條件的一個序對M=(S,l) :
1.S 是一個非空有窮集合;
2.l2Sϕl
3.l 滿足交換性質(Augmentation):若Al,Bl|A|<|B| ,則xBAs.t.A{x}l
4.l 滿足遺傳性質(Downward closure):若Bl,AB ,則Al .稱BS獨立子集,這樣B 的任意子集也都是S 的獨立子集。

3.2 擬陣的實例

G=(V,E) 是一個無向圖,則MG=(SG,lG) 是一個擬陣.這裏MG 的定義如下:
集合SG 定義爲E ,即G 的邊集;
AE 的子集,則AlG 當且僅當A 是無迴路的。即,一組邊A 是獨立的當且僅當子圖GA=(V,A) 構成了一個森林。
證明:
1)顯然SG=E 是一個有窮集合。

2)lG 是遺傳的。對於任意的BIG,AB ,都有邊集AlG ,原因是從無環的一組邊中去掉一些邊並不會產生出迴路。

3)具有k 條邊的森林恰好包含|V|k 棵樹。若GA=(V,A)GB=(V,B)G 的森林,且|B|>|A| ,則GA 中有|V||A| 棵樹,GB 中有|V||B| 棵樹。由於GB 中的樹比GA 中的樹要少,必有邊e(u,v)GBGA 而且連接GA 中的兩棵樹。將e 添加進A ,不會產生迴路。A{e}l
得證。

3.3 極大獨立子集

首先明確可擴展元素的概念

3.3.1 定義 可擴展元素

給定擬陣M=(S,l) ,對於l 中的獨立子集Al ,若xA,s.t.x 加入A 中仍然保持獨立性,即A{x}l ,則稱xA 的可擴展元素。當擬陣M 中獨立子集A 沒有可擴展元素時,即A 不被M 中別的獨立子集所包含時。稱A 爲極大獨立子集。所有的極大獨立子集都具有相同的勢。

3.3.2 定義 帶權擬陣

若對給定擬陣M=(S,l)S 指定權函數w(),s.t.xS,w(x)>0 ,則稱擬陣M 爲帶權擬陣。那麼按此權函數,對於S 的子集Aw(A)=xAw(x) .
適宜用貪心方法獲得最優解的許多問題,都可以歸結爲在加權擬陣中找出一個具有最大權值的獨立子集問題。因爲任意元素的權值都是正的,故找出的最優子集同時也是最大子集。
下面是求帶權擬陣最優子集的貪心算法。

3.4 求帶權擬陣最優子集的貪心算法

Greedy(M,w){Aϕ;sortMSintomonotonicallydecreasingorderbyweightw;while(MSϕ){xgetMax(MS);if(A{x}Ml)AA{x};}returnA;}

該算法排序時間複雜度爲O(NlogN) ,共判斷N 次,設判斷複雜度爲f(N) ,則整個算法運行時間爲O(NlogN+Nf(N))
現證明算法返回的結果是一個最優子集。

3.4.1 引理1(擬陣具有貪心選擇性質)

假設M=(S,l) 是一個具有權函數w() 的加權擬陣,且S 被按權值的單調減順序排列。設xS 的第一個使{x} 獨立的元素。如果x 存在,則存在S 的一個包含x 的最優子集A .

3.4.2 引理2

M=(S,l) 爲任意一個擬陣。如果xS 的任意元素,是S 的獨立子集A 的一個可擴展元素,那麼x 也必然是ϕ 的一個可擴展元素。
推論M=(S,l) 爲任意一個擬陣。如果集合S 中的元素x 不是空集的可擴展元素,那麼x 也不會是S 的任意獨立子集A 的一個可擴展元素。(這個推論說明了任何元素如果不能立即被選擇,則以後也決不會被選擇。所以,在開始時,對S 中的非空集合的可擴展元素不予選擇不會漏掉解,因爲它們以後也不會被選擇。)

3.4.3 引理3(擬陣具有最優子結構性質)

xS 中被作用於加權擬陣M=(S,l)Greedy 算法第一個選擇的元素。找一個包含x 的具有最大權值的獨立子集問題,可以化歸爲找出加權矩陣M=(S,l) 的一個具有最大權值的獨立子集問題,此處
S={yS|{x,y}l}
l={BS{x}|B{x}l}
其中,M 權函數爲受限於SM 的權函數(即M 的由x 引起的收縮)。
故可得定理,Greedy 算法返回最優子集。
這樣可得到一個定理 擬陣上貪心算法的正確性

3.5 定理 擬陣上貪心算法的正確性

如果給定M=(S,l) 爲一個具有權函數w() 的甲醛擬陣,則調用Greedy(M,w) 返回一個最優子集.

4 後記

擬陣提供給絕大部分貪心算法很好的理論背景,(但不能把所有的貪心算法都覆蓋全面),在我們使用貪心算法解決問題時,應該考察其是否滿足擬陣的相應約束,可否用擬陣理論的背景給予一些證明.應用擬陣的題目雖然不常見,但卻是某些貪心問題強力解法。其獨立擴充公理旺旺成爲證明模型符合擬陣條件的關鍵。
本文只介紹了擬陣的基本概念以及擬陣和貪心算法的關係,若繼續深入研究,可以參閱劉桂真,陳慶華編著的《擬陣》一書。

5 參考文獻

[1] Thomas H.Cormen Charles E.Leiserson Ronald L.Rivest Clifford, Stein introduction to algorithms
[2] 劉桂真,陳慶華,擬陣,國防科技大學出版社,1994

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章