Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >蚁群算法(ACO)旅行商问题(TSP)路径规划MATLAB实现

蚁群算法(ACO)旅行商问题(TSP)路径规划MATLAB实现

作者头像
里克贝斯
发布于 2021-05-21 07:35:03
发布于 2021-05-21 07:35:03
2.4K00
代码可运行
举报
文章被收录于专栏:图灵技术域图灵技术域
运行总次数:0
代码可运行

蚁群算法的由来

蚁群算法(ant colony optimization)最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,据此提出了基于信息正反馈原理的蚁群算法。

蚁群算法的基本思想来源于自然界蚂蚁觅食的最短路径原理,根据昆虫科学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它们可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并在周围环境发生变化后,自适应地搜索新的最佳路径。

蚂蚁在寻找食物源的时候,能在其走过的路径上释放一种叫信息素的激素,使一定范围内的其他蚂蚁能够察觉到。当一些路径上通过的蚂蚁越来越多时,信息素也就越来越多,蚂蚁们选择这条路径的概率也就越高,结果导致这条路径上的信息素又增多,蚂蚁走这条路的概率又增加,生生不息。这种选择过程被称为蚂蚁的自催化行为。对于单个蚂蚁来说,它并没有要寻找最短路径,只是根据概率选择;对于整个蚁群系统来说,它们却达到了寻找到最优路径的客观上的效果。这就是群体智能。

蚁群算法能做什么

蚁群算法根据模拟蚂蚁寻找食物的最短路径行为来设计的仿生算法,因此一般而言,蚁群算法用来解决最短路径问题,并真的在旅行商问题(TSP,一个寻找最短路径的问题)上取得了比较好的成效。目前,也已渐渐应用到其他领域中去,在图着色问题、车辆调度问题、集成电路设计、通讯网络、数据聚类分析等方面都有所应用。

函数优化问题MATLAB实现:

蚁群算法(ACO)MATLAB实现

机器人路径规划:

蚁群算法(ACO)最短路径规划(MATLAB)

更多ACO算法:https://www.omegaxyz.com/tag/aco/

TSP问题

旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

本文要实现的代码

①问题建模

31个省市自治区的首都画在笛卡尔坐标系上,用坐标表示,两个城市间的距离用二维距离公式表示。

②初始化参数

m是种群数量,n是节点的多少(这里指城市数量的多少)

③构建解空间

将每个个体随机放到不同的点上,进行迭代更新

④更新信息素

计算本轮中最短路径,更新信息素。

⑤判断是否终止

ACO的优点

①采用正反馈机制,不容易陷入局部最优。

②利用信息素达到个体间的交互,有利于进行信息共享。

③可以并行编程,多个个体并行计算,有效地减少时间

MATLAB代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%% 清空环境变量
clear all
clc

%% 导入数据
load citys_data.mat

%% 计算城市间相互距离
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

%% 初始化参数
m = 50;                              % 蚂蚁数量
alpha = 1;                           % 信息素重要程度因子
beta = 5;                            % 启发函数重要程度因子
rho = 0.1;                           % 信息素挥发因子
Q = 1;                               % 常系数
Eta = 1./D;                          % 启发函数
Tau = ones(n,n);                     % 信息素矩阵
Table = zeros(m,n);                  % 路径记录表
iter = 1;                            % 迭代次数初值
iter_max = 500;                      % 最大迭代次数 
Route_best = zeros(iter_max,n);      % 各代最佳路径       
Length_best = zeros(iter_max,1);     % 各代最佳路径的长度  
Length_ave = zeros(iter_max,1);      % 各代路径的平均长度  

%% 迭代寻找最佳路径
while iter <= iter_max
    % 随机产生各个蚂蚁的起点城市
      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,清空路径记录表
    iter = iter + 1;
    Table = zeros(m,n);
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('各代最短距离与平均距离对比')

