⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 genetic.m

📁 遗传算法 并有很简单的例子。对于初学者来说是个不错的选择
💻 M
字号:
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 最大迭代次数
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); %编码为二进制 字串
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 + -