【路径规划】A_star算法智能仓储机器人移动避碰路径规划【含Matlab源码 1180期】

✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式
⛳️座右铭:行百里者,半于九十。

更多Matlab仿真内容点击👇
Matlab图像处理(进阶版)
路径规划(Matlab)
神经网络预测与分类(Matlab)
优化求解(Matlab)
语音处理(Matlab)
信号处理(Matlab)
车间调度(Matlab)

⛄一、简介

A算法
A算法是一种典型的启发式搜索算法,建立在Dijkstra算法的基础之上,广泛应用于游戏地图、现实世界中,用来寻找两点之间的最短路径。A算法最主要的是维护了一个启发式估价函数,如式(1)所示。
f(n)=g(n)+h(n)(1)
其中,f(n)是算法在搜索到每个节点时,其对应的启发函数。它由两部分组成,第一部分g(n)是起始节点到当前节点实际的通行代价,第二部分h(n)是当前节点到终点的通行代价的估计值。算法每次在扩展时,都选取f(n)值最小的那个节点作为最优路径上的下一个节点。
在实际应用中,若以最短路程为优化目标,h(n)常取作当前点到终点的欧几里得距离(Euclidean Distance)或曼哈顿距离(Manhattan Distance)等。若令h(n)=0,表示没有利用任何当前节点与终点的信息,A
算法就退化为非启发的Dijkstra算法,算法搜索空间随之变大,搜索时间变长。
A*算法步骤如下,算法维护两个集合:P表与Q表。P表存放那些已经搜索到、但还没加入最优路径树上的节点;Q表维护那些已加入最优路径树上的节点。
(1)P表、Q表置空,将起点S加入P表,其g值置0,父节点为空,路网中其他节点g值置为无穷大。
(2)若P表为空,则算法失败。否则选取P表中f值最小的那个节点,记为BT,将其加入Q表中。判断BT是否为终点T,若是,转到步骤(3);否则根据路网拓扑属性和交通规则找到BT的每个邻接节点NT,进行下列步骤:

①计算NT的启发值
f(NT)=g(NT)+h(NT)(2)
g(NT)=g(BT)+cost(BT, NT)(3)
其中,cost(BT, NT)是BT到NT的通行代价。
②如果NT在P表中,且通过式(3)计算的g值比NT原先的g值小,则将NT的g值更新为式(3)结果,并将NT的父节点设为BT。
③如果NT在Q表中,且通过式(3)计算的g值比NT原先的g值小,则将NT的g值更新为式(3)结果,将NT的父节点设为BT,并将NT移出到P表中。
④若NT既不在P表,也不在Q表中,则将NT的父节点设为BT,并将NT移到P表中。
⑤转到步骤(2)继续执行。
(3)从终点T回溯,依次找到父节点,并加入优化路径中,直到起点S,即可得出优化路径。

⛄二、部分源代码

%main函数,robot_number的数目目前支持2~6;
clear all;
close all;
clear variables;
clc;
robot_number=3;
[map,grid1,Nrow,Ncol,sorting_table,Obstacle]=initial_input();
% Obstacle_index=max(round(rand(1,30)*length(Obstacle)),1);
% Obstacle_index=randperm(length(Obstacle),10);
Obstacle_index=[48,24,70,43,34,15,59,12,58,35,46,61, 4,79,30,63,60,31,67,37, 6,20,50,73,72,56,47,14,78,62];
mission_list=[];start_node=[];
for i=1:length(Obstacle_index)
mission_list=[mission_list,Obstacle(Obstacle_index(i))];
end
mission=mission_list(1:robot_number);
%从N个数中不重复的选取一些数
% start_node=Obstacle(randperm(length(Obstacle),robot_number));
start_node=[166,352,5,12,120,220,240,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40];
for k1=1:robot_number
robot_ID(k1)=robot();
robot_ID(k1).location=start_node(k1);
end

[scedule_table,undistributed_mission]=Schedule1(robot_ID,mission,Nrow,Ncol);
%scedule_table结果的第一行为任务的索引,格式大多数情况为1:length(mission), 第二行为该任务分配给的小车。
for i=1:length(scedule_table(1,:))
end_node(scedule_table(2,i))=mission(scedule_table(1,i));
end
for k2=1:robot_number
map3=map;
for map_i = 1:robot_number
if map_i~=k2
[ia,ib]=ind2sub([Nrow,Ncol],start_node(map_i));
map3(Ncol-ib+1,ia)=2;
[ia1,ib1]=ind2sub([Nrow,Ncol],end_node(map_i));
map3(Ncol-ib1+1,ia1)=2;
end
end
[sorting_table_index]= assign_sorting_table(end_node(k2),sorting_table);
allpath_ID(k2)=allpath([Astar_method(start_node(k2),end_node(k2),0,map3),Astar_method(end_node(k2),sorting_table(sorting_table_index,1),1,map3),…
sorting_table(sorting_table_index,2:4),Astar_method(sorting_table(sorting_table_index,5),end_node(k2),1,map3)]);
end