效果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
蚁群算法和简要matlab来源
从1991由意大利学者 M. Dorigo,V. Maniezzo 和 A. Colorni 通过模拟蚁群觅食行为提出了一种基于群体的模拟进化算法——蚁群优化。极大关注,蚁群算法的特点:
全栈程序员站长
2022/07/18
6980
蚁群算法(ACO)最短路径规划(MATLAB)
蚁群算法最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,据此提出了基于信息正反馈原理的蚁群算法。
里克贝斯
2021/05/21
2.6K0
蚁群算法(ACO)最短路径规划(MATLAB)
蚁群算法
蚁群觅食过程中,每只蚂蚁在所走过的路径上均会释放出一种信息素,该信息素随时间的推移逐渐挥发。因此,每条路径上的信息素同时存在正负反馈两种机制。正反馈:蚂蚁每次经过该路径均会释放信息素使得该路径上的信息素浓度增加;负反馈:每条路径上的信息素随时间推移会逐渐挥发。由此,我们可以判断,在起点与终点之间,当相同数量的蚂蚁初始同时经过两条不同的路径时,路径上初始信息素的浓度是相同的;不过,当路径越短时,信息素挥发时间也越短,残留信息素浓度也将越高。随后的蚂蚁将根据路径上残留信息素浓度的大小对路径进行选择 --- 浓度越高,选择概率越大。最终导致信息素浓度越高的路径上蚂蚁的选择数目越多,而更多的蚂蚁也将同时导致该路径上残留信息素浓度越高(即高者越高,低者越低)。因此,在理想情况下,整个蚁群将逐渐向信息素浓度最高的路径(即最短路径)进行转移。
用户3577892
2020/06/12
1.2K0
蚁群算法 matlab程序(已执行)
下面是解放军信息project大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处。
全栈程序员站长
2021/12/16
4540
蚁群算法规划路径
蚁群算法可以用于路径规划,在本例中,地形矩阵用0表示无障碍物、用1表示有障碍物,机器人从1x1处走到10x10处,使用蚁群算法找最短路径。
mwangblog
2018/12/12
2.3K0
蚁群算法规划路径
蚁群算法(ACO)MATLAB实现
蚁群算法(ant colony optimization)最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,据此提出了基于信息正反馈原理的蚁群算法。
里克贝斯
2021/05/21
1.4K0
蚁群算法(ACO)MATLAB实现
蚁群算法最短路径规划多出口情况及问题答疑
最近好多人问我蚁群算法最短路径规划如何设置多出口情况,原来2019年美赛D题“拯救卢浮宫”需要用到。本人没有看过美赛的题目,下面给出一些不成熟的代码。
里克贝斯
2021/05/21
9470
蚁群算法最短路径规划多出口情况及问题答疑
基于蚁群算法(ACO)的TSP(Python实现)
基于蚁群算法(Ant Colony Optimization, ACO)的TSP(Traveling Salesman Problem,旅行商问题),求解方法源自观察到蚂蚁在寻找食物时释放信息素,并根据信息素浓度选择路径的行为。这种自组织调节的行为启发了一种新颖的启发式优化方法,即蚁群算法。在TSP问题中,蚂蚁在搜索空间内移动,同时释放和感知路径上的信息素,通过反复迭代的过程,逐步寻找到较优的旅行路径。
不去幼儿园
2024/12/03
3640
基于蚁群算法(ACO)的TSP(Python实现)
蚁群算法解决旅行商(TSP)问题
在更新信息素的过程中,只有最优路线上的信息素会进行增加操作,且不能超过信息素最大值。
mwangblog
2018/12/13
2.4K0
各种智能优化算法比较与实现(matlab版)
免疫算法是受生物免疫系统的启发而推出的一种新型的智能搜索算法。它是一种确定性和随机性选择相结合并具有“勘探”与“开采”能力的启发式随机搜索算法。免疫算法将优化问题中待优化的问题对应免疫应答中的抗原,可行解对应抗体(B细胞),可行解质量对应免疫细胞与抗原的亲和度。如此则可以将优化问题的寻优过程与生物免疫系统识别抗原并实现抗体进化的过程对应起来,将生物免疫应答中的进化过程抽象成数学上的进化寻优过程,形成一种智能优化算法。它具有一般免疫系统的特征,采用群体搜索策略,通过迭代计算,最终以较大的概率得到问题的最优解。相对于其他算法,免疫算法利用自身产生多样性和维持机制的特点,保证了种群的多样性,克服了一般寻优过程(特别是多峰值的寻优过程)的不可避免的“早熟”问题,可以求得全局最优解。免疫算法具有自适应性、随机性、并行性、全局收敛性、种群多样性等优点。 1.2 算法操作步骤 (1)首先进行抗原识别,即理解待优化的问题,对问题进行可行性分析,提取先验知识,构造出合适的亲和度函数,并制定各种约束条件。 (2)然后初始化抗体群,通过编码把问题的可行解表示成解空间中的抗体,在解的空间内随机产生一个初始种群。 (3)对种群中的每一个可行解进行亲和度评价。(记忆单元的更新:将与抗原亲和性高的抗体加入到记忆单元,并用新加入的抗体取代与其亲和性最高的原有抗体(抗体和抗体的亲和性计算)) (4)判断是否满足算法终止条件;如果满足条件则终止算法寻优过程,输出计算结果;否则继续寻优运算。 (5)计算抗体浓度和激励度。(促进和抑制抗体的产生:计算每个抗体的期望值,抑制期望值低于阈值的抗体;可以知道与抗原间具有的亲和力越高,该抗体的克隆数目越高,其变异率也越低) (6)进行免疫处理,包括免疫选择、克隆、变异和克隆抑制。 免疫选择:根据种群中抗体的亲和度和浓度计算结果选择优质抗体,使其活化; 克隆:对活化的抗体进行克隆复制,得到若干副本; 变异:对克隆得到的副本进行变异操作,使其发生亲和度突变; 克隆抑制:对变异结果进行再选择,抑制亲和度低的抗体,保留亲和度高的变异结果。 (7)种群刷新,以随机生成的新抗体替代种群中激励度较低的抗体,形成新一代抗体,转步骤(3)。 免疫算法运算流程图
全栈程序员站长
2022/08/31
2.6K0
各种智能优化算法比较与实现(matlab版)
基于蚁群算法的机械臂打孔路径规划
问题描述   该问题来源于参加某知名外企的校招面试。根据面试官描述,一块木板有数百个小孔(坐标已知),现在需要通过机械臂在木板上钻孔,要求对打孔路径进行规划,力求使打孔总路径最短,这对于提高机械臂打孔的生产效能、降低生产成本具有重要的意义。 数学模型建立 问题分析   机械臂打孔生产效能主要取决于以下三个方面: 单个孔的钻孔作业时间,这是由生产工艺所决定的,不在优化范围内,本文假定对于同一孔型钻孔的作业时间是相同的。 打孔机在加工作业时,钻头的行进时间。 针对不同孔型加工作业时间,刀具的转换时间。   在机
waylon
2018/03/08
1.7K0
基于蚁群算法的机械臂打孔路径规划
基于蚁群算法的机械臂打孔路径规划
  该问题来源于参加某知名外企的校招面试。根据面试官描述,一块木板有数百个小孔(坐标已知),现在需要通过机械臂在木板上钻孔,要求对打孔路径进行规划,力求使打孔总路径最短,这对于提高机械臂打孔的生产效能、降低生产成本具有重要的意义。
