利用遗传算法求函数的极小值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 ---- 变异概率
% 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',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=[];
% 计算适应度,并画出图形
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,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);
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,%.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);
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;
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
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)');