日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法

發布時間:2024/10/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

黃樂天

淺談模擬退火算法

背景

在實際生活中, 數學問題中,我們常常會遇到(一定范圍內)函數求最值的問題。一般可以用數學方式解答,但如果遇到如下惡心的函數:

它的函數圖像是這樣的:

我們只好用計算機科學 (說白了就是編程) 來計算了。

對于這種單峰函數,可以使用“爬山算法”來得出結果,即每次在當前最優解附近找一個解,若比當前最優解更優則接受它。

但它的缺點十分明顯,就是容易陷入局部最優解,如果遇到下面的

多峰函數

(我也不知道這g(r)是咋來的)

我們可以使用一種玄學算法——模擬退火

模擬退火是啥?

模擬退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis等人于1953年提出。1983 年,S. Kirkpatrick 等成功地將退火思想引入到組合優化領域。它是基于Monte-Carlo迭代求解策略的一種隨機尋優算法,其出發點是基于物理中固體物質的退火過程與一般組合優化問題之間的相似性。模擬退火算法從某一較高初溫出發,伴隨溫度參數的不斷下降,結合概率突跳特性在解空間中隨機尋找目標函數的全局最優解,即在局部最優解能概率性地跳出并最終趨于全局最優。模擬退火算法是一種通用的優化算法,理論上算法具有概率的全局優化性能,目前已在工程中得到了廣泛應用,諸如VLSI、生產調度、控制工程、機器學習、神經網絡、信號處理等領域。

——百度百科

實際上,SA廣泛運用于信息學競賽(Olympiad in Informatics,OI),在OIers(即信競生)想不出某道數據范圍較小的題的正解時用來騙分。

看看它的原理:

模擬退火算法來源于固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最后在常溫時達到基態,內能減為最小。根據Metropolis準則,粒子在溫度T時趨于平衡的概率為e(-ΔE/(kT)),其中E為溫度T時的內能,ΔE為其改變量,k為Boltzmann常數。用固體退火模擬組合優化問題,將內能E模擬為目標函數值f,溫度T演化成控制參數t,即得到解組合優化問題的模擬退火算法:由初始解i和控制參數初值t開始,對當前解重復“產生新解→計算目標函數差→接受或舍棄”的迭代,并逐步衰減t值,算法終止時的當前解即為所得近似最優解,這是基于蒙特卡羅迭代求解法的一種啟發式隨機搜索過程。退火過程由冷卻進度表(Cooling Schedule)控制,包括控制參數的初值t及其衰減因子Δt、每個t值時的迭代次數L和停止條件S。

——百度百科

物理?...感覺這段話只有小唐能看懂

用人話來說,這是一種求多峰函數最值的算法。原理是模擬固體降溫的過程,并在此過程中產生新解。隨著溫度的降低,產生新解的變化越來越小,越來越集中在最優解附近。直到溫度低至一定的最低溫,即“結晶”,則停止此過程,當前的最優解基本上就是全局最優解了。

還不理解?上圖!

過程也應該很好理解,直接上動圖吧

我們用幾個變量來理性理解此過程(以求多峰函數最小值為例)

:常量,模擬退火的初始溫度,一般設在

模擬退火的當前溫度

常量,模擬退火的目標溫度,一般設為

常量,模擬退火的溫度變動量,一般比小一點點,乘上得到下一個溫度

當前得到的最優解結果(當前求到的函數最小值)

新得到的解

上一個被接受的解

解的變化量,即的結果

那么模擬退火的具體過程就是,由初溫開始,每次乘以得到當前溫度,若$t

在這個過程中,我們在上一被接受的解的基礎上隨機浮動產生新解。但是注意,每次的浮動大小與當前溫度有關,若小則浮動相對也更小。我們通過一系列隨機數的操作再乘來得出浮動大小,最后加上得出新解。

接著我們計算由所得的結果(求函數值),減去得到解的變動量。若,則我們遇到了一個更小的結果,即更優的解,那么當然要接受它——更新變為新解的結果,變為。如果,則這是個更劣的解,我們當然不要更新,那是否接受這個解(更新)呢?我們使用Metropolis接受準則,對于接受這個解,它的概率是,再判斷這個概率是否大于一個大于、小于等于的隨機數來接受即可。

