人工智慧 模擬退火演算法及實踐

2021-08-17 12:12:40 字數 4020 閱讀 5033

摸擬退火演算法是基於隨機搜尋的,即在解的空間中展開隨機搜尋的。當問題的空間很大,而可行解比較多,並且對解的精度要求不高時,隨機搜尋是很有效的解決辦法,因為其他的做法在這個時候時空效率不能讓人滿意。而借助演化思想和群集智慧型思想改進過的隨機演算法更是對解的分布有規律的複雜問題有良好的效果。

所謂退火是冶金專家為了達到某些特種晶體結構重複將金屬加熱或冷卻的過程,該過程的控制引數為溫度t。模擬退火法的基本思想是:在系統朝著能量減小的趨勢這樣乙個變化過程中,偶爾允許系統跳到能量較高的狀態,以避開區域性極小點,最終穩定達到全域性最小點。可以看到模擬退火不是單純的採用貪心策略,它每獲得乙個解,對於該解有兩種做法:若該解為更優解,則100%採納;若該解為劣解,以一定的概率採納該解,也就是說可能丟棄,可能採納。所以在模擬退火演算法的隨機搜尋過程中,當前的採納解是時好時壞,呈現出一種不斷波動的情況,但在總體的過程中又朝著最優的方向收斂。

評估解的好壞取決於問題的語境,例如旅行商tsp問題,我們用全部的距離加起來作為解的優劣情況。

(1)由乙個產生函式從當前解產生乙個位於解空間的新解;為便於後續的計算和接受,減少演算法耗時,通常選擇由當前新解經過簡單地變換即可產生新解的方法,如對構成新解的全部或部分元素進行置換、互換等。

(2)計算與新解所對應的目標函式差。因為目標函式差僅由變換部分產生,所以目標函式差的計算最好按增量計算。

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

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

s:=s0;e:=e(s)//設定目前狀態為s0,其能量e(s0)

k:=0//評估次數k

while kand e>emax//若還有時間(評估次數k還不到kmax)且結果還不夠好(能量e不夠低)則:

sn:=neighbour(s)//隨機選取一臨近狀態sn

en:=esn)//sn的能量為e(sn)

ifrandom() < p(e,en,temp(k/kmax)) the

n//決定是否移至臨近狀態sn

s:=sn;e:=en//移至臨近狀態sn

k:=k+1//評估完成,次數k加一

return

s//迴轉狀態s

模擬退火是乙個不斷迭代的過程,我們通過設定乙個迭代次數來模擬時間,注意這個迭代次數,不能多也不能少,具體是通過實踐出來的。如果設定得太小,那麼模擬過程還沒有收斂就已經結束了;而設定得太大,那麼收斂之後的迭代式浪費時間,因為收斂之後已經不會再變了。(收斂就是達到目前的最優解狀態)所以經過多次嘗試調出乙個恰當的迭代次數是非常有必要

了解模擬退火的基本原理之後,實踐是最好的學習方式。

tsp問題背景

tsp問題,假設乙個旅行商人要去n個城市,給出n個城市的座標,他必須經過且只經過每個城市一次,要求最後回到出發的城市,並且要求他選擇的路徑是所有路徑中的最小值。

擬定演算法

(1).隨機生成乙個城市序列作為初始解,比如1、2、… 140,這樣的乙個序列;設定合適的初溫;

(2).通過交換兩個城市的位置得到序列的領域,作為新解,如果溫度為0,則轉(6);

(3).將新解與最優解比較,如果新解小於最優解,則將新解作為最優解,否則則以metropolis 準則決定是否接受差解為最優解;

(4).如果系統處於平衡狀態,則轉(5),否則接著執行(2);

(5).降溫,迭代計數器加1,返回(2);

(6).輸出最優解。

其中,我們給每個城市編號1-n,每乙個解對應乙個路徑序列,代表通過這個路徑走遍全部城市。我們評估函式就是這個路徑的大小,最終目的就是盡可能找到乙個路徑長度最小的解。關於達到系統平衡狀態,這個我們設定乙個內建的迴圈,整個演算法是雙重迴圈,外迴圈表示退火過程,內迴圈迭代致使達到乙個平衡狀態。

程式設計實現

變數表示:

const

int ncities = 130; //城市數量

const

double speed = 0.98;//退火速度

const

int initial_temp = 1000;//初始溫度

struct nodenodes[ncities];

class genbyone

intoperator() ()

private:

int seed;

};double length_table[ncities][ncities];//儲存各點間距離

解的狀態表示:

class answer //乙個解  

void calculate_length()

length += length_table[path[ncities - 1] - 1][path[0] - 1];

}double

length;//代價,總長度

int path[ncities];//路徑

//用於比較解之間的優劣

bool operator < (const answer &other) const

};

設定初溫:根據接收準則倒推初溫

double geninitialtemp()

//獲取最大最小差異

double delta = maxlength - minlength;

double p = 0.8;

double result = 0.0;

//倒推

result = -delta/(log(1.0/p - 1.0));

return result;

}

根據當前解獲取它的乙個鄰域解:

void getnewsolution(answer &t) 

else

if (i == j)return;

//隨機取路徑中兩點進行操作

int choose = rand() % 3;

switch (choose)

t.calculate_length();

}

求解模擬:

answer sa_tsp(bool is_sa) }}

t *= r;//降溫

}return best;

}

接受解的函式:

bool accept(answer &temp, answer &best, double t)
上面已經列出了演算法的核心**,我借用qt的做出了乙個視覺化演算。

曲線顯示的是當前解的路徑距離,右邊顯示的當前解下不同城市的連線狀態,可以看到摸擬退火整個過程是上下波動的,但整體是朝著乙個減小的過程進行的。最終達到收斂後會得到乙個優美的無交叉的曲線,與目前那個**上算到的最優距離差距不到2%:

模擬退火演算法是可以達到全域性最優的,但是爬山法就不一定的,爬山法就是採用貪心的策略進行區域性搜尋,它得到結果就沒那麼好了,可以看到明顯的線的交叉:

人工智慧 模擬退火演算法概述

模擬退火演算法 simulated annealing,sa 的思想最早由metropolis等人於1953年提出 kirkpatrick於1983年第一次使用模擬退火演算法求解組合最優化問題。模擬退火演算法是一種基於monte carlo迭代求解策略的隨機尋優演算法,其出發點是基於物理中固體物質的...

人工智慧 alpha beta剪枝演算法及實踐

alpha beta剪枝演算法是基於極大極小搜尋演算法的。極大極小搜尋策略是考慮雙方對弈若干步之後,從可能的步中選一步相對好的走法來走,在有限的搜尋範圍內進行求解,可以理解為規定乙個有限的搜尋深度。為此要定義乙個靜態估計函式f,以便對棋局的勢態做出優劣的估計,這個函式可根據棋局的優劣勢態的特徵來定義...

人工智慧 模擬退火演算法解決N皇后問題(C語言)

1.原理 模擬退火演算法 simulated annealing algorithm 其實也是一種隨機爬山法 hill climbing 其不同之處在於模擬退火演算法在下乙個狀態情況 變壞 的情況下以指數級概率接受該移動,這種隨機接受方法可以使得爬山法跳出區域性山峰的平坦區域,從而得到全域性最優解。...