基于蚁群算法的二维路径规划算法(matlab)

news2024/11/16 23:42:37

微♥关注“电击小子程高兴的MATLAB小屋”获得资料

一、理论基础

1、路径规划算法

路径规划算法是指在有障碍物的工作环境中寻找一条从起点到终点、无碰撞地绕过所有障碍物的运动路径。路径规划算法较多,大体上可分为全局路径规划算法和局部路径规划算法两大类。其中,全局路径规划算法包括位形空间法、广义锥方法、顶点图像法、栅格划归法;局部路径规划算法主要有人工势场法等。

2、MAKLINK图论理论

MAKLINK图论可以建立二维路径规划的空间模型,其通过生成大量的MAKLINK线构造二维路径规划可行空间。MAKLINK线定义为两个障碍物之间不与障碍物相交的顶点之间的连线,以及障碍物顶点与边界相交的连线。典型MAKLINK图形如图1所示。

图片

图1 MAKLINK图形

在MAKLINK图上存在I条自由连接线,连接线的中点依次为1,V2,连接所有MAKLINK线的中点加上始点S和终点工构成用于初始路径规划的无向网络图,如图2所示。

图片

图2 无向网络图

3、蚁群算法

请参考这里

4、dijkstra算法

dijkstra算法是典型的单源最短路径算法,用于计算非负权值图中一个节点到其他所有节点的最短路径,其基本思想是把带权图中所有节点分为两组,第1组包括已确定最短路径的节点,第2组为未确定最短路径的节点。按最短路径长度递增的顺序逐个把第2组的节点加入第1组中,直到从源点出发可达的所有节点都包含在第1组中。

dijkstra算法流程如下:

(1)初始化存放未确定最短路径的节点集合V VV和已确定最短路径的节点集合S SS,利用带权图的邻接矩阵arcs初始化源点到其他节点最短路径长度D DD,如果源点到其他节点有连接弧,对应的值为连接弧的权值,否则对应的值取为极大值。

(2)选择D DD中的最小值D DD[i ii],D DD[i ii]是源点到点i ii的最短路径长度,把点i ii从集合V VV中取出并放入集合S SS中。

(3)根据节点i ii修改更新数组D DD中源点到集合V VV中所有节点k kk对应的路径长度值。

(4)重复步骤(2)和步骤(3)的操作,直至找出源点到所有节点的最短路径为止。

二、案例背景

1、问题描述

采用蚁群算法在200×200的二维空间中寻找一条从起点S SS到终点T TT的最优路径,该二维空间中存在4个障碍物,障碍物1的4个顶点的坐标分别为(40 140;60 160;100 140;60 120),障碍物2的4个顶点分别为(50 30;30 40;80 80;100 40),障碍物3的4个顶点分别为(120 160;140 100;180 170;165 180),障碍物4的3个顶点分别为(120 40;170 40;140 80),其中点S SS为起点,起点坐标为(20,180);点T TT为终点,终点坐标为(160,90)。二维规划空间如图3所示。

图片

2、算法流程

算法流程如图4所示。其中,空间模型建立采用MAKLINK图论算法建立路径规划的二维空间,初始路径规划利用dijkstra算法规划出一条从起点到终点的初始路径,初始化算法参数,信息素更新采用根据蚂蚁搜索到的路径的长短优劣更新节点的信息素。

图片

三、MATLAB程序

根据蚁群算法原理,在MATLAB软件中编程实现基于蚁群算法的二维路径规划算法,算法分为两步:第一步使用dijkstra算法生成初始次优路径;第二步在初始路径的基础上,使用蚁群算法生成全局最优路径。

1、dijkstra算法

采用dijkstra算法规划初始路径,其算法思想是先计算点点之间的距离,然后依次计算各点到出发点的最短距离,程序如下:

function path = DijkstraPlan(position,sign)
%% 基于Dijkstra算法的路径规划算法
% position     input        节点位置
% sign         input        节点间是否可达
% path         output       规划路径
%% 计算路径距离
cost = ones(size(sign))*10000;
[n, m] = size(sign);
for i = 1:n
    for j = 1:m
        if sign(i, j) == 1
            cost(i, j) = sqrt(sum((position(i, :)-position(j, :)).^2));
        end
    end
