www.gusucode.com > 《图像配准技术及其Matlab编程实现》--源码程序 > 《图像配准技术及其Matlab编程实现》/match/GA.m
function [x,y,max_value]=GA global M T Gen NextGen pr=initialization(); %初始化遗传算法参数 [Gen NextGen]=initGeneration(pr); %产生父代及子代 for i=1:T [Fitness x1 x2]=CalculateFitness(pr); [OrderFitness,Index]=sort(Fitness); %将适应度从小到大进行排序 MaxFitness=OrderFitness(M); %找出适应度的最大值 AvgFitness=mean(Fitness); %求出适应度的平均值 Diff=MaxFitness - AvgFitness; Best_x1=x1(Index(M)); Best_x2=x2(Index(M)); BetterFit=SaveElitist(Index,pr); %保护精英个体 Select(Fitness,pr); %选择操作 Cross(OrderFitness,AvgFitness,Diff,pr); %交叉操作 Mutation(OrderFitness,MaxFitness,AvgFitness,Diff,pr); %变异操作 RestoreElitist(BetterFit,pr); %恢复精英个体 Gen=NextGen; %产生新一代 end max_value=MaxFitness; %输出结果 x=Best_x1; y=Best_x2; function pr=initialization() global M T M=80; %种群大小 T=200; %进化代数 pr.ChromLong=22; %染色体长度(二进制编码) pr.Pcross1=0.9; %交叉概率常数 pr.Pcross2=0.6; pr.Pmutation1=0.1; %变异概率常数 pr.Pmutation2=0.001; pr.ElitistNumber=5; %精英个体数量 pr.VaribleNumber=2; %变量个数 pr.Lower1=-10; %设置变量定义域 pr.Upper1=10; pr.Lower2=-10; pr.Upper2=10; %初始化父代及子代 function [Gen NextGen]=initGeneration(pr) global M Gen NextGen CL=pr.ChromLong; VN=pr.VaribleNumber; Gen=round(rand(M,CL*VN)); %随机产生父代 NextGen=zeros(M,CL*VN); %初始化子代 %计算适应度 function [Fitness x1 x2]=CalculateFitness(pr) global M Gen CL=pr.ChromLong; Upper1=pr.Upper1; Upper2=pr.Upper2; Lower1=pr.Lower1; Lower2=pr.Lower2; for s=1:M Individual=Gen(s,:); decimal_x1=0; decimal_x2=0; Chrom_1=Individual(1:CL); %对x1进行编码 for i=1:CL decimal_x1=decimal_x1+Chrom_1(i)*2^(i-1); end x1(s)=(Upper1-Lower1)*decimal_x1/(2^CL-1)+Lower1; Chrom_2=Individual(CL+1:1:2*CL); %对x2进行解码 for i=1:CL decimal_x2=decimal_x2+Chrom_2(i)*2^(i-1); end x2(s)=(Upper2-Lower2)*decimal_x2/(2^CL-1)+Lower2; Fitness(s)=objFunction(x1(s),x2(s)); %计算适应度 end %选择操作,采用轮盘赌选择法 function Select(Fitness,pr) global M Gen NextGen BFN=pr.ElitistNumber; SumFitness=sum(Fitness); %计算适应度和 for i=1:(M-BFN) Rd=rand; s=1; temp=0; while(temp<Rd) & (s<=M) temp=temp+Fitness(s)/SumFitness; %计算积累概率 s=s+1; end if s==1 s=1; else s=s-1; end NextGen(i,:)=Gen(s,:); end %交叉操作 function Cross(OrderFitness,AvgFitness,Diff,pr) global M NextGen CL=pr.ChromLong; VN=pr.VaribleNumber; Pc1=pr.Pcross1; Pc2=pr.Pcross2; EN=pr.ElitistNumber; for i=1:2:(M-EN) Rn=rand; if OrderFitness(i+1)>=AvgFitness %计算自适应交叉概率 pcross=Pc1-(Pc1-Pc2)*(OrderFitness(i+1)-AvgFitness)/Diff; else pcross=Pc1; end if pcross>Rn %满足交叉条件时,进行交叉运算 CrossPoint=ceil(VN*CL*Rn); if or(CrossPoint==0,CrossPoint>=VN*CL) continue; end for j=CrossPoint:VN*CL %随机交换部分染色体基因 temp=NextGen(i,j); NextGen(i,j)=NextGen(i+1,j); NextGen(i+1,j)=temp; end end end %变异操作 function Mutation(OrderFitness,MaxFitness,AvgFitness,Diff,pr) global M NextGen EN=pr.ElitistNumber; CL=pr.ChromLong; VN=pr.VaribleNumber; Pm1=pr.Pmutation1; Pm2=pr.Pmutation2; for i=1:(M-EN) for j=1:VN*CL if OrderFitness(i)>=AvgFitness %计算自适应变异概率 pmutation=Pm1-(Pm1-Pm2)*(MaxFitness-OrderFitness(i))/Diff; else pmutation=Pm1; end if pmutation>rand %满足变异条件时,进行变异运算 if NextGen(i,j)==0 NextGen(i,j)=1; else NextGen(i,j)=0; end end end end %保护精英个体 function BetterFit=SaveElitist(Index,pr) global M Gen EN=pr.ElitistNumber; for i=1:EN BetterFit(i,:)=Gen(Index(M-i+1),:); end %恢复精英个体 function RestoreElitist(BetterFit,pr) global M NextGen EN=pr.ElitistNumber; for i=1:EN NextGen(M-i+1,:)=BetterFit(i,:); end %目标函数 function F=objFunction(x1,x2) F=0.5-((sin(sqrt(x1.^2+x2.^2))).^2-0.5)./(1+0.001*(x1.^2+x2.^2).^2);