日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

matlab 非支配排序,NSGA-II快速非支配排序算法理解

發(fā)布時間:2023/12/20 循环神经网络 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab 非支配排序,NSGA-II快速非支配排序算法理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

快速的非支配排序

在NSGA進(jìn)行非支配排序時,規(guī)模為N的種群中的每個個體都要針對M個目標(biāo)函數(shù)和種群中的N-1個個體進(jìn)行比較,復(fù)雜度為O(MN),因此種群中的N個個體都比較結(jié)束的復(fù)雜度為O(MN2),即每進(jìn)行一次Pareto分級的時間復(fù)雜度為O(MN2)。在最壞的情況下,每個Pareto級別都只含有一個個體,那么需要進(jìn)行N次分級所需要的時間復(fù)雜度則會上升為O(MN3)。鑒于此,論文中提出了一種快速非支配排序法,該方法的時間復(fù)雜度為O(MN2)。

該算法需要保存兩個量:

(1).支配個數(shù)np。該量是在可行解空間中可以支配個體p的所有個體的數(shù)量。

(2).被支配個體集合SP。該量是可行解空間中所有被個體p支配的個體組成的集合。

下面是fast_nondominated_sort的偽代碼

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集合中的個體進(jìn)行排序

nq -= 1

if nq == 0: #如果該個體的支配個數(shù)為0,則該個體是非支配個體

q_rank = i+2 #該個體Pareto級別為當(dāng)前最高級別加1。此時i初始值為0,所以要加2

Q.append( q )

F.append( Q )

i += 1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

deffast_nondominated_sort(P):

F=[]

forpinP:

Sp=[]

np=0

forqinP:

ifp>q:#如果p支配q,把q添加到Sp列表中

Sp.append(q)

elseifp

np+=1

ifnp==0:

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

F1.append(p)

F.append(F1)

i=0

whileF[i]:

Q=[]

forpinF[i]:

forqinSp:#對所有在Sp集合中的個體進(jìn)行排序

nq-=1

ifnq==0:#如果該個體的支配個數(shù)為0,則該個體是非支配個體

q_rank=i+2#該個體Pareto級別為當(dāng)前最高級別加1。此時i初始值為0,所以要加2

Q.append(q)

F.append(Q)

i+=1

下面是C++實現(xiàn):

C++

void population::nodominata_sort()

//求pareto解(快速非支配排序)

{

int i,j,k;

indivial H[2*popsize];

int h_len=0;

for(i=0;i<2*popsize;i++)

{

R[i].np=0;//支配個數(shù)np

R[i].is_domied=0;//被支配的個數(shù)

len[i]=0;//初始化

}

for(i=0;i<2*popsize;i++)

{

for(j=0;j<2*popsize;j++)

{

if(i!=j)//自己不能支配自身

{

if(is_dominated(R[i],R[j]))

{

R[i].domi[R[i].is_domied++]=j;

//如果i支配j,把i添加到j(luò)的is_domied列表中

}

else if(is_dominated(R[j],R[i]))

R[i].np+=1;

//如果i被j支配,則把np加1

}

}

if(R[i].np==0)//如果該個體的np為0,則該個體為Pareto第一級

{

len_f=1;

F[0][len[0]++]=R[i];//將R[i]歸并

}

}

i=0;

while(len[i]!=0)

{

h_len=0;

for(j=0;j

{

for(k=0;k

//對所有在is_domied集合中的個體進(jìn)行排序

{

R[F[i][j].domi[k]].np--;

if( R[F[i][j].domi[k]].np==0)

//如果該個體的支配個數(shù)為0,則該個體是非支配個體

{

H[h_len++]=R[F[i][j].domi[k]];

R[F[i][j].domi[k]].rank=i+1;

}

}

}

i++;

len[i]=h_len;

if(h_len!=0)

{

len_f++;

for(j=0;j

{

F[i][j]=H[j];

}

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

voidpopulation::nodominata_sort()

//求pareto解(快速非支配排序)

{

inti,j,k;

indivialH[2*popsize];

inth_len=0;

for(i=0;i<2*popsize;i++)

{

R[i].np=0;//支配個數(shù)np

R[i].is_domied=0;//被支配的個數(shù)

len[i]=0;//初始化

}

for(i=0;i<2*popsize;i++)

{

for(j=0;j<2*popsize;j++)

{

if(i!=j)//自己不能支配自身

{

if(is_dominated(R[i],R[j]))

{

R[i].domi[R[i].is_domied++]=j;

//如果i支配j,把i添加到j(luò)的is_domied列表中

}

elseif(is_dominated(R[j],R[i]))

R[i].np+=1;

//如果i被j支配,則把np加1

}

}

if(R[i].np==0)//如果該個體的np為0,則該個體為Pareto第一級

{

len_f=1;

F[0][len[0]++]=R[i];//將R[i]歸并

}

}

i=0;

while(len[i]!=0)

{

h_len=0;

for(j=0;j

{

for(k=0;k

//對所有在is_domied集合中的個體進(jìn)行排序

{

R[F[i][j].domi[k]].np--;

if(R[F[i][j].domi[k]].np==0)

//如果該個體的支配個數(shù)為0,則該個體是非支配個體

{

H[h_len++]=R[F[i][j].domi[k]];

R[F[i][j].domi[k]].rank=i+1;

}

}

}

i++;

len[i]=h_len;

if(h_len!=0)

{

len_f++;

for(j=0;j

{

F[i][j]=H[j];

}

}

}

}

matlab代碼:

MATLAB

%-------非支配排序

fnum=0; %當(dāng)前分配的前沿面編號

cz=false(1,size(functionvalue,1)); %記錄個體是否已被分配編號

frontvalue=zeros(size(cz)); %每個個體的前沿面編號

[functionvalue_sorted,newsite]=sortrows(functionvalue); %對種群按第一維目標(biāo)值大小進(jìn)行排序

while ~all(cz) %開始迭代判斷每個個體的前沿面,采用改進(jìn)的deductive sort

fnum=fnum+1;

d=cz;

for i=1:size(functionvalue,1)

if ~d(i)

for j=i+1:size(functionvalue,1)

if ~d(j)

k=1;

for m=2:size(functionvalue,2)

if functionvalue_sorted(i,m)>functionvalue_sorted(j,m)

k=0;

break

end

end

if k

d(j)=true;

end

end

end

frontvalue(newsite(i))=fnum;

cz(i)=true;

end

end

end

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

%-------非支配排序

fnum=0;%當(dāng)前分配的前沿面編號

cz=false(1,size(functionvalue,1));%記錄個體是否已被分配編號

frontvalue=zeros(size(cz));%每個個體的前沿面編號

[functionvalue_sorted,newsite]=sortrows(functionvalue);%對種群按第一維目標(biāo)值大小進(jìn)行排序

while~all(cz)%開始迭代判斷每個個體的前沿面,采用改進(jìn)的deductive sort

fnum=fnum+1;

d=cz;

fori=1:size(functionvalue,1)

if~d(i)

forj=i+1:size(functionvalue,1)

if~d(j)

k=1;

form=2:size(functionvalue,2)

iffunctionvalue_sorted(i,m)>functionvalue_sorted(j,m)

k=0;

break

end

end

ifk

d(j)=true;

end

end

end

frontvalue(newsite(i))=fnum;

cz(i)=true;

end

end

end

NSGA2具體算法實現(xiàn)還在編寫中。

總結(jié)

以上是生活随笔為你收集整理的matlab 非支配排序,NSGA-II快速非支配排序算法理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。