對于這個概率的理解,我們引用一位神犇的思想:對于,如果它較大,就說明我們遇到了一個非常劣的解,則接受它的概率極小,因為很小;反之接受的概率較大,因為相對較大。對于,隨時間增加而減小,所以用來除以。而且,對于整個式子,較大的時候我們會接受大部分解,較小時只會接受較小的解。

例題/C++代碼實現

如果看不懂代碼,可以在菜鳥教程學習基礎語法就絕對能看懂了,當然我自己也會加上詳細注釋。

例題:UVA10228 A Star not a Tree?

原題面是英文的,我寫一下中文題面吧...


題目描述

給定一個邊形所有頂點坐標,求其費馬點到所有頂點距離和

費馬點是指到多邊形所有頂點距離和最小的點

輸入格式

第一行一個正整數,其后行,每行兩個整數。

輸出格式

一行,即費馬點到所有頂點距離和,精確到整數。


題目分析

我們可以通過模擬退火來找出其費馬點,只用改變每個解(坐標)對結果的計算即可。

原來我們舉的例子是計算函數,把解直接代入即可。而在這題中,計算結果的方式變為計算此坐標到每個頂點的距離之和。計算距離的方式應該不用我多說,就是利用勾股定理求歐幾里得距離,則到的距離為。

核心代碼如下:

//頭文件等不展示了
//...和/*...*/均為注釋
//定義變量
int?n;//int為整型變量,儲存一個[-2^32,2^31-1]的整數,這里表示定義一個整型變量n,即多邊形邊的數量
double?ans=1e18;//double是“雙精度浮點數”,即較為精確的小數,儲存范圍很大
//這里把ans的初始值定為10^18,因為取最小值,后面直接比較就好
double?px[105],py[105];//double類型數組,一個數組(如px)可儲存105個double類型的數,因為n最大為100
//如需訪問第i個點的x軸上的值,為px[i]
const?double?eps=1e-15;//定義常量eps,const為常量關鍵字
double?calc(double?x,double?y)//計算此坐標到所有頂點的距離和{//這是一個“double”的函數,返回值則也為double類型
????double?res=0;//儲存結果的變量
????for(int?i=1;i<=n;i++)//i從1到n循環
????????s+=sqrt((x-px[i])*(x-px[i])+(y-py[i])*(y-py[i]));//計算距離,sqrt是開方函數
????return?res;//返回結果
}
void?SA()//模擬退火的核心{//這是個"void"的函數,沒有像calc一樣的返回值return?res
????//rand()是隨機函數,一個區間[0,32767]的整數
????//=是賦值操作,a=b表示把b賦值給a
????double?x=rand()%10000,y=rand()%10000;//最初始的解隨機得出
????//%是取余
????double?t=3000;//模擬退火的溫度
????while(t>eps)//溫度大于末溫就一直循環
????{//while(condition){...}表示只要滿足condition就執行"..."
????????//RAND_MAX是rand()能達到的最大值,即32767
????????double?xx=x+(rand()*2-RAND_MAX)*t,yy=y+(rand()*2-RAND_MAX)*t;//隨機操作再乘t
????????//↑計算新解e
????????double?now=calc(xx,yy);//計算結果
????????double?dt=now-ans;//計算e_k
????????if(dt<0)x=xx,y=yy,ans=now;//找到更優的解,則接受它
????????else?if(exp(-dt/t)>rand()/(RAND_MAX*1.0)/*rand()/RAND_MAX一定>0且<=1*/)//Metropolis準則
????????????x=xx,y=yy;//接受這個解,但不要更新ans,因為它不是最優解
????????t*=0.996;//t乘上Δ
????}//+=,*=都也是賦值操作,如a+=b表示把a+b賦值給a
}
//輸入和輸出變量都在下面的主函數main()里,每個C/C++程序都要有一個main函數,所有操作都在里面
//包括上面的SA()也會在main()被調用
//int?main(){...}
//這里只展示核心代碼(模擬退火部分),主函數就不寫在這里了
//完整代碼可以找我要

后記

