www.gusucode.com > MATLAB仿真技术与应用__的配套例题和习题的matlab源代码 > 第八章/GeneticAlgorithm.m
% Genetic algorithm for solving simple optimization problem % f(x)=x1^2+x2^2, -5≤x1≤5, -5≤x2≤5 %The stategy of optimal maintaince is applied in the algorithm clear all; clc; format long; Population_Size=100; String_Length=30; chromosome=round(rand(Population_Size,String_Length)); chromosome_change=zeros(Population_Size,String_Length); flag=1; fitness_function=zeros(1,Population_Size); selected=zeros(1,Population_Size); generation=1; maxsat=100; while(flag>0)&(generation<50) sum_fit=0; for i=1:Population_Size a1=chromosome(i,1:15);a2=chromosome(i,16:30); param=zeros(1,2); for j=1:15 param(1,1)=param(1,1)+a1(1,j)*pow2(j-1); end for j=1:15 param(1,2)=param(1,2)+a2(1,j)*pow2(j-1); end m=pow2(15)-1; x1=-5+param(1,1)/m*10; x2=-5+param(1,2)/m*10; fitness_function(1,i)=x1^2+x2^2; if(fitness_function(1,i)<maxsat) maxsat=fitness_function(1,i); optimal=[x1 x2 fitness_function(1,i)]; end if(fitness_function(1,i)<=0.001) flag=-1; optimal generation break; else sum_fit=sum_fit+fitness_function(1,i); end if (flag<0) break; end end if(flag>0) %the first select sum_fit=sum_fit-fitness_function(1,Population_Size); for i=1:Population_Size-1 x=round(rand(1)*32767); sum=round(sum_fit); rr=rem(x,sum); n=1;ba=1; partsum=0; while((partsum<rr)&(n<Population_Size-1)) partsum=partsum+fitness_function(1,n); ba=n; n=n+1; end selected(1,i)=ba; end %reproduce for i=1:Population_Size-1 for j=1:String_Length chromosome_change(i,j)=chromosome(selected(1,i),j); end fitness_function(1,i)=fitness_function(1,selected(1,i)); end %select before crossover for i=1:Population_Size-1 x=round(rand(1)*32767); sum=round(sum_fit); rr=rem(x,sum)+1; n=1; partsum=0; while((partsum<rr)&(n<=Population_Size-1)) partsum=partsum+fitness_function(1,n); bba=n; n=n+1; end selected(1,i)=bba; end %crossover maxsw=max(fitness_function); for i=1:Population_Size/2-1 parent1=selected(1,i); parent2=selected(1,Population_Size-1-i); child1=i; child2=Population_Size-1-i; pc=0.8; randnum=rand(1); site1=round(rand(1)*String_Length); for j=1:String_Length if(j<site1) chromosome(child1,j)=chromosome_change(parent1,j); chromosome(child2,j)=chromosome_change(parent2,j); else chromosome(child1,j)=chromosome_change(parent2,j); chromosome(child2,j)=chromosome_change(parent1,j); end end end %mutation pm=0.05; for i=1:Population_Size-1 for j=1:String_Length randnum=rand(1); if(randnum<pm) chromosome(i,j)=~chromosome(i,j); end end end end generation=generation+1 end