算法設計方法小結

本文總結了常用的5種算法設計辦法和理念.

 

最優化問題(optimization problem)

         每個最優化問題都包含一組限制條件(constraint)和一個優化函數(optimization function), 符合限制條件的問題求解方案可稱爲可行解(feasible solution), 能夠

使得優化函數取得最佳值的可行解稱爲"最優解" (optimal solution)

 

【方法一】貪心法(greedy method)

算法思想:在貪婪算法中採用逐步構造最優解的方法。在每個階段,都作出一個看上去最優的決策(在一定的準則下)。決策一旦作出,就不可再更改。作出貪婪決策

的依據稱爲貪婪準則(greedy criterion)

典型例子:最短路徑、找零錢、貨箱裝船、拓撲排序、最小生成樹

 

【方法二】分而治之算法

算法思想:分而治之方法與軟件設計的模塊化方法非常相似。爲了解決一個大的問題,可以如下做:

                   a. 它分成兩個或多個更小的問題;

                   b. 分別解決每個小問題;

                   c. 把各個小問題的解答組合起來,即可得出原問題的答案。

小問題通常與原問題相似,可以遞歸地使用分而治之策略來解決。

典型例子:找出僞幣、金塊問題、矩陣分塊相乘、殘缺棋盤、歸併排序、快速排序、距離最近的點對

 

【方法三】動態規劃(dynamic programming)

算法思想:和貪婪算法一樣,在動態規劃中,可將一個問題的解決方案視爲一系列決策的結果。不用的是,在貪婪算法中,每採用一個次貪婪準則做出一個不可撤回

的決策,而在動態規劃中,還要考察每個最優決策序列中是否包含一個最優子序列。動態規劃方法採用最優原則(principle of optimality)來建立用於計算最優解的遞歸式。

所謂最優原則即不管前面的策略如何,此後的決策必須是基於當前狀態(由上一次決策產生)的最優決策。由於對於有些問題的某些遞歸式來說並不一定能保證最優原則,

因此在求解問題時有必要對它進行驗證。若不能保持最優原則,則不可應用動態規劃方法。

個人觀點: 動態規劃的數學表現是遞歸、排列組合,在遞歸過程中會出現重複計算問題,爲了解決這個開銷,使用二維表格保存已計算出的結果,以便複用!

典型例子:最短路徑、0/1揹包問題、矩陣乘法鏈、元件摺疊

 

【回溯法】

        尋找問題的解的一種可靠的方法是首先列出所有候選解,然後依次檢查每一個,在檢查完所有或部分候選解後,即可找到所需要的解。理論上,當候選解數量

有限並且通過檢查所有或部分候選解能夠得到所需解時,上述方法是可行的。

 

算法思想:回溯(backtracking)是一種系統地搜索問題解答的方法。爲了實現回溯,首先需要爲問題定義一個解空間(solution space),這個空間必須至少包含

問題的一個解(可能是最優的)。在迷宮老鼠問題中,我們可以定義一個包含從入口到出口的所有路徑的解空間;在具有n 個對象的0 / 1揹包問題中解空間的一個

合理選擇是2^n個長度爲n 的0 / 1向量的集合,這個集合表示了將0或1分配給x的所有可能方法。

 

回溯方法的步驟如下:
1) 定義一個解空間,它包含問題的解。
2) 用適於搜索的方式組織該空間。
3) 用深度優先法搜索該空間,利用限界函數避免移動到不可能產生解的子空間。
回溯算法的一個有趣的特性是在搜索執行的同時產生解空間。

 

【分支界定】

         類似於回溯法,分枝定界法在搜索解空間時,也經常使用樹形結構來組織解空間。然而與回溯法不同的是,回溯算法使用深度優先方法搜索樹結構,而分枝定界

一般用寬度優先或最小耗費方法來搜索這些樹。

算法思想:分枝定界(branch and bound)是另一種系統地搜索解空間的方法,它與回溯法的主要區別在於對E-節點的擴充方式。每個活節點有且僅有一次機會變成

E-節點。當一個節點變爲E-節點時,則生成從該節點移動一步即可到達的所有新節點。在生成的節點中,拋棄那些不可能導出(最優)可行解的節點,其餘節點加入活

節點表,然後從表中選擇一個節點作爲下一個E-節點。從活節點表中取出所選擇的節點並進行擴充,直到找到解或活動表爲空,擴充過程才結束。

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章