NSGA2算法中文版详细介绍
NSGA2主要是對NSGA算法的改進。NSGA是N. Srinivas 和 K. Deb在1995年發表的一篇名為《Multiobjective function optimization using nondominated sorting genetic algorithms》的論文中提出的。該算法在快速找到Pareto前沿和保持種群多樣性方面都有很好的效果,不過在這么多年的應用中也出現了如下的一些問題:
1。非支配排序的時間復雜的很大,為O(MN3)。其中M為目標函數的數量,N為種群規模。
2。不支持精英策略。精英策略在保持好的個體及加速向Pareto前沿收斂方面都有很好的表現。
3。需要自己指定共享參數。該參數將對種群的多樣性產生很大的影響。
NSGA2算法將在以下方面進行改進:
1。快速的非支配排序
在NSGA進行非支配排序時,規模為N的種群中的每個個體都要針對M個目標函數和種群中的N-1個個體進行比較,復雜度為O(MN),因此種群中的N個個體都比較結束的復雜度為O(MN2),即每進行一次Pareto分級的時間復雜度為O(MN2)。在最壞的情況下,每個Pareto級別都只含有一個個體,那么需要進行N次分級所需要的時間復雜度則會上升為O(MN3)。鑒于此,論文中提出了一種快速非支配排序法,該方法的時間復雜度為O(MN2)。
該算法需要保存兩個量:(1).支配個數np。該量是在可行解空間中可以支配個體p的所以個體的數量。(2).被支配個體集合SP。該量是可行解空間中所有被個體p支配的個體組成的集合。排序算法的偽代碼如下: def fast_nondominated_sort( P ):F = [ ]for p in P:Sp = [ ]np = 0for q in P:if p > q: #如果p支配q,把q添加到Sp列表中Sp.append( q )else if p < q: #如果p被q支配,則把np加1np += 1if np == 0:p_rank = 1 #如果該個體的np為0,則該個體為Pareto第一級F1.append( p )F.append( F1 )i = 0while F[i]:Q = [ ]for p in F[i]:for q in Sp: #對所有在Sp集合中的個體進行排序nq -= 1if nq == 0: #如果該個體的支配個數為0,則該個體是非支配個體q_rank = i+2 #該個體Pareto級別為當前最高級別加1。此時i初始值為0,所以要加2Q.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)。2。種群中個體多樣性的保留
原始的NSGA算法中使用共享函數的方法來維持物種的多樣性,這種方法包含一個共享參數,該參數為所求解問題中所期望的共享范圍。在該范圍內,兩個個體共享彼此的適應度。但是該方法有兩個難點:(1).共享函數方法在保持多樣性的性能很大程度上依賴于所選擇的共享參數值。(2).種群中的每個個體都要與其余的個體相比較,因此該方法的全局復雜度為O(N2)。在NSGA2中使用了排擠算法和精英策略來代替共享函數算法。而要實現這兩種方法,首先我們需要定義兩個操作:密度估算和排擠算子。(1).密度估算要對擁擠距離進行計算,則需要根據每個目標函數對種群中的所有個體按升序進行排序。第一個和最后一個個體的擁擠距離設為無窮大,第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()) ) 偽代碼中的objFun( i )是對個體i求其目標函數值。Max(objFun())為目標函數objFun()的最大值,Min(objFun())為目標函數objFun的最小值。其復雜度為O(MNlogN)。3。主體循環部分
(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,并循環,直至滿足結束條件。步驟5的具體操作可見下圖:偽代碼如下: while condition:Rt = Pt + QtF = fast_nondominate_sort( Rt )Pt+1 = [ ]i = 0while len(Pt+1) + len( F[i] ) < N:crowding_distance_assignment( F[i] )Pt+1 += F[i]i += 1Pt+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))。總結
以上是生活随笔為你收集整理的NSGA2算法中文版详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决问题的反馈机制_谈谈HBase中的N
- 下一篇: Makefile中几种赋值