NSGA2算法中拥挤度计算代码
思想:
? ? ? ? 要對(duì)擁擠距離進(jìn)行計(jì)算,則需要根據(jù)每個(gè)目標(biāo)函數(shù)對(duì)種群中的所有個(gè)體按升序進(jìn)行排序。第一個(gè)和最后一個(gè)個(gè)體的擁擠距離設(shè)為無(wú)窮大,第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è)為無(wú)窮大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)。
?
NSGA2算法的主體循環(huán)部分:
(1)隨機(jī)初始化開(kāi)始種群P0。并對(duì)P0進(jìn)行非支配排序,初始化每個(gè)個(gè)體的rank值。
(2). t = 0
(3).通過(guò)二進(jìn)制錦標(biāo)賽法從Pt選擇個(gè)體,并進(jìn)行交叉和變異操作,產(chǎn)生新一代種群Qt。
(4) 計(jì)算新種群的obj值,
(5).通過(guò)合并Pt 和 Qt 產(chǎn)生出組合種群Rt = ?Pt UQt 。
(6).對(duì)Rt進(jìn)行非支配排序,并通過(guò)排擠和精英保留策略選出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
?
總結(jié)
以上是生活随笔為你收集整理的NSGA2算法中拥挤度计算代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: maven如何修改本地仓库与中央仓库
- 下一篇: 水深平均的二维浅水方程推导