end


%% 路径开始点
dist = cost(1, :);            % 节点间路径长度
s = zeros(size(dist));        % 节点经过标志
s(1) = 1; dist(1) = 0;
path = zeros(size(dist));     % 依次经过的节点
path(1, :) = 1;


%% 循环寻找路径点
for num = 2:n
    % 选择路径长度最小点
    mindist = 10000;
    for i = 1:length(dist)
        if s(i) == 0
            if dist(i)< mindist
                mindist = dist(i);
                u = i;
            end
        end
    end
    % 更新点点间路径
    s(u) = 1;
    for w = 1:length(dist)
        if s(i) == 0
            if dist(u)+cost(u,w) < dist(w)
                dist(w) = dist(u)+cost(u,w);
                path(w) = u;
            end
        end
    end
end

2、蚁群算法搜索

在初始路径的基础上,采用蚁群算法搜索最优路径,程序如下:

%% 蚁群算法参数初始化
pathCount = length(path)-2;                 % 经过线段数量
pheCacuPara = 2;                            % 启发值重要程度因子
pheThres = 0.8;                             % 信息素选择阈值
pheUpPara = [0.1 0.0003];                   % 信息素更新参数
qfz = zeros(pathCount, 10);                 % 启发值
phePara = ones(pathCount, 10)*pheUpPara(2); % 信息素
qfzPara1 = ones(10,1)*0.5;                  % 启发信息参数1
qfzPara2 = 1.1;                             % 启发信息参数2
m=10;                                       % 蚂蚁数量
NC=500;                                     % 循环次数
pathk = zeros(pathCount, m);                % 搜索结果记录
shortestpath = zeros(1,NC);                 % 进化过程记录
shortestroute = zeros(NC, 2*pathCount);     % 每一代的最短路径
%% 初始最短路径
dijpathlen = 0;
vv = zeros(22, 2);
vv(1, :) = S;
vv(22, :) = T;
vv(2:21, :) = v;
for i=1:pathCount-1
    dijpathlen = dijpathlen +sqrt(sum((vv(path(i), :)-vv(path(i+1), :)).^2));
%     dijpathlen = dijpathlen + sqrt((vv(path(i),1)-vv(path(i+1),1))^2+(vv(path(i),2)-vv(path(i+1),2))^2);
end
LL = dijpathlen;


%% 经过的链接线
lines = zeros(pathCount, 4);
for i = 1:pathCount
    lines(i, 1:2) = B(L(path(i+1)-1, 1), :);
    lines(i, 3:4) = B(L(path(i+1)-1, 2), :);
end
 
