【最优化方法】穷举法 vs. 爬山法 vs. 模拟退火算法 vs. 遗传算法 vs. 蚁群算法
一、 窮舉法
列舉所有可能,然后一個個去,得到最優的結果。如圖一,需要從A點一直走到G點,才能知道,F是最高的(最優解)。這種算法得到的最優解肯定是最好的,但也是效率最低的。窮舉法雖然能得到最好的最優解,但效率是極其低下的。為了能提高效率,可以不要枚舉所有的結果,只枚舉結果集中的一部分,如果某個解在這部分解中是最優的,那么就把它當成最優解。顯然這樣有可能不能得到真正的最優解,但效率卻比窮舉法高很多。
二. 爬山算法 ( Hill Climbing )
【貪心法】
在枚舉所有解時,當遇到的解在當前情況下是最優時,就認為它是最優解。如圖一,當從A點到B點時,由于B點比A點的解更優,所以會認為B點是最優解。顯然這樣的效率很高,但得到的最優解質量也很差。
【爬山法】
貪心法是只和前面的一個比較,為了提高最優解的質量,可以不僅和前一個解比較,也和后一個解比較,如果比前面和后面的解都優,那么就認為它是最優解。如圖一,當到C點時,發現它比前面的B和后面的D點的解都好,所以認為它是最優解。爬山算法是一種簡單的貪心搜索算法,該算法每次從當前解的臨近解空間中選擇一個最優解作為當前解,直到達到一個局部最優解。
???????? 爬山算法實現很簡單,其主要缺點是會陷入局部最優解,而不一定能搜索到全局最優解。如圖1所示:假設C點為當前解,爬山算法搜索到A點這個局部最優解就會停止搜索,因為在A點無論向那個方向小幅度移動都不能得到更優的解。
圖1
?
?
三. 模擬退火(SA,Simulated Annealing)思想
???????? 爬山法是完完全全的貪心法,每次都鼠目寸光的選擇一個當前最優解,因此只能搜索到局部的最優值。模擬退火其實也是一種貪心算法,但是它的搜索過程引入了隨機因素。模擬退火算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個局部的最優解,達到全局的最優解。以圖1為例,模擬退火算法在搜索到局部最優解A后,會以一定的概率接受到E的移動。也許經過幾次這樣的不是局部最優的移動后會到達D點,于是就跳出了局部最大值A。
? ? ? ? 【模擬退火算法(Simulated Annealing,SA)】最早由Kirkpatrick等應用于組合優化領域,它是基于Mente-Carlo迭代求解策略的一種隨機尋優算法,其出發點是基于物理中固體物質的退火過程與一般組合優化問題之間的相似性。模擬退火算法從某一較高初溫出發,伴隨溫度參數的不斷下降,結合概率突跳特性在解空間中隨機尋找目標函數的全局最優解,即在局部最優解能概率性地跳出并最終趨于全局最優。
模擬退火算法的關鍵在于控制溫度(概率)降低快慢的參數r,這個參數范圍是0<r<1。如果參數r過大,則搜索到全局最優解的可能會較高,但搜索的過程也就較長。若r過小,則搜索的過程會很快,但最終可能會達到一個局部最優值。
模擬退火算法不能保證得到真正的最優解,但它能在效率不錯的情況下得到質量較高的最優解。
???????? 模擬退火算法描述:
???????? 若J( Y(i+1) )>= J( Y(i) ) ?(即移動后得到更優解),則總是接受該移動
???????? 若J( Y(i+1) )< J( Y(i) ) ?(即移動后的解比當前解要差),則以一定的概率接受移動,而且這個概率隨著時間推移逐漸降低(逐漸降低才能趨向穩定)
這里的“一定的概率”的計算參考了金屬冶煉的退火過程,這也是模擬退火算法名稱的由來。
根據熱力學的原理,在溫度為T時,出現能量差為dE的降溫的概率為P(dE),表示為:
P(dE) = exp( dE/(kT) )
其中k是一個常數,exp表示自然指數,且dE<0。這條公式說白了就是:溫度越高,出現一次能量差為dE的降溫的概率就越大;溫度越低,則出現降溫的概率就越小。又由于dE總是小于0(否則就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函數取值范圍是(0,1) 。
隨著溫度T的降低,P(dE)會逐漸降低。
我們將一次向較差解的移動看做一次溫度跳變過程,我們以概率P(dE)來接受這樣的移動。
關于爬山算法與模擬退火,有一個有趣的比喻:
【爬山算法】:兔子朝著比現在高的地方跳去。它找到了不遠處的最高山峰。但是這座山不一定是珠穆朗瑪峰。這就是爬山算法,它不能保證局部最優值就是全局最優值。
【模擬退火】:兔子喝醉了。它隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。但是,它漸漸清醒了并朝最高方向跳去。這就是模擬退火。
?
下面給出模擬退火的偽代碼表示。
?
【模擬退火算法偽代碼】
/** J(y):在狀態y時的評價函數值
* Y(i):表示當前狀態
* Y(i+1):表示新的狀態
* r: 用于控制降溫的快慢
* T: 系統的溫度,系統初始應該要處于一個高溫的狀態
* T_min :溫度的下限,若溫度T達到T_min,則停止搜索
*/
while( T?>?T_min )
{
dE?=?J( Y(i+1) )?-?J( Y(i) ) ;?
if?( dE?>=0?)?//表達移動后得到更優解,則總是接受移動
Y(i+1)?=?Y(i) ;?//接受從Y(i)到Y(i+1)的移動
else
{
//?函數exp( dE/T )的取值范圍是(0,1) ,dE/T越大,則exp( dE/T )也
if?( exp( dE/T )?>?random(?0?,?1?) )
Y(i+1)?=?Y(i) ;?//接受從Y(i)到Y(i+1)的移動
}
T?=?r?*?T ;?//降溫退火 ,0<r<1 。r越大,降溫越慢;r越小,降溫越快
/*
* 若r過大,則搜索到全局最優解的可能會較高,但搜索的過程也就較長。若r過小,則搜索的過程會很快,但最終可能會達到一個局部最優值
*/
i?++?;
}
? ?【使用模擬退火算法解決旅行商問題】
旅行商問題 ( TSP , Traveling Salesman Problem ) :有N個城市,要求從其中某個問題出發,唯一遍歷所有城市,再回到出發的城市,求最短的路線。
旅行商問題屬于所謂的NP完全問題,精確的解決TSP只能通過窮舉所有的路徑組合,其時間復雜度是O(N!) 。
使用模擬退火算法可以比較快的求出TSP的一條近似最優路徑。(使用遺傳算法也是可以的,我將在下一篇文章中介紹)模擬退火解決TSP的思路:
1. 產生一條新的遍歷路徑P(i+1),計算路徑P(i+1)的長度L( P(i+1) )
2. 若L(P(i+1)) < L(P(i)),則接受P(i+1)為新的路徑,否則以模擬退火的那個概率接受P(i+1) ,然后降溫
3. 重復步驟1,2直到滿足退出條件
產生新的遍歷路徑的方法有很多,下面列舉其中3種:
1. 隨機選擇2個節點,交換路徑中的這2個節點的順序。
2. 隨機選擇2個節點,將路徑中這2個節點間的節點順序逆轉。
3. 隨機選擇3個節點m,n,k,然后將節點m與n間的節點移位到節點k后面。
?
? ? ? ?【算法評價】
?? ? ? ?模擬退火算法是一種隨機算法,并不一定能找到全局的最優解,可以比較快的找到問題的近似最優解。?如果參數設置得當,模擬退火算法搜索效率比窮舉法要高。
四、遺傳算法
遺傳算法是計算數學中用于解決最優化的搜索算法,是進化算法的一種。進化算法最初是借鑒了進化生物學中的一些現象而發展起來的,生物在繁衍發展的過程,會通過繁殖,發生基因交叉,基因突變,適應度低的個體會被逐步淘汰,而適應度高的個體會越來越多。那么經過N代的自然選擇后,保存下來的個體都是適應度很高的。
遺傳算法初始是一個較差解的解集種群,通過遺傳交叉繁殖出下一代的解集種群。在交叉的過程中,有一定的概率發生基因突變。在下一代的解集種群中,通過適者生存的自然選擇,淘汰那些較差的解(個體),只讓較好的解(個體)繁殖后代,這樣產生出代表新的解集的種群。這個過程將導致種群像自然進化一樣的后生代種群比前代更加適應于環境。經過許多代的繁殖和自然選擇后,就能得到接近于真正最優解的解。
可以用精英主義原則來對基本遺傳算法進行優化。所謂精英主義原則,就是為了防止進化過程中產生的最優解被交叉和變異所破壞,可以將每一代中的最優解原封不動的復制到下一代中。
五、蟻群算法
蟻群算法(Ant?Colony?Optimization,?ACO),又稱螞蟻算法,是一種用來在圖中尋找優化路徑的機率型算法。它由Marco Dorigo于1992年在他的博士論文中提出,其靈感來源于螞蟻在尋找食物過程中發現路徑的行為。
螞蟻在路徑上前進時會根據前邊走過的螞蟻所留下的分泌物選擇其要走的路徑。其選擇一條路徑的概率與該路徑上分泌物的強度成正比。因此,由大量螞蟻組成的群體的集體行為實際上構成一種學習信息的正反饋現象:某一條路徑走過的螞蟻越多,后面的螞蟻選擇該路徑的可能性就越大。螞蟻的個體間通過這種信息的交流尋求通向食物的最短路徑。
蟻群算法就是根據這一特點,通過模仿螞蟻的行為,從而實現尋優。當程序最開始找到目標的時候,路徑幾乎不可能是最優的,甚至可能是包含了無數錯誤的選擇而極度冗長的。但是,程序可以通過螞蟻尋找食物的時候的信息素原理,不斷地去修正原來的路線,使整個路線越來越短,最終找到最佳路線。
這種優化過程的本質在于:
選擇機制:信息素越多的路徑,被選擇的概率越大。
更新機制:路徑上面的信息素會隨螞蟻的經過而增長,而且同時也隨時間的推移逐漸揮發消失。
協調機制:螞蟻間實際上是通過分泌物來互相通信、協同工作的。通過個體之間的信息交流與相互協作最終找到最優解,使它具有很強的發現較優解的能力。
出錯機制:顯然如果螞蟻都往信息素多的地方移動,會導致局部最優解的問題??墒?#xff0c;總有些具有叛逆精神的螞蟻,會不往信息素較多的地方移動,從而可以跳出局部最優解,找到全局的最優解。
總結
以上是生活随笔為你收集整理的【最优化方法】穷举法 vs. 爬山法 vs. 模拟退火算法 vs. 遗传算法 vs. 蚁群算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word无法打开该文件,因为文件格式与文
- 下一篇: 爬山演算法