在2020年的國賽A題中,第三問要確定面積最小的最優爐溫曲線,這是一個有

五個最佳化變數

的最佳化問題,由於最佳化變數太多,導致假若直接用搜索法求解的話,計算量會非常大。一共5個最佳化變數,每個變數都進行20次搜尋(搜尋精度已經很小了)的話,就是要計算20的5次方次,假如計算一次需要0。05秒,也就是需要計算44小時以上。倘若再提高搜尋的精度,則估計需要計算數天。

解決這個問題的其中一類方法就是用智慧演算法,包括模擬退火、遺傳演算法、蟻群演算法、粒子群演算法等等

下面就來介紹一下比較適合於解這道題的模擬退火演算法。

模擬退火演算法是屬於貪心策略的演算法,所謂貪心策略,就是總是做出在當前看來是最好的選擇。而不是從整體最優上考慮,它得到的是某種意義下的區域性最優解。因此,這種演算法不是對所有的問題都能得到整體最優解,關鍵是選擇什麼樣的貪心策略。

最基本的基於貪心策略的演算法可以叫做爬上法,此演算法是從當前解的附近解空間中去選擇一個最優解作為當前解,一直這樣重複,直到在附近的解空間中找不到更優解為止。因此這個演算法很大的可能性找到的只能是區域性最優解。

如下圖所示:假設當前解是在C點,爬山演算法搜尋到A點這個區域性最優解後就會停止搜尋,因為在A點時,無論向哪個方向去小幅度移動都不能得到更優的解。

數學建模必會演算法之模擬退火演算法

而我們的模擬退火演算法實際上也是基於貪心策略的,只不過它在爬山法這種純粹的貪心策略的基礎上,又在搜尋過程中加上了隨機因素。這個隨機因素的具體表示就是:該演算法會以一定的機率來接受一個比當前解要差的解。於是也就有了跳出爬山法的區域性最優解的可能。

數學建模必會演算法之模擬退火演算法

還是以上面爬山法的圖為例,模擬退火演算法在到達區域性最優解A後,會以一定的機率向E去移動。到達E點後,就會有可能到達D點,從而依據爬上法的思想,就會到達真正的全域性最優解B點了。

模擬退火演算法描述如下:

若K(Y(i+1))>=K(Y(i))(即移動後的第i+1處得到了更優解),則總是接受該移動。

若K(Y(i+1))

那麼怎麼定義這個“一定的機率”呢?

實際上是參考了金屬冶煉的退火過程,故而此演算法被叫做模擬退火演算法。

根據熱力學的原理,在溫度為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)來接受這樣的移動。

因此可以將模擬退火演算法與爬山演算法對比成:

爬山演算法:一隻兔子朝著比當下所處的位置更高的地方跳。它逐步地跳到了不遠處的最高山峰。但是這座山峰不一定就是整個解空間所在區域的最高山峰,它只是這隻兔子目光所及的這一塊區域的最高山峰。

模擬退火:一隻兔子喝醉了。它隨機地向各個方向跳了很長時間。這期間,它可能跳向比當下更高的地方,也有可能跳入比當下更低的地方。但是,等它逐漸地清醒了,會朝著最高的方向跳去。這種跳法更有可能會跳向最高的山峰。

此演算法用流程圖可以表示為:

數學建模必會演算法之模擬退火演算法

用偽程式碼表示:

s:=s0;e:=E(s) //設定目前狀態為s0,其能量E(s0)

k:=0 //評估次數k

while kemax

//若還有時間(評估次數k還不到kmax)且結果還不夠好(能量e不夠低)則:

sn:=neighbour(s) //隨機選取一臨近狀態sn

en:=Esn) //sn的能量為E(sn)

if random()

then //決定是否移至臨近狀態sn

s:=sn; e:=en //移至臨近狀態sn

k:=k+1 //評估完成,次數k加一

returns //迴轉狀態s

模擬退火演算法的應用非常廣泛,在經典的0-1揹包問題上、圖著色問題上、物流配送裡的排程問題等各類的排程問題上等等,都能夠使用。

在跨領域上,大規模積體電路設計(VLSI)問題裡的佈線布板等最佳化問題都會用到此演算法。以及在最近幾年非常火的神經網路上,如何避免梯度下降演算法過程中陷入區域性最優解很多時候都是可以用到模擬退火演算法。還有影象處理以及各種組合最佳化問題都會用到。