1、1、 利用遗传算法求出下面函数的极小值 : z=2-exp[-(x2+y2)], x,y∈[-5,+5] 对于此函数 ,求某一极值、或说最值时,由于x、y定义域与系数相同, x与y相对于z来说是地位等同的,因此可以转换成求该函数极值: ;继而转换成了一种单变量函数。 函数的实现 : (1)ga_main脚本文件 % GA main program % Edited by Bian Xuezi % n ---- 种群规模 % ger ---- 迭代次数 % pc ---- 交叉概率 % pm ---- 变异概率 %
2、v ---- 初始种群(规模为n) % f ---- 目标函数值 % fit ---- 适应度向量 % vx ---- 最优适应度值向量 % vmfit ---- 平均适应度值向量 clear all; close all; clc; tic; n=20; ger=100; pc=0.70; pm=0.009; % 生成初始种群 v=init_population(n,20); [N,L]=size(v); disp(sprintf('Number of generations:%d'
3、ger)); disp(sprintf('Population size:%d',N)); disp(sprintf('Crossover probability:%.3f',pc)); disp(sprintf('Mutation probability:%.3f',pm)); % 待优化问题 xmin=-5;ymin=-5; xmax=5;ymax=5; f='-2+exp(-x.^2-y.^2)'; %初始化 sol=0.1; vmfit=[]; it=1; vx=[]; %C=[]; % 计算适应度,
4、并画出图形 x=decode(v(:,1:10),xmin,xmax); y=decode(v(:,11:20),ymin,ymax); fit=eval(f); figure(1); [X,Y]=meshgrid(-5:0.1:5,-5:0.1:5); Z=-2+exp(-X.^2-Y.^2); mesh(X,Y,Z); grid on; hold on; plot3(x,y,fit,'k*'); title('染色体的初始位置'); xlabel('x'); ylabel('y'); zlabel('f(x
5、y)'); % 开始进化 while it<=ger %Reproduction(Bi-classist Selection) vtemp=roulette(v,fit); %Crossover v=crossover(vtemp,pc); %Mutation M=rand(N,L)<=pm; %M(1,:)=zeros(1,L); v=v-2.*(v.*M)+M; %Results x=decode(v(:,1:10),xmin,xmax);
6、 y=decode(v(:,11:20),ymin,ymax); fit=eval(f); [sol,indb]=max(fit); v(1,:)=v(indb,:); media=mean(fit); vx=[vx sol]; vmfit=[vmfit media]; it=it+1; end %%%% 最后的结果 disp(sprintf('\n')); %空一行 % 显示最优解及最优值 disp(sprintf('Maximum found[x,f(x)]:[%.4f,%
7、4f,%.4f]',x(indb),y(indb),sol)); % 图形显示最优结果 figure(2); [X,Y]=meshgrid(-5:0.1:5,-5:0.1:5); Z=-2+exp(-X.^2-Y.^2); mesh(X,Y,Z); grid on; hold on; plot3(x,y,fit,'k*'); title('染色体的最终位置'); xlabel('x'); ylabel('y'); zlabel('f(x,y)'); % 图形显示最优及平均函数值变化趋势 figure(3);
8、 plot(vx); %title('最优,平均函数值变化趋势'); xlabel('Generations'); ylabel('f(x,y)'); hold on; plot(vmfit,'r'); hold off; runtime=toc (2)Crossover函数 %Crossover function v=crossover(vtemp,pc) [N,L]=size(vtemp); C(:,1)=rand(N,1)<=pc; I=find(C(:,1)==1); I'; j=1;
9、for i=1:2:size(I) if i>=size(I) break; end site=fix(1+L*rand(1)); temp=vtemp(I(i,1),:); vtemp(I(i,1),site:end)=vtemp(I(i+1,1),site:end); vtemp(I(i+1,1),site:end)=temp(:,site:end); %j=j+2; end v=vtemp; (3)decode函数 %Decodify bitstrings
10、 function x=decode(v,min,max) % x ----真实值 % v ----待解码的已编码的0-1串 v=fliplr(v); [s,c]=size(v); aux=0:1:c-1 ;%21; aux=ones(s(1),1)*aux; x1=sum((v.*2.^aux)'); x=min+(max-min)*x1./(2^c-1); % ; (4)init_population函数 function v=init_population(n1,s1) v=round(rand(n1,s1)); (5)roulette函数 function vtemp=roulette(v,fit) N=size(v); fitmin=abs(min(fit)); fit=fitmin+fit; %fit S=sum(fit); for i=1:N SI=S*rand(1); for j=1:N if SI<=sum(fit(1:j)) vtemp(i,:)=v(j,:); break end end end






