function GA
lchrmod = 10;
popsize=60;
pc=0.8;
pm=0.05;
generation=0;
maxgen=1000;
tic;
fmin=zeros(1,maxgen+1);
pop=initiate(popsize,lchrmod);
f=fitness(lchrmod,popsize,pop);
fmin(1)=min(f);
f1m=zeros(2,maxgen);
for ii=1:maxgen
Newp=cross(lchrmod,popsize,pc,pop);
Pold=mutate(lchrmod,popsize,pm,Newp);
pnew=inverse(lchrmod,popsize,Pold);
V1=pnew;
f1=fitness(lchrmod,popsize,V1);
f1m(1,ii)=ii;
f1m(2,ii)=mean(f1);
V2=pop(find(f<=f1m(2,ii)),:);
W=[V1;V2];
a=size(W,1);
for j=1:a
if W(j,1)==0
continue;
end
for k=j+1:a
if W(k,:)==W(j,:)
W(k,1)=0;
end
end
end
W(find(W(:,1)==0),:)=[];
d=size(W,1);
fw=fitness(lchrmod,d,W);
[fmin(ii+1),k]=min(fw);
t=W(k,:);
fw(k)=[];
A=[];
p=fw./sum(fw);
q=cumsum(p);
r=rand(1,popsize-1);
for j=1:popsize-1
for k=1:d-1
if r(j)<=q(k)
A(j)=k;
break;
end
end
end
pop=[t;W(A,:)];
f=fitness(lchrmod,popsize,pop);
minfit=min(f);
end
time=toc;
minf=fmin(ii+1);
disp('迭代结果'),path=fmin
disp('结果为'),minlength=minf,
disp('进化代数'),generation=ii,
disp('共用时'),time
plot(fmin);
function f=fitness(lchrom,popsize,pop)
q = 0;
for i = 1:popsize
for j = 1:lchrom
x(j)=pop(i,j);
q = q+x(j)^2;
end
y(i) = q;
q=0;
end
f=y;
function pop=initiate(popsize,lchrmod)
pop=10.24*(rand(popsize,lchrmod)-0.5*ones(popsize,lchrmod));
function Newp=cross(lchrom,popsize,pc,oldpop)
r=rand(1,popsize);
oldp=[];
noldp=[];
for i=1:popsize
if(r(i)<pc)
oldp=[oldp;oldpop(i,:)];
else
noldp=[noldp;oldpop(i,:)];
end
end
n=size(oldp,1);
newp=[];
Newp=zeros(popsize,lchrom);
for i=1:2:n-1
oldp1=oldp(i,:);
oldp2=oldp(i+1,:);
[newp1,newp2]=crossover(oldp1,oldp2);
newp=[newp;newp1;newp2];
end
if(size(newp,1)~=n)
noldp=[noldp;oldp(n,:)];
end
Newp=[noldp;newp];
function [newp1,newp2]=crossover(oldp1,oldp2)
crossj1=floor((length(oldp1)-1)*rand)+1;
crossj2=floor((length(oldp2)-1)*rand)+1;
minjcross=min(crossj1,crossj2);
maxjcross=max(crossj1,crossj2);
newp1=[oldp1(1:minjcross-1) oldp2(minjcross:maxjcross) oldp1(maxjcross+1:length(oldp1))];
newp2=[oldp2(1:minjcross-1) oldp1(minjcross:maxjcross) oldp2(maxjcross+1:length(oldp2))];
function Pold=mutate(lchrom,popsize,pm,Newp)
r=rand(1,popsize);
pold=[];
npold=[];
for i=1:popsize
if(r(i)<pm)
pold=[pold;mutation(Newp(i,:))];
else
npold=[npold;Newp(i,:)];
end
end
Pold=zeros(popsize,lchrom);
Pold=[npold;pold];
function old=mutation(newpop);
mutationj1=floor((length(newpop)-1)*rand)+1;
mutationj2=floor((length(newpop)-1)*rand)+1;
minmutation=min(mutationj1,mutationj2);
maxmutation=max(mutationj1,mutationj2);
newpop([minmutation maxmutation])=newpop([maxmutation minmutation]);
old=newpop;
function pnew=inverse(lchrom,popsize,Pold)
pnew=[];
for i=1:popsize
pold1=Pold(i,:);
pnew1=inversion(lchrom,pold1);
oldfit=fitness(lchrom,1,pold1);
newfit=fitness(lchrom,1,pnew1);
if(oldfit>newfit)
pnew=[pnew;pnew1];
else
pnew=[pnew;pold1];
end
end
function pnew1=inversion(lchrom,pold1)
inversej1=floor((length(pold1)-1)*rand)+1;
inversej2=floor((length(pold1)-1)*rand)+1;
mininverse=min(inversej1,inversej2);
maxinverse=max(inversej1,inversej2);
order=1:lchrom;
order(mininverse:maxinverse)=order(maxinverse:-1:mininverse);
pnew1=pold1(order);
评论2
最新资源