📄 chain.m
字号:
%LAGA程序
%Name:chain.m
function [pop_best1_chain,error2,i2,bestfit_temp1_chain]=chain(M_red,M_white,pop)
tic; %用于记录运行时间
%参数设置
[x_length,y_length]=size(M_red);
popsize=30;
%设置初始参数,群体大小
chromlength=y_length; %字符串长度(个体长度),染色体长度
pc=0.6; %设置交叉概率
pm=0.05; %设置变异概率
%参数设置结束
dai=200;
M1=M_red;
M2=M_white;
[xx,yy]=size(M1);
pop_best1_chain=zeros(1,yy);%给最佳染色体及其适应度值赋初值%
value_best1=0; %到当前代数为止的最优适应值,初始化为0
error2=0; %两代间最优适应值的差值
coun=0; %最优适应值连续相同(没有增长)的代数
bestfit_temp1_chain=0; %保存每代最优个体适应值
near_temp1=zeros(1,3);
difference1=cal_difference1(M1,M2); %计算两类间的方差和类内方差
fitvalue1=calfitvalue(pop,difference1,M1,M2); %计算群体中每个个体的适应度
[bestindividual1,bestfit1]=best(pop,fitvalue1);%求出上代pop群体中适应值最大的个体及其适应值
bestfit_old=bestfit1;
for i=1:dai %200为迭代次数
bestfit_temp1_chain(i)=bestfit1;
newpop=selection(pop,fitvalue1); %复制
newpop=crossover(newpop,pc); %交叉
newpop=mutation(newpop,pm);%变异
%add_self begin 求出下代newpop群体中适应值最小的个体及其适应值
fitvalue1=calfitvalue(newpop,difference1,M1,M2);
[badestindividual1,badestfit1]=badest(newpop,fitvalue1);
counter=0;
for j=1:popsize
if fitvalue1(j)==badestfit1
newpop(j,:)=bestindividual1;%用父代的最优个体代替子代的最差个体从而形成新的下代,
counter=counter+1;
end
end
%add_self end
if bestfit1>value_best1 %保存数代遗传之后最好的种群
value_best1=bestfit1;
pop_best1_chain=bestindividual1;
i
end
% % 如果两代之间的差异满足要球,终止遗传算法
fitvalue1=calfitvalue(newpop,difference1,M1,M2);%此时的newpop是替换后的
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%对个体的适应值进行3邻域比较开始
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for ii=1:popsize
if ii==1%%当扫描第一个个体时,它的前一个个体时最后一个个体,它的下一个个体是第二个个体
near_temp1=[fitvalue1(popsize) fitvalue1(1) fitvalue1(2)];%%把相邻的三个个体存放在邻域寄存器中
[max1 max_row1]=max(near_temp1);%求出相邻的三个个体中适应值最大的存放在max,最大适应值对应的个体存放在max_row里
switch max_row1%如果最大的个体是邻域里的个体,则把当前个体与此邻域的个体比较,相同位则不变,不同位则随机生成一个2进制数
%如果最大的个体是当前扫描的个体,则当前个体不变。
case 1
for jj=1: chromlength
if newpop(popsize,jj)==newpop(1,jj)
newpop(1,jj)=newpop(1,jj);
else
newpop(1,jj)=round(rand);
end
end
case 2
newpop(ii,:)=newpop(ii,:);
case 3
for jj=1: chromlength
if newpop(1,jj)==newpop(2,jj)
newpop(1,jj)=newpop(1,jj);
else
newpop(1,jj)=round(rand);
end
end
end
elseif ii==popsize%%当扫描最后一个个体时,它的前一个个体是倒数第二个个体,它的下一个个体是第一个个体
near_temp1=[fitvalue1(popsize-1) fitvalue1(popsize) fitvalue1(1)];
[max1 max_row1]=max(near_temp1);
switch max_row1
case 1
for jj=1: chromlength
if newpop(popsize,jj)==newpop(popsize-1,jj)
newpop(popsize,jj)=newpop(popsize,jj);
else
newpop(popsize,jj)=round(rand);
end
end
case 2
newpop(ii,:)=newpop(ii,:);
case 3
for jj=1: chromlength
if newpop(1,jj)==newpop(popsize,jj)
newpop(popsize,jj)=newpop(popsize,jj);
else
newpop(popsize,jj)=round(rand);
end
end
end
else
near_temp1=fitvalue1(ii-1:ii+1);
[max1 max_row1]=max(near_temp1);
switch max_row1
case 1
for jj=1: chromlength
if newpop(ii,jj)==newpop(ii-1,jj)
newpop(ii,jj)=newpop(ii,jj);
else
newpop(ii,jj)=round(rand);
end
end
case 2
newpop(ii,:)=newpop(ii,:);
case 3
for jj=1: chromlength
if newpop(ii,jj)==newpop(ii+1,jj)
newpop(ii,jj)=newpop(ii,jj);
else
newpop(ii,jj)=round(rand);
end
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%对个体的适应值进行3邻域比较结束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fitvalue1=calfitvalue(newpop,difference1,M1,M2);%此时的newpop是替换后的
[bestindividual1,bestfit1]=best(newpop,fitvalue1);%求出替换后的pop群体中适应值最大的个体及其适应值
bestfit_next=bestfit1;
error2(i)=bestfit_next-bestfit_old;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 判断连续coun次bestfit相同,就退出循环
if error2(i)==0
coun=coun+1;
else
coun=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if coun==10
break;
else
pop=newpop;
bestfit_old=bestfit_next; %保存当代平均适应度,用于和下一代比较
end
end
% pop_best
value_best1 %输出最优适应值
pop_best1_chain %输出最优个体
i2=i %算法退出时的代数
toc;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -