精华内容
下载资源
问答
  • 基于蚁群算法思想的智能考试系统模型研究.rar
  • 基于蚁群算法思想的智能考试系统模型研究.pdf
  • 针对传统考试耗时耗力等缺点, 提出基于解离散优化问题蚁群算法思想的智能考试系统模型。该模型从智能考试系统的需求出发对蚁群算法的信息素初始值的设定进行了探讨并改进了更新规则, 将考试结果反馈给系统, 从而不仅...
  • 蚁群算法 实现思想

    2011-12-17 14:17:38
    蚁群算法的基本思想
  • 蚁群算法

    万次阅读 多人点赞 2017-05-13 20:23:13
    蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法...蚁群算法的基本思想: 蚁群算法的基本原理: 1、蚂蚁在路径上释放信息素。 2、碰到还没走过的路口,就随机挑选一条路走。同时,释放与路径长度有关的信息素。
     
    
    蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法,它是由意大利学者Dorigo M等人于1991年首先提出,并首先使用在解决TSP(旅行商问题)上。
    之后,又系统研究了蚁群算法的基本原理和数学模型.
    蚁群算法的基本思想:
    蚁群算法的基本原理:

    1、蚂蚁在路径上释放信息素。

    2、碰到还没走过的路口,就随机挑选一条路走。同时,释放与路径长度有关的信息素。

    3、信息素浓度与路径长度成反比。后来的蚂蚁再次碰到该路口时,就选择信息素浓度较高路径。

    4、最优路径上的信息素浓度越来越大。

    5、最终蚁群找到最优寻食路径。

    人工蚁群与真实蚁群对比:

    基于TSP问题的基本蚁群算法:

    TSP求解中,假设蚁群算法中的每只蚂蚁是具有以下特征的简单智能体:

    每次周游,每只蚂蚁在其经过的支路(i,j)上都留下信息素。

    蚂蚁选择城市的概率与城市之间的距离和当前连接支路上所包含的信息素余量有关。

    ƒ为了强制蚂蚁进行合法的周游,直到一次周游完成后,才允许蚂蚁游走已访问过的城市(这可由禁忌表来控制)。

    基本蚁群的两个过程:

    (1)状态转移

    (2)信息素更新

    (1)状态转移

    为了避免残留信息素过多而淹没启发信息,在每只蚂蚁走完一步或者完成对所有n个城市的遍历(也即一个循环结束)后,要对残留信息进行更新处理。

    由此,t+n时刻在路径(i,j)上的信息量可按如下规则进行调整: 

    (2)信息素更新模型

    蚁周模型(Ant-Cycle模型)

    蚁量模型(Ant-Quantity模型)

    蚁密模型(Ant-Density模型)

    区别:

    1.蚁周模型利用的是全局信息,即蚂蚁完成一个循环后更新所有路径上的信息素;

    2.蚁量和蚁密模型利用的是局部信息,即蚂蚁完成一步后更新路径上的信息素。

    蚁群算法基本流程:

    蚁群算法中主要参数的选择:

    蚁群算法中主要参数的理想选择如下:

    国内外,对于离散域蚁群算法的改进研究成果很多,例如自适应蚁群算法、基于信息素扩散的蚁群算法等,这里仅介绍离散域优化问题的自适应蚁群算法。

    自适应蚁群算法:对蚁群算法的状态转移概率、信息素挥发因子、信息量等因素采用自适应调节策略为一种基本改进思路的蚁群算法。

    自适应蚁群算法中两个最经典的方法:蚁群系统(AntColony System, ACS)和最大-最小蚁群系统(MAX-MINAnt System, MMAS)。

    蚁群系统对基本蚁群算法改进:

    蚂蚁的状态转移规则不同;

    ②全局更新规则不同;


    ③新增了对各条路径信息量调整的局部更新规则


    用蚁群算法求解TSP问题:一个旅行商人要拜访全国31个省会城市,需要选择最短的路径.

    %%%一个旅行商人要拜访全国31个省会城市,需要选择最短的路径%%%%
    
    
    %%%蚁群算法解决TSP问题%%%%%%%
    
    clear all; %清除所有变量
    close all; %清图
    clc ;      %清屏
    m=50;    %% m 蚂蚁个数
    Alpha=1;  %% Alpha 表征信息素重要程度的参数
    Beta=5;  %% Beta 表征启发式因子重要程度的参数
    Rho=0.1; %% Rho 信息素蒸发系数
    NC_max=200; %%最大迭代次数
    Q=100;         %%信息素增加强度系数
    
    C=[
    1304 2312;
    3639 1315;
    4177 2244;
    3712 1399;
    3488 1535;
    3326 1556;
    3238 1229;
    4196 1004;
    4312 790;
    4386 570;
    3007 1970;
    2562 1756;
    2788 1491;
    2381 1676;
    1332 695;
    3715 1678;
    3918 2179;
    4061 2370;
    3780 2212;
    3676 2578;
    4029 2838;
    4263 2931;
    3429 1908;
    3507 2367;
    3394 2643;
    3439 3201;
    2935 3240;
    3140 3550;
    2545 2357;
    2778 2826;
    2370 2975
    ];                %%31个省会坐标
    %%-------------------------------------------------------------------------
    %% 主要符号说明
    %% C n个城市的坐标,n×2的矩阵
    %% NC_max 最大迭代次数
    %% m 蚂蚁个数
    %% Alpha 表征信息素重要程度的参数
    %% Beta 表征启发式因子重要程度的参数
    %% Rho 信息素蒸发系数
    %% Q 信息素增加强度系数
    %% R_best 各代最佳路线
    %% L_best 各代最佳路线的长度
    %%=========================================================================
    %%第一步:变量初始化
    n=size(C,1);%n表示问题的规模(城市个数)
    D=zeros(n,n);%D表示完全图的赋权邻接矩阵
    for i=1:n
        for j=1:n
            if i~=j
                D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
            else
                D(i,j)=eps;      %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示
            end
            D(j,i)=D(i,j);   %对称矩阵
        end
    end
    Eta=1./D;          %Eta为启发因子,这里设为距离的倒数
    Tau=ones(n,n);     %Tau为信息素矩阵
    Tabu=zeros(m,n);   %存储并记录路径的生成
    NC=1;               %迭代计数器,记录迭代次数
    R_best=zeros(NC_max,n);       %各代最佳路线
    L_best=inf.*ones(NC_max,1);   %各代最佳路线的长度
    L_ave=zeros(NC_max,1);        %各代路线的平均长度
    
    
    
    while NC<=NC_max        %停止条件之一:达到最大迭代次数,停止
        %%第二步:将m只蚂蚁放到n个城市上
        Randpos=[];   %随即存取
        for i=1:(ceil(m/n))
            Randpos=[Randpos,randperm(n)];
        end
        Tabu(:,1)=(Randpos(1,1:m))';   
        %%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游
        for j=2:n     %所在城市不计算
            for i=1:m
                visited=Tabu(i,1:(j-1)); %记录已访问的城市,避免重复访问
                J=zeros(1,(n-j+1));       %待访问的城市
                P=J;                      %待访问城市的选择概率分布
                Jc=1;
                for k=1:n
                    if length(find(visited==k))==0   %开始时置0
                        J(Jc)=k;
                        Jc=Jc+1;                         %访问的城市个数自加1
                    end
                end
                %下面计算待选城市的概率分布
                for k=1:length(J)
                    P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
                end
                P=P/(sum(P));
                %按概率原则选取下一个城市
                Pcum=cumsum(P);     %cumsum,元素累加即求和
                Select=find(Pcum>=rand); %若计算的概率大于原来的就选择这条路线
                to_visit=J(Select(1));
                Tabu(i,j)=to_visit;
            end
        end
        if NC>=2
            Tabu(1,:)=R_best(NC-1,:);
        end
        %%第四步:记录本次迭代最佳路线
        L=zeros(m,1);     %开始距离为0,m*1的列向量
        for i=1:m
            R=Tabu(i,:);
            for j=1:(n-1)
                L(i)=L(i)+D(R(j),R(j+1));    %原距离加上第j个城市到第j+1个城市的距离
            end
            L(i)=L(i)+D(R(1),R(n));      %一轮下来后走过的距离
        end
        L_best(NC)=min(L);           %最佳距离取最小
        pos=find(L==L_best(NC));
        R_best(NC,:)=Tabu(pos(1),:); %此轮迭代后的最佳路线
        L_ave(NC)=mean(L);           %此轮迭代后的平均距离
        NC=NC+1                      %迭代继续
    
        
        %%第五步:更新信息素
        Delta_Tau=zeros(n,n);        %开始时信息素为n*n的0矩阵
        for i=1:m
            for j=1:(n-1)
                Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
                %此次循环在路径(i,j)上的信息素增量
            end
            Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
            %此次循环在整个路径上的信息素增量
        end
        Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素
        %%第六步:禁忌表清零
        Tabu=zeros(m,n);             %%直到最大迭代次数
    end
    %%第七步:输出结果
    Pos=find(L_best==min(L_best)); %找到最佳路径(非0为真)
    Shortest_Route=R_best(Pos(1),:) %最大迭代次数后最佳路径
    Shortest_Length=L_best(Pos(1)) %最大迭代次数后最短距离
    
    figure(1) 
    plot(L_best)
    xlabel('迭代次数')
    ylabel('目标函数值')
    title('适应度进化曲线')
    
    
    figure(2)
    subplot(1,2,1)                  %绘制第一个子图形
       %画路线图
    %%=========================================================================
    %% DrawRoute.m
    %% 画路线图
    %%-------------------------------------------------------------------------
    %% C Coordinate 节点坐标,由一个N×2的矩阵存储
    %% R Route 路线
    %%=========================================================================
    N=length(R);
    scatter(C(:,1),C(:,2));
     hold on
     plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)],'g')
     hold on
    for ii=2:N
        plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'g')
         hold on
    end
    title('旅行商问题优化结果 ')
    
    subplot(1,2,2)                  %绘制第二个子图形
    plot(L_best)
    hold on                         %保持图形
    plot(L_ave,'r')
    title('平均距离和最短距离')     %标题
    
    
    
    

    输出结果如下:





    展开全文
  • 蚁群算法是基于蚂蚁寻找食物时在路少留下的激素味道,从而为其它蚂蚁提供了线索,使他们能够更容易寻找到食物的思想
  • 蚁群算法及十进制蚁群算法

    千次阅读 2014-09-20 22:54:10
    蚁群算法(ant colonyoptimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。[1] 蚁群...

     本文是在学习完蚁群算法,并且在2014年全国大学生数学建模比赛中应用之后,总结而得。其中引用文献均已标注,第一份matlab代码系引用,第二份matlab代码系原创。

    转载请注明出处!

    引言

    蚁群算法(ant colonyoptimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。[1] 蚁群算法采用分布式并行计算的机制,可以较好地跳出局部最优,从而找到全局最优解。广泛应用于求解旅行商问题、货郎担问题等NP完全问题,具有较强的鲁棒性。

            

    算法思想

    蚂蚁在寻找食物的过程中,总能找到蚁穴到食物的一条最短路径。而每只蚂蚁并不知道食物的位置,只是在前进的过程中,在自身周围的局部范围内搜索路径,并且以相对较高的概率朝着其他蚂蚁留下的信息素浓度较高的地方移动。蚂蚁在前进的同时会留下一定的信息素,留下的信息素的浓度与该蚂蚁经过的路径长度成反比。路径上总的信息素的浓度与通过的蚂蚁的数量成正比。同时,所有的信息素将按照一定的速率挥发。当大量的蚂蚁同时搜索的时候,在最短路径上的信息素将会越来越浓,按照最短路径移动的蚂蚁也会越来越多,形成一个正反馈,经过反复多次迭代,所有蚂蚁的路径都会收敛到这条最短路径上。

    概括一下,蚁群算法的关键点有以下五个:

    1.  蚂蚁数量与迭代次数。每轮迭代中,每只蚂蚁都要走遍所有的城市,因此一轮迭代后将生成与蚂蚁数量相等的路径数。更新信息素后进入下一轮迭代。

    2.  蚂蚁的移动操作。蚂蚁选择下一个城市的时候,要考虑所有路径上的信息素和城市间的距离,选择概率与前者成正比与后者成反比。综合考虑后使用轮盘赌方法随机选择下一个城市。

    文献[2]给出的移动概率的计算公式为:


    其中,

    表示t时刻蚂蚁ki城市移动到j城市的概率;

    表示t时刻i城市到j城市之间的路径上的信息素;

    等于i城市与j城市之间的距离的倒数,表示t时刻希望蚂蚁ki城市移动到j城市的期望度;

    是蚂蚁k没有遍历的城市的集合;

    是蚂蚁k已经遍历的城市的集合,已经遍历的城市不允许再访问,因此对应的概率为0。

    3.  对路径优劣的判断。一次迭代结束后,对所有蚂蚁的路径进行一次评价,根据特定的评判准则(比如TSP问题中的路径最短原则),选取较优(或最优)路径。

    4.  信息素的释放。对较优(或最优)路径,认为遍历它们的蚂蚁找到了食物,对这些路径添加新的信息素(由参数控制)。而其余路径不添加信息素。

    5.  信息素的更新。每次迭代结束后,除了相应的增添信息素,还要对所有信息素进行衰减(按一定比例)。

    文献[2]给出的信息素更新公式为:



    其中,

    表示信息素的挥发系数,取值范围[0,1);

    表示第k只蚂蚁在路径上释放的信息素的量;

    Q表示一只蚂蚁所携带的信息素的强度;

    表示蚂蚁k在t时刻经过的路径的总长度。

     

     

    实现步骤

    结合下一节的代码,设置变量有:

    变量

    取值

    说明

    NC_max

    50

    最大迭代次数

    m

    1000

    蚂蚁个数

    Alpha

    1

    表征信息素重要程度的参数

    Beta

    5

    表征启发式因子重要程度的参数

    Rho

    0.2

    信息素挥发系数

    Q

    0.5

    信息素增强系数

     

    根据上一部分介绍的算法思想,蚁群算法在matlab中的实现步骤如下:

    1.  根据已知信息,生成表示各个城市之间的距离的矩阵D,对于无向图,D是一个对称矩阵,有向图则否。

    2.  设置每个城市的信息素初始值。

    3.  随机(或按照特定规则)释放蚂蚁,按照轮盘赌方法选择每个蚂蚁下一个城市,反复直到所有蚂蚁均完成周游。

    4.  评价所有蚂蚁遍历的路径,选择较优者增强信息素。

    5.  更新(主要是挥发过程)信息素,存储路径。

    6.  检查是否达到最大迭代次数,如果达到则推出,算法结束。否则转到3。

     

    代码

    摘自 http://blog.csdn.net/lyp2003ok/article/details/3706247,由解放军信息工程大学的一个老师编写。matlab实现,针对TSP问题的蚁群算法。

    主函数:

    ACATSP.m

    function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
    %%===========================================================================
    %  ACATSP.m
    %  http://blog.csdn.net/lyp2003ok/article/details/3706247
    %  Ant Colony Algorithm for Traveling Salesman Problem
    %  ChengAihua,PLA Information Engineering University,ZhengZhou,China
    %  Email:aihuacheng@gmail.com
    %  All rights reserved
    %---------------------------------------------------------------------------
    %  主要符号说明
    %  C        n个城市的坐标,n×2的矩阵
    %  NC_max   最大迭代次数
    %  m        蚂蚁个数
    %  Alpha    表征信息素重要程度的参数
    %  Beta     表征启发式因子重要程度的参数
    %  Rho      信息素蒸发系数
    %  Q        信息素增加强度系数
    %  R_best   各代最佳路线
    %  L_best   各代最佳路线的长度
    %%===========================================================================
    
    %% 第一步:变量初始化
    n=size(C,1);    %n表示问题的规模(城市个数)
    D=zeros(n,n);   %D表示完全图的赋权邻接矩阵
    for i=1:n
        for j=1:n
            if i~=j
                D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
            else
                D(i,j)=eps; %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示
            end
            D(j,i)=D(i,j);
        end
    end
    Eta=1./D;   %Eta为启发因子,这里设为距离的倒数
    Tau=ones(n,n);  %Tau为信息素矩阵
    Tabu=zeros(m,n);    %存储并记录路径的生成
    NC=1;   %迭代计数器
    R_best=zeros(NC_max,n); %各代最佳路线
    L_best=inf.*ones(NC_max,1); %各代最佳路线的长度
    L_ave=zeros(NC_max,1);  %各代路线的平均长度
    
    while NC<=NC_max    %停止条件之一:达到最大迭代次数
        %% 第二步:将m只蚂蚁放到n个城市上
        Randpos=[]; %
        for i=1:(ceil(m/n))
            Randpos=[Randpos,randperm(n)];
        end
        Tabu(:,1)=(Randpos(1,1:m))';
       
        %% 第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游
        for j=2:n   %所在城市不计算
            for i=1:m
                visited=Tabu(i,1:(j-1));    %已访问的城市
                J=zeros(1,(n-j+1)); %待访问的城市
                P=J;    %待访问城市的选择概率分布
                Jc=1;   %待访问的城市个数
                for k=1:n
                    if ~any(visited==k)  %判断第k个城市是否已经访问
                        J(Jc)=k;
                        Jc=Jc+1;    %访问的城市个数自加1
                    end
                end
                %下面计算待选城市的概率分布
                for k=1:length(J)
                    P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
                end
                P=P/(sum(P));
                %按 概率原则 选取下一个城市
                Pcum=cumsum(P); %cumsum,求序列的和序列
                Select=find(Pcum>=rand);    %若计算的概率大于原来的就选择这条路线
                to_visit=J(Select(1));
                Tabu(i,j)=to_visit;
            end
        end
        if NC>=2
            Tabu(1,:)=R_best(NC-1,:);
        end
       
        %% 第四步:记录本次迭代最佳路线
        L=zeros(m,1);   %开始距离为0,m*1的列向量
        for i=1:m
            R=Tabu(i,:);
            for j=1:(n-1)
                L(i)=L(i)+D(R(j),R(j+1));   %原距离加上第j个城市到第j+1个城市的距离
            end
            L(i)=L(i)+D(R(1),R(n)); %一轮下来后走过的距离
        end
        L_best(NC)=min(L);  %最佳距离取最小
        pos=find(L==L_best(NC));
        R_best(NC,:)=Tabu(pos(1),:);    %此轮迭代后的最佳路线
        L_ave(NC)=mean(L);  %此轮迭代后的平均距离
        NC=NC+1
       
        %% 第五步:更新信息素
        Delta_Tau=zeros(n,n);   %开始时信息素为n*n的0矩阵
        for i=1:m
            for j=1:(n-1)
                Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);   %此次循环在路径(i,j)上的信息素增量
            end
            Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);   %此次循环在整个路径上的信息素增量
        end
        Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素
       
        %% 第六步:禁忌表清零
        Tabu=zeros(m,n);
    end
    
    %% 第七步:输出结果
    Pos=find(L_best==min(L_best));	%找到最佳路径(非0为真)
    Shortest_Route=R_best(Pos(1),:)	%最大迭代次数后最佳路径
    Shortest_Length=L_best(Pos(1))	%最大迭代次数后最短距离
    subplot(1,2,1);	%绘制第一个子图形
    DrawRoute(C,Shortest_Route);	%画路线图的子函数
    subplot(1,2,2); %绘制第二个子图形
    plot(L_best);
    hold on;    %保持图形
    plot(L_ave,'r')
    title('平均距离和最短距离');  %标题

    子函数:

    DrawRoute.m

    function DrawRoute(C,R)
    %%====================================================================
    %  DrawRoute.m
    %  画路线图的子函数
    %--------------------------------------------------------------------
    %  C    Coordinate        节点坐标,由一个N×2的矩阵存储
    %  R    Route             路线
    %%====================================================================
    
    N=length(R);
    scatter(C(:,1),C(:,2));
    hold on
    plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)])
    hold on
    for ii=2:N
        plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)])
        hold on
    end

    若以网上流传的中国31个城市为目标,用下面的语句调用上面的函数:

    C=[ 1304 2312
        3639 1315
        4177 2244
        3712 1399
        3488 1535
        3326 1556
        3238 1229
        4196 1004
        4312 790
        4386 570
        3007 1970
        2562 1756
        2788 1491
        2381 1676
        1332 695
        3715 1678
        3918 2179
        4061 2370
        3780 2212
        3676 2578
        4029 2838
        4263 2931
        3429 1908
        3507 2367
        3394 2643
        3439 3201
        2935 3240
        3140 3550
        2545 2357
        2778 2826
        2370 2975 ];
    m=31;
    Alpha=1;
    Beta=5;
    Rho=0.1;
    NC_max=200;
    Q=100;
    [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q);
    

    结果为:

    Shortest_Length = 1.5602e+04

    绘图:


    解决连续函数优化问题—十进制蚁群算法[3]

    蚁群算法虽然能跳出局部最优找到全局最优解,但是其处理的都是离散问题(城市都是离散的),对于连续问题(比如求一个实数)却无能为力。文献[3]提到的一种十进制蚁群算法,采用特殊的办法构造城市群,可以解决这个问题,以一元连续函数优化为例:


    具体方法如下。

    构造城市群

    首先将待优化的参数归一化,归一到[0,1)上。比如在本例中,令

    假设的精度为p(小数点后有p位),则共需要有p个0到9的整数,依次代表小数点后的各位,为了得到这p个整数,如下构造城市群。


    如图,构造10p+1个城市,分成p+1列,第一列一个城市表示起始点,其余每一列的城市分别代表数字1,2,3…9,0。一共有10p个城市,所有的p列放在一起代表精度为p的小数。可以看出,十进制蚁群算法的城市群是对蚁群算法城市群的一个简化和限制。

    路径转移规则

    除了最后一列,每一列的每一个城市都只能前往下一列的10所城市。于是每只蚂蚁遍历完成后,都只经历了除起始城市之外的所有10p个城市中的p个,每列遍历且只遍历一个城市。

    最终构造出来的邻接矩阵是一个非对称矩阵(因为城市间移动是单向的),每个点的出度均为10(最后一列除外),入度均为10(起始城市和第一列除外)。且城市间的距离是二值化的,即有连接和没连接。由于城市是虚拟的,本不存在彼此距离之说,所以不妨将有连接的城市的距离设为常数,没连接的设为无穷大。

    记第k列第i个城市到第k+1列第j个城市之间的路径的信息素为。则某只蚂蚁在第k列第i个城市向第k+1列第j个城市转移的概率为: 


    从上式可以看出,两个城市间的信息量越多,蚂蚁转移的概率越大。但由于信息素再大也是基于概率的,所以信息量少的路径扔有可能被选择,即避免了全部蚂蚁陷入局部最优无法跳出的结果。这样就保留了原蚁群算法的优势。

    信息素更新规则

    信息素的更新需要在原基础上额外满足以下两个条件:

    1.  选择的较优的路径上的所有信息素都要加强,且按路径的优劣程度有不同程度的加强。

    2.  局部搜索增强策略。考虑到x是连续值,为了增强局部搜索能力,规定若某次迭代中(i,j)在较优路径里,其信息素增强了,则其相邻路径(i,j+1),(i,j-1)都增强。这样下一次迭代时,路径(i,j+1),(i,j-1)被选中的几率也会增加。

    设第N次迭代时第k列第i个城市到第k列第j个城市之间的路径的信息素为,则每次信息素的更新公式为



    其中,K为权重系数,Q为小于1的正数,为蚂蚁k对应的目标函数值,best为之前所有迭代中最有蚂蚁对应的目标函数值。这样可以增大最优路径在之后的迭代中被选中的概率。

    评价标准

    对本例来说,最终目的是求出满足min(f(x))的x值,因此相应的评价标准即为min(f(x))。由的计算公式也可以看出,越接近最优结果的路径,释放的信息素越多。依次形成正反馈。 

    代码

    结合上一份解决TSP问题的代码,我写了下面这份解决连续函数优化的代码。写完后简单验证了一下,没有用复杂的函数来试验。不妥之处欢迎指正。

    function fx_best=DACA(NC_max,m,Rho,Q,K,f,num,Range,precision)
    %%  DACA.m
    %十进制蚁群算法,用于解决连续函数优化问题,求min(f)
    %主要变量定义和符号说明
    % f;          %目标函数
    % num=11;     %优化参数的个数
    % Range;      %优化参数的范围,num行,2列,每行对应一个参数范围
    % precision=5;%每个优化参数的精度,精确到小数点后第几位
    n=num*precision*10+1;%n表示城市个数,一共产生num个数,每个数有precision位精度,每位精度有10个可能值;第一个城市为起始城市
    D=zeros(n,n);	%D表示完全图的赋权邻接矩阵
    % NC_max=50;    %最大迭代次数
    % m=1000;       %蚂蚁个数
    % Rho=0.2;      %信息素蒸发系数
    % Q=0.5;        %信息素增加强度系数,小于1
    % K=5;          %信息素的权重系数
    R_best=zeros(NC_max,floor(n/10+1)); %各代最佳路线
    x=0;
    fx_best=inf;
    fx_ave=zeros(NC_max,1);  %各代路线的平均长度
    
    %% 第一步:变量初始化
    %构造D
    D(1,1)=eps;
    for i=2:n
        if i<=11
            D(1,i)=1;
        else
            D(1,i)=inf;
        end
        D(i,1)=inf;
    end
    for i1=1:num
        for i2=1:precision
            for i3=1:10
                i=(i1-1)*precision*10+(i2-1)*10+i3+1;
                for j1=1:num
                    for j2=1:precision
                        for j3=1:10
                            j=(j1-1)*precision*10+(j2-1)*10+j3+1;
                            if i==j
                                D(i,j)=eps; %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示
                            else
                                if i1==j1 && i2==j2-1 || (i1==j1-1 && j2==1 && i2==precision)
                                    D(i,j)=1;
                                else D(i,j)=inf;
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    % Eta=1./D;   %Eta为启发因子,这里设为距离的倒数
    Tau=5*ones(n,n);  %Tau为信息素矩阵
    Tabu=zeros(m,floor(n/10+1));    %存储并记录路径的生成
    NC=1;   %迭代计数器
    
    while NC<=NC_max    %停止条件之一:达到最大迭代次数
        %% 第二步:将m只蚂蚁放到初始城市上
        for i=1:m
            Tabu(i,1)=1;
        end
        %% 第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游
        for j=2:n/10+1   %所在城市不计算
            for i=1:m
                last_city=Tabu(i,j-1);
                P=zeros(1,10);%概率分布
                next_line=ceil((last_city-1)/10)*10+2;%待访问的城市的第一个,即待访问的城市编号为:J到J+9
                %下面计算待选城市的概率分布
                p=0;
                for k=next_line:next_line+9
                    if D(last_city,k)==1
                        p=p+Tau(last_city,k);
                    end
                end
                for k=next_line:next_line+9
                    if D(last_city,k)==1
                        P(k-next_line+1)=Tau(last_city,k)/p;
                    end
                end
                %按 概率原则 选取下一个城市
                Pcum=cumsum(P); %cumsum,求序列的和序列
                Select=find(Pcum>=rand);    %若计算的概率大于原来的就选择这条路线
                to_visit=next_line+Select(1)-1;
                Tabu(i,j)=to_visit;
            end
        end
        %杀死第一只蚂蚁,取而代之的是之前的迭代中最优的蚂蚁
        if NC>=2
            Tabu(1,:)=R_best(NC-1,:);
        end
        %% 第四步:记录本次迭代最佳路线
        data=zeros(m,num);   %m只蚂蚁,每只蚂蚁对应num个数。data记录各优化参数
        fx=zeros(m,1);  %保存优化函数值
        pos=0;  %保存本次迭代取到最优的位置
        for i=1:m
            R=Tabu(i,2:end)-floor((Tabu(i,2:end)-2)./10)*10-2;%R记录各个城市对应的数,0~9
            for j=1:num
                sum=0.0;
                for k=1:precision
                    sum=sum/10+R((j-1)*precision+k)/10;
                end
                sum=sum*(Range(j,2)-Range(j,1))+Range(j,1);
                data(i,j)=sum;
            end
            fx(i,1)=f(data(i)); %求该优化参数对应的优化函数值
            if fx(i)<=fx_best
                x=data(i);
                fx_best=fx(i);
                pos=i;
            end
        end
        R_best(NC,:)=Tabu(pos,:);    %此轮迭代后的最佳路线
        fx_ave(NC)=fx(pos);%mean(fx);
        NC=NC+1
    	%% 第五步:更新信息素
        Delta_Tau=zeros(n,n);   %开始时信息素为n*n的0矩阵
        for i=1%:size(pos,2)    %如果每轮迭代保存前若干优的路径,则要用到这一句
            for j=1:(n/10-1)
                Delta_Tau(Tabu(pos(i),j),Tabu(pos(i),j+1))=K*Q^(fx(i)-fx_best);   %此次循环在路径(i,j)上的信息素增量
                if Tabu(pos(i),j+1)-1>0 && D(Tabu(pos(i),j),Tabu(pos(i),j+1)-1)==1
                    Delta_Tau(Tabu(pos(i),j),Tabu(pos(i),j+1)-1)=K*Q^(fx(i)-fx_best)/4;
                end
                if Tabu(pos(i),j+1)+1<n && D(Tabu(pos(i),j),Tabu(pos(i),j+1)+1)==1
                    Delta_Tau(Tabu(pos(i),j),Tabu(pos(i),j+1)+1)=K*Q^(fx(i)-fx_best)/4;
                end
            end
        end
        Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素
        %% 第六步:禁忌表清零
        Tabu=zeros(m,floor(n/10+1));
    end
    %% 第七步:输出结果
    x
    fx_best
    figure;
    plot(fx_ave,'r')
    % hold on;    %保持图形
    % plot(R_best,'b');
    title('平均');  %标题

    总结

    第一次接触十进制蚁群算法在文献[3]中,是用于解决月球着陆轨迹问题的,原文为了求优化目标(函数)的优化变量(另一个函数),采用参数化方法,用蚁群算法生成了十几个优化参数,拟合出优化变量,再对优化目标进行计算、评价,反馈。较为复杂。

    文献[3]在蚁群算法方面引用了文献[5]。文献[5]详细介绍了用于连续函数优化的十进制蚁群算法,与本文所讲整体思想一致,但细节上略有不同。值得一提的是,局部搜索增强策略是文献[3]所提,在连续函数优化上不失为一个良策。

    参考文献

    [1]百度百科http://baike.baidu.com/view/539346.htm?fr=aladdin

    [2]杜利峰,牛永洁. 蚁群算法在MATLAB中的实现[J]. 信息技术,2011,06:115-118.

    [3]段佳佳,徐世杰,朱建丰. 基于蚁群算法的月球软着陆轨迹优化[J]. 宇航学报,2008,02:476-481+488.

    [4]蚁群算法代码http://blog.csdn.net/lyp2003ok/article/details/3706247

    [5]陈烨. 用于连续函数优化的蚁群算法[J].四川大学学报(工程科学版),2004,06:117-120.

    展开全文
  • 集粒度计算、蚁群算法与模糊思想的聚类算法.pdf
  • 个人改进的蚁群算法,借鉴了最大最小蚁群算法思想并加入动态重组算子
  • 1、蚁群算法的背景 2、蚁群算法的提出 3、蚁群算法的特征 4、蚁群算法的基本思想 5、蚁群算法的数学模型 6、应用举例
  • 蚁群算法详解(含例程)

    万次阅读 多人点赞 2020-10-31 20:00:36
    蚁群算法详解(含例程)

    该篇博客为课程学习的笔记,含一个例子可以帮助理解蚁群算法,主要为理论知识的总结。

    1.算法简介

    1991年意大利米兰理学院M. Dorigo提出Ant System, 用于求解TSP等组合优化问题,这是一种模拟蚂蚁觅食行为的优化算法。

    蚂蚁在运动过程中, 能够在它所经过的路径上留下外激素,而且蚂蚁在运动过程中能够感知外激素的存在及其强度,并以此指导自己的运动方向, 蚂蚁倾向于朝着外激素强度高的方向移动.由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象: 某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大. 蚂蚁个体之间就是通过这种信息的交流达到搜索食物的目的。

    举一个例子来进行说明:
    在这里插入图片描述
    蚂蚁从A点出发,速度相同,食物在D点,可能随机选择路线ABD或ACD。假设初始时每条分配路线一只蚂蚁,每个时间单位行走一步,本图为经过9个时间单位时的情形:走ABD的蚂蚁到达终点,而走ACD的蚂蚁刚好走到C点,为一半路程。

    经过18个时间单位时的情形:走ABD的蚂蚁到达终点后得到食物又返回了起点A,而走ACD的蚂蚁刚好走到D点。
    在这里插入图片描述
    假设蚂蚁每经过一处所留下的信息素为一个单位,则经过36个时间单位后,所有开始一起出发的蚂蚁都经过不同路径从D点取得了食物,此时ABD的路线往返了2趟,每一处的信息素为4个单位,而ACD的路线往返了一趟,每一处的信息素为2个单位,其比值为2:1
    寻找食物的过程继续进行,则按信息素的指导,蚁群在ABD路线上增派一只蚂蚁(共2只),而ACD路线上仍然为一只蚂蚁。再经过36个时间单位后,两条线路上的信息素单位积累为12和4,比值为3:1。
    若按以上规则继续,蚁群在ABD路线上再增派一只蚂蚁(共3只),而ACD路线上仍然为一只蚂蚁。再经过36个时间单位后,两条线路上的信息素单位积累为24和6,比值为4:1。
    若继续进行,则按信息素的指导,最终所有的蚂蚁会放弃ACD路线,而都选择ABD路线。这也就是前面所提到的正反馈效应。

    基于以上蚁群寻找食物时的最优路径选择问题,可以构造人工蚁群,来解决最优化问题,如TSP问题。

    人工蚁群和自然蚁群的区别

    1. 人工蚁群有一定的记忆能力,能够记忆已经访问过的节点;
    2. 人工蚁群选择下一条路径的时候是按一定算法规律有意识地寻找最短路径,而不是盲目的。例如在TSP问题中,可以预先知道当前城市到下一个目的地的距离。
      在这里插入图片描述

    2.Ant System(蚂蚁系统)

    蚂蚁系统是以TSP作为应用实例提出的,是最基本的ACO(Ant Colony algorithm)算法,下面以AS求解TSP问题的基本流程为例描述蚁群优化算法的工作机制
    首先对于TSP问题的数学模型如下:
    在这里插入图片描述
    AS算法求解TSP问题有两大步骤:路径构建与信息素更新方式。

    2.1 路径构建

    每个蚂蚁都随机选择一个城市作为其出发城市,并维护一个路径记忆向量,用来存放该蚂蚁依次经过的城市。 蚂蚁在构建路径的每一步中,按照一个随机比例规则选 择下一个要到达的城市。
    随机比例规则如下:
    在这里插入图片描述

    2.2 信息素更新

    在这里插入图片描述
    此处的 C n n C^{nn} Cnn表示最短路径的长度。

    为了模拟蚂蚁在较短路径上留下更多的信息素,当所有蚂蚁到达终点时,必须把各路径的信息素浓度重新更新一次,信息素的更新也分为两个部分:
    首先,每一轮过后,问题空间中的所有路径上的信息素都会发生蒸发,然后,所有的蚂蚁根据自己构建的路径长度在它们本轮经过的边上释放信息素
    在这里插入图片描述
    在这里插入图片描述
    信息素挥发(evaporation)信息素痕迹的挥发过程是每个连接上的信息素痕迹的浓度自动逐渐减弱的过程,这个挥发过程主要用于避免算法过快地向局部最优区域集中,有助于搜索区域的扩展。
    信息素增强(reinforcement)增强过程是蚁群优化算法中可选的部分,称为离线更新方式(还有在线更新方式)。这种方式可以实现 由单个蚂蚁无法实现的集中行动。基本蚁群算法的离线更新方式是在蚁群中的m只蚂蚁全部完成n城市的访问后,统一对残留信息进行更新处理。

    下面以一个例子进行说明
    在这里插入图片描述
    其中矩阵D表示各城市间的距离
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    一般蚁群算法的框架和上述算法大致相同,有三个组成部分:蚁群的活动;信息素的挥发;信息素的增强;主要体现在转移概率公式信息素更新公式的不同。

    3. 改进的蚁群算法

    上述基本的AS算法,在不大于75城市的TSP中,结果还是较为理想的,但是当问题规模扩展时, AS的解题能力大幅度下降。进而提出了一些改进版本的AS算法,这些AS改进版本的一个共同点就是增强了蚂蚁搜索过程中对最优解的探索能力,它们之间的差异仅在于搜索控制策略方面。

    3.1 精英策略的蚂蚁系统(Elitist Ant System, EAS)

    • AS算法中,蚂蚁在其爬过的边上释放与其构建路径长度成反比的信息素量,蚂蚁构建的路径越好,则属于路径的各个边上的所获得的信息素量就越多,这些边以后在迭代中被蚂蚁选择的概率也就越大。
    • 我们可以想象,当城市的规模较大时,问题的复杂度呈指数级增长,仅仅靠这样一个基础单一的信息素更新机制引导搜索偏向,搜索效率有瓶颈。

    因而精英策略(Elitist Strategy) 被提出,这是一种较早的改进方法,通过一种“额外的手段”强化某些最有可能成为最优路径的边,让蚂蚁的搜索范围更快、更正确的收敛。

    • 在算法开始后即对所有已发现的最好路径给予额外的增强,并将随后与之对应的行程记为Tb(全局最优行程);
    • 当进行信息素更新时,对这些行程予以加权,同时将经过这些行程的蚂蚁记为“精英”,从而增大较好行程的选择机会。

    其信息素的更新方式如下:
    在这里插入图片描述

    3.2 基于排列的蚂蚁系统(Rank-based AS, ASrank )

    精英策略被提出后,人们提出了在精英策略的基础上,对其余边的信息素更新机制加以改善
    在这里插入图片描述

    3.3 最大最小蚂蚁系统(MAX-MIN Ant System, MMAS)

    首先思考几个问题:
    问题一:对于大规模的TSP,由于搜索蚂蚁的个数有限,而初始化时蚂蚁的分布是随机的,这会不会造成蚂蚁只搜索了所有路径 中的小部分就以为找到了最好的路径,所有的蚂蚁都很快聚集在 同一路径上,而真正优秀的路径并没有被搜索到呢?
    问题二:当所有蚂蚁都重复构建着同一条路径的时候,意味着算法的已经进入停滞状态。此时不论是基本AS、EAS还是ASrank , 之后的迭代过程都不再可能有更优的路径出现。这些算法收敛的 效果虽然是“单纯而快速的”,但我们都懂得欲速而不达的道理, 我们有没有办法利用算法停滞后的迭代过程进一步搜索以保证找 到更接近真实目标的解呢?

    对于MAX-MIN Ant System
    1.该算法修改了AS的信息素更新方式,只允许迭代最优蚂蚁(在本次迭代构建出最短路径的蚂蚁),或者至今最优蚂蚁释放信息素;
    2.路径上的信息素浓度被限制在[MAX,MIN ]范围内;
    3.另外,信息素的初始值被设为其取值上限,这样有助于增加算法初始阶段的搜索能力。
    4.为了避免搜索停滞,问题空间内所有边上的信息素都会被重新初始化。

    改进1借鉴于精华蚂蚁系统,但又有细微的不同。

    • 在EAS中,只允许至今最优的蚂蚁释放信息素,而在MMAS中,释放信息素的不仅有可能是至今最优蚂蚁,还有可能是迭代最优蚂蚁。
    • 实际上,迭代最优更新规则和至今最优更新规则在MMAS中是交替使用的。
    • 这两种规则使用的相对频率将会影响算法的搜索效果。
    • 只使用至今最优更新规则进行信息素的更新,搜索的导向性很强,算法会很快的收敛到Tb附近;反之,如果只使用迭代最优更新规则,则算法的探索能力会得到增强,但搜索效率会下降。

    改进2是为了避免某些边上的信息素浓度增长过快,出现算法早熟现象。

    • 蚂蚁是根据启发式信息和信息素浓度选择下一个城市的。
    • 启发式信息的取值范围是确定的。
    • 当信息素浓度也被限定在一个范围内以后,位于城市i的蚂蚁k选择城市j作为下一个城市的概率pk(i,j)也将被限制在一个区间内。

    改进3,使得算法在初始阶段,问题空间内所有边上的信息素均被初始化τmax的估计值,且信息素蒸发率非常小(在MMAS中,一般将蒸发率设为0.02)。

    • 算法的初始阶段,不同边上的信息素浓度差异只会缓慢的增加,因此,MMAS在初始阶段有着较基本AS、EAS和ASrank更强搜索能力。
    • 增强算法在初始阶段的探索能力有助于蚂蚁“视野开阔地”进行全局范围内的搜索,随后再逐渐缩小搜索范围,最后定格在一条全局最优路径上。

    之前的蚁群算法,包括AS、EAS以及ASrank,都属于“一次性探索”,即随着算法的执行,某些边上的信息素量越来越小,某些路径被选择的概率也越来越小,系统的探索范围不断减小直至陷入停滞状态。

    • MMAS中改进4,当算法接近或者是进入停滞状态时,问题空间内所有边上的信息素浓度都将被初始化,从而有效的利用系统进入停滞状态后的迭代周期继续进行搜索,使算法具有更强的全局寻优能力。

    4.蚁群系统(Ant Colony System)

    上述EAS、ASrank 以及MMAS都是对AS进行了少量的修改而获得了更好的性能。1997年,蚁群算法的创始人Dorigo在Ant colony system:a cooperative learning approach to the traveling salesman problem一文中提出了一种新的具有全新机制的ACO 算法——蚁群系统,是蚁群算法发展史上的又一里程碑。

    ACS与AS之间存在三方面的主要差异:
    1.使用一种伪随机比例规则选择下一个城市节点, 建立开发当前路径与探索新路径之间的平衡。
    2.信息素全局更新规则只在属于至今最优路径的边上蒸发和释放信息素。
    3.新增信息素局部更新规则,蚂蚁每次经过空间内的某条边,他都会去除该边上的一定量的信息素,以增加后续蚂蚁探索其余路径的可能性。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5.算法应用

    在这里插入图片描述
    背包问题
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    系数的确定
    在这里插入图片描述
    蚁群大小
    一般情况下蚁群中蚂蚁的个数不超过TSP图中节点的个数。
    终止条件
    1 给定一个外循环的最大数目,表明已经有足够的蚂蚁工作;
    2 当前最优解连续K次相同而停止,其中K是一个给定的整数,表示算法已经收敛,不再需要继续;
    3 目标值控制规则,给定优化问题(目标最小化)的一个下界和一个误差值,当算法得到的目标值同下界之差小于给定的误差值时,算法 终止。

    信息素的更新分为离线和在线两种方式
    离线方式(同步更新方式):在若干只蚂蚁完成n个城市的访问后,统一对残留信息进行更新处理。
    信息素的在线更新(异步更新方式):蚂蚁每行走一步,立即回溯并且更新行走路径上的信息素。

    在这里插入图片描述
    在这里插入图片描述
    EAS算法是典型的离线信息素更新方式。该算法中,蚁群中蚂蚁的先后出行顺序没有相关性,但是每次循环需要记忆m只蚂蚁的行走路径,以进行比较选择最优路径。相对而言,单蚂蚁离线更 新方式记忆信息少,只需要记忆第s只蚂蚁的路径,并通过信息素更新后,释放该蚂蚁的所有记录信息。实际上这种方式等价于蚁 群离线方式中只有一只蚂蚁。

    在这里插入图片描述
    在这里插入图片描述
    小结
    随着群智能理论和应用算法研究的不断发展,研究者已尝试着将其用于各种工程优化问题,并取得了意想不到的收获。多种研究表明,群智能在离散求解空间和连续求解空间中均表现出良好的搜索效果,并在组合优化问题中表现突出。
    蚁群优化算法并不是旅行商问题的最佳解决方法,但是它却为解决组合优化问题提供了新思路,并很快被应用到其它组合优化问题中。比较典型的应用研究包括:网络路由优化、数据挖掘以及一些经典的组合优化问题。

    附:蚁群算法的应用场景

    蚁群算法在电信路由优化中的应用:

    蚁群算法在电信路由优化中已取得了一定的应用成果。HP公司和英国电信公司在90年代中后期都开展了这方面的研究,设计了蚁群路由算法(Ant Colony Routing, ACR)。每只蚂蚁就像蚁群优化算法中一样,根据它在网络上的经验与性能,动态更新路由表项。如果一只蚂蚁因为经过了网络中堵塞的路 由而导致了比较大的延迟,那么就对该表项做较大的增强。同时根 据信息素挥发机制实现系统的信息更新,从而抛弃过期的路由信息。 这样,在当前最优路由出现拥堵现象时,ACR算法就能迅速的搜寻另一条可替代的最优路径,从而提高网络的均衡性、负荷量和利用 率。目前这方面的应用研究仍在升温,因为通信网络的分布式信息 结构、非稳定随机动态特性以及网络状态的异步演化与ACO的算法本质和特性非常相似。

    蚁群算法聚类问题的应用:

    基于群智能的聚类算法起源于对蚁群蚁卵的分类研究。Lumer和Faieta将Deneubourg提出将蚁巢分类模型应用于数据聚类分析。其基本思想是将待聚类数据随机地散布到一个二维平面内,然后 将虚拟蚂蚁分布到这个空间内,并以随机方式移动,当一只蚂蚁 遇到一个待聚类数据时即将之拾起并继续随机运动,若运动路径 附近的数据与背负的数据相似性高于设置的标准则将其放置在该 位置,然后继续移动,重复上述数据搬运过程。按照这样的方法 可实现对相似数据的聚类。

    蚁群算法在组合优化问题中的应用:

    ACO还在许多经典组合优化问题中获得了成功的应用,如二次规划问题(QAP)、机器人路径规划、作业流程规划、图着色(Graph Coloring)等问题。 经过多年的发展,ACO已成为能够有效解决实际二次规划问题的几种重要算法之一。AS在作业流程计划(Job-shop Scheduling)问题中的应用实例已经出现,这说明了AS在此领域的应用潜力。利用MAX-MIN AS解决QAP也取得了比较理想的效果,并通过实验中的计算数据证明采用该方法处理QAP比较早的SA算法更好,且与禁忌搜索算法性能相当。利用ACO实现对生产流程和特料管理的综合优化,并通过与遗传、模拟退火和禁忌搜索算法的比较证明了ACO的工程应用价值。

    其他应用方面:

    武器攻击目标分配和优化问题
    车辆运行路径规划
    区域性无线电频率自动分配
    Bayesian networks的训练
    集合覆盖
    Costa和Herz还提出了一种AS在规划问题方面的扩展应用——图着色问题,取得了与其他启发式算法相似的效果。

    推荐
    蚁群算法其他优秀博客
    https://blog.csdn.net/qq_33829154/article/details/85258615

    展开全文
  • 蚁群算法大 纲蚁群算法的起源蚁群行为描述蚁群算法的基本思想基本蚁群算法的系统学特征TSP问题描述基本蚁群算法的数学模型基本蚁群算法的应用举例总结蚁群算法起源蚁群算法(ant colony optimization, ACO)Dorigo M于...
  • 讲述运用蚁群算法思想求解TSP问题的原理和方法,对求解TSP问题有帮助
  • 蚁群算法详解

    千次阅读 2020-09-22 19:04:00
    没有中心化的组织,蚁群何以进行高效地搜寻呢?一个快递小哥有5个包裹要送,如何确定一条最短的行进路线?本文我们一起学下常用于路径优化的蚁群算法,主要内容如下:蚁群算法简介蚁群算法原理蚁群算...

    没有中心化的组织,蚁群何以进行高效地搜寻呢?一个快递小哥有5个包裹要送,如何确定一条最短的行进路线?

    本文我们一起学下常用于路径优化的蚁群算法,主要内容如下:

    • 蚁群算法简介

    • 蚁群算法原理

    • 蚁群算法实例

    1.蚁群算法简介

    如何寻找一条合适的路径,几乎是一个永恒的话题。每个人、每天都会遇到。大到全国列车的运行规划,小到每个人的手机导航。其中一部分是关于“如何寻找两个位置间的最短距离”的,这一部分有较为成熟的理论与确切的解法,还有与之匹配的各种算法。

    蚁群系统(Ant System(AS)Ant Colony System(ACS))是由意大利学者DorigoManiezzo等人于20世纪90年代首先提出来的。他们在研究蚂蚁觅食的过程中,发现蚁群整体会体现一些智能的行为,例如蚁群可以在不同的环境下,寻找最短到达食物源的路径。

    后经进一步研究发现,这是因为蚂蚁会在其经过的路径上释放一种可以称之为“信息素(pheromone)”的物质,蚁群内的蚂蚁对“信息素”具有感知能力,它们会沿着“信息素”浓度较高路径行走,而每只路过的蚂蚁都会在路上留下“信息素”,这就形成一种类似正反馈的机制,这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了。

    由上述蚂蚁找食物模式演变来的算法,即是蚁群算法。这种算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。在数字时代背景下,蚁群算法在网络路由中的应用受到越来越多学者的关注,并提出了一些新的基于蚂蚁算法的路由算法。

    同传统的路由算法相比较,该算法在网络路由中具有信息分布式性、动态性、随机性和异步性等特点,而这些特点正好能满足网络路由的需要。

    2.蚁群算法原理

    蚁群算法是从自然界中真实蚂蚁觅食的群体行为得到启发而提出的,其很多观点都来源于真实蚁群,因此算法中所定义的人工蚂蚁与真实蚂蚁存在一定的辩证关系。

    自组织行为特征

    蚁群的自组织行为特征主要有:

    • 高度结构化的组织
      虽然蚂蚁的个体行为极其简单,但由个体组成的蚁群却构成高度结构化的社会组织,蚂蚁社会的成员有分工,有相互的通信和信息传递。

    • 自然优化
      蚁群在觅食过程中,在没有任何提示下总能找到从蚁巢到食物源之间的最短路径;当经过的路线上出现障碍物时,还能迅速找到新的最优路径。

    • 信息正反馈
      蚂蚁在寻找食物时,在其经过的路径上释放信息素(外激素)。蚂蚁基本没有视觉,但能在小范围内察觉同类散发的信息素的轨迹,由此来决定何去何从,并倾向于朝着信息素强度高的方向移动。

    • 自催化行为
      某条路径上走过的蚂蚁越多,留下的信息素也越多(随时间蒸发一部分),后来蚂蚁选择该路径的概率也越高。

    算法基本思想

    1. 根据具体问题设置多只蚂蚁,分头并行搜索。

    2. 每只蚂蚁完成一次周游后,在行进的路上释放信息素,信息素量与解的质量成正比。

    3. 蚂蚁路径的选择根据信息素强度大小(初始信息素量设为相等),同时考虑两点之间的距离,采用随机的局部搜索策略。这使得距离较短的边,其上的信息素量较大,后来的蚂蚁选择该边的概率也较大。

    4. 每只蚂蚁只能走合法路线(经过每个城市1次且仅1次),为此设置禁忌表来控制。

    5. 所有蚂蚁都搜索完一次就是迭代一次,每迭代一次就对所有的边做一次信息素更新,原来的蚂蚁死掉,新的蚂蚁进行新一轮搜索。

    6. 更新信息素包括原有信息素的蒸发和经过的路径上信息素的增加。

    7. 达到预定的迭代步数,或出现停滞现象(所有蚂蚁都选择同样的路径,解不再变化),则算法结束,以当前最优解作为问题的最优解。

    了解了基本思想,我们来关注几个必须得知道的问题:上述第2步中,蚂蚁完成一次周游后各路径上的信息素怎么计算?计算公式如下:

    其中, 为边 上的信息素量,刚开始时 为本次迭代边 上的信息素增量, 为第k只蚂蚁在本次迭代中留在边 上的信息素量, 为信息素挥发系数。Q是正常数,m是蚂蚁数量,n是城市数量, 为蚂蚁k在本次周游中所走路径的长度。

    第三步中蚂蚁的转移概率计算公式如下:

    其中 为信息素的相对重要程度, 为启发式因子的相对重要程度,而 是蚂蚁k下一步允许选择的城市集合。
    为启发式因子,反应蚂蚁由城市i转移到城市j的启发程度, 为城市 之间的距离。

    算法步骤

    我们了解了信息素计算公式和蚂蚁的转移概率之后,看下具体流程图如下:

    1. 初始化参数:开始时,每条边的信息素量都相等,即: .

    2. 将各只蚂蚁放置各顶点,禁忌表为对应的顶点。

    3. 1只蚂蚁,计算转移概率 ,按照轮盘赌的方式选择下一个顶点,更新禁忌表,再计算概率,再选择顶点,再更新禁忌表,直至遍历所有顶点一次。

    4. 计算该只蚂蚁留在各边的信息素量 ,该蚂蚁死去。

    5. 重复3-4步,直至m只蚂蚁都周游完毕。

    6. 计算各边的信息素增量 和信息素量

    7. 计算本次迭代的路径,更新当前的最优路径,清空禁忌表。

    8. 判断是否达到预定的迭代步数,或者是否出现停滞现象,若是则算法结束,输出当前最优路径,否则转到步骤2,进行下一次迭代。

    算法特点

    与其他优化算法相比,蚁群算法具有以下几个特点:

    • 采用正反馈机制,使得搜索过程不断收敛,最终逼近最优解。

    • 每个个体可以通过释放信息素来改变周围的环境,且每个个体能够感知周围环境的实时变化,个体间通过环境进行间接地通讯。

    • 搜索过程采用分布式计算方式,多个个体同时进行并行计算,大大提高了算法的计算能力和运行效率。

    • 启发式的概率搜索方式不容易陷入局部最优,易于寻找到全局最优解。

    3.蚁群算法实例

    该算法应用于其他组合优化问题,如旅行商问题、指派问题、Job—shop调度问题、车辆路由问题、图着色问题和网络路由问题等。

    知道了上面的算法原理,我们来看下开头的那个问题,一个快递小哥有5个包裹要送,如何确定一条最短的行进路线?

    假设由于某种原因,城市道路均是单行道,即A->BB->A的距离不相同,也就是说这是一个不对称的TSP问题。现在城市距离信息如下表:

    设置参数: 为禁忌表,那么第一次迭代第一只蚂蚁周游如下:

    第一次迭代第二只蚂蚁周游如下:

    依次类推,第一次迭代完成之后,我们得到信息素矩阵如下:

    接着进行第二次迭代,第二次迭代第一只蚂蚁周游如下:

    依次类推,发现第二次迭代的时候,假如五只蚂蚁走的是同一条路,那么算法收敛结束。最优路径为A->E->D->C->B->A,最优路径的距离为9.

    至此,我们从蚁群算法的简介,原理以及实例方面对蚁群算法进行了详细的阐述,希望对大家有所帮助。

    ♥点个赞再走呗♥

    展开全文
  • 真正的蚁群算法

    2014-03-12 10:32:55
    网上找到有些所谓的蚁群算法 其实是蚂蚁算法 算不成群的概念 这里基本称得上蚁群算法 借鉴了一个算法 添加了局部信息素更新 更改了全局信息素只对最优路径更新 借鉴了伪随机思想 避免局部最优 不断改进中 希望大家0...
  • 转(蚁群算法

    2019-09-19 00:14:01
    接下来便为大家简单介绍蚁群算法的基本思想蚁群算法,顾名思义就是根据蚁群觅食行为而得来的一种算法。单只蚂蚁的觅食行为貌似是杂乱无章的,但是据昆虫学家观察,蚁群在觅食时总能够找到离食物最近的...
  • 分析了传感器管理的目标分配问题各种解算方法的特点及存在的问题,结合蚁群算法思想,提出了一种新型的目标分配算法模型,并进行了算法仿真。仿真结果表明,基于蚁群算法思想的目标分配算法是有效的,特别是问题规模...
  • 蚁群算法理论介绍

    2019-06-03 10:08:46
    蚁群算法是啥呢,是启发式算法的一种。目前很多启发式算法都与仿生学有关,所以很明显,蚁群算法也是这个类别。这个蚁群算法的灵感呢就是蚂蚁在寻找食物过程中发现路径的行为。 接下来就正式开始学习蚁群算法! ...
  • 蚁群算法蚂蚁如何找到最短路径蚁群算法特征基本思想数学模型(以TSP问题为例子)初始化选择路径更新信息输出结果蚁群大小终止条件蚁群算法的基本思想(总结)蚁群算法的改进优化带精英策略的蚂蚁(AS)蚁群系统(ACS...
  • 蚁群算法matlab

    千次阅读 多人点赞 2018-09-12 16:49:55
    (一)蚁群算法的由来 蚁群算法最早是由Marco...蚁群算法的基本思想来源于自然界蚂蚁觅食的最短路径原理,根据昆虫科学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它们可以在没有任何提示的情况下找到从食物源到...
  • 蚁群算法 图着色问题

    2015-11-19 09:35:02
    主要介绍了蚁群算法的基本思想,及其在图着色方面的应用
  • 蚁群算法聚类分析

    2021-07-07 00:16:49
    蚁群算法优点2. 聚类数目已知的蚁群聚类算法3. 聚类数目未知的蚁群聚类算法 1. 蚁群算法 基本思想 优点 缺点 通常需要较长的搜索时间 2. 聚类数目已知的蚁群聚类算法 3. 聚类数目未知的蚁群聚类算法 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,136
精华内容 1,254
关键字:

蚁群算法思想