if length(robot_ID)>1
% 所有的两两路径冲突检验
all_conflict=nchoosek(1:length(robot_ID), 2);
k1=1;iters=length(all_conflict(:,1))*2;
while k1<=length(all_conflict(:,1))&iters>0;
if k11
[wait_path1,wait_path2,result1]=Enqueue1(allpath_ID(all_conflict(k1,1)).wait_path,…
allpath_ID(all_conflict(k1,2)).wait_path,1,map);
[wait_path4,wait_path3,result2]=Enqueue1(allpath_ID(all_conflict(k1,2)).wait_path,…
allpath_ID(all_conflict(k1,1)).wait_path,1,map);
if (result1
11)&(result211)
disp(‘前两量车无法避让,需要重新规划路径’)
else
if (result2
11)|((result1==10)&(length(wait_path1)+length(wait_path2)<=length(wait_path3)+length(wait_path4)))
allpath_ID(all_conflict(k1,1)).wait_path=wait_path1;
allpath_ID(all_conflict(k1,2)).wait_path=wait_path2;
else
allpath_ID(all_conflict(k1,1)).wait_path=wait_path3;
allpath_ID(all_conflict(k1,2)).wait_path=wait_path4;
end
end
k1=k1+1;
else
[wait_path5,wait_path6,result3]=Enqueue1(allpath_ID(all_conflict(k1,1)).wait_path,…

        if result3==10
            allpath_ID(all_conflict(k1,1)).wait_path=wait_path5;
            allpath_ID(all_conflict(k1,2)).wait_path=wait_path6;
            k1=k1+1;
        else 
            [wait_path6,wait_path5,result3]=Enqueue1(allpath_ID(all_conflict(k1,2)).wait_path,...
     
            if result3==10
                allpath_ID(all_conflict(k1,1)).wait_path=wait_path5;
                allpath_ID(all_conflict(k1,2)).wait_path=wait_path6;
                k1=1;
            else
                if result3==12
                   
                    
                    k1=1;

% disp(‘某两量车无法避让,需要重新规划路径’)
end
end
end
end
iters=iters-1;
if iters0;
disp(‘超出最大迭代次数,需要重新规划路径’)
end
end
% 参考程序Archive中astardemo.m
%存储可行的节点,朝向1,2,3,4
function [path]=Astar_method(start_node,end_node,loading,map,stop_car)
% Nrow=20;start_node=115;shelf_node=225;end_node=143;loading=1;
setOpen=[start_node];setOpenCosts=[0];setOpenHeuristics=[Inf];
setClosed=[];setClosedCosts=[];
%load /Users/jindi/Desktop/map.txt
Nrow=length(map(1,:));
Ncol=length(map(:,1));
% if
%为该栅格右上角的坐标
[xlabID_end,ylabID_end]=ind2sub([Nrow,Ncol],end_node);
%将起点和终点改为没有障碍
map(Ncol-ylabID_end+1,xlabID_end)=0;
if loading
0
for i=1:(NrowNcol)
connect_node_name=[0,0,0,0];
%为该栅格右上角的坐标
[xlabID,ylabID]=ind2sub([Nrow,Ncol],i);
if (xlabID<Nrow)
if (~ismember(map(Ncol-ylabID+1,xlabID+1),[2,99]))
connect_node_name(1)=i+1;
end
end
if (ylabID<Ncol)
%map的坐标关系和栅格中的对于y轴和列数是相反的
if(~ismember(map(Ncol-ylabID,xlabID),[2,99]))
connect_node_name(2)=i+Nrow;
end
end
if (xlabID>1)
if (~ismember(map(Ncol-ylabID+1,xlabID-1),[2,99]))
connect_node_name(3)=i-1;
end
end
if (ylabID>1)
if(~ismember(map(Ncol-ylabID+2,xlabID),[2,99]))
connect_node_name(4)=i-Nrow;
end
end
connect_node_ID(i)=connect_node([connect_node_name,connect_node_name]);
end
else
for i=1:(Nrow
Ncol)
connect_node_name=[0,0,0,0];
%为该栅格右上角的坐标
[xlabID,ylabID]=ind2sub([Nrow,Ncol],i);
if (xlabID<Nrow)
if(~ismember(map(Ncol-ylabID+1,xlabID+1),[1,2,3,99]))
connect_node_name(1)=i+1;
end
end
if (ylabID<Ncol)
% [xlabID1,ylabID1]=ind2sub([Nrow,Nrow],i+Nrow)
if(~ismember(map(Ncol-ylabID,xlabID),[1,2,3,99]))
connect_node_name(2)=i+Nrow;
end
end
if (xlabID>1)
if(~ismember(map(Ncol-ylabID+1,xlabID-1),[1,2,3,99]))
connect_node_name(3)=i-1;
end
end
if (ylabID>1)
if(~ismember(map(Ncol-ylabID+2,xlabID),[1,2,3,99]))
connect_node_name(4)=i-Nrow;
end
end
%为了右侧优先,设定的重复路径
connect_node_ID(i)=connect_node([connect_node_name connect_node_name]);
end
end

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]钱程,许映秋,谈英姿.A Star算法在RoboCup救援仿真中路径规划的应用[J].指挥与控制学报. 2017,3(03)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值