一、简介

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_numbermap3=map;for map_i = 1:robot_numberif 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;endend[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)]);
endif 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 k1==1[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)&(result2==11)disp('前两量车无法避让,需要重新规划路径')elseif (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;elseallpath_ID(all_conflict(k1,1)).wait_path=wait_path3;allpath_ID(all_conflict(k1,2)).wait_path=wait_path4;endendk1=k1+1;else[wait_path5,wait_path6,result3]=Enqueue1(allpath_ID(all_conflict(k1,1)).wait_path,...if result3==10allpath_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==10allpath_ID(all_conflict(k1,1)).wait_path=wait_path5;allpath_ID(all_conflict(k1,2)).wait_path=wait_path6;k1=1;elseif result3==12k1=1;
%                     disp('某两量车无法避让,需要重新规划路径')endendendenditers=iters-1;if iters==0;disp('超出最大迭代次数,需要重新规划路径')endend% 参考程序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.txtNrow=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==0for 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),[2,99]))connect_node_name(1)=i+1;endendif (ylabID<Ncol)%map的坐标关系和栅格中的对于y轴和列数是相反的if(~ismember(map(Ncol-ylabID,xlabID),[2,99]))connect_node_name(2)=i+Nrow;end    endif (xlabID>1)if (~ismember(map(Ncol-ylabID+1,xlabID-1),[2,99]))connect_node_name(3)=i-1;endendif (ylabID>1)if(~ismember(map(Ncol-ylabID+2,xlabID),[2,99]))connect_node_name(4)=i-Nrow;endendconnect_node_ID(i)=connect_node([connect_node_name,connect_node_name]);endelsefor 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 endif (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;endendif (xlabID>1)if(~ismember(map(Ncol-ylabID+1,xlabID-1),[1,2,3,99]))connect_node_name(3)=i-1;endendif (ylabID>1)if(~ismember(map(Ncol-ylabID+2,xlabID),[1,2,3,99]))connect_node_name(4)=i-Nrow;endend%为了右侧优先,设定的重复路径connect_node_ID(i)=connect_node([connect_node_name connect_node_name]);endend

三、运行结果


四、备注

版本:2014a

【路径规划】基于matlab A_star算法智能仓储机器人移动避碰路径规划【含Matlab源码 1180期】相关推荐

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

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]A_star算法智能仓储机器人移动避碰路径规划[含源码 1180期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文 ...

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

    ⛄一.简介 A算法 A算法是一种典型的启发式搜索算法,建立在Dijkstra算法的基础之上,广泛应用于游戏地图.现实世界中,用来寻找两点之间的最短路径.A算法最主要的是维护了一个启发式估价函数,如式( ...

  3. 【Matlab指纹识别】指纹识别匹配门禁系统【含GUI源码 587期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别匹配门禁系统[含GUI源码 587期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  4. 【Matlab图像加密】正交拉丁方置乱算法图像加解密【含GUI源码 182期】

    一.代码运行视频(哔哩哔哩) [Matlab图像加密]正交拉丁方置乱算法图像加解密[含GUI源码 182期] 二.matlab版本及参考文献 一.代码运行视频(哔哩哔哩) [Matlab图像处理]自动 ...

  5. 基于MATLAB的A*算法智能仓储机器人移动路径规划

    基于MATLAB的A*算法智能仓储机器人移动路径规划 智能仓储机器人在现代物流行业中发挥着重要的作用,其移动路径规划是其核心功能之一.本文将介绍如何使用MATLAB实现A*算法来进行智能仓储机器人的移 ...

  6. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  7. 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】

    一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  8. 【Matlab指纹识别】指纹识别门禁系统【含GUI源码 1692期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别门禁系统[含GUI源码 1692期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继 ...

  9. 【Matlab验证码识别】遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含GUI源码 1694期】

    一.代码运行视频(哔哩哔哩) [Matlab验证码识别]遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别[含GUI源码 1694期] 二.matlab版本及参考文献 1 matlab ...

  10. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

最新文章

  1. micropython中文社区 socket通讯_python网络编程学习笔记(3):socket网络服务器
  2. 【采集层】Kafka 与 Flume 如何选择
  3. 数据绑定以及Container.DataItem几种方式与用法分析 收藏
  4. 二十七、深入浅出Python中的 os模块
  5. editor多功能文本框在有些计算机上不能正常加载,解决方法,本人用的是把js调用方法放到body/body后面)...
  6. 兼容FF,IE的纯CSS下拉菜单
  7. C++ 向上转型初步01
  8. 构建一个自定义CentOS7内核
  9. 献给1975-1985年出生的人们!!!!
  10. PSFTP 常用命令
  11. Visual Studio2010安装步骤
  12. 基于Ubuntu系统下的Hadoop 环境搭建(新手可尝)
  13. 打开SVN server图形化管理界面
  14. Kafka报错: Topic(s) [publish] is/are not present and missingTopicsFatal is true
  15. 如何爬取豆瓣电影?python十分钟搞定
  16. wps插入C/C++代码
  17. 试试这几个简单好用的手机小技巧吧
  18. 淘宝客引流玩法介绍(一)
  19. 教程篇(6.4) 05. 集成 ❀ SD-WAN ❀ Fortinet 网络安全架构师 NSE7
  20. 面试手册第五版更新了!(面试必备)

热门文章

  1. django 标签的使用
  2. 文本区 JTextArea 的使用
  3. 安装运行okvis odometry
  4. [CSS学习] line-height属性讲解
  5. STM32 外部中断
  6. SELECT COUNT用法
  7. Python3入门机器学习经典算法与应用 第3章 Jupyter Notebook魔法命令%run,%timeit
  8. TCP IP通讯三次握手四次挥手
  9. 黑马程序员 Python学习笔记之 变量的命名
  10. knn k-近邻 学习笔记