NSGA2演算法中文版詳細介紹

2021-08-07 15:47:53 字數 3494 閱讀 4735

nsga2主要是對nsga演算法的改進。nsga是n. srinivas 和 k. deb在2023年發表的一篇名為《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列表中

else

if p < q:

#如果p被q支配,則把np加1

np +=

1if np ==0:

p_rank =

1#如果該個體的np為0,則該個體為pareto第一級

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,所以要加2

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).隨機初始化開始種**0。並對p0進行非支配排序,初始化每個個體的rank值。

(2). t = 0

(3).通過二進位制錦標賽法從pt選擇個體,並進行交叉和變異操作,產生新一代種群qt。

(4) 計算新種群的obj值,

(5).通過合併pt 和 qt 產生出組合種群rt = pt uqt 。

(6).對rt進行非支配排序,並通過排擠和精英保留策略選出n個個體,組成新一代種**t+1。

(7).跳轉到步驟3,並迴圈,直至滿足結束條件。

步驟5的具體操作可見下圖:

偽**如下:

while condition:

rt = pt + qt

f = 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 +=

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))。

NSGA2演算法一

pop size 200 max gen 300 solution company 0,118.719989,32.208781 for n in range pop size location 1,118.77089,32.242341 2,118.77116,32.242325 3,118.75...

nsga2演算法 NSGA2 遺傳演算法解決多目標優化

進行多目標優化時,通常面臨多個目標函式無法同時達到最優的情況,為了解決這一矛盾,引入pareto optimality的概念 通常,多目標優化的一般形式為 經過處理,可以化為以下形式 其中f1 x f2 x fn x 為目標函式,其全部都是求最小值的形式 以下針對兩個目標函式進行討論 有幾個目標函式...

R統計軟體詳細介紹(中文版)PDF文件

這篇文件內容的 多樣,既有來自於r 官方文件 包括r intro,r data,r admin 也有來自於網際網路的contributed documents 還有若干來自於capital of statistics 論壇的討論問題。本文件的目的是為具有一定統計 數學 背景的r 軟體初學者提供乙個快...