通俗易懂的路径搜索之A-star算法
A-star算法
搜索技术
搜索技术是一种通用的问题求解技术,可以将待解决的问题转化为可搜索的问题空间,然后在该空间中搜索求解。搜索技术在人工智能领域有着非常广泛的应用.
盲目搜索
盲目搜索是最简单的搜索方法,如宽度优先搜索和深度优先搜索,这种搜索方法效率非常低,只适用于非常简单的问题求解。
骑士旅行问题: 我们在6×6的棋盘上用国际象棋中的骑士遍历整个棋盘并回到出发点,这个看似并不复杂的问题如果用盲目搜索求解,可能需要好几天的时间。
启发式搜索
启发式搜索: 通过问题的特征信息引导搜索过程,减小搜索范围,从而提高搜索效率。还以上面提到的骑士旅行问题为例,使用启发式搜索方法,普通笔记本求解只需要20分钟,计算效率得到了几百倍的提升。
A-star算法
A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。
简单例子看启发式搜索
题目
- 绿色方块是起点,红色方块是终点,蓝色的方块是障碍物,求起点到终点的最短路径。
- 规则:每次只能移动一格,可以往8个方向移动.
- 移动水平或竖直方向移动代价为10,斜向移动代价为14.
- 从起点到终点总的移动代价最小的路径即为最短路径。

分析
- 盲目搜索的思路是遍历每一种可能的路径,显然绝大部分路径都是无用的,比如在这个例子中首先往左侧移动是肯定无法得到最短路径的。
- A*算法的思路是在所有可能的下一步子结点中进行试探性的搜索,寻找最佳结点。
- 判断最佳结点的公式:
F = G + H
G表示起点到子结点的代价。
H表示子结点到终点的预估代价。
注意这里H是预估代价,我们可以使用曼哈顿距离来计算:H = 10( |x
1-x
2| + |y
1-y
2| )

上图计算了起点的所有子节点的F值(左上角)、G值(左下角)、H值(右下角).
- 显然右侧的子结点F值最小,我们把它作为最佳结点A.
- 继续下一步的搜索。对于当前节点来说,共有4个可能的子结点,右侧蓝色障碍物无法移动,左侧绿色结点为起点,不必走回头路。经过计算,上方(或下方)的结点的F值最小,可以当作最佳结点B.
- 此时我们发现:由结点A到结点B的F值要大于从起点到结点B的F值,我们需要重新选择从起点移动到结点B作为第一步,A*算法就是通过这种原理实现路径的不断优化。
通俗易懂的路径搜索之A-star算法的更多相关文章
- 使用A Star 算法实现自动寻路详解
@ 目录 1.什么是A Start算法 2.A Star算法的原理和流程 2.1 前提 2.1.1 从起点开始扩散的节点 2.1.2 最短距离计算公式:F = G + H 2.1.3 欧几里得距离计算 ...
- A Star算法笔记
回顾A*算法,偶得一源代码,略有瑕疵,改正之,并置于下. using System; using System.Collections.Generic; using System.Linq; usin ...
- 十大经典排序算法的JS版
前言 个人博客:Damonare的个人博客 如遇到问题或有更好的优化方法,可以: 提issue给我 或是pull requests 我都会看到并处理,欢迎Star. 这世界上总存在着那么一些看似相似但 ...
- 堪称最好的A*算法(转)
如此好贴,不能不转!原文地址:http://dev.gameres.com/Program/Abstract/Arithmetic/AmitAStar.mht 中文译文转自:http://blog.c ...
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- [Python]基于K-Nearest Neighbors[K-NN]算法的鸢尾花分类问题解决方案
看了原理,总觉得需要用具体问题实现一下机器学习算法的模型,才算学习深刻.而写此博文的目的是,网上关于K-NN解决此问题的博文很多,但大都是调用Python高级库实现,尤其不利于初级学习者本人对模型的理 ...
- <转载> 从算法上解读自动驾驶是如何实现的?
科技新闻小鹏汽车2016-03-28 10:42 [摘要]车辆路径规划问题中路网模型.路径规划算法和交通信息的智能预测为关键点. 由于驾驶员的驾驶工作繁重,同时随着汽车拥有量的增加,非职业驾驶员的数 ...
- 最短路问题(dijkstral 算法)(优化待续)
迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向 ...
- hdu 1874 Dijkstra算法
先贴个网上找的比较通俗易懂的教程: 2.1Dijkstra算法(非负权,使用于有向图和无向图) Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心 ...
- JavaScript十大经典排序算法
排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ...
随机推荐
- 使用 DISM 安全清理 C 盘 WinSxS 文件夹空间
本文将介绍如何使用系统内置 DISM 工具进行安全清理 C 盘空间,清理 WinSxS 文件夹里面的可回收删除的程序包空间 开始之前,先使用管理员权限打开 CMD 或 PowerShell 命令行窗口 ...
- C# dotnet 的锁 SemaphoreSlim 和队列
本文主要是试验在顺序进入等待 SemaphoreSlim 的任务是否会按照顺序经过锁执行 我在一个有趣的WPF程序里面,需要限制任务同时执行的线程数量,不然用户就会说用我的程序会让电脑卡渣.而我的任务 ...
- 快速部署 微软开源的 Garnet 键值数据库
快速部署 微软开源的 Garnet 键值数据库 Garnet 是 Microsoft Research 推出的一种新型远程缓存存储,其设计速度极快.可扩展且延迟低. Garnet 在单个节点内是线程可 ...
- LLaMA 3 源码解读-大语言模型5
本来不是很想写这一篇,因为网上的文章真的烂大街了,我写的真的很有可能没别人写得好.但是想了想,创建这个博客就是想通过对外输出知识的方式来提高自身水平,而不是说我每篇都能写得有多好多好然后吸引别人来看. ...
- 分享一张2020年用jaegertracing画的tomcat8.5启动流程图
今天整理电脑的时候意外发现一张tomcat8.5的启动流程图,是笔者2020年借助jaegertracing绘制的,想想还比较有意思,在这里分享一下,当初闲来无事折腾了小半天,具体过程已经是记不起来了 ...
- Linux中文件的隐藏属性
在Linux系统中,可以使用chattr与lsattr来操作文件的隐藏属性.
- 在Docker内部使用gdb调试器报错-Operation not permitted
在docker内部使用gdb调试时刻遇到了gdb如下报错信息: warning: Error disabling address space randomization: Operation not ...
- vue3组件封装
1.父组件调用子组件属性和方法 父组件中template写法: <role-modal ref="myRoleModal" @OK="roleModalOK&quo ...
- Istio(七):ServiceEntry,sidecar,Envoy Filter
目录 一.模块概览 二.系统环境 三.ServiceEntry 四.sidecar 4.1 Sidecar 4.2 工作负载选择器 4.3 入口和出口监听器 五.Envoy Filter 5.1 En ...
- C# winfrom 局域网版多人成语接龙(二)
功能基本上是完成了,要两个人完才好玩,目前 倒计时,每组游戏玩家数量这些控制变量,都是写死再代码里的,等以后想改的时候再改,这个项目核心的功能算是实现了,但还可以扩展,比如记录一下用户的游戏数据,答对 ...