**NSGA-II改进之父代选择**
1-父代选择方式的选择
在父代选择方式中,原采用的选择方式锦标赛选择方式。从锦标赛的选择方式来看,随机从种群中选择指定数量的个体进行竞争得到父代个体,优点是任何个体都有可能参与到竞争,一个适应值大的个体有可能作为多个父代的个体,可以保证父代选择公平,保证种群进化有一定的搜索范围,避免陷入局部最优中。
但锦标赛的选择方式也有一定的缺点,从锦标赛的实现方式来看,父代的选择近似于随机选择,在整个种群的进化过程中,影响进化的速度,其进化过程的搜索能力不能得到保证。为了保证算法的收敛速度;在算法的前期要保证算法的搜索能力,扩大搜索空间,避免陷入局部最优;在后期要加大父代选择的压力,保证算法的收敛,使算法可以更好的毕竟真实值;选择基于线性排名的父代选择方式
2-基于线性排名的父代选择方式
假设 N 为种群的规模,在线性选择排名中,将种群的个体按照适应值从小到大,在 NSGA-II 中是先对等级进行降序排序,在对拥挤距离进行升序排序。**排名越低(适应值越大),选择概率越高。**然后按照某个有关的线性函数来分配每个个体的选择概率。
假设
x
1
为排名最高的个体,
x
n
为排名最低的个体。那么个体
x
i
的选择概率为
:
p
i
=
1
N
(
η
−
+
(
η
+
−
η
−
)
i
−
1
N
−
1
)
其中
i
=
1
,
2
,
3...
N
,
η
−
和
η
+
为指定的一个常数,且要求
η
−
+
η
+
,并且
0
≤
η
−
≤
1
。
根据选择概率,可以知道当
η
−
=
0
,
η
+
=
2
时,种群的选择压力最大,当
η
−
=
η
+
=
1
时,
选择当时为随机选择,这时选择压力最小。
而为了可以在计算过程中,逐渐加大父代种群的选择压力,可以根据当前代数与最大代数的关系
逐步改变
η
−
和
η
+
的值。
\begin{aligned} &假设x_1为排名最高的个体,x_n为排名最低的个体。那么个体x_i的选择概率为: %\end{aligned} \\ \\& p_i=\frac{1}{N}(\eta^-+(\eta^+-\eta^-)^\frac{i-1}{N-1}) \\ %\begin{aligned} \\& 其中i=1,2,3...N,\eta^- 和\eta^+为指定的一个常数,且要求\eta^-+\eta^+, 并且0\leq\eta^-\leq1。 \\& 根据选择概率,可以知道当\eta^-=0,\eta^+=2时,种群的选择压力最大,当\eta^-=\eta^+=1时, \\& 选择当时为随机选择,这时选择压力最小。 \\& 而为了可以在计算过程中,逐渐加大父代种群的选择压力,可以根据当前代数与最大代数的关系 \\& 逐步改变\eta^- 和\eta^+的值。 \end{aligned}
假设x1为排名最高的个体,xn为排名最低的个体。那么个体xi的选择概率为:pi=N1(η−+(η+−η−)N−1i−1)其中i=1,2,3...N,η−和η+为指定的一个常数,且要求η−+η+,并且0≤η−≤1。根据选择概率,可以知道当η−=0,η+=2时,种群的选择压力最大,当η−=η+=1时,选择当时为随机选择,这时选择压力最小。而为了可以在计算过程中,逐渐加大父代种群的选择压力,可以根据当前代数与最大代数的关系逐步改变η−和η+的值。
3-MATLAB代码实现
function parent_pop = select_parent(pop,ud,up,parent_size)
% 采用线性排名选择父代个体
[sizepop,td] = size(pop);
%对种群的等级和拥挤距离进行排序
pop = sortrows(pop,[-(td-1),td]);
parent_pop = [];
pi = zeros(1,sizepop);
for i = 1:sizepop
%计算每一个个体选择的概率
pi(1,i) = 1/sizepop*(ud+(up-ud)*((i-1)/(sizepop-1)));
end
pi = cumsum(pi);
r = sort(rand(1,parent_size));
fitin = 1; % 表示第几个个体
newin = 1; % 表示第几个随机数
while newin<=parent_size
if(r(newin)) <= pi(fitin)
parent_pop = [parent_pop;pop(fitin,:)];
newin = newin+1;
else
fitin = fitin+1;
end
end