貪心算法是用的比較多的一種優化算法,因為它過程簡潔優美,而且結果有效。有些優化問題如最大權森林(MWF)是可以用貪心問題求解的,由於最小支撐樹(MST)問題與MWF是等價的,所以MST也是可以用貪心算法求解。當然,貪心算法不是萬能的(對於某些問題貪心算法並不能求得最優解,如旅行商問題(TSP)、最大匹配問題),但並不妨礙人們對它的喜愛。
貪心算法(greedy algorithm)偽代碼:
input:一組帶權的元素集合E; 一組條件集合C output:找出集合A⊆E,使得A是滿足C的所有E的子集中權值最大的子集 //“集合的權值”定義為:集合中所有元素的權值之和 //“滿足C”定義為:滿足C中的所有條件。這里設定空集是滿足C的。 begin A = {}; while E!={} 找出E中權值最大的元素,假設該元素是e; E=E-{e}; if A+e 滿足C A=A∪{e}; end //注:這里部分采用C語言的運算符定義。 // 即"="表示賦值; "!="表示不等號
從以上描述中可以看出來,過程很簡單,可以說是簡單暴力的。所以,我們很容易會產生疑問:這樣的算法最后得出的解一定是全局最優解嗎?
在回答之前,我們要搞清楚的是:當前要解決的問題實例對可行解的定義是什么?換句話說,我們要找的“最優解”是從哪個可行解集中找出來的。即,去掉“最優的”限制條件后,還有哪些條件。那么滿足這些條件的所有集合就是可行解集,下一步就是從這個可行解集中找出一個最優的。到這里工作重點已然轉化為找一個合適的優化算法。
其次,這個優化問題可以用貪心算法求出最優解嗎?答案顯然是不一定的。比如,我們要考慮:
(1)若可行解集無限且其權值不收斂,那必然是不能解的。因為這個問題實例本身是沒有最優解的。
(2)可行解有限,或者無限但權值收斂的情況下,在以什么樣的條件下定義出的可行解集中用貪心算法可以最后得到最優解呢?
先引入一個概念:子集系統
已知集合E={e1,e2,...,en}; I⊆P(E)且I以包含關系封閉。那么稱二元組S=(E,I)為子集系統。I中每個成員稱為獨立集。
//注:P(E)表示E的冪集。
如A={1,2,3,4,5,6},B={{2},{2,4},{4,6},{2,4,6}},則(A,B)是子集系統。
再引入一個概念:擬陣
對於某個子集系統M=(E,I),若能用貪心算法找出I中權值最大的獨立集,那么這個子集系統就是擬陣。
看起來似乎問題又繞回去了,沒關系,下面3個命題的等價性可以解惑:
命題1:M是擬陣。
命題2:若Ep∈I,Ep+1∈I,且|Ep|=p,|Ep+1|=p+1,則∃e∈Ep+1-Ep,使得 Ep∪{e} ∈ I。
命題3:若A⊆E,且Ep,Ep+1是A的兩個極大獨立集,則|Ep|=|Ep+1|。
總結:貪心算法有這么多的條件限制,為什么還有這么被愛呢?開頭說過了,因為它簡潔優美。最關鍵的是,對於很多甚至說很大一部分問題,我們往往未必需要找出的它的最優解,近似最優已然足夠。
參考資料:《組合最優化 算法和復雜性》