vns可變領域 變鄰域搜尋 VNS

2021-10-16 19:35:14 字數 1978 閱讀 2595

1 區域性搜尋

1.1 區域性搜尋

區域性搜尋演算法是對一類演算法的統稱,符合其框架的演算法很多,比如爬山法、模擬退火演算法和禁忌搜尋演算法都屬於區域性搜尋演算法。儘管各個演算法在優化過程中的細節存在差異,但在優化流程上呈現出很大的共性。它的基本原理是在鄰近解中迭代,使目標函式逐步優化,直至不能再優化為止。

1.2 區域性搜尋的過程

區域性搜尋演算法的統一框架描述為:

1) 演算法從乙個或若干個初始解出發。

2)在演算法引數控制下由當前狀態的鄰域中產生若干個候選解。

3) 以某種策略在候選解中確定新的當前解。

4)伴隨控制引數的調節,重複執行上述搜尋過程,直至滿足演算法終止條件。

5) 結束搜尋過程並輸出優化結果。

1.3 區域性搜尋的幾大要素

區域性搜尋演算法主要包含五大要素:

1) 目標函式:用來判斷解的優劣。

2) 鄰域的定義:根據不同問題,有著不同的鄰域定義。

3) 初始解的產生方法。

4) 新解的產生和接受規則。

5) 演算法終止條件。

其中前兩個要素的定義和演算法要解決的特定問題有關,而且不同的人對同一問題可能有完全不同的定義。後三個要素定義的不同則會產生各種不同的區域性搜尋演算法,它們的效率和最終解的質量也會有很大的差異。

2 變鄰域搜尋演算法

2.1 什麼是變鄰域搜尋

變鄰域搜尋演算法(vns)是一種改進型的區域性搜尋演算法。它利用不同的動作構成的鄰域結構進行交替搜尋。

變鄰域搜尋演算法依賴於以下事實:

1) 乙個鄰域結構的區域性最優解不一定是另乙個鄰域結構的區域性最優解。

2)全域性最優解是所有可能鄰域的區域性最優解。

變鄰域搜尋演算法主要由以下兩個部分組成:

1) variable neighborhood descent (vnd)

2) shaking procedure

2.2 鄰域

在組合優化問題中,鄰域一般定義為由給定轉化規則對給定的問題域上每結點進行轉化所得到的問題域上結點的集合 。

通俗一點:鄰域就是指對當前解進行乙個操作(這個操作可以稱之為鄰域動作)可以得到的所有解的集合。那麼不同鄰域的本質區別就在於鄰域動作的不同了。

2.3 鄰域動作

鄰域動作是乙個函式,通過這個函式,對當前解s,產生其相應的鄰居解集合。例如:對於乙個bool型問題,其當前解為:s = 1001,當將鄰域動作定義為翻轉其中乙個bit時,得到的鄰居解的集合n(s)=,其中n(s) ∈ s。同理,當將鄰域動作定義為互換相鄰bit時,得到的鄰居解的集合n(s)=。

2.4 variable neighborhood descent (vnd)

vnd其實就是乙個演算法框架,它的過程描述如下:

1) 給定初始解s; 定義m個鄰域,記為n_k(k = 1, 2, 3......m);i = 1。

2) 使用鄰域結構n_i(即 n_i(s))進行搜尋,如果在n_i(s)裡找到乙個比s更優的解s′,則令s=s′, i=1 。

3)如果搜遍鄰域結構n_i仍找不到比s更優的解,則令i++。

4)如果i≤m ,轉步驟2。

5) 輸出最優解s。

vnd的**如下:

2)當在本鄰域搜尋找到了乙個比當前解更優的解的時候,我們就跳回第乙個鄰域重新開始搜尋。如圖中實線所示。

之前我們把區域性搜尋比作爬山的過程,那麼每變換一次鄰域,也可以理解為切換了搜尋的地形(landscape)。效果如下 :

偽**描述如下:

2.5 shaking procedure

就是乙個擾動運算元,類似於鄰域動作的這麼乙個東西。通過這個運算元,可以產生不同的鄰居解。雖然名詞很多看起來很高大上,擾動、抖動、鄰域動作這幾個本質上還是沒有什麼區別的。都是通過一定的規則,將乙個解變換到另乙個解而已。

2.6 vns過程

在綜合了前面這麼多的知識以後,vns的過程其實非常簡單, 直接看偽**,一目了然:

偽**中n_k和n_l代表的鄰域集合,分別是給shaking和vnd使用的,這兩點希望大家要格外注意,區分開來哈。這兩個鄰域集合可以是一樣的,也可以不一樣。

可變與不可變

元組 tuple 元組一旦被建立就不能被修改,採用逗號和圓括號 來表示。列表推導式 可變與不可變 序列型別 是否有序 是否可變 列表有序可變 元組有序 不可變 字串有序 不可變 字典無序可變 集合無序 不可變不管是可變還是不可變的序列型別 1 分片必定產生新的序列 2 號在等號右邊,必定產生新的序列...

可變和不可變

可變和不可變 不可變 物件所指向的記憶體中的值是不可以改變 不可變型別 int ser float 元組tuple num 10s1 abc print id s1 s1 abcd print id s1 t1 2 5,6 print id t1 t1 2 5 print id t1 可變的 物件所...

可變不可變型別

x 10 print id x x 11 print id x 1713078672 1713078704 值改變,id也發生了改變 驗證 int是不可變型別,所有的賦值都是產生新值 float是不可變型別 str是不可變型別 int float str三種型別的值是不可以分割的,是不可分割的整體,...