【貪心算法】思想 & 基本要素 & 貪心算法與局部最優 & 貪心算法與動態規劃的區別 & 運用貪心算法求解問題

首先我們先代入問題來認識一下貪心算法涉及的問題

找錢問題
給顧客找錢,希望找零的鈔票儘可能少,零錢種類和數量限定
找錢問題滿足最優子結構
最快找零(貪心):爲得到最小的找零次數,每次最大程度低減少零額

活動安排問題
設 個活動都需要使用某個教室,已知它們的起始時間和結束時間,求合理的安排使得舉行的活動數量最多
貪心:使得每次安排後,教室的空閒時間最多
在這裏插入圖片描述
解決過程如下:
在這裏插入圖片描述
在這裏插入圖片描述
貪心算法求得的相容活動集是最大的
第一步:證明最優解中包含結束時間最早的活動
設相容集 A 是一個最優解,其結束最早的活動爲 a,則 ( A - { a }) U { 1 } 也是一個最優解
第二步:證明去掉結束時間最早的活動後,得到的子問題仍是最優的:反證法

理解貪心算法

貪心算法總是做出當前最好的選擇

  • 貪心選擇的依據是當前的狀態,而不是問題的目標
  • 貪心選擇是不計後果的
  • 貪心算法通常以自頂向下的方法簡化子問題

貪心算法求解的問題具備以下性質

  • 貪心選擇性質:問題的最優解可以通過貪心選擇實現
  • 最優子結構性質:問題的最優解包含子問題的最優解

貪心選擇性質的證明

  1. 證明問題的最優解可以由貪心選擇開始
    即第一步可貪心
  2. 證明貪心選擇後得到的子問題滿足最優子結構
    即步步可貪心

揹包問題

問題描述:給定 n 個物品和一個揹包。物品 i 的重量爲 Wi ,價值爲 Vi ,揹包的容量爲 c ,問如何選擇物品或物品的一部分,使得揹包中物品的價值最大?
在這裏插入圖片描述
當 n = 3 ,c = 50
在這裏插入圖片描述
0-1揹包問題:裝入物品2、3,最大價值220
揹包問題:裝入物品1、2和2/3的物品3,最大價值240(貪心算法
貪心算法無法求解0-1揹包問題,按貪心算法,0-1揹包問題將裝入物品1和2

貪心與局部最優

思考:爲什麼0-1揹包可以用動態規劃?而不能用貪心算法

  1. 貪心易陷入局部最優
  2. 好比“以最快的速度下山”,每步都選擇最快不見得一定到達山腳
  3. 局部最優是指解在一定範圍或區域內是最優的,或求解問題的方法在一定限制條件下是最優的
  4. 一般的啓發式算法、貪心算法或局部算法都很容易產生局部最優
  5. 局部最優通常是無法查證的
  6. 獲得局部最解的複雜度遠低於全局最優解
    找錢問題:15元找零11之後,不存在面值爲4元的零錢
    0-1揹包問題:50容量的揹包裝入前兩個物品仍剩餘20容量的空間
    活動安排問題:若限制教室使用的總時間

貪心算法與動態規劃

貪心算法和動態規劃都具有最優子結構
在這裏插入圖片描述
貪心算法是自頂向下的,只查看了當前狀態;而動態規劃自底向上地求解了最優解包含的所有子問題

最優裝載

問題描述:一批集裝箱要裝上一艘載重量爲 c 的輪船,其中集裝箱 i 的重量爲 Wi ,不考慮體積,將盡可能多的集裝箱裝上輪船
在這裏插入圖片描述
貪心:重量輕者先裝
思考:與0-1揹包問題有什麼不同?
設 x = (x1, x2, … , xn) 是最優裝載問題的最優解(貪心算法)
貪心選擇性質:設 y = (y1, y2, … , yn) 是一個最優解,其第一個不爲0的選擇爲 yk = 1,則將物品 k 替換成物品1,仍滿足容量限制,替換方案就構成了原問題的另一個最優解
最優子結構性質:考慮去掉物品1後的子問題

哈夫曼編碼

Huffman編碼是一種可變字長編碼,一種構建極小多餘編碼的方法
一篇包含6種字符的文檔中
在這裏插入圖片描述
將串001011101解碼爲aabe
在這裏插入圖片描述
定義平均碼長爲
在這裏插入圖片描述
求文檔 C 的哈夫曼編碼就等價於構建一棵最優完全二叉樹,使得平均碼長最小
即文檔 C 的最優前綴碼
貪心算法:依次將最小頻率的節點兩兩合併

單源最短路徑

問題描述:設一個帶權的有向圖 G = (V, E)
在這裏插入圖片描述
求從源頂點 V1屬於 V 到其他頂點的最短路徑
在這裏插入圖片描述
Dijkstra 算法又稱爲標號法
T標號:臨時標號(tentative label),表示到源頂點的路徑還可以進一步降低,有待探查
P標號:永久標號(permanent label),表示已經找到源頂點的最短路徑,不再探查
當所有頂點的標號變成P標號時,算法結束,即算法最多需要 n - 1 步
初始:給起點一個 P 標號 0,其他頂點爲無窮大的 T 標號
更新:若頂點 Vi 最近獲得了P標號,考查與其有弧 eij 相連的頂點 Vj,若 Vj 仍是 T 標號,更新其 T 標號爲
在這裏插入圖片描述
決策:在所有 T 標號中,選擇一個值最小的頂點,令其變爲 P 標號

Dijkstra 算法爲什麼沒有陷入局部最優?
貪心:決策總是在所有T標號的頂點中選擇最小

最小生成樹

給定無向圖 G = (V, E) ,稱 G‘ = (V’, E‘) 是 G 的一個子圖,若 V’ 包含於 V,E’ 包含於 E。
若 V’ = V,則稱 G‘ 是 G 的一個支撐子圖
若一個無向圖是連通的,且無迴路,則稱這個圖爲一個樹
給定圖 G ,若 G 的一個支撐子圖 T 是一個樹,則稱 T 爲 G 的一個支撐樹
若 G 是一個帶權的圖,則稱權最小的支撐樹爲 G 的最小生成樹

Most Small Tree:設 G = (V, E)是一個連通帶權圖,設 (u , v) 包含於 E, u 包含於 U,v 包含於 V - U,其中 U 屬於 V ,且 (u , v) 是這樣的邊中權最小的一條邊,則一定存在 G 的一棵最小生成樹包含 (u , v) 這條邊
貪心:每次選取已觀察頂點集與未觀察頂點集之間具有最小權的邊,將所有邊按權從小到大排序,依次添加到最小生成樹中,且不形成迴路

多機調度問題

問題描述:給定 n 個獨立的作業要在 m 臺機器上加工,求合理的調度方案使得加工時間最短
貪心:將最長時間的作業安排到最閒的機器上
貪心選擇:
只剩一個作業時,應安排在最閒的機器上
最後安排時間最短的作業

總結

  1. 貪心算法總是選擇當前最有利的方案,因而容易陷入局部最優解
  2. 貪心算法可解的問題應具有貪心選擇性質和最優子結構性質
  3. 貪心算法的證明分兩步,第一步證明可將最優解替換成以貪心選擇開始,第二步證明去掉貪心選擇後滿足最優子結構
  4. 貪心算法的複雜性很低
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章