路径规划算法学习Day5-A*算法的实现

  • 原理回顾
  • 一、A* 算法评价函数
  • 二、曼哈顿距离(Manhattan Distance)
    • 2.1、名词解释
    • 2.2、其它启发函数
  • 二、A* 算法matlab完全实现
    • 3.1、地图创建
    • 3.2、A*算法matlab主程序
    • 3.3、A*算法matlab主程序
  • 四、A* 算法50*50地图演示
  • 五、总结

原理回顾

路径规划算法学习Day4-Astar算法


一、A* 算法评价函数

评价函数:f(n)=h(n)+g(n);
A* 可以看作Dijkstar和贪婪算法的结合,Dijkstar在规划中注重的是当前节点到起点的总代价值。而贪婪算法注重的是当前节点到终点的总代价值
所以将评价函数定义为f(n),h(n)则为贪婪算法的权重代价,g(n)为Dijkstar的权重代价。
根据评价函数f(n),A* 函数就会有目的性的去规划路径。

二、曼哈顿距离(Manhattan Distance)

出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。

2.1、名词解释

图1中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离,因此,曼哈顿距离又称为出租车距离。曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。曼哈顿距离示意图在早期的计算机图形学中,屏幕是由像素构成,是整数,点的坐标也一般是整数,原因是浮点运算很昂贵,很慢而且有误差,如果直接使用AB的欧氏距离(欧几里德距离:在二维和三维空间中的欧氏距离的就是两点之间的距离),则必须要进行浮点运算,如果使用AC和CB,则只要计算加减法即可,这就大大提高了运算速度,而且不管累计运算多少次,都不会有误差。


我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里德空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。
例如在平面上,坐标(x1,y1)的i点与坐标(x2,y2)的j点的曼哈顿距离为:
d(i,j)=|X1-X2|+|Y1-Y2|.
此原理参考:曼哈顿距离

2.2、其它启发函数

当然,启发函数不单单曼哈顿距离一种,常见的还有欧式距离、切比雪夫距离等等。
欧式距离
切比雪夫距离

二、A* 算法matlab完全实现

3.1、地图创建

见路径规划算法学习Day3

3.2、A*算法matlab主程序

load('Map50.mat');
start_node = [1, 1];
dest_node  = [45, 46];
figure(1);
[path, iterations] = Astar1(map, start_node, dest_node);

3.3、A*算法matlab主程序

function [path,iterations]=Astar1(Map,origin,destination)
Heuristic_ratio = 1;%启发式函数比例
iterations=0;%记录迭代次数
%图像颜色给定
white = [1,1,1];%1
black = [0,0,0];%2
green = [0,1,0];%3
yellow = [1,1,0];%4
red = [1,0,0];%5
blue = [0,0,1];%6
cyan = [0,1,1];%7
color_list = [white; black; green; yellow; red; blue; cyan];
colormap(color_list);
Obstacle = 2;%障碍
Origin = 3;%开始
Destination = 4;%终点
Finished = 5;%完成搜索
Unfinished = 6;%未完成搜索
Path = 7;%路径[rows, cols]=size(Map);
%创建地图
logical_map = logical(Map);
map = zeros(rows,cols);
map(logical_map) = 2;%Barrier
map(~logical_map) = 1;%free
%list----g
node_g_list = Inf(rows, cols);
node_g_list(origin(1), origin(2)) = 0;
%list----f
node_f_list = Inf(rows, cols);
node_f_list(origin(1), origin(2)) = Heuristic(origin, destination, Heuristic_ratio);
% 创建父节点列表
parent_list = zeros(rows,cols);destination_index = sub2ind(size(Map), destination(1), destination(2));
origin_index = sub2ind(size(Map), origin(1), origin(2));
Open_list = [origin_index];
plan_succeeded = false;
%迭代循环
while 1iterations = iterations+1;map(origin(1), origin(2)) = Origin;map(destination(1), destination(2)) = Destination;[min_node_cost, current_node_index] = min(node_f_list(:));if(min_node_cost == inf || current_node_index == destination_index)plan_succeeded = true;break;endnode_f_list(current_node_index) = inf;map(current_node_index) = Finished;[i,j] = ind2sub(size(map), current_node_index);for k = 0:3 % four directionif(k == 0)adjacent_node = [i-1,j];elseif (k == 1)adjacent_node = [i+1,j];elseif (k == 2)adjacent_node = [i,j-1];elseif(k == 3)adjacent_node = [i,j+1];endif((adjacent_node(1) > 0 && adjacent_node(1) <= rows) && (adjacent_node(2) > 0 && adjacent_node(2) <= cols)) %保证搜索不超过地图界限if(map(adjacent_node(1),adjacent_node(2)) ~= Obstacle && map(adjacent_node(1),adjacent_node(2)) ~= Finished)if(node_g_list(adjacent_node(1),adjacent_node(2)) > min_node_cost + 1 )node_g_list(adjacent_node(1),adjacent_node(2)) = node_g_list(current_node_index) + 1;                 node_f_list(adjacent_node(1),adjacent_node(2)) = node_g_list(adjacent_node(1),adjacent_node(2)) + Heuristic(adjacent_node, destination, Heuristic_ratio);                  if(map(adjacent_node(1),adjacent_node(2)) == Origin)parent_list(adjacent_node(1),adjacent_node(2)) = 0;  %如果邻接节点是原点,则设置父节点为0。.elseparent_list(adjacent_node(1),adjacent_node(2)) = current_node_index;%设置父当前节点索引endif(map(adjacent_node(1),adjacent_node(2)) ~= Unfinished)map(adjacent_node(1),adjacent_node(2)) = Unfinished;    %将相邻节点标记为未完成endendendendend
endif(plan_succeeded)path = [];node = destination_index;while(parent_list(node) ~= 0)path = [parent_list(node), path];node = parent_list(node);endfor k = 2:size(path,2)map(path(k)) = 7;image(0.5,0.5,map);grid on;set(gca,'xtick',1:1:rows);set(gca,'ytick',1:1:rows);axis image;drawnow;end
elsepath = [];
end
end

