📄 genetic.asv
字号:
% function [xo,fo]=genetic(f,x0,l,u,Np,Nb,Pc,Pm,eta,kmax)
%遗传算法求 f(x) 的最小值 s.t. l<=x<=u
%f:待求的函数 x0 初始值 l u 上下限
%Np 群体大小 Nb 每个变量的遗传值(二进制数)
%Pc 交叉概率 Pm 变异概率 eta 学习率 kmax 最大迭代次数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;clc;
f=inline('5*sin(x(1)*x(2))+x(1)^2+x(2)^2','x');
l=[-5 -5];
u=[5 5];
x0=[0 0];
Np=30;
Nb=[12 12];
Pc=0.5;
Pm=0.01;
eta=0.8;
kmax=200;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N=length(x0);
if nargin<10,kamx=100;end %z默认最大的迭代次数 100
if nargin<9|eta>1|eta<=0,eta=1;end %学习率eta (0<eta<1)
if nargin<8,Pm=0.01;end %变异概率默认为0.01
if nargin<7,Pc=0.5;end %交叉概率默认为0.5
if nargin<6,Nb=8*ones(1,N);end %每一变量的 遗传值
if nargin<5,Np=10;end %群体大小(染色体数)
%%%%%%%生成初始群体
NNb=sum(Nb);
xo=x0(:)';l=l(:)';u=u(:)';
fo=feval(f,xo);
X(1,:)=xo;
for n=2:Np,X(n,:)=1+rand(size(x0)).*(u-l);end % 初始群体随机数组
P=gen_encode(X,Nb,l,u); %编码为二进制 字串
break;
for k=1:kmax
X=gen_decode(P,Nb,l,u);%解码 为10进制数
for n=1:Np,fX(n)=feval(f,X(n,:));end
[fxb,nb]=min(fX); %选择最合适的 函数值最小的
if fxb<fo,fo=fxb;xo=X(nb,:);end
fX1=max(fxb)-fX; %将函数值转化为非负的适度值
fXm=fX1(nb);
if fXm<eps,return;end%%% 如果所有染色体值相同 终止程序
%%%%%%%复制下一代
for n=1:Np
X(n,:)=X(n,:)+eta*(fXm-fX1(n))/fXm*(X(nb,:)-X(n,:)); %%
end
P=gen_code(X,Nb,l,u); %%%
%%%%%%%%%%%%%随机配对、交叉得新的 染色体数组
is=shuffle([1:Np]);
for n=1:2:Np-1
if rand<pc
p(is(n:n+1),:)=crossover(P(is(n:n+1),:),Nb);
end
end
%%%%%%%%%%%%%%变异
P=mutation(P,Nb,Pm);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -