热门问题
时间线
聊天
视角

貪心算法

营销行为法则 来自维基百科,自由的百科全书

贪心算法
Remove ads

貪心算法(英語:greedy algorithm),又稱貪心算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的算法[1]比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心算法。

Thumb
一般人換零錢的時候也會應用到貪心算法。把$36換散︰$20 > $10 > $5 > $1

貪心算法在有最優子結構的問題中尤為有效。最優子結構的意思是局部最優解能決定全局最優解。簡單地說,問題能夠分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。

貪心算法與動態規劃的不同在於它對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會保存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。

貪心法可以解決一些最優化問題,如:求中的最小生成樹、求哈夫曼編碼......對於其他問題,貪心法一般不能得到我們所要求的答案。一旦一個問題可以通過貪心法來解決,那麼貪心法一般是解決這個問題的最好辦法。由於貪心法的高效性以及其所求得的答案比較接近最優結果,貪心法也可以用作輔助算法或者直接解決一些要求結果不特別精確的問題。在不同情況,選擇最優的解,可能會導致辛普森悖論(Simpson's Paradox),不一定出現最優的解。

貪心算法在數據科學領域被廣泛應用,特別是金融工程。其中一個貪心算法例子就是Ensemble method。

Remove ads

適用條件

一個問題要能用貪婪法解,必須同時具備以下兩個性質

貪婪選擇性質

表示在求解過程中,只要每一步都選擇當下看起來最好的選項,就能逐步導向整體的最佳解。貪婪演算法依循這種性質,會先做出一個局部最佳的選擇,接著再處理規模縮小後的子問題。這種方法的關鍵在於「一旦做出選擇,就不會回頭修改」,也不會檢查所有子問題的完整解答,只專注於當前狀態下的最優選擇。這正是它與動態規劃的根本差異:動態規劃會窮舉所有可能的決策路徑,並根據之前所有階段的結果決定後續行動,甚至可能回頭調整先前的決策,以保證能找到全域最優解。

最優子結構

表示它的整體最優解必定可以由各個子問題的最優解組合而成。這種性質也是動態規劃所依賴的基礎。

細節

  1. 建立數學模型來描述問題。
  2. 把求解的問題分成若干個子問題
  3. 對每一子問題求解,得到子問題的局部最優解。
  4. 把子問題的解局部最優解合成原來解問題的一個解。

實現該算法的過程:
從問題的某一初始解出發;while 能朝給定總目標前進一步 do,求出可行解的一個解元素;
最後,由所有解元素組合成問題的一個可行解。

應用

圖論的最小生成樹的算法如Prim算法Kruskal算法就是應用的例子。(Prim演算法是對圖上的節點貪心,Kruskal演算法是對圖上的邊貪心。)

但有兩點需要注意

  • 對於大部分的問題,貪心法通常都不能找出最佳解(不過也有例外),因為他們一般沒有測試所有可能的解。貪心法容易過早做決定,因而沒法達到最佳解。例如,所有對圖著色問題
  • 貪心法在系統故障診斷策略生成乃至高校的排課系統中都可使用。[1][2]

針對第一點的簡單例子,在陣列[1,49,50]求出最少組成98加法,貪婪法第一步會是50(當下最好選項),這導致後面需要48個1,但最好情況是2個49,該問題不滿足貪婪選擇性質,當前選擇會導向壞結果

參見

參考文獻

外部連結

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads