计算智能_蚁群算法

姓名:高洁

学号:19021210933

转载自:https://blog.csdn.net/XYYHHH11/article/details/102917942

【嵌牛导读】蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而蚂蚁在运动过程中能够感知这种物质,并以此指导自己的运动方向。

【嵌牛鼻子】蚁群算法 信息素重要程度因子 启发函数重要程度因子 信息素挥发因子 

【嵌牛提问】蚁群算法的原理是什么?该算法如何实现?

【嵌牛正文】

1、基本原理

    蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的 一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路 径上留下信息素(pheromone)的物质进行信息传递,而蚂蚁在运动过程中能够感知这种物质,并以此指导自己的 运动方向。由大量蚂蚁组成的蚁群集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。

2、基本概念和流程

    在ACO 算法中,人工蚂蚁实际上代表的是一个解的随机构建过程,从最初的空解开始,通过不断地向部分解添加解的成分而构建出一个完整的解。

    • 解的构建:每只蚂蚁最初都从随机选择出来的城市出发,每经过一次迭代蚂蚁就向解中添加一个还没有访问过的城市。当所有城市都被蚂蚁访问过之后,解的构建就终止。对于每只蚂蚁k,路径记忆向量按照访问顺序记录了所有k已经经过的城市序号。设蚂蚁k当前所在城市为i, 则其选择城市j作为下一个访问对象的概率为:

图1 访问下一个对象的概率

    • 信息素更新:这里m是蚂蚁个数, ρ是信息素的蒸发率,规定0≤ρ≤1,在AS中通常设置为ρ=0.5,△ζij是第k只蚂蚁在它经过的边上释放的信息素量,它等于蚂蚁k本轮构建路径长度的倒数。C表示路径长度,它是Rk中所有边的长度和。

图2 信息素更新公式

3、流程图和伪代码

图3 蚁群算法流程图

4、代码实现

%% 导入数据

load citys_data.mat

%% 计算城市间相互距离

fprintf('Computing Distance Matrix... \n');

n = size(citys,1);

D = zeros(n,n);

for i = 1:n

    for j = 1:n

        if i ~= j

            D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));

        else

            D(i,j) = 1e-4;     

        end

    end   

end

%% 初始化参数

fprintf('Initializing Parameters... \n');

m = 75;                              % 蚂蚁数量

alpha = 1;                          % 信息素重要程度因子

beta = 5;                            % 启发函数重要程度因子

rho = 0.5;                          % 信息素挥发因子

Q = 1;                              % 常系数

Eta = 1./D;                          % 启发函数

Tau = ones(n,n);                    % 信息素矩阵

Table = zeros(m,n);                  % 路径记录表

iter = 1;                            % 迭代次数初值

iter_max = 160;                      % 最大迭代次数

Route_best = zeros(iter_max,n);      % 各代最佳路径     

Length_best = zeros(iter_max,1);    % 各代最佳路径的长度 

Length_ave = zeros(iter_max,1);      % 各代路径的平均长度 

%% 迭代寻找最佳路径

figure;

while iter <= iter_max

    fprintf('迭代第%d次\n',iter);

    % 随机产生各个蚂蚁的起点城市

      start = zeros(m,1);

      for i = 1:m

          temp = randperm(n);

          start(i) = temp(1);

      end

      Table(:,1) = start;

      % 构建解空间

      citys_index = 1:n;

      % 逐个蚂蚁路径选择

      for i = 1:m

          % 逐个城市路径选择

        for j = 2:n

            tabu = Table(i,1:(j - 1));          % 已访问的城市集合(禁忌表)

            allow_index = ~ismember(citys_index,tabu);

            allow = citys_index(allow_index);  % 待访问的城市集合

            P = allow;

            % 计算城市间转移概率

            for k = 1:length(allow)

                P(k) = Tau(tabu(end),allow(k))^alpha * Eta(tabu(end),allow(k))^beta;

            end

            P = P/sum(P);

            % 轮盘赌法选择下一个访问城市

            Pc = cumsum(P);   

            target_index = find(Pc >= rand);

            target = allow(target_index(1));

            Table(i,j) = target;

        end

      end

      % 计算各个蚂蚁的路径距离

      Length = zeros(m,1);

      for i = 1:m

          Route = Table(i,:);

          for j = 1:(n - 1)

              Length(i) = Length(i) + D(Route(j),Route(j + 1));

          end

          Length(i) = Length(i) + D(Route(n),Route(1));

      end

      % 计算最短路径距离及平均距离

      if iter == 1

          [min_Length,min_index] = min(Length);

          Length_best(iter) = min_Length; 

          Length_ave(iter) = mean(Length);

          Route_best(iter,:) = Table(min_index,:);

      else

          [min_Length,min_index] = min(Length);

          Length_best(iter) = min(Length_best(iter - 1),min_Length);

          Length_ave(iter) = mean(Length);

          if Length_best(iter) == min_Length

              Route_best(iter,:) = Table(min_index,:);

          else

              Route_best(iter,:) = Route_best((iter-1),:);

          end

      end

      % 更新信息素

      Delta_Tau = zeros(n,n);

      % 逐个蚂蚁计算

      for i = 1:m

          % 逐个城市计算

          for j = 1:(n - 1)

              Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);

          end

          Delta_Tau(Table(i,n),Table(i,1)) = Delta_Tau(Table(i,n),Table(i,1)) + Q/Length(i);

      end

      Tau = (1-rho) * Tau + Delta_Tau;

    % 迭代次数加1,清空路径记录表

