百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

基于蚁群算法的机器人路径规划matlab程序代码实现

bigegpt 2024-10-12 05:52 11 浏览

基于蚁群算法的机器人路径规划matlab程序代码实现

说明: 基于蚁群算法的机器人路径规划。使用网格离散化的方法对带有障碍物的环境建模,使用邻接矩阵存储该环境,使得问题转化为蚁群算法寻找最短路径。

%% ---------------------------------------------------------------
% 输入参数列表
% G 地形图为01矩阵,如果为1表示障碍物
% Tau 初始信息素矩阵(认为前面的觅食活动中有残留的信息素)
% K 迭代次数(指蚂蚁出动多少波)
% M 蚂蚁个数(每一波蚂蚁有多少个)
% S 起始点(最短路径的起始点)
% E 终止点(最短路径的目的点)
% Alpha 表征信息素重要程度的参数
% Beta 表征启发式因子重要程度的参数
% Rho 信息素蒸发系数
% Q 信息素增加强度系数
%
% 输出参数列表
% ROUTES 每一代的每一只蚂蚁的爬行路线
% PL 每一代的每一只蚂蚁的爬行路线长度
% Tau 输出动态修正过的信息素
%% --------------------变量初始化----------------------------------
function m_main()
tic
G=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0;
0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;
0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;
0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;
0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0;
0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;]; %利用矩阵来表示栅格
MM=size(G1); % G 地形图为01矩阵,如果为1表示障碍物 返回矩阵G的行数(有几行)
Tau=ones(MM*MMMM*MM);% Tau 初始信息素矩阵,在这里设置所有位置初始信息素都相同(400*400矩阵)
Tau=8.*Tau;
K=100; % K 迭代次数(指蚂蚁出动多少波)
M=50; % M 蚂蚁个数(每一波蚂蚁有多少个)
S=1 ; % S 起始点(最短路径的起始点)
E=MM*MM; % E 终止点(最短路径的目的点)
Alpha=1; % Alpha 表征信息素重要程度的参数
Beta=7; % Beta 表征启发式因子重要程度的参数
Rho=0.3; % Rho 信息素蒸发系数
Q=1; % Q 信息素增加强度系数
minkl=inf;
mink=0;
minl=0;
D=G2D(G);
N=size(D1);%N表示问题的规模
a=1;%小方格象素的边长
Ex=a*(mod(EMM)-0.5);%终止点横坐标mod求余函数
if Ex==-0.5
Ex=MM-0.5;
end
Ey=a*(MM+0.5-ceil(E/MM));%终止点纵坐标cell返回大于或者等于指定表达式的最小整数
Eta=zeros(N);%启发式信息,取为至目标点的直线距离的倒数
%下面构造启发式信息矩阵
for i=1:N
ix=a*(mod(iMM)-0.5);
if ix==-0.5
ix=MM-0.5;
end
iy=a*(MM+0.5-ceil(i/MM));
if i~=E %不等于
Eta(i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;
else
Eta(i)=100;
end
end
ROUTES=cell(KM);%用细胞结构存储每一代的每一只蚂蚁的爬行路线里面的元素可以是任意类型的变量(属性变量,用户自己创建的变量),而不必是统一的类型
PL=zeros(KM);%用矩阵存储每一代的每一只蚂蚁的爬行路线长度
%% -----------启动K轮蚂蚁觅食活动,每轮派出M只蚂蚁--------------------
for k=1:K
for m=1:M
%% 第一步:状态初始化
W=S;%当前节点初始化为起始点
Path=S;%爬行路线初始化
PLkm=0;%爬行路线长度初始化
TABUkm=ones(N);%禁忌表初始化
TABUkm(S)=0;%已经在初始点了,因此要排除
DD=D;%邻接矩阵初始化
%% 第二步:下一步可以前往的节点
DW=DD(W:);
DW1=find(DW);
for j=1:length(DW1)
if TABUkm(DW1(j))==0
DW(DW1(j))=0;
end
end
LJD=find(DW);
Len_LJD=length(LJD);%可选节点的个数
%% 觅食停止条件:蚂蚁未遇到食物或者陷入死胡同
while W~=E&&Len_LJD>=1
%% 第三步:转轮赌法选择下一步怎么走
PP=zeros(Len_LJD);
for i=1:Len_LJD
PP(i)=(Tau(WLJD(i))^Alpha)*((Eta(LJD(i)))^Beta);
end
sumpp=sum(PP); %不太理解???
PP=PP/sumpp;%建立概率分布
Pcum(1)=PP(1);
for i=2:Len_LJD
Pcum(i)=Pcum(i-1)+PP(i);
end
Select=find(Pcum>=rand);
to_visit=LJD(Select(1));
%% 第四步:状态更新和记录
Path=[Pathto_visit];%路径增加
PLkm=PLkm+DD(Wto_visit);%路径长度增加
W=to_visit;%蚂蚁移到下一个节点
for kk=1:N
if TABUkm(kk)==0
DD(Wkk)=0;
DD(kkW)=0;
end
end
TABUkm(W)=0;%已访问过的节点从禁忌表中删除
DW=DD(W:);
DW1=find(DW);
for j=1:length(DW1)
if TABUkm(DW1(j))==0
DW(j)=0;
end
end
LJD=find(DW);
Len_LJD=length(LJD);%可选节点的个数
end
%% 第五步:记下每一代每一只蚂蚁的觅食路线和路线长度
ROUTES{km}=Path;
if Path(end)==E
PL(km)=PLkm;
if PLkm<minkl
mink=k;minl=m;minkl=PLkm;
end
else
PL(km)=0;
end
end
%% 第六步:更新信息素
Delta_Tau=zeros(NN);%更新量初始化
for m=1:M
if PL(km)
ROUT=ROUTES{km};
TS=length(ROUT)-1;%跳数
PL_km=PL(km);
for s=1:TS
x=ROUT(s);
y=ROUT(s+1);
Delta_Tau(xy)=Delta_Tau(xy)+Q/PL_km;
Delta_Tau(yx)=Delta_Tau(yx)+Q/PL_km;
end
end
end
Tau=(1-Rho).*Tau+Delta_Tau;%信息素挥发一部分,新增加一部分
end
%% ---------------------------绘图--------------------------------
plotif=1;%是否绘图的控制参数
if plotif==1
toc
%绘收敛曲线
minPL=zeros(K);
for i=1:K
PLK=PL(i:);
Nonzero=find(PLK);
PLKPLK=PLK(Nonzero);
minPL(i)=min(PLKPLK);
end
figure(1)
plot(minPL);
hold on
grid on
title('收敛曲线(最小路径长度)');
xlabel('迭代次数');
ylabel('路径长度');
%绘爬行图
figure(2)
axis([0MM0MM])
for i=1:MM
for j=1:MM
if G(ij)==1
x1=j-1;y1=MM-i;
x2=j;y2=MM-i;
x3=j;y3=MM-i+1;
x4=j-1;y4=MM-i+1;
fill([x1x2x3x4][y1y2y3y4][0.20.20.2]);
hold on
else
x1=j-1;y1=MM-i;
x2=j;y2=MM-i;
x3=j;y3=MM-i+1;
x4=j-1;y4=MM-i+1;
fill([x1x2x3x4][y1y2y3y4][111]);
hold on
end
end
end
hold on
ROUT=ROUTES{minkminl};
LENROUT=length(ROUT);
Rx=ROUT;
Ry=ROUT;
for ii=1:LENROUT
Rx(ii)=a*(mod(ROUT(ii)MM)-0.5);
if Rx(ii)==-0.5
Rx(ii)=MM-0.5;
end
Ry(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));
end
plot(RxRy)
end
plotif2=0;%绘各代蚂蚁爬行图
if plotif2==1
figure(3)
axis([0MM0MM])
for i=1:MM
for j=1:MM
if G(ij)==1
x1=j-1;y1=MM-i;
x2=j;y2=MM-i;
x3=j;y3=MM-i+1;
x4=j-1;y4=MM-i+1;
fill([x1x2x3x4][y1y2y3y4][0.20.20.2]);
hold on
else
x1=j-1;y1=MM-i;
x2=j;y2=MM-i;
x3=j;y3=MM-i+1;
x4=j-1;y4=MM-i+1;
fill([x1x2x3x4][y1y2y3y4][111]);
hold on
end
end
end
for k=1:K
PLK=PL(k:);
minPLK=min(PLK);
pos=find(PLK==minPLK);
m=pos(1);
ROUT=ROUTES{km};
LENROUT=length(ROUT);
Rx=ROUT;
Ry=ROUT;
for ii=1:LENROUT
Rx(ii)=a*(mod(ROUT(ii)MM)-0.5);
if Rx(ii)==-0.5
Rx(ii)=MM-0.5;
end
Ry(ii)=a*(MM+0.5-ceil(ROUT(ii)/MM));
end
plot(RxRy)
hold on
end
end
toc
function D=G2D(G)
l=size(G1);
D=zeros(l*ll*l);
for i=1:l
for j=1:l
if G(ij)==0
for m=1:l
for n=1:l
if G(mn)==0
im=abs(i-m);jn=abs(j-n);
if im+jn==1||(im==1&&jn==1)
D((i-1)*l+j(m-1)*l+n)=(im+jn)^0.5;
end
end
end
end
end
end
end

