五大常用算法(一) 貪心算法


一、基本概念

  所謂貪心算法是指,在對問題求解時,總是 做出在當前來看是最好的選擇。也就是說,不從整體最優上加以考慮,通過貪心算法做出來的往往是在把 原問題拆分成幾個小問題,分別求 每個小問題的最優解,再把這些“局部最優解”疊起來,就作為整個問題 當前 的最優解。

  貪心算法無固定的算法框架,算法設計的關鍵是貪心策略的選擇,必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇貪心策略必須具備 無后效性(即某個狀態以后的過程不會影響以前的狀態,只與當前狀態有關)。

  比如,求 最小生成樹的Prim算法 和 Kruskal算法 都是漂亮的貪心算法。

二、基本思路

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

三、存在的問題

  • 不能保證求得的最后解是最佳的;
  • 不能用來 求最值 的問題;
  • 只能求 滿足某些約束條件 的可行解的范圍。

四、例題分析

  【背包問題】有一個背包,容量是M=150,有7個物品,物品可以分割成任意大小。要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。

  物品:A B C D E F G
  重量:35 30 60 50 40 10 25
  價值:10 40 30 50 35 40 30

  題目分析:為了使背包總價值最大,我們可以制定三種策略:

  1. 每次挑選價值最大的物品裝入背包;
  2. 每次挑選重量最小的物品裝入背包;
  3. 每次挑選單位重量價值最大的物品裝入背包;

  策略 1 結果:選擇 D B F E 總重量 130 總價值 165;

  策略 2 結果:選擇 F G B A E 總重量 140 總價值 155;

  策略 3 結果:選擇 F B G D A 總重量 150 總價值 170;

  結果分析:可以看到單位重量價值最大的策略 的結果比其它更好。

  總結:由此可見,策略制定的不同,得到的解也會不同,我們只需要針對不同的問題制定不同的策略即可。

五、算法的使用前提

  • 原問題復雜度過高;
  • 求全局最優解的數學模型難以建立;
  • 求全局最優解的計算量過大;
  • 沒有太大必要一定要求出全局最優解,“比較優”就可以。

六、分解問題方式

  • 按串行任務分

  時間串行的任務,按子任務來分解,即每一步都是在前一步的基礎上再選擇當前的最優解。

  • 按規模遞減分

  規模較大的復雜問題,可以借助遞歸思想,分解成一個規模小一點點的問題,循環解決,當最后一步的求解完成后就得到了所謂的“全局最優解”。

  • 按並行任務分

  這種問題的任務不分先后,可能是並行的,可以分別求解后,再按一定的規則(比如某種配比公式)將其組合后得到最終解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM