📄 selection.m
字号:
function selecx=selection(xpop,pop,res_flg,gk,hk,n,cmax,tpop,tmax)
% 本程序为选择算子,从xpop(pop,n)中选择pop个染色体,xpop(pop,n)为父代,
% 该函数输出染色体矩阵为selecx(pop,n)将参与以后的交叉和变异,pop为群体
% 规模,n为设计变量维数。
%+++++++++++++++++++++++++++++++++
fitFx=zeros(1,pop);
for j=1:pop
fitFx(1,j)=fitfunction(xpop(j,:),res_flg,gk,hk,cmax,tpop,tmax);
% 计算父代的适应值,fitfunction为求染色体适应值的m函数。
end
%+++++++++++++++++++++++++++++++++++
%以下程序求适应值总和sumfit.
sumfit=0.0;
for i=1:pop
sumfit=fitFx(1,i)+sumfit;
end
if sumfit==0
fprintf('\t\t算法非正常早熟,按任意键查看目前群体xpop\n')
pause
xpop
fprintf('\t\t用"Ctrl+C"组合键中止程序,建议增加群体规模pop,重新运行\n\n')
pause
end
%+++++++++++++++++++++++++++++++++++
%以下程序计算各染色体的选择概率。
p=zeros(1,pop);
for k=1:pop
p(1,k)=fitFx(1,k)/sumfit;
end
%以下程序计算各染色体的累计选择概率q(k).
q=zeros(1,pop);
q(1,1)=p(1,1);
for k=2:pop
q(1,k)=p(1,k)+q(1,k-1);
end
%++++++++++++++++++++++++++++++++++
%产生pop个[0,1]间服从均匀分布的伪随机数。
ru=unifrnd(0,1,1,pop);
%然后用轮睹法选择pop个染色体。
for i=1:pop
if ru(1,i)<=q(1,1)
selecx(i,:)=xpop(1,:);
else
for k=pop:-1:2
if ru(1,i)<=q(1,k)&ru(1,i)>q(1,k-1)
selecx(i,:)=xpop(k,:);
end
end
end
end
%selecx
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -