1. 程式人生 > >大白話解析模擬退火演算法(simulate annealing)

大白話解析模擬退火演算法(simulate annealing)

心得:對差解的包容體供了全域性優化的的可能。

一. 爬山演算法 ( Hill Climbing )

         介紹模擬退火前,先介紹爬山演算法。爬山演算法是一種簡單的貪心搜尋演算法,該演算法每次從當前解的臨近解空間中選擇一個最優解作為當前解,直到達到一個區域性最優解。

         爬山演算法實現很簡單,其主要缺點是會陷入區域性最優解,而不一定能搜尋到全域性最優解。如圖1所示:假設C點為當前解,爬山演算法搜尋到A點這個區域性最優解就會停止搜尋,因為在A點無論向那個方向小幅度移動都不能得到更優的解。

圖1

二. 模擬退火(SA,Simulated Annealing)思想

         爬山法是完完全全的貪心法,每次都鼠目寸光的選擇一個當前最優解,因此只能搜尋到區域性的最優值。模擬退火其實也是一種貪心演算法,但是它的搜尋過程引入了隨機因素。模擬退火演算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個區域性的最優解,達到全域性的最優解。以圖1為例,模擬退火演算法在搜尋到區域性最優解A後,會以一定的概率接受到E的移動。也許經過幾次這樣的不是區域性最優的移動後會到達D點,於是就跳出了局部最大值A。

         模擬退火演算法描述:

         若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後面。

五. 演算法評價

        模擬退火演算法是一種隨機演算法,並不一定能找到全域性的最優解,可以比較快的找到問題的近似最優解。 如果引數設定得當,模擬退火演算法搜尋效率比窮舉法要高。



相關推薦

大白話解析模擬退火演算法simulate annealing

心得:對差解的包容體供了全域性優化的的可能。 一. 爬山演算法 ( Hill Climbing )          介紹模擬退火前,先介紹爬山演算法。爬山演算法是一種簡單的貪心搜尋演算法,該演算法每次從當前解的臨近解空間中選擇一個最優解作為當前解,直到達到一個區

模擬退火演算法Simulated Annealingpython的簡單實現

