算法圖解-貪婪算法
阿新 • • 發佈:2018-04-22
分享 旅行商問題 貪婪算法 背包 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", "set_covering.pymt"]) 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 whilestates_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
說明:
- 代碼中的for循環對廣播站進行進行遍歷,查找出能覆蓋最多州的廣播站;
- for循環結束後,把已覆蓋的州從集合中刪除,更新最終解的集合;
- 如果還有未覆蓋的州,繼續執行步驟1(第二部中,應該把找到的廣播 站刪除);
- 直到沒有需要覆蓋的州,則查找結束。
8.4 NP完全問題
- 定義:NP完全問題的簡單定義是,以難解著稱的問題,如旅行商問題和集合覆蓋問題。很多人認為,沒有可以快速結果這些問題的算法。
- 如何識別:
- 元素較少時算法的運行速度非常快,但隨著元素的增加,速度變得非常慢
- 涉及“所有組合”的問題通常是NP完全問題
- 不能將問題分成小問題,必須考慮各種可能的情況,這可能是NP完全問題
- 如果涉及集合且難以解決,它可能是NP完全問題
- 如果問題涉及集合且難以解決,他可能是NP完全問題
- 如果問題可轉換為集合覆蓋問題或旅行商問題,它肯定是NP完全問題
8.5小結
- 貪婪算法尋找局部最優解,企圖以這種方式獲得全局最優解
- 對於NP完全問題,還沒有找到快速解決方案
- 面臨NP完全問題時,最佳的做法是使用近似算法
- 貪婪算法易於實現、運行速度快,是不錯的近似算法
算法圖解-貪婪算法