四、A* 算法50*50地图演示

五、总结

此文为A*算法的完全实现,有问题请评论,欢迎大家查阅指正。

路径规划算法学习Day5相关推荐

  1. 路径规划算法学习Day2

    路径规划算法学习Day2-栅格法创建环境地图 前言 一.栅格法 1.原理 二.栅格法matlab实现 1.创建地图 2.完整代码 3.所生成地图 三.总结 前言 静态环境中机器人全局路径规划一直是路径 ...

  2. 路径规划算法学习Day3

    路径规划算法学习Day3-Dijkstra算法实现 前言 1.Dijkstra算法 1.1.地图创建 1.2.matlab实现 1.3.20*20地图 1.4.50*50地图 前言 算法原理:参考路径 ...

  3. 多无人机任务分配与路径规划算法学习(一)

    本文是阅读"多无人机任务分配与路径规划算法研究_丁家如"文献的学习记录. 记录的第一部分是有关任务分配的知识,各种模型的建立就放到下次来写. 一.多无人机任务分配的本质 目前阅读的 ...

  4. 视觉学习笔记5——FAR Planner全局路径规划算法学习研究

    文章目录 一.Far Planner是什么? 二.配置安装Far Planner 1.运行环境 2.下载编译开发环境包 3.编译Far_Planner 一.Far Planner是什么? FAR Pl ...

  5. 自动驾驶路径规划——基于概率采样的路径规划算法(RRT、RRT*)

    目录 1. RRT算法背景 1.1 RRT算法核心思想 1.2 RRT算法优缺点 2. 经典RRT算法 2.1 RRT算法流程 2.2 RRT伪代码 3. 基于目标概率采样 4. RRT*算法 4.1 ...

  6. 机器人学习--路径规划算法

    参考网址:https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&mid=2247520667&idx=3&sn=47ee67915 ...

  7. Apollo学习笔记(24)基于采样的路径规划算法

    之前的文章都是基于搜索的路径算法,这两天在又学习了一下基于采样的路径规划算法,这里做一下记录,最后会奉上大神的链接 基于采样的路径规划算法大致可以分为综合查询方法和单一查询方法两种. 前者首先构建路线 ...

  8. 基于强化学习的智能机器人路径规划算法研究(附代码)

    目录 一.摘要 二.路径规划技术的研究进展 1.研究现状 2.算法分类 2.1 全局路径规划算法 2.2 局部路径规划算法 三.本文采用的路径规划算法--强化学习 1. 概念 2. 与其他机器学习方式 ...

  9. Apollo星火计划学习笔记——Apollo路径规划算法原理与实践

    文章目录 前言 1. 路径规划算法总体介绍 1.1 Task: LANE_CHANGE_DECIDER 1.2 Task: PATH_REUSE_DECIDER 1.3 Task: PATH_BORR ...

最新文章

  1. 面向对象编程(OOP)和面向过程编程
  2. DiskFileUpload类常用方法
  3. 新一代的编译工具 SWC,97年小哥写的~
  4. Java案例:利用JDBC连接Oracle数据库
  5. 【TensorFlow实战】TensorFlow实现经典卷积神经网络之ResNet
  6. 索引 | ggplot2基础语法系列推文汇总
  7. 1.08 亿条投注信息遭泄露,Elasticsearch 是祸因?!
  8. HTML关联两个标签事件,javascript – 交换2个html元素并保留事件侦听器
  9. linux中buff/cache占用高
  10. 《C++ 黑客编程揭秘与防范(第2版)》目录—导读
  11. easyexcel1.0导出excel测试案例
  12. java 图片不失真缩放,ico格式图片转换,透明图层,jar->exe
  13. 自用房屋租住管理系统
  14. windows服务器系统发展史,从1.0到Win10:Windows操作系统进化史
  15. kotlin的必修之路
  16. 怎样理解心藏神,肝藏魂,脾藏意,肺藏魄,肾藏精志?
  17. 宇视摄像机实况画面不清晰排查方法
  18. Kali Linux速查手记(长期更新)
  19. 计算机网络实验报告 静态路由的配置
  20. 前端(react)上传到阿里云OSS存储 实例

热门文章

  1. Bin文件和Hex文件相互转换
  2. 代码坏味道之夸夸其谈的未来性
  3. 安卓获取摄像头帧率_一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法_2015109767475_说明书_专利查询_专利网_钻瓜专利网...
  4. python 解析域名_三、域名解析模块(dnspython)
  5. TCA9548A-I2C多路复用器介绍
  6. Windows驱动程序的安装(一)
  7. 麦肯锡解决问题七步法
  8. Content Distribution Networks(CDNs)
  9. AcWing1488. 最短距离
  10. Schillace 定律 背后的 Sam Schillace