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

📄 genetic.m

📁 matlab科学计算继续上传
💻 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
    kmax = 100; %最大迭代次数缺省为100
end
if nargin < 9|eta > 1|eta <= 0
    eta = 1;  %学习率eta,(0 < eta < 1)
end
if nargin < 8
    Pm = 0.01; %变异概率缺省0.01
end
if nargin < 7
    Pc = 0.5; %交叉概率缺省0.5
end
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,:) = l + rand(size(x0)).*(u - l); %初始群体随机数组
end
P = gen_encode(X,Nb,l,u);  %编码为2进制字串
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_encode(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 + -