模拟退火算法(代码可直接运行)
生活随笔
收集整理的這篇文章主要介紹了
模拟退火算法(代码可直接运行)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
模擬退火算法(SA)
模擬退火是很經典的算法,針對大多數模型、應用,受限于SA運行時間長等特點,已不能直接應用SA,這樣的算法值得去改進,我試圖找一些縮短運行時間的方法,已經在測試,這里是模擬退火第一篇文章,介紹模擬退火,給出基礎代碼(經過多次測試,可直接運行)。
參考了https://blog.csdn.net/qq_34554039/article/details/90294046(該文介紹了模擬退火)
1.簡介
模擬退火算法的思想:
借鑒于固體的退火過程,當固體的溫度很高時,內能比較大,固體內的粒子處于快速無序運動狀態,當溫度慢慢降低,固體的內能減小,粒子逐漸趨于有序,最終固體處于常溫狀態,內能達到最小,此時粒子最為穩定。
思路:
一開始為算法設定一個較高的值T(模擬溫度),算法不穩定,選擇當前較差解的概率很大;隨著T的減小,算法趨于穩定,選擇較差解的概率減小,最后,T降至終止迭代的條件,得到近似最優解。
2.算法步驟
模擬退火算法,有很多文章進行了介紹,這里不贅述,算法思想也簡單,看流程圖一般就很清晰了。
其中,
代碼(一個求函數極值的程序):
運行方式:全部復制保存到一個m文件中,直接運行
function main_fcn_extreme_value()T=1000;%初始化溫度值 T_min=1e-12;%設置溫度下界 alpha=0.98;%溫度的下降率 k=1000;%迭代次數(解空間的大小)x=getX;%隨機得到初始解 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('最優解為:') 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總結
以上是生活随笔為你收集整理的模拟退火算法(代码可直接运行)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK源码分析
- 下一篇: thymeleaf 中文文档