📄 crossover.m
字号:
function crosx=crossover(selecx,cros_ratio,pop,n,res_flg,gk,hk,cmax,tpop,tmax,flag_x,dis_date,float_date)
%本程序为交叉算子,cros_ratio为交叉概率,采用算术交叉。
%输出矩阵corsx[J,n],J为交叉后得到的染色体数,由程序运行情况决定。
%++++++++++++++++++++++++++++++++++++++
r=unifrnd(0,1,1,pop); %产生[0,1]间均匀分布的伪随机数。
xxk=zeros(1,pop);
for k=1:pop
%本循环确定预选参与交叉的染色体标记为xx(k)=1。
if r(1,k)<=cros_ratio
xxk(1,k)=1;
else
xxk(1,k)=0;
end
end
%++++++++++++++++++++++++++++++++++++++++
[y1,y2]=find(xxk); %确定xxk中非零元素的下标值。
[a,b]=size(y2); %测试y2的维数。
J=floor(b/2); %floor向负无穷方向取整,使J为2的整数倍。
J=2*J; %J为参与交叉的路软色体各个数
xxkk=zeros(1,pop);
yy=zeros(J,n);
for i=1:J
%本循环确定参与交叉的染色体yy。
yy(i,:)=selecx(y2(i),:);
xxkk(1,y2(i))=1; %给最后选出参与交叉的染色体置标志1
end
%+++++++++++++++++++++++++++++++++++++++++
fcrosx=zeros(J,n);
for i=1:2:(J-1)
%本循环为交叉操作,交叉后得到的子染色体为fcrosx(J,n)。
f_x=zeros(4,n); %临时工作数组
f_x0=zeros(1,4); %临时工作数组
fcrosx(i,:)=0.6*yy(i,:)+0.4*yy(i+1,:);
fcrosx(i+1,:)=0.4*yy(i,:)+0.6*yy(i+1,:);
fcrosx(i,:)=discrete(fcrosx(i,:),n,flag_x,dis_date,float_date); %离散化处理
fcrosx(i+1,:)=discrete(fcrosx(i+1,:),n,flag_x,dis_date,float_date);%离散化处理
f_x=[yy(i,:);yy(i+1,:);fcrosx(i,:);fcrosx(i+1,:)];
f_x0(1,1)=fitfunction(yy(i,:),res_flg,gk,hk,cmax,tpop,tmax);
f_x0(1,2)=fitfunction(yy(i+1,:),res_flg,gk,hk,cmax,tpop,tmax);
f_x0(1,3)=fitfunction(fcrosx(i,:),res_flg,gk,hk,cmax,tpop,tmax);
f_x0(1,4)=fitfunction(fcrosx(i+1,:),res_flg,gk,hk,cmax,tpop,tmax);
[b,index]=sort(f_x0);
fcrosx(i,:)=f_x(index(3),:);
fcrosx(i+1,:)=f_x(index(4),:);
%pause
end
ppch=1;
for i=1:pop
%交叉后群体重组,输出交叉操作后的群体crosx(pop,n).
if xxkk(1,i)==1
crosx(i,:)=fcrosx(ppch,:);
ppch=ppch+1;
else
crosx(i,:)=selecx(i,:);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -