模拟退火算法(代码可直接运行)
模擬退火算法(SA)
模擬退火是很經(jīng)典的算法,針對大多數(shù)模型、應(yīng)用,受限于SA運(yùn)行時間長等特點(diǎn),已不能直接應(yīng)用SA,這樣的算法值得去改進(jìn),我試圖找一些縮短運(yùn)行時間的方法,已經(jīng)在測試,這里是模擬退火第一篇文章,介紹模擬退火,給出基礎(chǔ)代碼(經(jīng)過多次測試,可直接運(yùn)行)。
參考了https://blog.csdn.net/qq_34554039/article/details/90294046(該文介紹了模擬退火)
1.簡介
模擬退火算法的思想:
借鑒于固體的退火過程,當(dāng)固體的溫度很高時,內(nèi)能比較大,固體內(nèi)的粒子處于快速無序運(yùn)動狀態(tài),當(dāng)溫度慢慢降低,固體的內(nèi)能減小,粒子逐漸趨于有序,最終固體處于常溫狀態(tài),內(nèi)能達(dá)到最小,此時粒子最為穩(wěn)定。
思路:
一開始為算法設(shè)定一個較高的值T(模擬溫度),算法不穩(wěn)定,選擇當(dāng)前較差解的概率很大;隨著T的減小,算法趨于穩(wěn)定,選擇較差解的概率減小,最后,T降至終止迭代的條件,得到近似最優(yōu)解。
2.算法步驟
模擬退火算法,有很多文章進(jìn)行了介紹,這里不贅述,算法思想也簡單,看流程圖一般就很清晰了。
其中,
代碼(一個求函數(shù)極值的程序):
運(yùn)行方式:全部復(fù)制保存到一個m文件中,直接運(yùn)行
function main_fcn_extreme_value()T=1000;%初始化溫度值 T_min=1e-12;%設(shè)置溫度下界 alpha=0.98;%溫度的下降率 k=1000;%迭代次數(shù)(解空間的大小)x=getX;%隨機(jī)得到初始解 while(T>T_min)for I=1:kfx=Fx(x);x_new=getX;if(x_new>=-2&&x_new<=2)fx_new=Fx(x_new);delta=fx_new-fx;if(delta<0)x=x_new+(2*rand-1);elseP=getP(delta,T);if(P>rand)x=x_new;endendend end T=T*alpha; end disp('最優(yōu)解為:') disp(x)%%getX.m function x=getX x=4*rand-2; end%%Fx.m function fx=Fx(x) fx=(x-2)^2+4; end%%getP.m function p=getP(c,t) p=exp(-c/t); end end總結(jié)
以上是生活随笔為你收集整理的模拟退火算法(代码可直接运行)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK源码分析
- 下一篇: thymeleaf 中文文档