參考鏈接:https://zhuanlan.zhihu.com/p/76164082?ivk_sa=1024320u,非常棒!!!
圖片前引:
假設一個問題比較復雜,暫時找不到全局最優解,那么我們可以考慮把原問題拆成幾個小問題(分而治之思想),分別求每個小問題的最優解,再把這些“局部最優解”疊起來,就“當作”整個問題的最優解了。
貪心算法的三步走!
第一步:明確到底什么是最優解?明確下來之后用小本本記下來!
第二步:明確什么是子問題的最優解?再用小本本記下來!
第三步:分別求出子問題的最優解再堆疊出全局最優解?這步不用記!
就是這么簡單!
示例:0-1背包問題
有一個背包,最多能承載150斤的重量,現在有7個物品,重量分別為[35, 30, 60, 50, 40, 10, 25],它們的價值分別為[10, 40, 30, 50, 35, 40, 30],,阿廣,如果是你的話,應該如何選擇才能使得我們的背包背走最多價值的物品?
按照剛才說的步驟實操一下吧!
第一步,明確到底什么是最優解?
第二步,明確什么是子問題的最優解?再用小本本記下來!
第三步,分別求出子問題的最優解再堆疊出全局最優解?
按照制訂的規則(價值)進行計算,順序是:4 2 6 5 。
最終的總重量是:130。
最終的總價值是:165。
按照制訂的規則(重量)進行計算,順序是:6 7 2 1 5 。
最終的總重量是:140。
最終的總價值是:155。
可以看到,重量優先是沒有價值優先的策略更好。
按照制訂的規則(單位密度)進行計算,順序是:6 2 7 4 1。
最終的總重量是:150。
最終的總價值是:170。
可以看到,單位密度這個策略比之前的價值策略和重量策略都要好。
貪心算法三個核心問題!!!
是的,阿廣,你說的基本意思正確!
下面我總結一下使用貪心算法的前提:
1、原問題復雜度過高;
2、求全局最優解的數學模型難以建立;
3、求全局最優解的計算量過大;
4、沒有太大必要一定要求出全局最優解,“比較優”就可以。
那么幾乎99.99999999999%就要使用貪心算法的思想來解決問題。
按串行任務分:時間串行的任務,按子任務來分解,即每一步都是在前一步的基礎上再選擇當前的最優解。
按規模遞減分:規模較大的復雜問題,可以借助遞歸思想(見第2課),分解成一個規模小一點點的問題,循環解決,當最后一步的求解完成后就得到了所謂的“全局最優解”。
按並行任務分:這種問題的任務不分先后,可能是並行的,可以分別求解后,再按一定的規則(比如某種配比公式)將其組合后得到最終解。
成本
耗費多少資源,花掉多少編程時間。
速度
計算量是否過大,計算速度能否滿足要求。
價值
得到了最優解與次優解是否真的有那么大的差別,還是說差別可以忽略。