更多精彩盡在微信公眾號【程序猿聲】

迭代局部搜索(Iterated Local Search, ILS)
00 目錄
- 局部搜索算法
- 簡單局部搜索
- 迭代局部搜索
01 局部搜索算法
1.1 什么是局部搜索算法?
局部搜索是解決最優化問題的一種啟發式算法。因為對於很多復雜的問題,求解最優解的時間可能是極其長的。因此誕生了各種啟發式算法來退而求其次尋找次優解,局部搜索就是其中一種。它是一種近似算法(Approximate algorithms)。
局部搜索算法是從爬山法改進而來的。簡單來說,局部搜索算法是一種簡單的貪心搜索算法,該算法每次從當前解的臨近解空間中選擇一個最優解作為當前解,直到達到一個局部最優解。局部搜索從一個初始解出發,然后搜索解的鄰域,如有更優的解則移動至該解並繼續執行搜索,否則返回當前解。
1.2 算法思想過程
局部搜索會先從一個初始解開始,通過鄰域動作。產生初始解的鄰居解,然后根據某種策略選擇鄰居解。一直重復以上過程,直到達到終止條件。
不同局部搜索算法的區別就在於:鄰域動作的定義以及選擇鄰居解的策略。這也是決定算法好壞的關鍵之處。
1.3 什么又是鄰域動作?
其實鄰域動作就是一個函數。那么,通過這個函數,對當前的最優解s,產生s對應的鄰居解的一個集合。比如:
對於一個bool型問題,其當前解為:s = 1001,當將鄰域動作定義為翻轉其中一個bit時,得到的鄰居解的集合N(s)={0001,1101,1011,1000},其中N(s) ∈ S。同理,當將鄰域動作定義為互換相鄰bit時,得到的鄰居解的集合N(s)={0101,1001,1010}.
02 簡單局部搜索
在開始我們的迭代局部搜索之前,還是先來給大家科普幾個簡單局部搜索算法。他們也是基於個體的啟發式算法(Single solution)。
2.1 爬山法(HILL-CLIMBING)
干貨 | 用模擬退火(SA, Simulated Annealing)算法解決旅行商問題
2.2 模擬退火(SIMULATED ANNEALING)
干貨 | 用模擬退火(SA, Simulated Annealing)算法解決旅行商問題
2.3 模擬退火(SIMULATED ANNEALING)
干貨 | 十分鍾掌握禁忌搜索算法求解帶時間窗的車輛路徑問題(附C++代碼和詳細代碼注釋)
03 迭代局部搜索(Iterated Local Search, ILS)
3.1 介紹
迭代局部搜索屬於探索性局部搜索方法(EXPLORATIVE LOCAL SEARCH METHODS)的一種。它在局部搜索得到的局部最優解上,加入了擾動,然后再重新進行局部搜索。
3.2 過程描述
注:下文的局部搜索(或者LocalSearch)指定都是簡單局部搜索。指上文介紹的三種中的任意一種。
- 從初始解s中進行局部搜索,找到一個局部最優解s1。
- 擾動s1,獲得新的解s2。
- 從新解s2中進行局部搜索,再次找到一個局部最優解s3。
- 基於判斷策略,對s3好壞進行判斷。選擇接受s3作為新解或者回退s2。
- 直到找到滿足條件的最優解,不然跳回第二步。
其圖解如下:

偽代碼如下:

關於其中的接受判斷准則,這里采用了模擬退火中的概率函數:

04 代碼時間
以下C++代碼還是用於求解TSP旅行商問題。至於什么是旅行商問題,讀者可以從爬山算法那篇文章了解。
欲獲取代碼,請關注我們的微信公眾號【程序猿聲】,在后台回復:ILS代碼。即可獲取。
