繼續我們在遺傳演算法求解tsp問題中所說的,遺傳演算法具有很強的全域性搜尋能力,但由於「早熟」問題使得區域性搜尋能力不足,模擬退火演算法雖然全域性搜尋能力不強,但具有很強的區域性搜尋能力,混合使用遺傳演算法和模擬退火演算法可以解決很多np-hard問題,即由遺傳演算法提供問題的較優解,然後由模擬退火求解全域性最優解。
模擬退火的演算法過程如下:
1.對原來的解進行變化,生成乙個新的解;
2.如果新的解小於原來的解,則使用新解代替原解;
3.如果新的解大於原來的解,則以一定的概率使用新解代替原解
4.重複步驟1-3,直到達到結束條件。
我們需要知道模擬退火演算法具有很強區域性搜尋能力的原因。下面這個公式雖然很簡潔,但就是模擬退火演算法的精髓之處。公式中δe代表著新解與原解之間的差值(注意:這裡新解一定是大於原解,如果新解小於原解,則新解直接被接受了,就不需要以一定概率接受這個大於原解的新解),p代表著這個大於原解的新解被接受的概率,t作為引數控制概率的大小變化,k為布林茲曼常數(為了簡化,下文的例子中並不會用到k)。假設t=2000,k=1,如果新解與原解之間的差值等於2000,則該新解被接受的概率為exp(-1)=0.3679,差值越小,被接受的概率越大;反之,被接受的概率越小,所以t的取值對於模擬退火演算法至關重要!你還要意識到這個接受概率p是乙個指數函式,exp(-2)=0.1353,exp(-1)=0.3679,exp(-0.5)=0.6065,雖然新得到的解並不優於原來的解,但也許新得到的較差的解經過某種變換就可以得到比原來的解更好的解,這就為什麼模擬退火演算法要以一定的概率接受較差的解的原因,也是該演算法具有很強區域性搜尋能力的原因。
正如前文所說的,我們在遺傳演算法給出的較優解的基礎上,繼續使用模擬退火演算法求解tsp問題。雖然下文的**並不完整,但並不影響我們理解模擬退火演算法。
說明:沿用遺傳演算法中的ga_adaptation函式計算該條path的長度,sa_exchange與遺傳演算法中的ga_exchange作用類似,flag_refuse作為乙個標誌位,如果新解被連續拒絕20次則跳出當前迴圈。
t=2000; %初始溫度
t_end=1; %外層迴圈截至條件
loop=200; %內層迴圈次數
reduce=0; %退火係數,應該是動態變化的
while(t>=t_end)
flag_refuse=0; %內層迴圈退出標誌
fori=1:loop
path_old=path;
e_old=ga_adaptation(path_old);
path_new=sa_exchange(path);
e_new=ga_adaptation(path_new);
if(e_new%新解小於原解->接受
path=path_new;
flag_refuse=0;
else
%否則以一定概率->接受or拒絕
if(rand
< exp(-(e_new-e_old)/t))
path=path_new;
else
flag_refuse=flag_refuse+1;
endendif(flag_refuse==20) %當新解被連續拒絕20次,則退出當前內層迴圈
break;
endend t=t-reduce;
end
啟發式演算法 模擬退火演算法
爬山演算法 是一種簡單的貪心搜尋演算法,該演算法每次從當前解的臨近空間中選擇乙個最優解作為當前解,直到達到乙個區域性最優解。該演算法實現簡單,其主要缺點是會陷入區域性最優解。如,按箭頭的方向搜尋,當達到a點時,無論朝哪個方向小幅度移動都不能得到更優的解。模擬退火演算法 模擬退火演算法 於固體退火原理...
啟發式演算法 模擬退火演算法
執行環境 windows10,python3.7 1.問題模型 y x 7 x 2 x 6 x 9 s in x si n 0.5 x y x 7 x 2 x 6 x 9 sin x sin 0.5 x y x 7 x 2 x 6 x 9 sin x s in 0 5 x x 10 10 x in ...
現代啟發式演算法
啟發式演算法 heuristic algorithm 是相對於最優化演算法提出的。乙個問題的最優演算法求得該問題每個例項的最優解。啟發式演算法可以這樣定義 乙個基於直觀或經驗構造的演算法,在可接受的花費 指計算時間和空間 下給出待解決組合優化問題每乙個例項的乙個可行解,該可行解與最優解的偏離程度一般...