zoukankan      html  css  js  c++  java
  • 蚁群算法

    一、蚁群算法简介

      蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法,它是由意大利学者Dorigo M等人于1991年首先提出,并首先使用在解决TSP(旅行商问题)上。

          之后,又系统研究了蚁群算法的基本原理和数学模型.
    二、蚁群算法原理

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

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

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

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

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

    三、蚁群算法流程图

     四、实例应用

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

        原理讲解参考老师上课讲解的PPT不做过多粘贴

    1.源代码:

    %% 旅行商问题(TSP)优化
    %% 清空环境变量
    clear all
    clc

    %% 导入数据
    citys = ceil(rand(50,2)*50000)
    %load newcitys.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 = 50; % 蚂蚁数量
    alpha = 1; % 信息素重要程度因子
    beta = 5; % 启发函数重要程度因子
    rho = 0.05; % 信息素挥发因子
    Q = 1; % 常系数
    Eta = 1./D; % 启发函数
    Tau = ones(n,n); % 信息素矩阵
    Table = zeros(m,n); % 路径记录表
    iter = 1; % 迭代次数初值
    iter_max = 150; % 最大迭代次数
    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('各代最短距离与平均距离对比')

    运行结果:

     利用函数citys = ceil(rand(50,2)*50000) 随机产生五十个城市坐标

            

    2.研究信息素重要程度因子alpha, 启发函数重要程度因子beta,信息素挥发因子rho对结果的影响

      为了保证变量唯一我重新设置五十个城市信息进行实验

    在原来设值

    运行结果:

    实验结果可知当迭代到120次趋于稳定

     2.1     alpha值对实验结果影响

      (1)当alpha=4时

      运行结果

    实验结果可知当迭代到48次左右趋于稳定

    (2)当alpha=8时

     运行结果:

    有图可知迭代40次左右趋于稳定,搜索性较小

    (3)当alpha= 0.5

    运行结果:

    有图可知迭代到140次左右趋于稳定

    (4)当alpha=0.2时

    运行结果:

    结果趋于110次左右稳定

    所以如果信息素因子值设置过大,则容易使随机搜索性减弱;其值过小容易过早陷入局部最优

    2.2   beta值对实验影响

    (1)当 beta=8时

    运行结果

    结果迭代75次左右趋于稳定

    (2)当 beta=1时

    运行结果:

    结果迭代130次左右趋于稳定

    所以beta如果值设置过大,虽然收敛速度加快,但是易陷入局部最优;其值过小,蚁群易陷入纯粹的随机搜索,很难找到最优解

    2.3 rho值对实验结果影响

      (1)当rho=3时

    运行结果:

    结果迭代75次左右趋于稳定

    (2)当rho=0.05

       运行结果:

    结果迭代125次左右趋于稳定

    所以如果rho取值过大时,容易影响随机性和全局最优性;反之,收敛速度降低

    总结:蚁群算法对于参数的敏感程度较高,参数设置的好,算法的结果也就好,参数设置的不好则运行结果也就不好,所以通常得到的只是局部最优解。

  • 相关阅读:
    bootstrap 兼容 IE8
    在IE8的基础上安装IE11
    前台
    dll 库文件下载地址
    年轻
    linux 异常
    Navicat断网时连不上数据库
    jQuery
    破解版 Teamver 安装
    mysql
  • 原文地址:https://www.cnblogs.com/lhx0814/p/11798864.html
Copyright © 2011-2022 走看看