嗯,頹了一早上(呸)
於是去看了一下模擬退火,首先先要講一下辣雞的爬山演算法
這是乙個很顯然會錯的貪心,給出乙個模型:平面上有很多山,一開始有只小張俊在某個點上(嗯沒錯就是乙隻小張俊),然後小張俊比較蠢,他只會看相鄰的點是否比他高,如果比他高那他就走過去。
顯然他不一定會跑到最高的點上去因為他只關心相鄰的點(其實就是蠢),雖然未知最高點在**,但是他就會確信自己的是最高點,所以才會卒
爬山演算法的缺點在於:他一定不會跑到不比當前優的點上去。
那麼可以怎樣做呢?
先來想象一下乙個生火(最喜歡火了哈哈哈)的過程,首先,火焰燃起,然後會因外在因素「擺動」,最後慢慢穩定下來。
根據熱力學的原理,在溫度為t時,出現能量差為de的降溫的概率為p(de),表示為:p(
de)=
exp(
ktde
) 這個的意思就是溫度越高,出現一次能量差為de的降溫的概率就越大;溫度越低,則出現降溫的概率就越小。
那麼模擬退火就是在爬山演算法的基礎上加上了乙個走到區域性劣的可能,但這同時使得小張俊走到最後人生巔峰的概率大得多。
模擬退火的演算法流程大概是這樣的:
1、設定初始溫度t,降溫速度v,溫度下限,乙個可行的評價函式f
2、設當前的狀態為s,對於乙個新的狀態s』,比較f(s)與f(s』),若f(s』)大於f(s)那麼從s走到s』,否則利用前面提到的概率函式p(
de)=
exp(
ktde
) ,隨機乙個在[0,1]區間的數,若該函式大於這個數且小於1那麼也走過去。
3、退火,降低溫度即t=
t×v
如果不懂看**吧。。。
費馬點問題求解
題目:題意:給n個點,找出乙個點,使這個點到其他所有點的距離之和最小,也就是求費馬點。
**:
#include
#include
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using
namespace
std;
typedef
long
long ll;
typedef
double db;
const db eps = 1e-8;//溫度下界
const db t = 100;//初始溫度
const db delta = 0.98;//降溫速度
const db inf = 1e+14;
const
int n = 1005;
struct pointa[n];
int n;
db fx[4][2]=,,,};
db dis(point a,point b)
db getsum(point v)
db random()
db search()//找到區域性較優解
else
if (exp((v-ans)/t)>random()&&(exp((v-ans)/t)<1))//嘗試走入較劣解}}
t*=delta;//退火
}return ans;
}int main()
return
0;}
解析 玄學 模擬退火
讓火焰淨化一切!火元素領主拉格納羅斯 通俗地來說,模擬退火是一種用於在方案數極大的情況下求取最優解的演算法。模擬退火的實現和物理中的金屬退火流程是一樣的。物理上我們先將物體加熱,再慢慢冷卻。在oi中,我們則是先隨機求取多個解,如果當前解比之前的解更優則選取它,否則我們按照一定的概率來判斷是否選取。設...
模擬退火演算法 學習反饋
模擬退火演算法是啟發式演算法的一種,啟發式演算法就是從對自然現象的直觀感覺或人類的工作經驗中啟發出來的演算法。有些實際問題根本就沒有最優解,或者最優解幾乎是不可能被求出來,這種情況使用啟發式演算法可以求得較優解,或者是與最優解差別不是很大的較優解,然後由於最優解是無法得知的,所以啟發式演算法也就無法...
機器學習 模擬退火演算法
爬山演算法 爬山演算法是一種貪心搜尋演算法,該演算法每一步從當前解的臨近解空間中選擇乙個最優解作為當前解,直至達到某個區域性最優解。模擬退火演算法 模擬退火演算法也是一種貪心演算法,但在它的搜尋過程中引入了乙個隨機因素 以一定的概率來接受乙個比當前解要差的解。故而模擬退火演算法有可能跳出區域性的最優...