相关推荐

最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)

前言作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上...

Redis数据库从入门到精通(redis数据库设计)

目录一、常见的非关系型数据库NOSQL分类二、了解Redis三、Redis的单节点安装教程四、Redis的常用命令1、Help帮助命令2、SET命令3、过期命令4、查找键命令5、操作键命令6、GET命...

netcore 急速接入第三方登录,不看后悔

新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢。如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下:https://oauthlogin.net/前言此次带来得这个小项目是...

精选 30 个 C++ 面试题(含解析)(c++面试题和答案汇总)

大家好,我是柠檬哥,专注编程知识分享。欢迎关注@程序员柠檬橙,编程路上不迷路,私信发送以下关键字获取编程资源:发送1024打包下载10个G编程资源学习资料发送001获取阿里大神LeetCode...

Oracle 12c系列(一)|多租户容器数据库

作者杨禹航出品沃趣技术Oracle12.1发布至今已有多年,但国内Oracle12C的用户并不多,随着12.2在去年的发布,选择安装Oracle12c的客户量明显增加,在接下来的几年中,Or...

flutter系列之:UI layout简介(flutter-ui-nice)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。在flutter中,基本上所有的对象都是wi...

Flutter 分页功能表格控件(flutter 列表)

老孟导读:前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析来来。PaginatedDataTablePaginatedDataTable是一个带分页功能的DataTable,...

