matlab 非支配排序,NSGA-II快速非支配排序算法理解
快速的非支配排序
在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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 87_类成员的继承和重写
- 下一篇: matlab人脸追踪,求大神帮助我这个菜