模擬退火演算法(SA)

Tzu-Chieh Tang
Jul 23, 2021

--

引言

模擬退火演算法(Simulation annealing )是一個在1983年發表的演算法,而該演算法在發表時有一些爭議,原因為 Kirkpatrick 以及 Černý 在差不多時間都發表了模擬退火演算法,該演算法從爬山演算法延伸而來。雖然年代久遠,但至今還是有許多的研究使用模擬退火的概念,將模擬退火結合其他演算法或是將其應用至各種問題。此演算法的概念十分簡單卻有效,是一個頗為經典的超啓發式演算法。

概念

在超啓發式演算法中,區域最佳解(Local optimum)是此領域常遇到的一個問題,在迭代(iteration)過程中若是陷入區域最佳解,可能導致程式卡在此解,無法跳脫找到更佳的解,這邊以一個經典的函數最佳化問題來做說明,大家可能會比較好理解。

下圖是一個經典的測試函數-Rastrigin,所謂的區域最佳解就是那些山谷,從地形圖來看就是各種顏色的圈圈,而我們可以看出中間的位置(藍色)才有較好的解,但若演算法跳脫區域最佳解的能力不佳,很有可能沒辦法找到中間的區域。

而模擬退火演算法則是會讓程式以一定的機率接受較差的解,以此增加跳脫出區域最佳解的機會。接下來我們就來看看模擬退火演算法的細節吧!

Rastrigin function

想更了解測試函數可以參考

程式流程

模擬退火演算法的運行流程與爬山演算法大致相同,有以下五步,一開始先設定退火溫度以及迭代次數(Iteration),再進行隨機初始化(2),接著會不斷的進行TED(3–5)的步驟,直到設定的迭代次數才終止。為了方便大家了解這邊還是以 One max problem 來進行解說。

※01問題定義、超啟發式演算法運行流程可以看上一篇對爬山演算法的介紹

  1. 設定

設定迭代次數(Iteration)、初始溫度(T)和退火係數(Rₜ)。

2.初始化(Initial)

以隨機方式進行初始化,接著再評估該組解的好壞。

以長度10為例

3.Transition

將第一步產生出的解,隨機挑選一個位置進行更動。

橘色位置即為改動位置

4.Evaluation

評估適應值(Fitness value)大小。

5.Determination

將第四步評估出的適應值與先前的進行比較。

若優於或等於先前解則更新。

若無則進行退火環節,退火的進行方式是使用退火溫度(T)和適應值的差值(Δf)計算出允許機率,接著隨機一個0–1的浮點數(r),若該隨機值(r)≤允許機率則進行更新。

每次迭代的最後皆需進行降溫動作,會將溫度T乘上一個小於1的數值(Rₜ),Rₜ的數值大小取決於想要的收斂速度。

6小於7所以進入退火環節,若隨機值r小於退火值則更新,反之則否(公式1)
無論更新與否,皆須在迭代最後進行降溫動作(公式2)
  1. r為一個0–1的隨機浮點數
  2. Δf為當前的適應值減去先前的適應值
  3. T則為退火溫度,一般初始值設為1
  4. 在這邊要注意因為01問題是要找出最大的適應值,所以Δf的計算是當前-先前,若為最小化的問題,Δf的計算要改為先前-當前

簡而言之,必須要讓Δf的值小於0!

公式解析

這邊會逐步的說明公式特性

此迭代產生出的解若是優於先前解,則會直接更新,不會進入退火環節,也就是說進入到退火環節的當前解一定會比先前解差,所以Δf一定會是負值

接下來先假設T為1,暫時可以忽略不看。若當前解與先前解差異過大的話,會產生出一個很大的負值,若差異小的話則產生出的負值會較小。

e的指數若是一個很大的負值,計算後的值會很接近0;e的指數若是一個很小的負值,計算後的值會較接近1,所以此公式在差值較小的情形能有比較大的機率接受更新,在差值較大的情況更新機率會較低。

接下來我們將T也考慮進來,根據公式2,T會隨著迭代的進行而越來越小,從初始值1開始,隨著迭代不斷下降;回到公式1,Δf 除上一個小於1的值,會將 Δf 的值放大,變成一個更大的負數,成功更新的機率變得更低了!

附上簡單的舉例說明,希望可以讓大家了解的更快速!

不同的Δf和T對退火公式的影響

這邊做個小結論,差值越大更新機率越低,隨著迭代進行,更新的次數也會下降,也就是演算法將漸趨收斂

程式結果

設定的參數為

T : 1.0

Rₜ : 0.95

Length : 100、1000

Iteration : 100、500、1000、5000

Run : 51

以下的實驗結果皆為51次的平均結果,初始溫度和降溫係數可以依據問題設定不同的值;但01問題較為簡單,比較沒辦法看出不同值的差異性,所以在這邊只設定一組參數來進行實驗。

SA在不同長度、不同的最大迭代次數的平均結果

接下來介紹收斂圖,收斂圖可以讓我們很直觀的了解演算法的收斂情形,有利於我們了解演算法在各個迭代次數下的狀況。

下圖為模擬退火演算法在長度1000且最大迭代次數為5000的收斂圖,可以看出此方法是以一個斜率漸減的拋物線往好的解前進。

SA平均結果收斂圖

結論

模擬退火演算法以溫度下降的方式在一定機率下接受較差的解,能夠藉此方式跳出區域最佳解,雖然在01問題的實驗結果與上一篇介紹的爬山演算法差異不大,但在更複雜問題上,模擬退火演算法是能夠有更好效果的!

最後附上程式碼。

--

--