1 模擬退火演算法簡介            模擬退火演算法是一種啟發式演算法。 通過不斷的迭代當前解在周圍找到問題的最優解。( 個人理解是在簡單的爬坡法加上了概率的因素,防止陷入區域性最優解。)     完整的模擬退火過程是模擬熱力學的退火過程,隨著溫度的不斷下降(本質上

大白話解析模擬退火演算法

一. 爬山演算法 ( Hill Climbing )          介紹模擬退火前,先介紹爬山演算法。爬山演算法是一種簡單的貪心搜尋演算法,該演算法每次從當前解的臨近解空間中選擇一個最優解作為當前解,直到達到一個區域性最優解。          爬山演算法實現很簡

[經典]大白話解析模擬退火演算法

淺顯易懂, 清楚明白, 入門之佳品, 菜鳥之福音. 轉者注: 在實際應用中, 並不實施 "以一定的概率接受較差的移動", 而是以 "在全域性範圍內隨機試探多個點, 再在每個點的鄰域內隨機試探多個點, 得到該鄰域內極值, 最終取多個點的最大(最小)值"  的方式避免最終

TSP--模擬退火演算法c++實現+詳細解釋

利用模擬退火演算法解決TSP問題,能看到這篇文章的應該知道TSP是什麼,在此就不贅述了,模擬退火演算法思想網路上優質結束很多,因此直接講講如何用C++實現它 演算法步驟 1.初始化:起始溫度,終止溫度,溫度變化率,最優路徑頂點集 ,最短長度S 2.利用蒙特卡洛法得到

模擬退火演算法初步

關於模擬退火演算法的介紹在知乎,CSDN都有很多前輩給出了自己的介紹,我認為都講得很好。其實模擬退火演算法應用於一維搜尋的話,以概率為1收斂於最優,而且早熟收斂發生的概率很低。和粒子群相比,收斂速度慢,依賴於降溫的速度,但是粒子群實在是太容易收斂到區域性最優了,而且一旦到了區

模擬退火演算法西安網選賽hdu5017

Ellipsoid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 648    Accepted Subm

poj 2069 Super Star—— 模擬退火板子較精確

Description During a voyage of the starship Hakodate-maru (see Problem 1406), researchers found strange synchronized movements of stars. Having

深度學習 --- 模擬退火演算法詳解Simulated Annealing, SA

上一節我們深入探討了,Hopfield神經網路的性質,介紹了吸引子和其他的一些性質,而且引出了偽吸引子,因為偽吸引子的存在導致Hopfield神經網路正確率下降,因此本節致力於解決偽吸引子的存在。在講解方法之前我們需要再次理解一些什麼是偽吸引子,他到底是如何產生的? 簡單來說說就是網路動態轉

夜深人靜寫演算法十二- 模擬退火

一、引例         1、函式最值        函式最值分為函式最大值和函式最小值,最小值即定義域

模擬退火演算法與C語言實現TSP問題

1簡介: 模擬退火來自冶金學的專有名詞退火。退火是將材料加熱後再經特定速率冷卻,目的是增大晶粒的體積,並且減少晶格中的缺陷。材料中的原子原來會停留在使內能有區域性最小值的位置,加熱使能量變大,原子會離開原來位置,而隨機在其他位置中移動。退火冷卻時速度較慢,使得原子有較多可能

[work] 演算法學習筆記 爬山法,模擬退火演算法,遺傳演算法

在優化問題中,有兩個關鍵點 代價函式 確定問題的形式和規模之後,根據不同的問題,選擇要優化的目標。如本文涉及的兩個問題中,一個優化目標是使得航班選擇最優,共計12個航班,要使得總的票價最少且每個人的等待時間之和最小。第二個問題是學生選擇宿舍的問題,每個學生可以實現填報

A Star not a Tree?費馬點問題+模擬退火演算法

A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9377 Accepted: 4043 Description Luke wan

模擬退火演算法解決TSPpython實現 110+行程式碼【gif生成】

簡述 程式碼我是基於我之前寫的兩篇,一篇是遺傳演算法TSP的Python實現,一篇是模擬退火演算法的解決TSP的C++實現。 模擬退火演算法理論+Python解決函式極值+C++實現解決TSP問題 遺傳演算法解決TSP問題 Python實現【160行以內程式碼】

優化演算法1:模擬退火演算法思想解析

1.演算法簡介 模擬退火演算法得益於材料的統計力學的研究成果。統計力學表明材料中粒子的不同結構對應於粒子的不同能量水平。在高溫條件下,粒子的能量較高,可以自由運動和重新排列。在低溫條件下,粒子能量較低。如果從高溫開始,非常緩慢地降溫(這個過程被稱為退火),粒子

模擬退火演算法解旅行商TSP問題

該帖子的程式碼主要轉自模擬退火演算法1. 該文對模擬退火演算法作了較好的分析,不過該文中舉例的TSP的程式碼有一些問題,我對此作了修正,並在文中最後做出解釋。 程式碼如下: #include <iostream> #include <

[隨機化演算法] 聽天由命?淺談Simulate Anneal模擬退火演算法

Simulate Anneal模擬退火演算法,是一種用於得到最優解的隨機化演算法。 如果可以打一手漂亮的隨機化搜尋,也許當你面對一籌莫展的神仙題時就有一把趁手的兵器了。 這篇題解將教你什麼?SA的基本思路,什麼時候能用SA。 標題是淺談,所以本篇部落格參雜了些許個人簡介,若有疑問或異議,歡迎提出指正。

MATLAB模擬退火演算法模板

為了參加國賽,這幾天學了模擬退火演算法,整理下當做模板方便國賽的時候用。 模擬退火用於處理最優化問題,可以求出當目標函式取得最小值時的決策變數的值。 在編寫程式時需要根據具體問題設計演算法,演算法描述為: (1)解空間(初始解) (2)目標函式 (3)新解的產生 &nbs

模擬退火演算法案例

2018年的華為軟體精英挑戰賽題目簡介:給出華為雲虛擬機器過去的租借數量歷史資料,用以訓練模型並預測下一個時間段裡的虛擬機器租借數量,然後把這些預測得到的虛擬機器裝填進一定規格的物理機中,即分為預測和裝填兩個部分。   總結一下裝填部分使用的模擬退火演算法: 演算法原理 裝

HDU 3007 模擬退火演算法

Buried memory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4067