您的位置:首页 > 编程语言 > MATLAB

遗传算法(Genetic Algorithm)应用于函数优化--MATLAB源码详细解析-附GA思维导图

2020-07-11 11:35 531 查看

目录

  • 四、代码解析
  • 5、单点交叉 crossover.m
  • 6、基本位变异 mutation.m
  • 7、目标函数 objfun.m
  • 五、输出结果
  • 六、源码以及汇报PPT下载
  • 一、理论

    模拟退火算法(SA)、遗传算法(GA)、布谷鸟算法(CS)、人工蜂群算法(ABC)学习笔记—附MATLAB注释代码

    二、遗传算法流程图

    三、遗传算法思维导图

    GA算法思维导图下载

    四、代码解析

    1、主函数GAmain.m

    clear
    close
    clc
    %varnum 变量个数
    %eps 精度
    %lb ub 变量范围
    %n 种群大小
    %pc 交叉概率
    %pm 变异概率
    %M 动态线性变换
    f = @(x) 11*sin(6*x) + 7*cos(5*x);%待求函数最大值优化问题的函数
    %f = @(x) x*sin(10*pi*x)+2;
    
    ezplot(f)
    hold on
    h = plot(0,0,'*');
    
    varnum = 1;%%变量个数
    n = 200; %%种群大小
    eps = 1e-2;
    pc = 0.9;%%交叉一般是0.4-0.9
    pm = 0.01;%%变异概率
    maxgen = 200;%%种群数量
    q = 0.2;%%排序选择中的最好的个体选择概率
    lb =-pi;%%函数自变量下限
    ub =pi;%%函数自变量上限
    
    %%初始化种群
    for i = 1:varnum
    L(i) = ceil(log2(ub(i)-lb(i)) / eps +1);%%ceil函数:朝正无穷大方向取整,L是每个自变量的编码长度
    end
    
    LS = sum(L);%%多个自变量时,是每个自变量的长度之和;LS是自变量组成的二进制编码总位长
    
    pop = randi([0 1],n,LS);%%生成n行LS列的随机数,生成0或者1
    spoint = cumsum([0 L]);%%cumsum计算数组各行的累加值
    
    for iter = 1:maxgen
    %% 将二进制转化为十进制
    for i = 1:n
    for j = 1:varnum
    startpoint  = spoint(j) + 1;
    endpoint = spoint(j+1);
    real(i,j) = decode(pop(i,startpoint:endpoint),lb(j),ub(j));
    end
    end
    %% 计算适应度值
    fitvalue = fitnessfun(real);
    fval = objfun(real);
    h.XData = real;
    h.YData = fval;
    pause(0.051)
    
    %%轮盘赌选择
    %%[dad,mom] = selection(pop,fitvalue);
    %%排序选择
    %%选择
    [dad,mom] = sortselection(pop,fitvalue,q);
    
    %%交叉
    newpop = crossover(dad,mom,pc);
    
    %%变异
    newpop = mutation(newpop,pm);
    
    pop = newpop;
    
    end
    
    for i = 1:n
    for j = 1:varnum
    startpoint  = spoint(j) + 1;
    endpoint  = spoint(j+1);
    real(i,j) = decode(pop(1,startpoint:endpoint),lb(j),ub(j));%%把最后的种群计算成十进制数
    end
    end
    
    fitvalue = fitnessfun(real);%%计算适应度的值
    
    [bestfitness,bestindex] = max(fitvalue)%%找到最好的适应度
    bestindividual = real(bestindex,:)
    fval = objfun(bestindividual)%%计算最好的目标函数值
    
    plot(bestindividual,fval,'*')%%绘制点

    2、计算适应度 fitnessfun.m

    function fitvalue = fitnessfun(x)
    
    Cmin = 0.01;
    [row,~] = size(x);
    for i = 1:row
    fval = objfun(x(i,:));
    if fval + Cmin > 0
    fitvalue(i) = fval + Cmin;
    else
    fitvalue(i) = 0;
    end
    end

    3、二进制转十进制 decode.m

    function real = decode(pop,lb,ub)
    %% pop种群
    %% varnum 变量个数
    [~,col] = size(pop);
    
    for j = col:-1:1
    temp(j) = 2^(j-1)*pop(j);%%计算二进制数
    end
    temp = sum(temp);
    real = lb + temp *(ub - lb)/(2^col-1);
    end

    4、选择算子(任选其一)

    4.1 轮盘赌选择算子 selection.m

    function [dad,mom] = selection(pop,fitvalue)
    %%轮盘赌选择算法
    %% 计算累加概率
    PP = cumsum(fitvalue ./ sum(fitvalue) );
    
    [row,~] = size(pop);
    
    %% 选择出row个个体,轮盘赌的方式
    for i = 1:row
    for j = 1:row
    r = rand;
    if r <= PP(j)
    dad(i,:) = pop(j,:);
    break;
    end
    end
    mom(i,:) = pop(randi([1 row]),:);
    end

    4.2排序选择算子 sortselection.m

    function [dad,mom] = sortselection(pop,fitvalue,q)
    
    [row,~] = size(pop);
    [~,Sindex] = sort(fitvalue,'descend');%%按照适应度高低排序
    pop = pop(Sindex,:);
    
    %%每个个体被选中的概率
    P = q*(1-q).^((1:row)-1)/(1-(1-q)^row);
    %%种群被选中的累计概率
    PP = cumsum(P);
    
    %%选择出row个个体
    for i = 1:row
    for j = 1:row
    r = rand;
    if r <= PP(j)
    dad(i,:) = pop(j,:);
    break;
    end
    end
    mom(i,:) = pop(randi([1 row]),:);
    end

    5、单点交叉 crossover.m

    function newpop = crossover(dad,mom,pc)
    
    [row,col]  = size(dad);
    for i = 1:row
    if rand < pc %%生成的随机数小于交叉概率
    cpoint  = randi([1 col-1]);%%交叉点
    %%把交叉点之前的父代和交叉点之后的母代进行组合
    newpop(i,:) = [dad(i,1:cpoint) mom(i,cpoint+1:end)];
    else
    newpop(i,:) = dad(i,:);
    end
    end

    6、基本位变异 mutation.m

    function newpop = mutation(pop,pm)
    
    [row,col] = size(pop);
    newpop = zeros(row,col);
    for i = 1:row
    mpoint  = randi([1 col]);%%变异的点
    if rand < pm
    newpop(i,:) = ~pop(1,mpoint);%%变异的位置取反
    else
    newpop(i,:) = pop(i,:);%%不发生变异
    end
    end

    7、目标函数 objfun.m

    function fval  = objfun(x)
    %目标函数
    fval = 11*sin(6*x) + 7*cos(5*x);
    %fval = x*sin(10*pi*x)+2;

    五、输出结果

    两个算子的选择结果稍微有点不一样,根据图像显然可见,在横坐标1.3附近取得最大值,排序选择的结果比较好

    1.轮盘赌选择算子结果:

    2.排序选择算子结果


    六、源码以及汇报PPT下载

    遗传算法(Genetic Algorithm)MATLAB案例详细解析代码以及PPT.zip

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: