AI中的幾種搜尋演算法 SA搜尋演算法

2021-06-12 01:22:00 字數 1656 閱讀 1654

sa (simulated annealing)搜尋演算法,就如它的名字,是模仿了退火的處理過程。在提到tsp問題的時候,經常會使用該演算法進行解決。

該演算法的流程如下

1.     首先便是初始化工作,設定初始溫度(temperature),獲得乙個隨機的解決方案,並將其設定為當前解決方案(cur_sol)。

2.     如果溫度大於0,處理cur_sol(perturb處理,比如隨機調換方案中步驟執行順序等),得到新方案(new_sol);如果溫度小於0,結束演算法。

3.     比較當前方案和新方案的消耗(deltae = cost(new_sol) – cost(cur_sol))。

4.     如果deltae小於0則表明新方案比當前方案優秀,將新方案設定為當前方案,降溫,則繼續執行步驟2。

5.     根據公式p = exp(-detae/t)。計算p將其與以小於1的正隨機數比較。如果p大於隨機數,正將新方案設定為當前方案,降溫繼續執行步驟2;如果p小於隨機數,則降溫直接執行步驟2。

這個流程可以簡單的理解:不斷獲取新方案,和當前比較,如果優於當前方案,取新方案為當前方案;如果劣於當前方案,則給予它乙個機會成為當前方案,這個機會的概率取決於當前的溫度和它與當前方案之間的差距。

這裡舉tsp問題,這個在sa搜尋中最常用的例子。

tsp問題即旅行商問題:乙個旅行商a被分配到乙個任務,公司要求a去幾個城市進行公司業務拓展,所以a就會拿出地圖制定乙個合理的路線。其中路線的要求便是消耗最小,並且能夠從某乙個城市出發,並且最後返回該城市時,已經訪問過了所有城市。

首先我們需要聯絡一下sa演算法,將幾個tsp中的概念對應到sa中。路線便是我們要搜尋的解決方案(solution),路線所經歷的長度便是sa中的消耗,這樣問題就簡單了。

至於perturb處理,便是調換路線中兩個城市的順序比如

cur_sol: a->b->c->d->e->a

經過perturb處理後得到new_sol

new_sol:a->b->d->c->e->a

我們可以隨機調換兩個城市的訪問順序。

接下來便是p = exp(-detae/t)。聯絡tsp問題這個公式中

p和p2都為路線,p為當前路線,p2為新路線。p[i]表示路線中的第i個城市,l(x,y)表示城市x和城市y之間的距離。

我寫了乙個程式演示tsp問題的解決,感興趣的讀者可以去

int tsp_sa(city * cities,intncities,int ** path)

else

}temperature -= 0.01;

}deletenewpath;

return 1;

}

說明其中city是乙個自定義的結構體,儲存了城市的位置。perturbpath函式則是隨機調換路線中兩個城市的訪問順序。

sa演算法,隨著溫度越來越低,獲得的方案也是越來越穩定,因為溫度的降低,是的採納非優方案的概率越來越低。至於為什麼還要給非優方案乙個機會,是因為要避免區域性最優(local optimum)。

接下來我會發表介紹幾種搜尋演算法。

非常暴力的搜尋演算法 深度優先搜尋演算法

第一題 有1 9 9個數,選取3個數組成以下格式 數字只能用一次,不能重複 有1 9 9個數,選取3個數組成以下格式 數字只能用一次,不能重複 public class demo1 第二題 有1 9 9個數,選取3個數組成以下格式 數字只能用一次,不能重複 如 12 35 47 public cla...

幾種搜尋演算法原理比一比

a搜尋 總代價 f n g n h n 其中g n 為從初始狀態到達該狀態的代價 這裡乙個狀態也就是a演算法裡常說的乙個節點 h n 為從當前狀態到目標狀態的預估代價。因此,該演算法的思路就是,每次尋找總代價f n 最小的點進行擴充套件,直到找到終點。a 的具體過程可參考這篇部落格,可參考這篇部落格...

最簡單的搜尋演算法

目前自己用的比較多的是廣搜bfs 以下是別的大神們的詳細講解 原 bfs可用於解決2類問題 從a出發是否存在到達b的路徑 從a出發到達b的最短路徑 這個應該叫最少步驟合理 其思路為從圖上乙個節點出發,訪問先訪問其直接相連的子節點,若子節點不符合,再問其子節點的子節點,按級別順序依次訪問,直到訪問到目...