P3878 模擬退火

2022-05-25 00:54:09 字數 2388 閱讀 8898

首先我們看基礎操作

◢◤ 針對題意,可以打錯誤的貪心,或是暴力,

◢◤ 對於此題,大可以暴力打擬最優解(明顯不對也沒關係)

比如:

1

inline ll calc()

view code

1

inline ll calc()

view code

其實隨心所欲,不踰矩(出自《論語》)即可。

下面是一段摘抄:

模擬退火演算法(simulate anneal,sa)是一種通用概率演演算法,用來在乙個大的搜尋空間內找尋命題的最優解。模擬退火是由s.kirkpatrick, c.d.gelatt和m.p.vecchi在2023年所發明的。v.černý在2023年也獨立發明此演演算法。模擬退火演算法是解決tsp問題的有效方法之一。

模型&原理

模擬退火的原理也和金屬退火的原理近似:將熱力學的理論套用到統計學上,將搜尋空間內每一點想像成空氣內的分子;分子的能量,就是它本身的動能;而搜尋空間內的每一點,也像空氣分子一樣帶有「能量」,以表示該點對命題的合適程度。演演算法先以搜尋空間內乙個任意點作起始:每一步先選擇乙個「鄰居」,然後再計算從現有位置到達「鄰居」的概率。

廢話不多說,開始解釋演算法。

第一步是由乙個產生函式從當前解產生乙個位於解空間的新解;為便於後續的計算和接受,減少演算法耗時,通常選擇由當前新解經過簡單地變換即可產生新解的方法,如對構成新解的全部或部分元素進行置換、互換等,注意到產生新解的變換方法決定了當前新解的鄰域結構,因而對冷卻進度表的選取有一定的影響。(摘自度娘)

什麼意思呢??

就是一開始rand()出乙個解,進行簡單交換,(比如兩點座標的交換,或直接進行解的比較)。比如:

1

int x=rand()%n+1,y=rand()%n+1;//

產生隨機解

2 swap(a[x],a[y]);//

產生新解交換

第二步是計算與新解所對應的目標函式差。因為目標函式差僅由變換部分產生,所以目標函式差的計算最好按增量計算。事實表明,對大多數應用而言,這是計算目標函式差的最快方法。(同上)

進行比較,觀察是否選擇。

1 ll now=calc(),bet=now-ans;

此時now指新解,bet指目標增量。

第三步是判斷新解是否被接受,判斷的依據是乙個接受準則,最常用的接受準則是metropolis準則: 若δt′<0則接受s′作為新的當前解s,否則以概率exp(-δt′/t)接受s′作為新的當前解s。

增量即為bet。

第四步是當新解被確定接受時,用新解代替當前解,這只需將當前解中對應於產生新解時的變換部分予以實現,同時修正目標函式值即可。此時,當前解實現了一次迭代。可在此基礎上開始下一輪試驗。而當新解被判定為捨棄時,則在原當前解的基礎上繼續下一輪試驗。

一.找到更優解 ,更新它。

1

if (bet<0) ans=now;

二.沒有找到(前方高能)

1

else

if(exp(-bet/tmp)*rand_max

以概率exp(-δt′/t)彈回,餘下概率保留此操作,當做擬最優解。

注意三個常量: start_tmp , final_tmp ,delta

1for(double tmp=start_tmp;tmp>final_tmp;tmp*=delta)

注意 final_tmp最好為接近於0的小數,delta為接近於1的小數 (目的是長跑進行更可能性擇最優)。

1

void

sa()

11 }

view code

注: 為了卡時間,我們可以呼叫clock()函式 //在此鳴謝 m_sea 大佬提供的卡時方式。

用max_time卡在0.9s(如果時間真的很炸)以內,到時break,輸出此時最優解ans;(不用太擔心不對,sa演算法本來就是隨機演算法,看rp你的srand()打的好不好)。

1

while ((double)clock()/clocks_per_sec最後提供此題p3878**。

1 #include2

using

namespace

std;

3#define ll long long

4#define max_max 1e18

5int

t,n;

6 ll ans,a[31];7

inline ll calc()

14void

sa()24}

25void solve()

26int

main()

39 }

view code

P3959 寶藏 模擬退火。。。

竟然模擬退火能做!我就直接抄 了,我加了點注釋。題幹 題目描述 參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 nn 個深埋在地下的寶藏屋,也給出了這 nn 個寶藏屋之間可供開發的 mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面...

模擬退火演算法

w 模擬退火演算法的基本思想 將乙個優化問題比擬成乙個金屬物體,將優化問題的目標函式比擬成物體的能量,問題的解比擬成物體的狀態,問題的最優解比擬成能量最低的狀態,然後模擬金屬物體的退火過程,從乙個足夠高的溫度開始,逐漸降低溫度,使物體分子從高能量狀態緩慢的過渡到低能量狀態,直至獲得能量最小的理想狀態...

模擬退火合集

首次接觸模擬退火 看來還是挺神奇的。主要參考這篇博文 題意判斷多邊形內部能否容納乙個半徑為r的圓,即在有限的平面內找最優範圍。遺傳演算法的結果難以掌控,爬山演算法又沒法保證跳出區域性最優,所以基於貪心原則的模擬退火演算法還是值得考慮的。然後就是設定每次變化的步長和演化方式。該題可以從每條邊的中點開始...