%
% 2008年4月12日修改
%**********************%主函数***************************************** function main()
global chrom lchrom oldpop newpop varible fitness popsize sumfitness %定义全局变量 global pcross pmutation temp bestfit maxfit gen bestgen global maxgen po pp mp np
lchrom=12; %染色体长度 popsize=30; %种群大小 pcross=0.6; %交叉概率 pmutation=0.1; %变异概率 maxgen=50; %最大代数 po=0.1; %淘汰概率 pp=0.1; %保护概率
mp=floor(pp*popsize); %保护的个数 np=floor(po*popsize); %淘汰的个数 %
initpop; % 初始种群 %
for gen=1:maxgen generation; end % best;
bestfit % 最佳个体适应度值输出 bestgen % 最佳个体所在代数输出 gen=1:maxgen; figure
plot(gen,maxfit(1,gen)); % 进化曲线 %
%********************** 产生初始种群 ************************************ %
function initpop()
global lchrom oldpop popsize chrom for i=1:popsize
chrom=rand(1,lchrom); % lchrom=12 染色体长度 for j=1:lchrom
if chrom(1,j)<0.5 chrom(1,j)=0; else
chrom(1,j)=1; end end
oldpop(i,1:lchrom)=chrom; end %
%*************************%产生新一代个体********************************** %
function generation()
objfun; %计算适应度值
pp_po; %执行保护与淘汰操作 select; %选择操作 crossover; mutation; %
%************************%计算适应度值************************************ %
function objfun()
global lchrom oldpop fitness popsize chrom maxfit gen varible a=0; %b=100; b=30;
for i=1:popsize
chrom=oldpop(i,:); c=decimal(chrom);
varible(1,i)=a+c*(b-a)/(2.^lchrom-1); %对应变量值 fitness(1,i)=varible(1,i)*varible(1,i);
% fitness(1,i)=20*cos(0.25*varible(1,i))-12*sin(0.33*varible(1,i))+40; %个体适应度函数值 end %
lsort; % 个体排序 %
maxfit(1,gen)=max(fitness); %求本代中的最大适应度值maxfit %
%************************二进制转十进制********************************** %
function c=decimal(chrom) global lchrom popsize c=0;
for j=1:lchrom
c=c+chrom(1,j)*2.^(lchrom-j); end %
%************************* 个体排序 ***************************** % 从小到大顺序排列 %
function lsort()
global popsize fitness oldpop for i=1:popsize j=i+1;
while j<=popsize
if fitness(1,i)>fitness(1,j)
tf=fitness(1,i); % 适应度值 tc=oldpop(i,:); % 基因代码
fitness(1,i)=fitness(1,j); % 适应度值互换 oldpop(i,:)=oldpop(j,:); % 基因代码互换 fitnescs(1,j)=tf; oldpop(j,:)=tc; end j=j+1; end end %
%*************************保护/淘汰操作***************************** %
function pp_po()
global popsize oldpop np
i=np+1; % np=floor(po*popsize); %淘汰的个数np j=1;
while i<=popsize %将(np+1)~popsize的个体放在toldpop中,共(popsize-np)个 toldpop(j,:)=oldpop(i,:); j=j+1; i=i+1; end
for i=1:(popsize-np) %从小到大顺序排列,将前面np个淘汰 oldpop(i,:)=toldpop(i,:); % 适应度是否也要互换? end %
%*************************转轮法选择操作********************************** %
function select()
global fitness popsize sumfitness oldpop temp mp np
sumfitness=0; %个体适应度之和
for i=1:(popsize-np-mp) % 仅计算(popsize-np-mp)个个体的选择概率 sumfitness=sumfitness+fitness(1,i); end %
for i=1:(popsize-mp-np) % 仅计算(popsize-np-mp)个个体的选择概率 p(1,i)=fitness(1,i)/sumfitness; % 个体染色体的选择概率 end %
q=cumsum(p); % 个体染色体的累积概率(内部函数),共(popsize-np-mp)个 %
b=sort(rand(1,(popsize-mp))); % 产生(popsize-mp)个随机数,并按升序排列。mp为保护个体数 j=1; k=1;
while j<=(popsize-mp) % 从(popsize-mp-np)中选出(popsize-mp)个个体,并放入temp(j,:)中; if b(1,j)temp(j,:)=oldpop(k,:); j=j+1; elsek=k+1; end end %
j=popsize-np-mp+1; % 从统一挪过来的(popsize-np-mp)以后个体——优秀个体中选择 for i=(popsize-mp+1):popsize % 将mp个保留个体放入交配池temp(i,:),以保证群体数popsize temp(i,:)=oldpop(j,:); j=j+1; end %
%**************************%交叉操作*************************************** %
function crossover()
global temp popsize pcross lchrom mp
n=floor(pcross*(popsize-mp)); %交叉发生的次数(向下取整) if rem(n,2)~=0 % 求余
n=n+1; % 保证为偶数个个体,便于交叉操作 end % j=1; m=0; %
% 对(popsize-mp)个个体将进行随机配对,满足条件者将进行交叉操作(按顺序选择要交叉的对象) %
for i=1:(popsize-mp)
p=rand; % 产生随机数 if pj=j+1; % 记录父本个数 m=m+1; % 记录杂交次数if (j==3)&(m<=n) % 满足两个父本(j==3),未超过交叉次数(m<=n) pos=round(rand*(lchrom-1))+1; % 确定随机位数(四舍五入取整) for i=1:pos
child1(1,i)=parent(1,i); child2(1,i)=parent(2,i); end
for i=(pos+1):lchrom
child1(1,i)=parent(2,i); child2(1,i)=parent(1,i); end
i=k(1,1); j=k(1,2);
temp(i,:)=child1(1,:); temp(j,:)=child2(1,:); j=1; end end end %
%****************************%变异操作************************************* %
function mutation()
global popsize lchrom pmutation temp newpop oldpop mp m=lchrom*(popsize-mp); % 总的基因数 n=round(pmutation*m); % 变异发生的次数 for i=1:n % 执行变异操作循环
k=round(rand*(m-1))+1; %确定变异位置(四舍五入取整) j=ceil(k/lchrom); % 确定个体编号(取整)
l=rem(k,lchrom); %确定个体中变位基因的位置(求余) if l==0
temp(j,lchrom)=~temp(j,lchrom); % 取非操作 else
temp(j,l)=~temp(j,l); % 取非操作 end end
for i=1:popsize
newpop(i,:)=temp(i,:); %产生新的个体 oldpop(i,:)=newpop(i,:); end %
%*********************%最佳个体******************************************** %
function best()
global maxfit bestfit gen maxgen bestgen bestfit=maxfit(1,1); gen=2;
while gen<=maxgen
if bestfitgen=gen+1; end%**************************************************************************