Flutter | 使用BottomNavigationBar快速构建底部导航

平时我们在使用app时经常会看到底部导航栏,而在flutter中它的实现也较为简单.需要用到的组件:BottomNavigationBar导航栏的主体BottomNavigationBarI...

Android中的数据库和本地存储在Flutter中是怎样实现的

如何使用SharedPreferences?在Android中,你可以使用SharedPreferencesAPI来存储少量的键值对。在Flutter中,使用Shared_Pref...

Flet,一个Flutter应用的实用Python库!

▼Flet:用Python轻松构建跨平台应用!在纷繁复杂的Python框架中,Flet宛如一缕清风,为开发者带来极致的跨平台应用开发体验。它用最简单的Python代码,帮你实现移动端、桌面端...

flutter系列之:做一个图像滤镜(flutter photo)

简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起...

flutter软件开发笔记20-flutter web开发

flutterweb开发优势比较多,采用统一的语言,就能开发不同类型的软件,在web开发中,特别是后台式软件中,相比传统的html5开发,更高效,有点像c++编程的方式,把web设计出来了。一...

Flutter实战-请求封装(五)之设置抓包Proxy

用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来...

为什么不在 Flutter 中使用全局变量来管理状态

我相信没有人用全局变量来管理Flutter应用程序的状态。毫无疑问,我们的Flutter应用程序需要状态管理包或Flutter的基本小部件(例如InheritedWidget或St...

Flutter 攻略(Dart基本数据类型,变量 整理 2)

代码运行从main方法开始voidmain(){print("hellodart");}变量与常量var声明变量未初始化变量为nullvarc;//未初始化print(c)...