上一章:分治法和動態規划http://www.cnblogs.com/suxi-blog/articles/6238831.html
下一章:分支限界法http://www.cnblogs.com/suxi-blog/articles/6240060.html
一.貪心算法
1.貪心算法是把一個復雜的問題分解為一個較為簡單的局部最優選擇,每一步選擇都是對當前解的一個擴展,直到獲取問題的完整。貪心算法的典型運用是求解最優化問題,而且對許多問題都能得到整體最優解。(這里得到的結不一定是最優解,但一定是最優解的十分接近的解)
2.可以使用貪心算法的要具有兩個重要的性質:最優子結構和貪心選擇性質
(1)最優子結構:在這里就不再說了,要看的請到上一章的動態規划里看。
(2)貪心選擇性質:指問題的整體最優解可以通過一系列的局部最優的選擇得到。
3.貪心算法和動態規划的主要區別:
(1)動態規划:只要求出相關的子問題的解后才能做出選擇
(2)貪心算法:僅當前的狀態下做出最好的選擇,即局部最優選,產生再去作出這樣選擇后產生的相關子問題的解。
4.貪心算法通常被使用來求解最優的問題,從某初始化的狀態出發,根據但前的局部最優策略以滿足約束方程為條件,以是目標函數增長最快(最慢)為准則,在候選集合進行一系列的選擇,以便盡快的構成問題的可行解。
5.貪心算法的一般步驟:
Greedy(C) //C是問題的輸入集合,即候選集合
{
S={}; //初始化解集合為空集
while(not solution(S)) //集合S沒有構成問題的一個解
{
x=select(C); //在候選集合C中做貪心選擇
if feasible(S,x) //判斷集合S中加入x后的解是否可行
{
S=S+{X};
}
C=C-{x}; //不管可不可行,都要從候選集中C刪除x
}
return S;
}
二.回溯算法
1.回溯算法就是一種有組織的系統最優化搜索技術,可以看作蠻力法窮舉搜索的改進。回溯法常常可以避免搜索所有可能的解,所以它是用求解組織數量較大的問題。(為什么?后面會解釋)
2.首先我們先了解一下一個基本概念“解空間樹”:問題的解空間一般使用解空間樹的方式來組織,樹的根節點位於第1層,表示搜索的初始狀態,依次向下排列。
3.解空間樹的動態搜索:在搜索至樹中任一節點時,先判斷該節點對應的部分是否是滿足約束條件,或者是否超出目標函數的界,也就是判斷該節點是否包含問題的最優解。如果肯定不包含,則跳過對該節點為根的子樹的搜索,即所謂的剪枝;否則,進入該節點為根的子樹,繼續按照深度優先策略搜索。(這也是為什么回溯可以避免搜索所有的解)
4.在搜索過程中,通常采用兩種策略避免無效搜索:(1)用約束條件剪除得不到的可行解的子樹
(2)用目標函數剪取得不到的最優解的子樹
(這兩種方式統稱為:剪枝函數)
5.在用回溯法求解問題時,常常遇到兩種典型的解空間樹:
(1)子集樹:但所有的問題是從n個元素的集合中找出滿足某種性質的子集時,相應的解空間樹成為子集樹
(2)排列樹:當所給出問題是確定n個元素滿足某種性質的排列時,相應的解空間稱為排列樹。
6.回溯法的一般步驟:
(1)設置初始化的方案(給變量賦初始值,讀入已知數據等)
(2)變換方式去試探,若全部試完側轉(7)
(3)判斷此法是否成功(通過約束函數),不成功則轉(2)
(4)試探成功則前進一步再試探
(5)正確方案還是未找到則轉(2)
(6)以找到一種方案則記錄並打印
(7)退回一步(回溯),若未退到頭則轉(2)
(8)已退到頭則結束或打印無解
7.回溯法的優點在於其結構明確,可讀性強,易於理解,而且通過對問題的分析可以大大提高運行效率。
--------------------------------------------------------------------------------------------------------------------
今天就到這里,下一次:分支限界法
http://www.cnblogs.com/suxi-blog/articles/6240060.html
