📄 mutation.m
字号:
function mutax=mutation(crosx,muta_ratio,tpop,n,pop,us,ux,tmax,res_flg,gk,hk,cmax,emigrant_or_not,flag_x,dis_date,float_date)
% 变异算子,对交叉交配池中的染色体群crosx(pop,n)采用动态变异
% muta_ratio为变异概率。
%++++++++++++++++++++++++++++++++++++++++++
r=unifrnd(0,1,pop,n);
yy=r<=muta_ratio;
%确定参与变异的基因号,标记为yy(i,k)=1。
%+++++++++++++++++++++++++++++++++++++++
for i=1:pop
%该循环为变异操作,us(k),ux(k)分别为设计变量x(k)的上限和下限。
%tpop为当前的遗传代数。tmax为最大遗传代数是全局变量。
muta_flag=0;
for k=1:n
if yy(i,k)>0
muta_flag=1;
while 1
mutax(i,k)=crosx(i,k)+(us(k)-ux(k))*unifrnd(-1,1)*(1-tpop/tmax)^2;
if mutax(i,k)>=ux(k)&mutax(i,k)<=us(k);
break
end
end
else
mutax(i,k)=crosx(i,k);
end
end
if muta_flag==1&emigrant_or_not==1
fit_muta=fitfunction(mutax(i,:),res_flg,gk,hk,cmax,tpop,tmax);
fit_cros=fitfunction(crosx(i,:),res_flg,gk,hk,cmax,tpop,tmax);
if fit_muta<fit_cros
mutax(i,:)=crosx(i,:); % 若变异后得到的染色体较交叉前差,则保留原染色体
end
end
mutax(i,:)=discrete(mutax(i,:),n,flag_x,dis_date,float_date); %离散化处理
end
%++++++++++++++++++++++++++++++++++++++++
%以上程序得到变异后的染色体群体为mutax(pop,n)。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -