📄 ga.m.m
字号:
crossfitness(nocross(s))=selectfitness(matchrand(nocross(s)));
crossfitness(popsize+1-nocross(s))=selectfitness(matchrand(popsize+1-nocross(s)));
end
else %此时不交叉、双性交叉、单性交叉三种情况均有
for s=1:length(nocross)
crossset(nocross(s),:)=selectset(matchrand(nocross(s)),:);
crossset(popsize+1-nocross(s),:)=selectset(matchrand(popsize+1-nocross(s)),:);
crossfitness(nocross(s))=selectfitness(matchrand(nocross(s)));
crossfitness(popsize+1-nocross(s))=selectfitness(matchrand(popsize+1-nocross(s)));
end
for s=1:ceil(0.5*length(yescross)) %此部分采用双性交叉
crossset(yescross(s),:)=selectset(matchrand(yescross(s)),:);
crossset(popsize+1-yescross(s),:)=selectset(matchrand(popsize+1-yescross(s)),:);
elementrand=randperm(L); %生成随机数,定义前后交叉点
x1=min(elementrand(1:2));
x2=max(elementrand(1:2));
A=crossset(yescross(s),x1:x2); %将染色体分别赋给A,B
B=crossset(popsize+1-yescross(s),x1:x2);
binarycross;
crossset(yescross(s),x1:x2)=A;
crossset(popsize+1-yescross(s),x1:x2)=B;
crossfitness(yescross(s))=decomyque(crossset(yescross(s),:),M,pt);
crossfitness(popsize+1-yescross(s))=decomyque(crossset(popsize+1-yescross(s),:),M,pt);
end
for s=ceil(0.5*length(yescross))+1:length(yescross) %此部分采用单性交叉
crossset(yescross(s),:)=selectset(matchrand(yescross(s)),:);
crossset(popsize+1-yescross(s),:)=selectset(matchrand(popsize+1-yescross(s)),:);
r_1=randperm(L);
r_2=randperm(L);
r_1(5:L)=[];
r_2(5:L)=[];
for s_1=1:3
for s_2=(1+s_1):4
if r_1(s_1)>r_1(s_2)
temp=r_1(s_1);
r_1(s_1)=r_1(s_2);
r_1(s_2)=temp;
end
end
end
for s_1=1:3
for s_2=(1+s_1):4
if r_2(s_1)>r_2(s_2)
temp=r_2(s_1);
r_2(s_1)=r_2(s_2);
r_2(s_2)=temp;
end
end
end
tempset_1=crossset(yescross(s),r_1(1):r_1(2));
if r_1(3)-r_1(2)==1
crossset(yescross(s),r_1(1):(r_1(1)+r_1(4)-r_1(3)))=crossset(yescross(s),r_1(3):r_1(4));
crossset(yescross(s),r_1(1)+r_1(4)-r_1(3)+1:r_1(4))=tempset_1;
else
tempset_2=crossset(yescross(s),r_1(2)+1:r_1(3)-1);
crossset(yescross(s),r_1(1):(r_1(1)+r_1(4)-r_1(3)))=crossset(yescross(s),r_1(3):r_1(4));
crossset(yescross(s),(r_1(1)+r_1(4)-r_1(3)+1):(r_1(1)+r_1(4)-r_1(2)-1))=tempset_2;
crossset(yescross(s),(r_1(1)+r_1(4)-r_1(2)):r_1(4))=tempset_1;
end
tempset_1=crossset(popsize+1-yescross(s),r_2(1):r_2(2));
if r_2(3)-r_2(2)==1
crossset(popsize+1-yescross(s),r_2(1):(r_2(1)+r_2(4)-r_2(3)))=crossset(popsize+1-yescross(s),r_2(3):r_2(4));
crossset(popsize+1-yescross(s),(r_2(1)+r_2(4)-r_2(3)+1):r_2(4))=tempset_1;
else
tempset_2=crossset(popsize+1-yescross(s),r_2(2)+1:r_2(3)-1);
crossset(popsize+1-yescross(s),r_2(1):(r_2(1)+r_2(4)-r_2(3)))=crossset(popsize+1-yescross(s),r_2(3):r_2(4));
crossset(popsize+1-yescross(s),(r_2(1)+r_2(4)-r_2(3)+1):(r_2(1)+r_2(4)-r_2(2)-1))=tempset_2;
crossset(popsize+1-yescross(s),(r_2(1)+r_2(4)-r_2(2)):r_2(4))=tempset_1;
end
crossfitness(yescross(s))=decomyque(crossset(yescross(s),:),M,pt);
crossfitness(popsize+1-yescross(s))=decomyque(crossset(popsize+1-yescross(s),:),M,pt);
end
end
end
else %最后1/3次迭代中将要全部采用单性交叉
crossrand=rand(1,popsize); %生成popsize个随机数,决定是否交叉
for s=1:popsize
if crossrand(s)>=poscross
crossset(s,:)=selectset(s,:);
crossfitness(s)=selectfitness(s);
else
crossset(s,:)=selectset(s,:);
r_1=randperm(L);
r_1(5:L)=[];
for s_1=1:3
for s_2=(1+s_1):4
if r_1(s_1)>r_1(s_2)
temp=r_1(s_1);
r_1(s_1)=r_1(s_2);
r_1(s_2)=temp;
end
end
end
tempset_1=crossset(s,r_1(1):r_1(2));
if r_1(3)-r_1(2)==1
crossset(s,r_1(1):(r_1(1)+r_1(4)-r_1(3)))=crossset(s,r_1(3):r_1(4));
crossset(s,r_1(1)+r_1(4)-r_1(3)+1:r_1(4))=tempset_1;
else
tempset_2=crossset(s,r_1(2)+1:r_1(3)-1);
crossset(s,r_1(1):(r_1(1)+r_1(4)-r_1(3)))=crossset(s,r_1(3):r_1(4));
crossset(s,(r_1(1)+r_1(4)-r_1(3)+1):(r_1(1)+r_1(4)-r_1(2)-1))=tempset_2;
crossset(s,(r_1(1)+r_1(4)-r_1(2)):r_1(4))=tempset_1;
end
crossfitness(s)=decomyque(crossset(s,:),M,pt);
end
end
end
if bestfitness<max(crossfitness)
bestfitness=max(crossfitness);
s=find(crossfitness==max(crossfitness));
best_solution=crossset(min(s),:);
else
randnumber=ceil(rand*popsize);
crossset(randnumber,:)=best_solution;
crossfitness(randnumber)=bestfitness;
end
% 以下为变异操作
average_fitness=sum(crossfitness)/popsize;
diversity=sum((crossfitness-average_fitness).^2)/(popsize-1);
mutationset=zeros(popsize,L); % 定义变异后的染色体种群为mutationset
mutationfitness=zeros(1,popsize);
if diversity>2500
posmutation=0.01;
else
posmutation=0.2-0.19*diversity/400;
end
for s=1:popsize
randnumber=rand; % 生成随机数
if randnumber>=posmutation % 若随机数比变异概率大,则不产生变异,直接将染色体放入mutationset中
mutationset(s,:)=crossset(s,:);
mutationfitness(s)=crossfitness(s);
else % 若随机数比变异概率小,则进行变异,本方案采用三种变异方式:交换、逆序、插入
tempsolution=repmat(crossset(s,:),3,1);
tempfitness=zeros(1,3);
r=randperm(L); %变异方式之一:交换
tempset=tempsolution(1,r(1));
tempsolution(1,r(1))=tempsolution(1,r(2));
tempsolution(1,r(2))=tempset;
r=randperm(L); %变异方式之一:逆序
x1=min(r(1),r(2));
x2=max(r(1),r(2));
tempsetA=tempsolution(2,x1:x2);
tempsetB=zeros(1,length(tempsetA));
for s_1=1:length(tempsetA)
tempsetB(length(tempsetA)+1-s_1)=tempsetA(s_1);
end
tempsolution(2,x1:x2)=tempsetB;
r=randperm(L); %变异方式之一:插入
x1=min(r(1),r(2));
x2=max(r(1),r(2));
tempset=tempsolution(3,x1+1:x2-1);
tempsolution(3,x2-1)=tempsolution(3,x1);
tempsolution(3,x1:x2-2)=tempset;
for s_1=1:3
tempfitness(s_1)=decomyque(tempsolution(s_1,:),M,pt);
end
if posmutation==0.2
s_1=find(tempfitness==min(tempfitness));
mutationset(s,:)=tempsolution(min(s_1),:);
mutationfitness(s)=min(tempfitness);
else
s_1=find(tempfitness==max(tempfitness));
mutationset(s,:)=tempsolution(min(s_1),:);
mutationfitness(s)=max(tempfitness);
end
end
end
if bestfitness<max(mutationfitness)
bestfitness=max(mutationfitness);
s=find(mutationfitness==max(mutationfitness));
best_solution=mutationset(min(s),:);
else
randnumber=ceil(rand*popsize);
mutationset(randnumber,:)=best_solution;
mutationfitness(randnumber)=bestfitness;
end
% 以下为保优操作
lastset=zeros(popsize,L);
lastfitness=zeros(1,popsize);
for s=1:popsize/2 % 从permset中选出popsize/2个最好的染色体作为下一代种群
s_1=find(mutationfitness==max(mutationfitness)); % s_1为mutationperm数组中最大值的下标
lastset(s,:)=mutationset(min(s_1),:); % 为防止同时存在几个相同的最大值,取min(s_1)对应的染色体放入laseset中
lastfitness(s)=max(mutationfitness);
mutationfitness(min(s_1))=[];
end
for s=1:popsize/2 % 从上一代种群chrompop中选出popsize/2个最好的染色体作为下一代种群
s_1=find(fitness==max(fitness));
lastset(popsize/2+s,:)=chrompop(min(s_1),:);
lastfitness(popsize/2+s)=max(fitness);
fitness(min(s_1))=[];
end
% 以下将得到的染色体种群lastset赋给chrompop,重新进行新的迭代
chrompop=lastset;
fitness=lastfitness;
end
bestvalue=-log(bestfitness/const_a)/const_b;
K=1:iteration;
plot(K,MAKESPAN)
toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -