1. 程式人生 > >人工智慧實驗——隨機重啟爬山法,模擬退火演算法,遺傳演算法求解N皇后問題

人工智慧實驗——隨機重啟爬山法,模擬退火演算法,遺傳演算法求解N皇后問題

一、爬山法

爬山法就是完全的貪心演算法,每一步都選最優位置,可能只能得到區域性最優解。本實驗對普通爬山法進行了簡單的優化,採用了傳統爬山法的變種——隨機重啟爬山法,當爬山步數超過一定值時,會重新打亂棋盤,重新“爬山”。

適應度函式:衝突皇后的總對數

“爬山”:每一步就是將棋盤的某一行的皇后移動到最優的位置,即該位置讓衝突的皇后對數最少,即適應度函式值最小。

“不斷地爬山”: 迴圈對棋盤的每一行進行爬山直到該棋盤狀態下適應度函式值為0。

演算法框圖如下:

                         核心程式碼實現如下:

                

二、模擬退火演算法

模擬退火演算法本質也是一種貪心演算法,只不過以一定的概率來接受更差的狀態。這種概率會隨著移動變得越來越小,好處是可能會讓演算法跳出區域性最優解,而得到全域性最優解。

適應度函式:衝突的皇后對數之和。

“模擬退火的過程”就是對棋盤的某一行進行最佳位置的選擇。具體降溫過程是:設定一個最高溫度Max,最低溫度Min,以及降溫速率r。某一溫度T從溫度Max以速率r降溫到Min後則返回最終選擇的皇后位置。

具體的選擇是,在每一次降溫過程中,先比較相鄰兩個皇后位置對應的狀態的適應度函式值h(x),設能量差為dE = h_new(x) – h_old(x)。如果dE <= 0,則接受該新的狀態,繼續比較相鄰狀態;如果dE > 0, 則以概率P(dE)= exp(-dE/rT)接受該移動。當該行比較出最優位置後,重新降溫,達到最小溫度後得出該行移動的位置。

核心程式碼如下:

三、遺傳演算法

遺傳演算法就是模擬自然選擇的過程,將許多棋盤視為一個種群,每一個種群對應每一個個體。每兩個個體進行結合產生一個新的個體,多次結合產生的新個體形成新的種群,然後再次繁殖,直到出現有適應度最高的個體。

本演算法中適應度函式為每個棋盤個體中不衝突的皇后對數。

遺傳演算法有三個基本操作:選擇,交叉,變異。

選擇:選擇一些個體來產生下一代。一種常用的選擇策略是 “比例選擇”,也就是個體被選中的概率與其適應度函式值成正比。假設群體的個體總數是M,那麼那麼一個體Xi被選中的概率為f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) ) 。比例選擇實現演算法就是所謂的“輪盤賭演算法”。   

交叉:兩個棋盤交換部分的行得到一個新的物種,本次交叉採用兩個變異點,交換兩點之間的辦法。

變異:隨機挑選一個行的位置,隨機改變該行皇后的位置。

本實驗對傳統的遺傳演算法進行了兩個優化,即每次產生的後代個體的適應度總是要不比父母個體差,由更優的種群產生的後代;當種群適應度處於穩定的時候,會適當提升變異率,以製造更優的個體出現。這樣求解的效率會更好。

虛擬碼如下:

最後有什麼說的不對,做的不好的歡迎指教和討論哈~