蚁群算法可以用于路径规划,在本例中,地形矩阵用0表示无障碍物、用1表示有障碍物,机器人从1x1处走到10x10处,使用蚁群算法找最短路径。

步骤如下:初始化参数、地形矩阵、信息素矩阵和启发式因子矩阵。启发式因子矩阵中一点的值为该点到终点距离的倒数,距离越短,启发式因子越大,障碍物处的启发式因子为0。信息素矩阵被初始化为一个统一的值。

在本例中,将一条路径表示如下:[路径长度 点1 点2 ……],例如[2 1 2 0 0]表示该路径长度为2,路径为[1 2]。

对每次迭代中的每只蚂蚁,进行如下3步,直至到达终点或者陷入死胡同:

创建一个禁忌矩阵,禁忌矩阵中已经访问过的点为0,其余点与启发式因子矩阵中相应点的值相同。

设置初始点,根据信息素、启发式因子、禁忌表,通过轮盘赌方法,选择下一个城市。

更新路径和禁忌矩阵。

每次迭代后,更新信息素,只对最优路径中的点进行增加信息素操作。

迭代, 直至结束。

结果如下,其中黄色块为障碍物,红色线为路线:

蚁群算法路径规划结果

主函数

主函数如下:function main()rn = 10; cn = 10;

G       = makeG(rn, cn);                % 地形图tau     = 8 .* ones(rn, cn);            % 初始化信息素MaxGen  = 100;                          % 迭代次数N       = 50;                           % 蚂蚁个数S       = 1;            % 路径起始点E       = rn * cn;      % 路径终点Alpha   = 1;            % 信息素重要程度Beta    = 30;           % 启发式因子重要程度Rho     = 0.3;          % 信息素挥发系数Q       = 5;            % 信息素增加系数Eta     = makeEta(G);   % 距离倒数矩阵gpath = zeros(MaxGen, rn*cn+1);     % 每代最优路径 [地点个数 地点……]for g = 1:MaxGen

npath = zeros(N, rn*cn+1);          % 每个路径 [地点个数 地点……]

for n = 1:N

D = Eta;                        % 禁忌矩阵

path = zeros(1, rn*cn+1);       % 路径

% 更新点、路径和禁忌矩阵

point = S;

path(1, 1) = path(1, 1) + 1;

path(1, path(1,1)+1) = point;

D(point) = 0;

% 搜索下一个点的坐标范围

nextlist = getNextList(point, rn, cn, D);        % 一直前进,直到到达食物或者陷入死胡同

while point ~= E && ~isempty(nextlist)            % 轮盘赌算法取下一点

p = zeros(1, length(nextlist));            for i = 1:length(nextlist)

p(1, i) = (tau(nextlist(i))^Alpha) * (Eta(nextlist(i))^Beta);            end

nextpoint = nextlist(getNextPoint(p));            % 更新点、路径和禁忌矩阵

point = nextpoint;

path(1, 1) = path(1, 1) + 1;

path(1, path(1,1)+1) = point;

D(point) = 0;

nextlist = getNextList(point, rn, cn, D);        end

% 记录成功成功到达终点的蚂蚁的路径

if (path(1, 1+path(1,1)) == E)

npath(n, :) = path;        end

end

npath = npath(find(sum(npath,2)), :);       % 保留到达终点的路径

lk = calLk(npath, rn, cn);                  % 计算lk距离

% 更新信息素

tau = (1 - Rho) .* tau;    for i = 1:size(npath, 1)        for j = 2:npath(i,1)+1

tau(npath(i,j)) = tau(npath(i,j)) + Q / lk(i);        end

end

[~, minindex] = min(lk);    if size(npath, 1) > 0

gpath(g, :) = npath(minindex, :);

endendlk = calLk(npath, rn, cn);

[minvalue, minindex] = min(lk);

fprintf("min length: %f\n", minvalue);bestpath = gpath(minindex,:);

bestpath = bestpath(2:1+bestpath(1,1));

figure;

imagesc(G);

hold on;for i = 2:length(bestpath)

[x1, y1] = ind2sub([rn, cn], bestpath(i-1));

[x2, y2] = ind2sub([rn, cn], bestpath(i));

plot([y1, y2], [x1, x2], 'r');

hold on;endend

得到下一点函数

每只蚂蚁的下一步候选点应该是这样的:没有障碍物

该蚂蚁之前没有经过

紧邻蚂蚁(蚂蚁不能飞)

得到待选点函数如下:function nextlist = getNextList(point, rn, cn, D)% 给出待选点列表% point         input  当前点% rn            input  地图行数% cn            input  地图列数% D             input  禁忌地图% nextlist      output 待选点列表list = find(D);

nextlist = zeros(1, length(list)+1);

[pointx, pointy] = ind2sub([rn, cn], point);for i = 1:length(list)

[indexx, indexy] = ind2sub([rn, cn], list(i));    if (indexx >= pointx-1 && indexx <= pointx+1 ...

&& indexy >= pointy-1 && indexy <= pointy+1)

nextlist(1, 1) = nextlist(1, 1) + 1;

nextlist(1, nextlist(1,1)+1) = list(i);    endenda  = nextlist(1,1);

nextlist = nextlist(1, 2:1+a);

在得到待选点列表后,就能通过轮盘赌法得到下一点了:function nextpointindex = getNextPoint(p)% 使用轮盘赌法给出下一个点% p                 input  概率列表% nextpointindex    output 下一个点sump = sum(p);

p = p / sump;

cumsump = cumsum(p);

list = find(cumsump >= rand);

nextpointindex = list(1);

一些其他函数

制作地形矩阵函数:function G = makeG(rn, cn)% 制作地形矩阵% rn        input  地形矩阵函数% cn        input  地形矩阵函数% G         output 地形矩阵G = zeros(rn, cn);

