首先我們看基礎操作
◢◤ 針對題意,可以打錯誤的貪心,或是暴力,
◢◤ 對於此題,大可以暴力打擬最優解(明顯不對也沒關係)
比如:
1view codeinline ll calc()
1view codeinline ll calc()
其實隨心所欲,不踰矩(出自《論語》)即可。
下面是一段摘抄:
模擬退火演算法(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注意 final_tmp最好為接近於0的小數,delta為接近於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)
1view codevoid
sa()
11 }
注: 為了卡時間,我們可以呼叫clock()函式 //在此鳴謝 m_sea 大佬提供的卡時方式。
用max_time卡在0.9s(如果時間真的很炸)以內,到時break,輸出此時最優解ans;(不用太擔心不對,sa演算法本來就是隨機演算法,看rp你的srand()打的好不好)。
1view codewhile ((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 }
P3959 寶藏 模擬退火。。。
竟然模擬退火能做!我就直接抄 了,我加了點注釋。題幹 題目描述 參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 nn 個深埋在地下的寶藏屋,也給出了這 nn 個寶藏屋之間可供開發的 mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面...
模擬退火演算法
w 模擬退火演算法的基本思想 將乙個優化問題比擬成乙個金屬物體,將優化問題的目標函式比擬成物體的能量,問題的解比擬成物體的狀態,問題的最優解比擬成能量最低的狀態,然後模擬金屬物體的退火過程,從乙個足夠高的溫度開始,逐漸降低溫度,使物體分子從高能量狀態緩慢的過渡到低能量狀態,直至獲得能量最小的理想狀態...
模擬退火合集
首次接觸模擬退火 看來還是挺神奇的。主要參考這篇博文 題意判斷多邊形內部能否容納乙個半徑為r的圓,即在有限的平面內找最優範圍。遺傳演算法的結果難以掌控,爬山演算法又沒法保證跳出區域性最優,所以基於貪心原則的模擬退火演算法還是值得考慮的。然後就是設定每次變化的步長和演化方式。該題可以從每條邊的中點開始...