模擬退火算法有4個參數
N:每個溫度迭代次數
T:重複降溫次數
a:降溫係數
t0:初始溫度
本文用一個50個城市的TSP問題數據集,用交叉對比的方法調參。一組參數運行200次取平均。
首先調初始溫度
N=1000,T=1000,a=0.99固定
可以看到在初始溫度在1500時平均距離和標準差就幾乎沒有什麼變化了。也就是初始溫度在大於1500以後對結果已經沒有什麼影響。產生這種效果的原因是
模擬退火算法最重要的判斷條件
Math.exp(差值/t)>r(0-1的隨機數)
因爲0-1之間隨機平均下來就是0.5
Math.exp(-0.69)=0.5
也就是說-0.69< 差值/t <0 時Math.exp(差值/t)>0.5
所以大致可以將模擬退火算法理解成只要 差值的絕對值在t的0.7倍以內就會被採用。因爲溫度t隨着迭代逐漸降低,t*0.7顯然逐漸變得更小,實現了退火。
所以t0*a^N這個值對退火算法最爲重要。
比如 1500*0.99^1000=0.06,0.06*0.7這個冗餘度對計算路徑太小了已經沒什麼意義。
第二步,調節降溫係數
N=1000,T=1000,t0=1500固定
當降溫係數=0.99815時平均距離爲69276最優,這時t0*a^N=235,這道題的最短路徑可能在66221附近,235*0.7/66221=0.002,這個冗餘度相當於最優值的0.2%。
第三步調重複降溫次數T
N=1000,a=0.99815,t0=1500固定
這組結果很明顯同一個過程重複次數越多性能越好。但T越大速度也越慢,所以T取2500.因爲每個溫度迭代次數=1000固定所以t0*a^N也都是固定的。
第四步調節每個溫度迭代次數N
T=2500,a=0.99815,t0=1500固定
這個很明顯隨着N的變化t0*a^N也顯著變化,結果變差。
所以綜合起來退火算法的四個參數
N:每個溫度迭代次數
T:重複降溫次數
a:降溫係數
t0:初始溫度
T越大性能越優,
N,a,t0這個三個變量是相互制約的,t0*a^N的值是退火算法最爲關鍵的因素。一個大致可以參考的標準是t0*a^N*0.7/理論最優值=0.002。
這個測試和蟻羣算法的測試用的數據集是一樣的
雖然退火算法的最好平均值大於蟻羣算法,
但是模擬退火算法的最優值是66221,這個最優值好於蟻羣算法, 而且這個最優值多次出現,表明退火算法更有利於搜索全局最優值。