搜索 —— 启发式搜索 —— 模拟退火
【概述】
模擬退火(Simulated Annealing,SA),其類似于物理學(xué)上金屬退火的過程,故稱為模擬退火,其是一個隨機(jī)化與貪心結(jié)合的算法,在你 RP 較好或數(shù)據(jù)范圍比較小的時候,可以輕松解決許多難題。
模擬退火的原理與金屬退火的原理近似:
- 將熱力學(xué)的理論套用到統(tǒng)計(jì)學(xué)上
- 將搜尋空間內(nèi)每一點(diǎn)想像成空氣內(nèi)的分子
- 搜尋空間內(nèi)的每一點(diǎn),也像空氣分子一樣帶有動能,其用于表示該點(diǎn)對命題的合適程度
- 演算法先以搜尋空間內(nèi)一個任意點(diǎn)作起始:每一步先選擇一個相鄰的點(diǎn),然后再計(jì)算從現(xiàn)有位置到達(dá)相鄰點(diǎn)的概率
【主要思路】
我們模擬物理退火的三個過程:加溫、等溫、冷卻,來歸納一下模擬退火算法的主要思路:
首先,確定一個初始溫度 T,這個參數(shù)是隨機(jī)選擇的,初始溫度選擇的越好,算法表現(xiàn)就越好,但具體該選何值,沒有一個明確的界定方法,只能依靠 RP 來選,不過據(jù)說有些大佬可以根據(jù)題目推出最優(yōu)初始溫度
然后,當(dāng)溫度大于一個邊界值時,我們將當(dāng)前狀態(tài)的答案與下一狀態(tài)的答案進(jìn)行比較:
- 如果 res<newRes,轉(zhuǎn)移答案
- 如果 res>newRes,有一定概率轉(zhuǎn)移答案
在擴(kuò)展?fàn)顟B(tài)時有一個小方法:nextSta=nowSta+(rand()?2?RAND_MAX)?T,這樣的原理是:(rand()?2?RANDMAX) 的范圍是從負(fù)數(shù)到正數(shù)的,這樣在擴(kuò)展坐標(biāo)的時候就可以多方向擴(kuò)展,不會只在一個方向上更新。
其次,確定轉(zhuǎn)移答案的概率,由于轉(zhuǎn)移答案的概率需要隨著時間的推移與 res 和 newRes 差值的增大而增大,因此常表示為:,其中
最后,我們模擬降溫過程,對 T 乘以一個小于但十分接近于 1 的數(shù) delta,以體現(xiàn)時間對答案的影響。
這樣,隨著溫度不斷降低,變化幅度也越來越小,接受一個更劣的解的概率也越來越小。
void SA(double nowSta){int T = ****; //初始溫度double delta=0.99;int res=getRes(nowSta);//初始狀態(tài)能得到的答案while (T > EPS) { // EPS是一個大于0的極小值,用于精度的比較,一般取1E-9~1E-15int nextSta = nowSta + (rand() * 2 - RAND_MAX)*T; //擴(kuò)展?fàn)顟B(tài)int newRes = getRes(nextSta); //記錄下一個狀態(tài)能得到的答案double pr = exp((res - newRes) / T) * RAND_MAX;//一定的概率if (res < newRes || pr > rand()){//新的代價(jià)小于當(dāng)前代價(jià),或在一定概率下nowSta = nextSta;//更新當(dāng)前狀態(tài)res = newRes;//更新新狀態(tài)的答案}T *= delta; //降溫的過程,將溫度減小} }?
總結(jié)
以上是生活随笔為你收集整理的搜索 —— 启发式搜索 —— 模拟退火的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图论 —— k 短路
- 下一篇: 满汉全席(洛谷-P4171)