%  figure;

%最佳路径的迭代变化过程

    [Shortest_Length,index] = min(Length_best(1:iter));

    Shortest_Route = Route_best(index,:);

    plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...

    [citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');

    pause(0.3);

    iter = iter + 1;

    Table = zeros(m,n);

% end

end

%% 结果显示

[Shortest_Length,index] = min(Length_best);

Shortest_Route = Route_best(index,:);

disp(['最短距离:' num2str(Shortest_Length)]);

disp(['最短路径:' num2str([Shortest_Route Shortest_Route(1)])]);

%% 绘图

figure(1)

plot([citys(Shortest_Route,1);citys(Shortest_Route(1),1)],...

    [citys(Shortest_Route,2);citys(Shortest_Route(1),2)],'o-');

grid on

for i = 1:size(citys,1)

    text(citys(i,1),citys(i,2),['  ' num2str(i)]);

end

text(citys(Shortest_Route(1),1),citys(Shortest_Route(1),2),'      起点');

text(citys(Shortest_Route(end),1),citys(Shortest_Route(end),2),'      终点');

xlabel('城市位置横坐标')

ylabel('城市位置纵坐标')

title(['蚁群算法优化路径(最短距离:' num2str(Shortest_Length) ')'])

figure(2)

plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:')

legend('最短距离','平均距离')

xlabel('迭代次数')

ylabel('距离')

title('各代最短距离与平均距离对比')

5、参数调试记录

    蚁群算法主要有5个参数

    alpha:信息素重要程度因子

    beta:启发函数重要程度因子

    rho :信息素挥发因子

    m :蚂蚁数量

    iter_max:迭代次数

    这次主要研究alpha,beta,rho对结果的影响,因此蚂蚁数量m固定为75,迭代次数iter_max固定为200次。

    用C语言写的简单生成随机数程序,生成了40个点坐标(X∈[0,6000],Y∈[0,5000]),代表40个城市。

图4 前20个随机数
图5 后20个随机数

控制启发函数重要程度因子beta和信息素挥发因子rho不变(beta=5,rho=0.5),改变信息素重要程度因子alpha。

    alpha=1:

图6 alpha为1

    最短距离:28558.1822

    alpha=2:

图7 alpha为2

    最短距离:28898.1839

    alpha=3:

图8 alpha为3

    最短距离:29094.3054

    alpha=4:

图9 alpha为4

    最短距离:29094.3054

分析

    alpha在1的时候最短距离最小,但是当alpha小于1的时候没有试。随着alpha增加,最短距离越来越小,平均距离收敛得越快,但最后都稳定在3.4左右。

控制信息素重要程度因子alpha和信息素挥发因子rho不变(alpha=3,rho=0.5),改变启发函数重要程度因子beta

    beta=1:

图10 beta为1

    最短距离:30344.8553

    beta=2:

图11 beta为2

    最短距离:29145.7761

    beta=4:

图12 beta为4

    最短距离:28978.882

    beta=6:

图13 beta为6

    最短距离:29094.3054

分析

    当beta为4的时候,最短距离最小,当beta为6时,平均距离最小,在3.4以下.

控制信息素重要程度因子alpha和启发函数重要程度因子beta(alpha=1,beta=5),改变信息素挥发因子rho

    rho=0.1:

图14 rho为0.1

    最短距离:28898.1839

    rho=0.3:

图15 rho为0.3

     最短距离:29047.2567

     rho=0.7:

图16 rho为0.7

    最短距离:28542.8334

分析

    当rho为0.7左右时,最短距离最短,并且rho越大时,平均距离收敛得越快。

6、结论

    1、alpha信息素重要程度因子,alpha越大,最短距离越大,但收敛速度越快

    2、beta启发函数重要程度因子,除了beta特别小以外,beta对最短距离影响不大,在一定区间里面浮动

    3、rho信息素挥发因子,随着rho增加,收敛速度变快,并且最短距离变短,但是如果当迭代次数够多的话,最短距离会稳定下来。

    4、因为这次实验有40个城市,但是只迭代了200次,并且对alpha和beta取值范围不是很懂,所以导致结果基本没有出现最优解,只是都卡在了局部最优,迭代次数我觉得应该要500次左右,才能得出完整的结论。

    5、TSP问题是一类经典的组合优化问题,即在给定城市个数和各城市之间距离的条件下,找到一条遍历所有城市且每个城市只能访问一次的总路程最短的路线。蚁群算法在TSP问题应用中取得了良好的效果,但是也存在一些不足:

    ①比如alpha和beta设置不当,导致求解质量很差。

    ②基本蚁群算法计算量大,求解所需时间较长。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352