關於NSGA-II的一些資料
簡介
關於演化計算
生物系統中,進化被認爲是一種成功的自適應方法,具有很好的健壯性。
基本思想:達爾文進化論是一種穩健的搜索和優化機制。大多數生物體是通過自然選擇和有性生殖進行進化。自然選擇決定了羣體中哪些個體能夠生存和繁殖,有性生殖保證了後代基因中的混合和重組。自然選擇的原則是適者生存,優勝劣汰。
演化計算正是一類借鑑生物界自然選擇和自然遺傳機制而發展起來的通用問題求解方法。
基本方法:
演化計算採用簡單的編碼技術來表示各種複雜的結構,進而進行簡單的遺傳操作和優勝劣汰的自然選擇來指導學習和確定搜索方向。
演化計算採用種羣的方式組織搜索,使得它可以同時搜索解空間的多個區域,從而特別適合大規模並行。
演化計算不僅能獲得較高的效率而且具有簡單、易於操作和通用性。目前,演化算法已經廣泛在計算機科學、工程技術、管理科學和社會科學等衆多領域得到了越來越廣泛的應用。
NSGA-II簡介
NSGA2主要是對NSGA算法的改進。NSGA是N. Srinivas 和 K. Deb在1995年發表的一篇名爲《Multiobjective function optimization using nondominated sorting genetic algorithms》的論文中提出的。該算法在快速找到Pareto前沿和保持種羣多樣性方面都有很好的效果,不過在這麼多年的應用中也出現瞭如下的一些問題:
- 非支配排序的時間複雜的很大,爲O(MN3)。其中M爲目標函數的數量,N爲種羣規模。
- 不支持精英策略。精英策略在保持好的個體及加速向Pareto前沿收斂方面都有很好的表現。
- 需要自己指定共享參數。該參數將對種羣的多樣性產生很大的影響。
NSGA2算法的策略
快速的非支配排序
在NSGA進行非支配排序時,規模爲N的種羣中的每個個體都要針對M個目標函數和種羣中的N-1個個體進行比較,複雜度爲O(MN),因此種羣中的N個個體都比較結束的複雜度爲O(MN2),即每進行一次Pareto分級的時間複雜度爲O(MN2)。在最壞的情況下,每個Pareto級別都只含有一個個體,那麼需要進行N次分級所需要的時間複雜度則會上升爲O(MN3)。鑑於此,論文中提出了一種快速非支配排序法,該方法的時間複雜度爲O(MN2)。
該算法需要保存兩個量:
-
支配個數np。該量是在可行解空間中可以支配個體p的所以個體的數量。
-
被支配個體集合SP。該量是可行解空間中所有被個體p支配的個體組成的集合。
非支配排序算法的僞代碼如下:
def fast_nondominated_sort( P ):
F = [ ]
for p in P:
Sp = [ ]
np = 0
for q in P:
if p > q: #如果p支配q,把q添加到Sp列表中
Sp.append( q )
else if p < q: #如果p被q支配,則把np加1
np += 1
if np == 0:
p_rank = 1 #如果該個體的np爲0,則該個體爲Pareto第一級
F1.append( p )
F.append( F1 )
i = 0
while F[i]:
Q = [ ]
for p in F[i]:
for q in Sp: #對所有在Sp集合中的個體進行排序
nq -= 1
if nq == 0: #如果該個體的支配個數爲0,則該個體是非支配個體
q_rank = i+2 #該個體Pareto級別爲當前最高級別加1。此時i初始值爲0,所以要加2
Q.append( q )
F.append( Q )
i += 1
在上面僞代碼中,第一部分循環爲二重循環,時間複雜度爲O(N2),第二部分循環中,我們可以假設共有x個級別,而每個級別中最多有(N-N/x)各個體,每個個體的支配集合中也最多有(N- N/x)各個體。由此可得出循環次數爲x*(N-N/x)*(N-N/x)=((x-1)2/x2)N2M,即時間複雜度爲O(MN2)。
種羣中個體多樣性的保留
原始的NSGA算法中使用共享函數的方法來維持物種的多樣性,這種方法包含一個共享參數,該參數爲所求解問題中所期望的共享範圍。在該範圍內,兩個個體共享彼此的適應度。但是該方法有兩個難點:
-
共享函數方法在保持多樣性的性能很大程度上依賴於所選擇的共享參數值。
-
種羣中的每個個體都要與其餘的個體相比較,因此該方法的全局複雜度爲O(N2)。
在NSGA2中使用了排擠算法和精英策略來代替共享函數算法。而要實現這兩種方法,首先我們需要定義兩個操作:密度估算和排擠算子。
關於密度估算
要對擁擠距離進行計算,則需要根據每個目標函數對種羣中的所有個體按升序進行排序。第一個和最後一個個體的擁擠距離設爲無窮大,第i個個體的擁擠距離則設爲第i+1和第i個體的所有目標函數值之差的和。具體方法如下面僞代碼:
def crowding_distance_assignment( I )
nLen = len( I ) #I中的個體數量
for i in I:
i.distance = 0 #初始化所有個體的擁擠距離
for objFun in M: #M爲所有目標函數的列表
I = sort( I, objFun ) #按照目標函數objFun進行升序排序
I[0] = I[ len[I]-1 ] = ∞ #對第一個和最後一個個體的距離設爲無窮大
for i in xrange( 1, len(I) - 2 ):
I[i].distance = I[i].distance + ( objFun( I[i+1] ) - objFun( I[i-1] ) )/(Max(objFun()) - Min(objFun()) )
主體循環部分
(1).隨機初始化開始種羣P0。並對P0進行非支配排序,初始化每個個體的rank值。
(2). t = 0
(3).通過二進制錦標賽法從Pt選擇個體,並進行交叉和變異操作,產生新一代種羣Qt。
(4) 計算新種羣的obj值,
(5).通過合併Pt 和 Qt 產生出組合種羣Rt = Pt UQt 。
(6).對Rt進行非支配排序,並通過排擠和精英保留策略選出N個個體,組成新一代種羣Pt+1。
(7).跳轉到步驟3,並循環,直至滿足結束條件。
僞代碼如下
while condition:
Rt = Pt + Qt
F = fast_nondominate_sort( Rt )
Pt+1 = [ ]
i = 0
while len(Pt+1) + len( F[i] ) < N:
crowding_distance_assignment( F[i] )
Pt+1 += F[i]
i += 1
Pt+1 += F[i][0:N-len(Pt+1)]
Qt+1 = make_new_generation( Pt+1 )
t = t+1
NSAG2算法的整體複雜度
(1).非支配排序,最差複雜度爲O(M(2N)2)。
(2).擁擠距離估算賦值,最差複雜度爲O(M(2N)log(2N))。
(3).擁擠操作排序,最差複雜度爲O(2Nlog(2N))。
更多內容訪問 omegaxyz.com
網站所有代碼採用Apache 2.0授權
網站文章採用知識共享許可協議BY-NC-SA4.0授權
© 2020 • OmegaXYZ-版權所有 轉載請註明出處