1. 程式人生 > >算法圖解-貪婪算法

算法圖解-貪婪算法

分享 旅行商問題 貪婪算法 背包 get 速算 全局最優 任務 獲得

內容:

  • 如何處理不可能完成的任務;沒有快速算法的問題(NP完全問題)
  • 學習是被NP完全問題,以免浪費時間去尋找解決他們的快速算法
  • 學習近似算法,使用它們可快速中找到NP完全問題的近似解
  • 學習貪婪策略——一種非常簡單的問題解決策略

8.1教室調度問題

  貪婪算法:每步都采取絕不最優解,最終的到的就是全局最優解。

貪婪蘇凡並非任何情況下都有效,但它易於實現。

8.2背包問題

  貪婪算法並不能得到最優解,但是非常接近。

在有些情況下,完美是優秀的敵人。 有時,只需找到一個單只解決問題的算法啊,此時貪婪算法正好派上用場,其易於實現,得到的結果又與最優結果相當接近。

8.3近似算法

  貪婪算法是一種近似算法,在獲得精確解需要時間太長時,可使用近似算法。

  判斷近似算法優劣的標準如下:

  • 速度有多快
  • 的到的近似解與最優解的接近程度

  使用貪婪算法解決廣播臺覆蓋問題。

技術分享圖片
 1 # You pass an array in, and it gets converted to a set.
 2 states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
 3 
 4 stations = {}
 5 stations["kone"] = set(["id", "nv", "ut"])
 6 stations["ktwo"] = set(["wa", "id", "
mt"]) 7 stations["kthree"] = set(["or", "nv", "ca"]) 8 stations["kfour"] = set(["nv", "ut"]) 9 stations["kfive"] = set(["ca", "az"]) 10 11 final_stations = set() 12 13 for station, states in stations.items(): 14 # print "states: ", states 15 print "station: ", station 16 print "\n" 17 18 while
states_needed: 19 best_station = None 20 states_covered = set() 21 for station, states in stations.items():#station is index, states is element 22 covered = states_needed & states # get intersection 23 print "covered: ", covered 24 print "states_covered: ", states_covered 25 print "states: ", states 26 print "station: ", station 27 print "***********\n" 28 29 if len(covered) > len(states_covered): 30 best_station = station 31 states_covered = covered 32 33 states_needed -= states_covered 34 final_stations.add(best_station) 35 36 print final_stations
set_covering.py

說明:

  1. 代碼中的for循環對廣播站進行進行遍歷,查找出能覆蓋最多州的廣播站;
  2. for循環結束後,把已覆蓋的州從集合中刪除,更新最終解的集合;
  3. 如果還有未覆蓋的州,繼續執行步驟1(第二部中,應該把找到的廣播 站刪除);
  4. 直到沒有需要覆蓋的州,則查找結束。

8.4 NP完全問題

  1. 定義:NP完全問題的簡單定義是,以難解著稱的問題,如旅行商問題和集合覆蓋問題。很多人認為,沒有可以快速結果這些問題的算法。
  2. 如何識別:
  • 元素較少時算法的運行速度非常快,但隨著元素的增加,速度變得非常慢
  • 涉及“所有組合”的問題通常是NP完全問題
  • 不能將問題分成小問題,必須考慮各種可能的情況,這可能是NP完全問題
  • 如果涉及集合且難以解決,它可能是NP完全問題
  • 如果問題涉及集合且難以解決,他可能是NP完全問題
  • 如果問題可轉換為集合覆蓋問題或旅行商問題,它肯定是NP完全問題

8.5小結

  • 貪婪算法尋找局部最優解,企圖以這種方式獲得全局最優解
  • 對於NP完全問題,還沒有找到快速解決方案
  • 面臨NP完全問題時,最佳的做法是使用近似算法
  • 貪婪算法易於實現、運行速度快,是不錯的近似算法

算法圖解-貪婪算法