寫這篇文章只是為了讓你們了解模擬退火的原理及過程,真正在實際生活應用可能還得等到大學或者工作的研究。當然,在別人問你求函數峰值的數學問題時,也可以拿出電腦跑一遍模擬退火來炫技[斜眼笑]...

如果有任何不理解的地方可以來問我,掛幾個聯系方式:

QQ:3038564494

郵箱:adayhlt526@gmail.com

參考資料

  • 淺談玄學算法——模擬退火 by M_sea(https://www.luogu.com.cn/blog/m-sea/qian-tan-SA)

  • 模擬退火-維基百科(https://zh.wikipedia.org/wiki/模擬退火) (如果wiki上不去可以找我要圖片)

  • 模擬退火算法-百度百科(https://baike.baidu.com/item/模擬退火算法)

END
“要熱愛 請深愛”系列往期精彩回顧

(1)2025——Music!嗨起來!

(2)幾道你第一眼肯定做錯的題

(3)那些英語“白大象”

(4)世界之大,遠不及他心中碧海蒼梧

掃碼關注更多精彩

策劃、審定:班主任趙老師編輯:黃樂天、黃樂天媽媽、肖劉暢媽媽 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧洲精品久久久久毛片完整版 | 久久国产一级 | 在线欧美一区二区 | 男人懂得网站 | 亚洲午夜在线视频 | 少妇做爰k8经典 | 欧美成人福利 | 无限国产资源 | 亚洲九九九 | 九色视频网站 | 亚洲av中文无码乱人伦在线观看 | 日本一区视频在线观看 | 天天射一射 | 欧美男女交配视频 | 午夜毛片在线观看 | 91看视频| 穿扒开跪着折磨屁股视频 | 在线免费观看一区二区 | 有码在线视频 | 成人在线观看h | 亚洲第七页 | 中文字幕看片 | 97在线公开视频 | 国产97色在线 | 少妇2做爰bd在线意大利堕落 | 天天综合久久 | 日日射av | 有色影院 | 狠狠爱av| 伊人网综合网 | 日韩美女做爰高潮免费 | 欧美日韩一区精品 | 欧美人妻日韩精品 | 色综合啪啪 | 欧美成人免费一级 | 黄色大片免费在线观看 | 草草影院在线播放 | 美女网站污 | 中文人妻熟女乱又乱精品 | 亚洲成av人在线观看 | 怨女1988国语版在线观看高清 | 国产欧美一区二区三区视频在线观看 | 亚洲25p | 亚洲欧洲日韩av | 成人免费精品 | 美女黄视频在线观看 | 亚洲一区 欧美 | 日韩电影一区二区在线观看 | 好吊色这里只有精品 | 无码免费一区二区三区免费播放 | 久草视频在线看 | 91美女网站| 在线免费观看污视频 | 国产后入清纯学生妹 | 久久精彩| 亚洲美女视频网站 | 中文成人无字幕乱码精品区 | 女人张开腿让男人插 | 国产人成无码视频在线观看 | 91亚洲专区 | 免费视频一二三区 | 一级片免费的 | 秋霞av网 | 亚洲精品高清视频在线观看 | japansexxxxhd医生 夜夜操导航 | 精品国产人妻一区二区三区 | 久久婷婷丁香 | www.av在线播放 | 国产精品入口66mio男同 | 爆乳熟妇一区二区三区 | 日本嫩草影院 | 影音先锋成人资源 | 国产欧美一区二区在线观看 | 精品一区二区国产 | 欧美国产日本 | 日韩精品久久久久久久 | 四虎伊人| 日本一区二区精品 | 中国黄色片子 | 青青青网 | 99国产精品无码 | 丹丹的呻吟声1一7 | 无码少妇一级AV片在线观看 | 麻豆久久久久久久久久 | 丁香婷婷久久久综合精品国产 | 性色AV无码久久一区二区三 | 欧美8888 | 日本免费一区二区三区 | 亚洲熟悉妇女xxx妇女av | 亚洲com| 一级片www | 91亚洲专区| av高清在线观看 | 欧美熟妇乱码在线一区 | 日本成人在线免费 | 国产一区亚洲二区 | 欧美片17c07.com | 麻豆系列 | 综合天堂av久久久久久久 |