利用遗传算法求函数的极小值

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)');

相关文档
最新文档