算法笔记【1】-蚁群算法解决旅行商问题(简称TSP问题)

一、简介

TSP问题由于问题的可行解是所有顶点的全排列,随着顶点数的增加,会产生组合爆炸,它是一个NP完全问题。由于其在交通运输、电路板线路设计以及物流配送等领域内有着广泛的应用,国内外学者对其进行了大量的研究。早期的研究者使用精确算法求解该问题,常用的方法包括:分枝定界法、线性规划法、动态规划法等。但是,随着问题规模的增大,精确算法将变得无能为力,因此,在后来的研究中,国内外学者重点使用近似算法或启发式算法,主要有遗传算法、模拟退火法、蚁群算法、禁忌搜索算法、贪婪算法和神经网络等。

二、样例说明

移动机器人可以通过移动来完成一些比较危险的任务,如地雷探测、海底探测等,在工业、国防领域有很多实用价值。移动机器人需探测5Km*5Km范围内的8个目标(随机分布),请设计路径规划算法,使移动机器人在最短时间完成探测任务。
样例中由于随机点数量并不算多,可以使用精确求解的方法求解,也可以通过启发式算法求解,由于启发式算法的通用性和迭代流程的简约性,这里基于一个样例,选择经典的启发式算法-蚁群拳法来求解机器人最短路径。

三、 理论分析

从样例说明要求可知,移动机器人最短时间完成探测任务就是寻找探测过程中的最短路径问题 假定机器人从原点出发,首先机器人要在最短的时间内完成8个随机目标点的探测任务,由于目标点的随机性,则要求在机器人在每次开始探测之前,规划出从原点出发依次经过8个任务点的最短路径,并在完成任务后回到原点,以便进行下一次任务的规划,因此规划多个目标点之间的最短路径问题可抽象成经典的旅行商问题(简称TSP问题):机器人(旅行商)从起点(原点)出发,依次访问8个目标点(城市),每个目标点只允许访问一次,最后回到起点(原点),求最短路径。

四、 蚁群算法实现最短路径规划算法设计

 蚁群算法是一种仿生学算法,是由自然界中蚂蚁觅食的行为而启发的。在自然界中,蚂蚁觅食过程中,蚁群总能够按照寻找到一条从蚁巢和食物源的最优路径。蚁群算法最早用来求解TSP问题,并且表现出了很大的优越性,因为它分布式特性,鲁棒性强并且容易与其它算法结合

在这里插入图片描述
机器人8个随机探测点和原点之间的路径规划问题,代入蚁群算法流程如图所示。
在这里插入图片描述
总体可分为如下步骤求解:

  • 初始化蚂蚁数量,信息素浓度。
  • 为每只蚂蚁选择下一个节点。每只蚂蚁从一个城市走到另一个城市的过程中都会在路径上释放信息素,并且蚂蚁选择下一个城市的依据是一个概率公式,如下:
    在这里插入图片描述

其中,α 为发式因子,它反映了信息素对蚂蚁路径选择的作用;
β为望启发式因子,它反映了信息素在蚂蚁选择路径时被重视的程度;
ρij (t) 为启发函数,表达式为ρij(t)=1/dij
dij表示城市i和j之间的距离;
τij为城市i到城市j的路径上的信息素的量。

  • 更新信息素矩阵。当所有的蚂蚁完成一次路径循环后,才更新信息素。因此路径上的信息素应该分为两部分:之前未挥发所残留的信息素 + 经过当前循环所有蚂蚁在经过该路径后所留下的信息素。用公式表述如下:
    τij(t+n)=(1-ρ)*τij (t)+Δτij (t,t+n)
  • 迭代计算,如果达到最大代数,算法终止,转到第5步;否则,更新所有的蚂蚁信息,重新执行2、3、4步。
  • 输出最优值

五、仿真

5.1 程序分析与编写

假如蚁群中所有蚂蚁的数量为m,所有城市(探测点)之间的信息素用矩阵Tau表示,最短路径为Length_best,最佳路径为Route_best。每只蚂蚁都有自己的内存,内存中用一个禁忌表(Table)来存储该蚂蚁已经访问过的城市(探测点),表示其在以后的搜索中将不能访问这些城市(探测点);还有另外一些数据,例如一些控制参数(alpha ,beta ,rho,Q)等等。假定算法总共运行iter_max次。基于matlab编写蚁群算法实现函数,函数部分代码如下:

function [Length_ave,Length_best,Route_best] = ant_colony_algorithm(dis,iter_max)
%% 蚁群优化求解最短路
%% IV. 初始化参数
m = 50;                             % 蚂蚁数量
n = size(dis,1);                    % 目标点数量
alpha = 1;                          % 信息素重要程度因子
beta = 5;                           % 启发函数重要程度因子
rho = 0.1;                          % 信息素挥发因子
Q = 1;                              % 常系数
Eta = 1./dis;                       % 启发函数
Tau = ones(n, n);                   % 信息素矩阵
Table = zeros(m, n);                % 路径记录表
iter = 1;                           % 迭代次数初值
Route_best = zeros(iter_max, n);    % 各代最佳路径
Length_best = zeros(iter_max, 1);   % 各代最佳路径长度
Length_ave = zeros(iter_max, 1);    % 各代路径的平均长度

%% V. 迭代寻找最佳路径
while iter <= iter_max
    iter
    % 各个蚂蚁的起点城市均为起始点
    start = ones(m, 1);
    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) + dis(Route(j), Route(j+1));
        end
        Length(i) = Length(i) + dis(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, 清空路径记录表
    iter = iter + 1;
    Table = zeros(m, n);
end

5.2仿真结果

随机规划出的路径如图所示。由于点数较少,可直观看出是否为最短路径。
在这里插入图片描述

蚁群算法迭代过程中的最短距离如图所示,由图可知,路径是逐渐收敛于最短路径的。
在这里插入图片描述

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

>_<!

码字不易,如有帮助,欢迎鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值