G(1:3, 2) = 1;

G(7:10, 1:5) = 1;

G(5, 3) = 1;

G(1, 4) = 1;

G(1:5, 5) = 1;

G(5:7, 7:9) = 1;

制作启发式因子矩阵:function eta = makeEta(G)% 制作启发式因子矩阵(到终点距离倒数,障碍物为0)% G         input  地形矩阵% eta       output 启发式因子矩阵eta = G;

[rn, cn] = size(G);for i = 1:rn    for j = 1:cn        if G(i, j) == 1

eta(i, j) = 0;        elseif (i == rn && j == cn)

eta(i, j) = 1;        else

eta(i, j) = 1 / ( (rn-i)^2+(cn-j)^2 )^0.5;        end

endend

计算路径长度矩阵function lk = calLk(npath, rn, cn)% 计算路径长度% npath         input  路径% rn            input  地图行数% cn            input  地图列数% lk            output 路径长度 rnx1[nr, ~] = size(npath);

lk = zeros(nr, 1);for i = 1:nr

path = npath(i, 2:1+npath(1,1));    for j = 2:length(path)

[x1, y1] = ind2sub([rn, cn], path(j-1));

[x2, y2] = ind2sub([rn, cn], path(j));

lk(i) = lk(i) + ((x2-x1)^2+(y2-y1)^2)^0.5;    endendend

作者:mwangjs

链接:https://www.jianshu.com/p/622bf89ba88e

蚁群算法C语言最短路径规划,蚁群算法规划路径相关推荐

  1. >算法笔记-动态规划-最短路径迪杰斯特拉算法

    算法笔记-动态规划-最短路径迪杰斯特拉算法 作者:星河滚烫兮 前言   图的最短路径问题在现实生活中有很广阔的应用,最短路径又分为单源最短路径与多源最短路径,前者求出固定起点到其他节点的最短路径,后者 ...

  2. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  3. c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...

  4. java合一算法_Prolog语言的编译原理:合一算法

    Prolog语言的编译原理:合一算法 分类:软考 | 更新时间:2016-07-08| 来源:转载 Prolog是一种基于谓词演算的程序设计语言.Prolog是一种说明性语言,它的基本意思是程序员着重 ...

  5. c4.5算法 程序语言,决策树之C4.5算法详解-Go语言中文社区

    决策树之C4.5算法详解 主要内容 C4.5算法简介 分裂属性的选择--信息增益率 连续型属性的离散化处理 剪枝--PEP(Pessimistic Error Pruning)剪枝法 缺失属性值的处理 ...

  6. 最坏适应算法c语言源码,首次适应算法,最佳适应算法,最坏适应算法源代码

    这是一个非常完美的程序,输出显示的格式也很棒,里面包含首次适应算法,最佳适应算法,最坏适应算法 #include #include #define Free 0 //空闲状态 #define Busy ...

  7. 自适应对消算法c语言,LMS自适应对消算法

    LMS算法最小均方误差算法,是一种自适应滤波算法.该算法通过对输入信号进行滤波输出一个信号y(n),将输出信号与期望输出信号作差得到一个误差信号,再将误差信号输入到自适应滤波器中形成一个反馈回路.LM ...

  8. 虚拟存储页面置换算法c语言,虚拟存储器管理页面置换算法模拟实验.doc

    虚拟存储器管理页面置换算法模拟实验 淮海工学院计算机工程学院 实验报告书 课程名:< 操作系统原理A > 题 目: 虚拟存储器管理 页面置换算法模拟实验 班 级: 软件*** 学 号: 2 ...

  9. dv路由算法c语言实现,路由协议之DV算法

    #include #define ROUTER_OF_NUMBER 100 //网络中路由的最大数目 #define MaxExp 10000 //假设为此路由费用为无穷大 int RouterNum ...

最新文章

  1. python输出大小不同的字体_python – 为什么我的truetype字体大小为11渲染与windows不同?...
  2. mysql更新一个表里的字段等于另一个表某字段的值
  3. 不想参加无聊的团队分享, 我们这样玩
  4. linux 配置jupyter远程访问
  5. ORA-01659: 无法分配超出 7 的 MINEXTENTS
  6. Arcgis desktop 9.3的破解方法_经验版
  7. 关于Servlet和异步Servlet
  8. PostgreSQL在何处处理 sql查询之二十九
  9. 数字五笔输入法,特别版
  10. 【使用老电脑win7下载miniconda】
  11. Ceph使用系列之——Ceph RGW使用
  12. CAD基础+常用快捷(三)
  13. 云GIS架构的研究与实践
  14. Ninja is required to load C++ extensions in Pycharm
  15. mysql 查询每个科目分数大于80
  16. Apache Spark 怎么选择 JOIN 策略?
  17. 苹果手机双卡双待是哪一款_提个醒:手机“双卡双待”,卡一和卡二究竟有什么区别?早知道为好...
  18. Unable to simultaneously satisfy constraints.这一问题
  19. 最浅显易懂的Javascript 中的slice和splice
  20. Codeforces 1579G

热门文章

  1. 个人作业 Alpha项目测试
  2. 239期夏天计算机开机号,福彩3D16239期便民工作室提供中国福彩中心开机号239期开机号...
  3. 阿里面试官:你知道Dubbo的服务暴露机制么?
  4. 用计算机判断函数单调性吗,高中数学函数单调性的判断方法(全)
  5. 初学Java简易自助饮品消费系统项目实践
  6. Jmeter:图形界面压力测试工具
  7. Dojo 学习--ADM
  8. 解决“vmware15虚拟机启动造成win10黑屏或自动注销“问题
  9. maximo跟java_maximo遇到的错误问题
  10. PS青山绿水婚片处理