• 从Matlab实例学习蚁群算法(2)


    前言

    从Matlab实例学习蚁群算法 中我们介绍了用蚁群算法求解TSP问题的实例。 进一步的,本文介绍一个通过蚁群算法求解连续问题的实例。

    问题

    求解 f ( x , y ) = 20 ( x 2 − y 2 ) 2 − ( 1 − y ) 2 − 3 ( 1 + y ) 2 + 0.3 f(x,y)=20(x^2-y^2)^2-(1-y)^2-3(1+y)^2+0.3 f(x,y)=20(x2y2)2(1y)23(1+y)2+0.3 的最小值。其中 x ∈ [ − 5 , 5 ] , y ∈ [ − 5 , 5 ] x\in[-5,5], y\in[-5,5] x[5,5],y[5,5]。 这是一个简单的数学问题,用以阐释蚁群算法的求解过程。

    求解流程

    1. 随机生成 m m m个蚂蚁, 对应于可行域中的 m m m个可行解 ( x m , y m ) (x_m, y_m) (xm,ym),并求出对应的 f ( x m , y m ) f(x_m,y_m) f(xm,ym)值,得到其中最优的一个解, 记为 f m i n f_{min} fmin
    2. 遍历所有蚂蚁, 计算 p m = ( f ( x m , y m ) − f m i n ) / f m i n p_m =(f(x_m,y_m) - f_{min}) / f_{min} pm=(f(xm,ym)fmin)/fmin。 预设常数值 p 0 p_0 p0, 也称为转移概率常数。 判断:
    • p m < p 0 p_m < p_0 pm<p0, 进行局部搜索: x m = x m + λ s x x_m = x_m + \lambda s_x xm=xm+λsx, y m = y m + λ s y y_m = y_m + \lambda s_y ym=ym+λsy λ \lambda λ是一个常系数,随着搜索代数的提升而减少, 即 λ = 1 / N c \lambda = 1 / N_c λ=1/Nc s x s_x sx s y s_y sy则是可正可负的随机步长值,来进行一个局部的随机搜索。
    • p m ≥ p 0 p_m \ge p_0 pmp0, 进行全局搜索: 重新生成一个可行解 ( x m , y m ) (x_m,y_m) (xm,ym)
      可以看到,在这一步中, 主要通过 p 0 p_0 p0来控制探索的解, 若蚂蚁当前所在的解的质量较好,则进行局部搜索寻求更好。 若解的质量较差,则进行全局的重新探索。在重新生成解的过程中, 如果有数值越界导致的解非可行的情况, 则强制归回可行范围内。
    1. 判断蚂蚁是否移动: 若新的解对应函数值小于原先解,则进行移动。 否则不动。
    2. 更新信息素: f m = ( 1 − ρ ) f m + f ( x m , y m ) f_m = (1-\rho) f_m + f(x_m,y_m) fm=(1ρ)fm+f(xm,ym), 后续根据 f m f_m fm值来评估最优的解。
    3. 判断是否到达迭代代数。 若未到达, 跳转到步骤2。

    思考

    通过这个实例,我们看到对于求解相较于TSP更为一般的优化问题时,蚁群算法主要就变成了, 多组可行解的智能并行搜索。 此时,根据当前蚂蚁所对应的解的优劣, 好的解则令蚂蚁在解的邻域中进行搜索,而差的解则让蚂蚁跳出这一解进行一个全局的搜索。

    总之,感觉智能启发算法的核心思路正如强化学习中的exploration-exploitation 策略相似:以一定的概率保持着对未知的探索,其余遵循经验中最优的方向。

    代码

    %%%%%%%%%%%%%%%%%%%%蚁群算法求函数极值%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    clear all;               %清除所有变量
    close all;               %清图
    clc;                     %清屏
    m=20;                    %蚂蚁个数
    G_max=200;               %最大迭代次数
    Rho=0.9;                 %信息素蒸发系数
    P0=0.2;                  %转移概率常数
    XMAX= 5;                 %搜索变量x最大值
    XMIN= -5;                %搜索变量x最小值
    YMAX= 5;                 %搜索变量y最大值
    YMIN= -5;                %搜索变量y最小值
    %%%%%%%%%%%%%%%%%随机设置蚂蚁初始位置%%%%%%%%%%%%%%%%%%%%%%
    for i=1:m
        X(i,1)=(XMIN+(XMAX-XMIN)*rand);
        X(i,2)=(YMIN+(YMAX-YMIN)*rand);
        Tau(i)=func(X(i,1),X(i,2));
    end
    step=0.1;                %局部搜索步长
    for NC=1:G_max
        lamda=1/NC;
        [Tau_best,BestIndex]=min(Tau);
        %%%%%%%%%%%%%%%%%%计算状态转移概率%%%%%%%%%%%%%%%%%%%%
        for i=1:m
            P(NC,i)=(Tau(BestIndex)-Tau(i))/Tau(BestIndex);
        end
        %%%%%%%%%%%%%%%%%%%%%%位置更新%%%%%%%%%%%%%%%%%%%%%%%%
        for i=1:m
               %%%%%%%%%%%%%%%%%局部搜索%%%%%%%%%%%%%%%%%%%%%%
            if P(NC,i)XMAX
                temp1=XMAX;
            end
            if temp2YMAX
                temp2=YMAX;
            end
            %%%%%%%%%%%%%%%%%%蚂蚁判断是否移动%%%%%%%%%%%%%%%%%%
            if func(temp1,temp2)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
  • 相关阅读:
    泥环算法 (MRA)附matlab代码
    华硕ROG吹雪和微星刀锋钛两者如何选择
    Apollo安装全攻略
    再再肝3天,整理了70个Python面向对象编程案例,怎能不收藏?
    香港服务器在大陆连不上怎么回事?
    甘特图:项目管理的核心工具WBS
    C++设计模式之代理模式(结构型模式)
    How to resolve jre-openjdk and jre-openjdk-headless conflicts?
    打造千万级流量秒杀第十八课 热更新:如何解决程序升级中的稳定性问题?
    MyBatisPlus学习(2)—— 初始化环境配置 + 自定义Mapper
  • 原文地址:https://blog.csdn.net/weixin_39274659/article/details/127956240