waylon
2018/02/27
2.2K0
基于蚁群算法的机械臂打孔路径规划
几种蚁群算法介绍
最早的蚁群算法,其在小规模TSP中性能尚可,再大规模TSP问题中性能下降,容易停滞。其解决旅行商问题(TSP)过程大致如下:
mwangblog
2018/12/06
2K0
蚁群算法
蚁群算法是一种智能优化算法,在TSP商旅问题上得到广泛使用。蚁群算法于1992年由Marco Dorigo首次提出,该算法来源于蚂蚁觅食行为。由于蚂蚁没有视力,所以在寻找食物源时,会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素。信息素浓度的大小表征路径的远近,信息素浓度越高,表示对应的路径距离越短。通常,蚂蚁会以较大的概率优先选择信息素浓度高的路径,并且释放一定的信息素,使该条路径上的信息素浓度增高,进而使蚂蚁能够找到一条由巢穴到食物源最近的路径。但是,随着时间的推移,路径上的信息素浓度会逐渐衰减。
六四零
2022/05/30
1.8K0
蚁群算法
蚁群(ACO)算法求解TSP问题(附C#,Java代码及注释)
在写这篇蚁群算法推文期间,小编曾一度崩溃,只是换掉原文算例,即将“60个城市随机生成距离”换成Oliver30等标准实例,跑出来的结果就惨不忍睹,实是被按在地上摩擦。正如鲁迅先生《狂人日记》中所写:凡事总须研究,才会明白。小编怀着一颗虔诚滴心,遍查全网,亲身试验诸般方法,尽管最终由于学识浅薄,还是没有成功解决,但对启发式算法的了解却也加深了几分。
用户1621951
2021/07/15
1.8K1
蚁群(ACO)算法求解TSP问题(附C#,Java代码及注释)
遗传算法解决TSP问题MATLAB实现(详细)
给定一组n个城市和俩俩之间的直达距离,寻找一条闭合的旅程,使得每个城市刚好经过一次且总的旅行距离最短。
里克贝斯
2021/05/21
5.3K0
遗传算法解决TSP问题MATLAB实现(详细)
蚁群算法详解
如何寻找一条合适的路径,几乎是一个永恒的话题。每个人、每天都会遇到。大到全国列车的运行规划,小到每个人的手机导航。其中一部分是关于“如何寻找两个位置间的最短距离”的,这一部分有较为成熟的理论与确切的解法,还有与之匹配的各种算法。
智能算法
2020/09/24
6.9K0
蚁群算法详解
一文详述蚁群算法
前几篇解释了一些智能优化算法,今天才想到还有一个重要的给忘了,,言归正传,蚁群算法也是一种生物仿生算法,它是通过模拟自然界中蚂蚁集体寻径行为而提出的一种基于种群的启发式随机搜索算法。自然界常理,蚂蚁可以通过群体行动在没有任何提示下从家找到食物源的最短路径,并能随着环境变化不断调整适应性地搜索出新的路径产生新的选择使得找到的路径最短。一般来说每个蚂蚁可以看成是独立的个体,相互交流的纽带是通过释放分泌信息素来实现的,所以这也是该算法模拟的核心地方,根据信息素的浓度进行下一个最优移动方向的选择,从而做到周游所有地点的最短路径,具体过程下面详述
用户7506105
2021/08/09
2.7K0
集群,蚁群算法简介
为了让厨师专心炒菜,把菜做到极致,又请了个配菜师负责切菜,备菜,备料,厨师和配菜师的关系是分布式,一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群;
zhangjiqun
2024/12/17
1320
集群,蚁群算法简介
路径规划算法
随着机器人技术、智能控制技术、硬件传感器的发展,机器人在工业生产、军事国防以及日常生活等领域得到了广泛的应用。而作为机器人行业的重要研究领域之一,移动机器人行业近年来也到了迅速的发展。移动机器人中的路径规划便是重要的研究方向。移动机器人的路径规划方法主要分为传统的路径规划算法、基于采样的路径规划算法、智能仿生算法。传统的路径规划算法主要有A*算法、Dijkstra算法、D*算法、人工势场法,基于采样的路径规划算法有PRM算法、RRT算法,智能仿生路径规划算法有神经网络算法、蚁群算法、遗传算法等。
六四零
2021/11/12
2.4K0
相关推荐
蚁群算法和简要matlab来源
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验