NSGA2算法中文版详细介绍
NSGA2主要是對(duì)NSGA算法的改進(jìn)。NSGA是N. Srinivas 和 K. Deb在1995年發(fā)表的一篇名為《Multiobjective function optimization using nondominated sorting genetic algorithms》的論文中提出的。該算法在快速找到Pareto前沿和保持種群多樣性方面都有很好的效果,不過在這么多年的應(yīng)用中也出現(xiàn)了如下的一些問題:
1。非支配排序的時(shí)間復(fù)雜的很大,為O(MN3)。其中M為目標(biāo)函數(shù)的數(shù)量,N為種群規(guī)模。
2。不支持精英策略。精英策略在保持好的個(gè)體及加速向Pareto前沿收斂方面都有很好的表現(xiàn)。
3。需要自己指定共享參數(shù)。該參數(shù)將對(duì)種群的多樣性產(chǎn)生很大的影響。
NSGA2算法將在以下方面進(jìn)行改進(jìn):
1。快速的非支配排序
在NSGA進(jìn)行非支配排序時(shí),規(guī)模為N的種群中的每個(gè)個(gè)體都要針對(duì)M個(gè)目標(biāo)函數(shù)和種群中的N-1個(gè)個(gè)體進(jìn)行比較,復(fù)雜度為O(MN),因此種群中的N個(gè)個(gè)體都比較結(jié)束的復(fù)雜度為O(MN2),即每進(jìn)行一次Pareto分級(jí)的時(shí)間復(fù)雜度為O(MN2)。在最壞的情況下,每個(gè)Pareto級(jí)別都只含有一個(gè)個(gè)體,那么需要進(jìn)行N次分級(jí)所需要的時(shí)間復(fù)雜度則會(huì)上升為O(MN3)。鑒于此,論文中提出了一種快速非支配排序法,該方法的時(shí)間復(fù)雜度為O(MN2)。
該算法需要保存兩個(gè)量:(1).支配個(gè)數(shù)np。該量是在可行解空間中可以支配個(gè)體p的所以個(gè)體的數(shù)量。(2).被支配個(gè)體集合SP。該量是可行解空間中所有被個(gè)體p支配的個(gè)體組成的集合。排序算法的偽代碼如下: 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 #如果該個(gè)體的np為0,則該個(gè)體為Pareto第一級(jí)F1.append( p )F.append( F1 )i = 0while F[i]:Q = [ ]for p in F[i]:for q in Sp: #對(duì)所有在Sp集合中的個(gè)體進(jìn)行排序nq -= 1if nq == 0: #如果該個(gè)體的支配個(gè)數(shù)為0,則該個(gè)體是非支配個(gè)體q_rank = i+2 #該個(gè)體Pareto級(jí)別為當(dāng)前最高級(jí)別加1。此時(shí)i初始值為0,所以要加2Q.append( q )F.append( Q )i += 1 在上面?zhèn)未a中,第一部分循環(huán)為二重循環(huán),時(shí)間復(fù)雜度為O(N2),第二部分循環(huán)中,我們可以假設(shè)共有x個(gè)級(jí)別,而每個(gè)級(jí)別中最多有(N-N/x)各個(gè)體,每個(gè)個(gè)體的支配集合中也最多有(N- N/x)各個(gè)體。由此可得出循環(huán)次數(shù)為x*(N-N/x)*(N-N/x)=((x-1)2/x2)N2M,即時(shí)間復(fù)雜度為O(MN2)。2。種群中個(gè)體多樣性的保留
原始的NSGA算法中使用共享函數(shù)的方法來維持物種的多樣性,這種方法包含一個(gè)共享參數(shù),該參數(shù)為所求解問題中所期望的共享范圍。在該范圍內(nèi),兩個(gè)個(gè)體共享彼此的適應(yīng)度。但是該方法有兩個(gè)難點(diǎn):(1).共享函數(shù)方法在保持多樣性的性能很大程度上依賴于所選擇的共享參數(shù)值。(2).種群中的每個(gè)個(gè)體都要與其余的個(gè)體相比較,因此該方法的全局復(fù)雜度為O(N2)。在NSGA2中使用了排擠算法和精英策略來代替共享函數(shù)算法。而要實(shí)現(xiàn)這兩種方法,首先我們需要定義兩個(gè)操作:密度估算和排擠算子。(1).密度估算要對(duì)擁擠距離進(jìn)行計(jì)算,則需要根據(jù)每個(gè)目標(biāo)函數(shù)對(duì)種群中的所有個(gè)體按升序進(jìn)行排序。第一個(gè)和最后一個(gè)個(gè)體的擁擠距離設(shè)為無窮大,第i個(gè)個(gè)體的擁擠距離則設(shè)為第i+1和第i個(gè)體的所有目標(biāo)函數(shù)值之差的和。具體方法如下面?zhèn)未a: def crowding_distance_assignment( I )nLen = len( I ) #I中的個(gè)體數(shù)量for i in I:i.distance = 0 #初始化所有個(gè)體的擁擠距離for objFun in M: #M為所有目標(biāo)函數(shù)的列表I = sort( I, objFun ) #按照目標(biāo)函數(shù)objFun進(jìn)行升序排序I[0] = I[ len[I]-1 ] = ∞ #對(duì)第一個(gè)和最后一個(gè)個(gè)體的距離設(shè)為無窮大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 )是對(duì)個(gè)體i求其目標(biāo)函數(shù)值。Max(objFun())為目標(biāo)函數(shù)objFun()的最大值,Min(objFun())為目標(biāo)函數(shù)objFun的最小值。其復(fù)雜度為O(MNlogN)。3。主體循環(huán)部分
(1).隨機(jī)初始化開始種群P0。并對(duì)P0進(jìn)行非支配排序,初始化每個(gè)個(gè)體的rank值。(2). t = 0(3).通過二進(jìn)制錦標(biāo)賽法從Pt選擇個(gè)體,并進(jìn)行交叉和變異操作,產(chǎn)生新一代種群Qt。(4) 計(jì)算新種群的obj值,(5).通過合并Pt 和 Qt 產(chǎn)生出組合種群Rt = Pt UQt 。(6).對(duì)Rt進(jìn)行非支配排序,并通過排擠和精英保留策略選出N個(gè)個(gè)體,組成新一代種群Pt+1。(7).跳轉(zhuǎn)到步驟3,并循環(huán),直至滿足結(jié)束條件。步驟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算法的整體復(fù)雜度,以下為該算法中的基本操作和其最差復(fù)雜度:
(1).非支配排序,最差復(fù)雜度為O(M(2N)2)。(2).擁擠距離估算賦值,最差復(fù)雜度為O(M(2N)log(2N))。(3).擁擠操作排序,最差復(fù)雜度為O(2Nlog(2N))。總結(jié)
以上是生活随笔為你收集整理的NSGA2算法中文版详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决问题的反馈机制_谈谈HBase中的N
- 下一篇: Makefile中几种赋值