模擬退火學習筆記

2021-09-14 00:06:27 字數 3529 閱讀 3147

博主這個暴力騙分選手get到了

人生的本質

有一類函式,我們要求其的最低點/最高點

二分?三分?四五六七**分??

哦涼涼了…

先介紹乙個爬山

我們隨機撒點,然後讓這些點去做類似現實的爬山

即右邊優就去右邊,左邊優就去左邊

直到沒有比他更優秀的了!

也就是相當於到山峰了吧

那麼這個貪心的演算法顯然非常容易卡在乙個區域性最優解出不來了

哦怎麼辦呢…

按正常人的思維想,走到了乙個最高處,就應該換個地方玩耍

玩耍也是要有思維的,怎麼說也得要有點判斷性嘛

怎麼給程式加判斷性呢

模擬退火就此出現

雖然聽說退火日常打不過爬山??

扯皮一下物理知識

乙個物體要降溫,從內能高降低到內能低,並不是越快越好

我們需要乙個徐徐降溫的過程,來讓其內部的微觀結構結晶來最小化內能

當然以上無關

模擬退火就是基於以上操作

我們先給其乙個溫度t

tt,再給他乙個降溫係數d

dd,表示每次讓溫度變為t∗d

t*dt∗

d自然這個d

dd不能太小了

當乙個物體內能大的時候,他有充分的時間與機率去做一些冒險的事情,調整其最優位置

反正他的分子能大,跑遠了後面還是有回來的空間

反之分子能小的時候,他就不能變得活躍了

我們的模擬退火同樣也要基於以上的思路

定義幾個變數

x

xx表示當前位置

δ

x\delta x

δx表示x

xx的增加量,其取值範圍應該與t

tt成正比關係,因為分子能越大他能跑的地方是越遠的

t

tt表示當前溫度

d

dd表示溫度變動係數,一般取在[

0.95

,0.99

][0.95,0.99]

[0.95,

0.99

]的區間內

δ

f\delta f

δf表示解的變動值,等於f(x

)−f(

δx

)f(x)-f(\delta x)

f(x)−f

(δx)

給乙個初始解x

xx,徐徐降溫並讓其在合適範圍內移動

取到下乙個位置x1=

x+δx

x1=x+\delta x

x1=x+δ

x計算當前位置x1x1

x1的解a 1a1

a1比較a 1a1

a1與x

xx位置的解a2a2

a2如果a 1a1

a1比a 2a2

a2優,此時顯然可以進行移動

否則,我們要以一定的概率獲得是否移動的訊號

科學家不懈鑽研過後獲得了這個概率為eδf

te^}

etδf

​然後降溫

反覆執行上述過程直到t≤e

ps

t\leq eps

t≤ep

s,此時視為物體內能為0

00在實現的過程中,為了避免最後可能移到沒有途中的解優秀的位置

我們可以記錄乙個中途的解的最大值來彌補

由於隨機演算法的不穩定性

我們可以多跑幾次來確定解

正常人都會選這個

自然界一切物體都在向著能量大->能量小的位置移動

故我們要讓這個模型整體能量盡量小

則讓這個模型的重力勢能盡量小

則讓其在桌面上的繩子盡量短

那麼就是讓∑di

∗len

i\sum d_i*len_i

∑di​∗l

eni​

盡量大,其中len

ilen_i

leni

​表示長度

過程中有乙個rand_max的函式,可以取到rand的最大值,用於生成乙個[0,

1]

[0,1]

[0,1

]之間的隨機數來獲取是否用目標解替換當前解

**很好懂

本質在於調參

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mp(x,y) make_pair(x,y)

#define pll pair

#define pii pair

#define double long double

using

namespace std;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int stack[20]

;inline

void

write

(int x)if(

!x)int top=0;

while

(x)stack[

++top]

=x%10

,x/=10;

while

(top)

putchar

(stack[top--]+

'0');}

inline

void

pr1(

int x)

inline

void

pr2(

int x)

const

int maxn=

10005

;const

double d=

0.97

;const

double eps=

1e-12

;int n;

double ux[maxn]

,uy[maxn]

,di[maxn]

;inline

double

sqr(

double u)

double

calc

(double u1,

double u2)

intmain()

bx/=n;by/

=n; best=ans=

calc

(bx,by)

;int times=1;

//退幾次火

while

(times--)}

printf

("%.3lf %.3lf\n"

,bx,by)

;return0;

}

模擬退火學習筆記

網上的絕大部分部落格,包括洛谷題解原來都是錯的寫法 具體看轉移部分qwq 終於成為了少數派,這是好的 模擬退火演算法 simulate anneal,sa 是一種通用概率演演算法,用來在乙個大的搜尋空間內找尋命題的最優解。模擬退火是由s.kirkpatrick,c.d.gelatt和m.p.vecc...

學習筆記 模擬退火

一談到模擬退火,大家都知道是玄學演算法,但是他是如何 a 題的呢?模擬退火,即模擬金屬退火這一過程,來實現最優解的尋找。金屬退火,對於我們似乎很遙遠了,那我們舉個實際點的例子吧。學過化學的都知道,在蒸發結晶時,我們會在蒸發皿還有部分溶劑時停止加熱,用餘熱蒸乾剩餘液體。這就是乙個退火過程,它的實質就是...

學習筆記 模擬退火

什麼是模擬退火?選自 oi wiki 模擬退火是一種隨機化演算法。當乙個問題的方案數量極大 甚至是無窮的 而且不是乙個單峰函式時,我們常使用模擬退火求解。模擬退火,顧名思義,是模擬 退火 的過程。當我們使用爬山演算法的時候,對於非單峰函式的情形容易陷入次優解。爬山演算法省略了最優解附近的非最優解從而...