%% 循环搜索
for num = 1:NC   
    %% 蚂蚁迭代寻优一次
    for i = 1:pathCount
        for k = 1:m
            q = rand();
            qfz(i, :) = (qfzPara2-abs((1:10)'/10-qfzPara1))/qfzPara2;      % 启发信息
            if q <= pheThres       % 选择信息素最大值
                arg = phePara(i, :).*(qfz(i, :).^pheCacuPara);
                j = find(arg == max(arg));
                pathk(i, k) = j(1);
            else  % 轮盘赌选择
                arg = phePara(i, :).*(qfz(i, :).^pheCacuPara);
                sumarg = sum(arg);
                qq = (q-pheThres)/(1-pheThres);
                qtemp = 0;
                j = 1;
                while qtemp < qq
                    qtemp = qtemp + (phePara(i, j)*(qfz(i, j)^pheCacuPara))/sumarg;
                    j = j+1;
                end
                j = j-1;
                pathk(i, k) = j(1);
            end
            % 实时信息素更新
            phePara(i, j) = (1-pheUpPara(1))*phePara(i, j)+pheUpPara(1)*pheUpPara(2);
        end
    end
    
    %% 计算路径长度
    len = zeros(1, k);
    for k = 1:m
        Pstart = S;
        Pend = lines(1, 1:2) + (lines(1, 3:4)-lines(1, 1:2))*pathk(1, k)/10;
        for l = 1:pathCount
            len(1, k) = len(1, k)+sqrt(sum((Pend-Pstart).^2));
            Pstart = Pend;
            ant_route(k, 2*l-1:2*l)=Pstart;
            if l < pathCount
                Pend = lines(l+1, 1:2) + (lines(l+1, 3:4)-lines(l+1, 1:2))*pathk(l+1, k)/10;
            end
        end
        Pend = T;
        len(1, k) = len(1, k)+sqrt(sum((Pend-Pstart).^2));
    end
    
    %% 更新信息素
    % 寻找最短路径
    minlen = min(len);
    minant = find(len == minlen);
    minant = minant(1);
    shortestroute(num, :) = ant_route(minant, :);
    % 更新全局最短路径
    if minlen < LL
        LL = minlen;
        LL_route = shortestroute(num, :);
    end
    
    % 路径信息素更新
    for i = 1:pathCount
        phePara(i, pathk(i, minant)) = (1-pheUpPara(1))* phePara(i, pathk(i, minant))+pheUpPara(1)*(1/minlen);
    end
    shortestpath(num) = LL;
end

3、结果分析

在无向网络图的基础上采用dijkstra算法规划初始路径,初始路径规划结果如图5所示。

在初始路径规划的基础上采用蚁群算法进行详细路径规划。根据初始路径规划结果判断路径经过的链路为v8→v7→v6→v12→v13→v11,每条链路均离散化为10个小路段,蚂蚁个数为10,个体长度为6,算法进化次数共500次,迭代过程中路径总长度变化及规划出的路径如图6和图7所示。

图片

图片

图片

Command Window中结果显示为:

初始路径:S->v8->v7->v6->v12->v13->v11->T
路径距离:229.0611
最短路径坐标:S->(60,164)->(66,160)->(102,142)->(134,98)->(136,94)->(140,94)->T
最短距离:173.8157

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1812538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java之IO流和集合框架的笔记

1 File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。 一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09; File 能新建、删…

网工使用频率最高的6款软件,都有的绝对是资深打工人

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 晚上好&#xff0c;我的网工朋友。 有不少朋友问到&#xff0c;深耕网络工程师需要哪些软件&#xff1f; 其实网工行业需要的软件还挺多的&…

JavaSE 实战五子棋中国象棋(单机简易版)

介绍 JavaSE实践五子棋和中国象棋游戏&#xff0c;棋盘&#xff0c;棋子绘制&#xff0c;输赢判定重置棋盘&#xff0c;单机博弈。 五子棋棋盘 中国象棋棋盘 使用说明 启动类 Main.java&#xff0c; 面板类 Panel.java绘制棋盘和玩法&#xff0c;实体类 ChessPiecesNode.jav…

新增多种图表类型,新增视频、流媒体、跑马灯组件,DataEase开源数据可视化分析工具v2.7.0发布

2024年6月11日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.7.0版本。 这一版本的功能变动包括&#xff1a;图表方面&#xff0c;新增对称条形图、桑基图、流向地图、进度条等图表类型&#xff0c;并对已有的仪表盘、指标卡、明细表、汇总表、水波图、象限…

芯片验证分享6 —— 激励开发4

大家好&#xff0c;我是谷公子&#xff0c;上节课跟大家分享了黑盒设计的几种常用方法。今天我们来讲激励的白盒设计和灰盒设计。 白盒设计允许我们检查芯片的内部结构。这种验证策略对芯片的逻辑结构进行检查&#xff0c;从中获取验证数据&#xff0c;遗憾的是&#xff0c;这…

IINA for Mac v1.3.5 安装教程(保姆级)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;测试2、查看版本号 **安装完成&#xff01;&#xf…

js之简单轮播图

今天给大家封装一个简单的轮播图,可以点击下一张上一张以及自动轮播 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>走马…

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【08】【商品服务】Object划分_批量删除

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【08】【商品服务】Object划分_批量删除 Object划分批量删除/添加参考 Object划分 数据库中对于一张表的数据&#xff0c;由于拥有隐私字段、多余字段、字段过少等原因&#xff0c;不应该直…

IP服务器代理如何设置使用?

IP服务器代理&#xff08;通常称为代理IP或代理服务器&#xff09;的设置和使用方法可以根据不同的需求和场景而有所不同。以下是一个清晰的步骤指南&#xff0c;帮助你设置和使用IP服务器代理&#xff1a; 1. 选择合适的代理IP类型 根据使用目的的不同&#xff0c;可以选择不…

Echarts 绘制地图(中国、省市、区县),保姆级教程!

前言&#xff1a;大家好呀&#xff0c;这篇讲述 VueEcharts 绘制地图&#xff08;中国、省市、区县&#xff09;&#xff0c;保姆级教程&#xff01;话不多说&#xff0c;上干货&#xff1a; 先安利两个网址&#xff0c;是制作地图的资源&#xff1a; DataV.地图GeoJSON数据 Ap…

微软将于 2024 下半年开始淘汰 VBScript

微软将于 2024 下半年开始淘汰 VBScript 微软宣布将从 2024 年下半年开始弃用 VBScript&#xff0c;使其成为一项按需功能 (Features on Demand&#xff0c;FOD)&#xff0c;直至完全删除。 按需功能是 Windows 操作系统中的可选功能&#xff0c;如 .NET Framework&#xff…

算法金 | D3blocks,一个超酷的 Python 库

​大侠幸会&#xff0c;在下全网同名[算法金] 0 基础转 AI 上岸&#xff0c;多个算法赛 Top [日更万日&#xff0c;让更多人享受智能乐趣] 1 选武入道 - 概况速览 库简介&#xff1a;D3Blocks是一个基于d3 javascript (d3js)的图形库&#xff0c;通过只需少量的Python代码就能…

安全相关的一些基础知识(持续更新)

目录 1. TRNG真随机数生成 2. 对称加密和非对称加密及其区别 3. Hash算法&#xff08;摘要算法&#xff09; 4. HTTPS、TLS、SSL、HTTP区别和关系 HTTPS的基本原理 5. PSS 1. TRNG真随机数生成 True Random Number Generator 在真随机数的生成里&#xff0c;把随机数的生…

MySQL学习(2):数据库相关概念及windows环境下安装

1.数据库、数据库管理系统、SQL 主流的关系型数据库有4种&#xff1a;oracle、mysql、SQLserver、PostgreSQL&#xff0c;它们都是SQL语言控制的 2.windows系统安装mysql 2.1下载安装包 mysql分为社区版&#xff08;免费&#xff09;和商业版&#xff08;30天试用&#xff09…

面试题:ArrayList和LinkedList的区别

ArrayList和LinkedList都是Java中实现List接口的集合类&#xff0c;用于存储和操作对象列表&#xff0c;但它们在内部数据结构、性能特性和适用场景上有所不同&#xff1a; 1.内部数据结构&#xff1a; ArrayList&#xff1a;基于动态数组实现。这意味着它在内存中是连续存储…

NodeJS体育用品销售管理系统-计算机毕业设计源码88807

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

BDD100k

摘要 数据集推动视觉进步&#xff0c;但现有的驾驶数据集在视觉内容和支持任务方面都很贫乏&#xff0c;以研究自动驾驶的多任务学习。研究人员通常被限制在一个数据集上研究一小部分问题&#xff0c;而现实世界的计算机视觉应用需要执行各种复杂的任务。我们构建了一个包含10…

一张试卷

目录 问题 1: 1.时间 题目描述1 输入1 输出1 样例输入1 样例输出1 提示1 代码1 问题 2: 超酷的电话号码 题目描述2 输入2 输出2 样例输入2 样例输出2 提示2 代码2 问题 3:3.爸爸的数学题 题目描述3 输入3 输出3 样例输入3 样例输出3 提示3 代码3 问题 4: 4. 营养膳食 题目描述4…

c# 学习 3

显示转换 异常捕获 语法

Django面试题

1. 什么是wsgi&#xff1f; WSGI 是 “Web Server Gateway Interface” 的缩写&#xff0c;它是一种用于 Python Web 应用程序和 Web 服务器之间通信的标准接口。它定义了一组规则和约定&#xff0c;使 Web 服务器能够与任何符合 WSGI 规范的 Python Web 应用程序进行交互。 #…