matlab數學建模之:模擬退火算法

matlab數學建模之:模擬退火算法

我們知道打鐵匠,打鐵的時候總是不斷用水冷卻鐵器,最後打出來的鐵就很堅實、鋒利。這裡的算法也是根據這個而來。

模擬退火算法(Simulated Annealing, SA)的思想借鑑於固體的退火原理,當固體的溫度很高的時候,內能比較大,固體的內部粒子處於快速無序運動,當溫度慢慢降低的過程中,固體的內能減小,粒子的慢慢趨於有序,整齊排列,最終,當固體處於常溫時,內能達到最小,此時,粒子最為穩定。模擬退火算法便是基於這樣的原理設計而成。

通俗點的說法:一個鍋底凹凸不平有很多坑的大鍋,如何晃動這個鍋才能使得一個小球使其達到全局最低點。首先一開始就使勁晃,小球的變化也就比較大,如果掉到一個小坑裡面也有幾率掉出來,大趨勢總是向底部滑下去。在趨於全局最低的時候慢慢減小晃鍋的幅度,直到最後不晃鍋,小球達到全局最低。

其他算法有時候經常就掉在小坑裡出不來了,就是所謂的達到局部最小值。模擬退火算法的優點就是:就算達到局部最小值了,我也給你一個機會滑出來,如果你是全局最小值,就算滑出來了,最後也會滑進去的。

這個算法經常使用於旅行商問題(TSP):就是要拜訪n個地點,怎麼走的距離最短。

matlab數學建模之:模擬退火算法

解題思想:計算每兩個地點之間的距離,得到距離矩陣。先一通亂走,計算一下走的距離。然後微調一下走的路線,如果調整過後的路線距離變變短了,就以這個路線作為下一步的基礎,然後繼續調整。但是如果路線變長了,我也給你一個概率,作為下一步的基礎。但是這個概率會隨著步數的增加,慢慢變小。最後這個概率也會趨於0,距離調整也會達到最小值。

matlab數學建模之:模擬退火算法

總之如果要途徑每一個點,方式就是一個1到N的數字排序問題,如果排序是1、7、4、2、9、6.。。。。,那麼距離就等於W17、W74、W42、。。。。。等等,也就是下面的公式:


matlab數學建模之:模擬退火算法

根據總距離公式,計算距離。然後微調,比如改變序列中兩個數字的排序,得到新樣本,然後再計算距離。

matlab數學建模之:模擬退火算法

直到達到距離的最小值。

matlab代碼:私信回覆 模擬退火算法


分享到:


相關文章: