最新要闻
- 楼市回暖背后:多城二手房在售量持续增加
- 环球新消息丨vivo将整合旗下iQOO手机:开启降本增效
- 王传福:比亚迪目标年底成为中国最大汽车制造商
- 全球热讯:全球最大游戏展危险了!世嘉、腾讯均宣布不参加本届E3
- 绿巨人前女友15年后回归漫威!《美国队长4》新剧照曝光:黑人美队现身
- 环球即时看!联名高达!ROG游戏手机7系列来了:二代骁龙8+6000mAh电池
- 全球视讯!中国代表敦促个别国家立即解除对叙利亚单边制裁
- 天天简讯:四方达(300179)3月28日主力资金净卖出861.62万元
- 微信QQ出现功能异常 官方紧急修复:微信支付等功能已恢复
- 天天速看:男子陵园祭祖车雷达显示全是人 网友:啥车?我想试试
- PS主机神作好评仅有32%!顽皮狗回应《最后生还者》PC优化翻车
- 全球速读:专家谈ChatGPT:或让更多人享受生活 一周只工作一天
- 全球热讯:电池级碳酸锂价格腰斩 电动车会降价吗?专家给出结论
- 环球速看:魔法氛围拉满!Redmi Note 12 Turbo哈利波特版图赏
- 不用带手机 抬手就能付!微信支付尝试推出微信刷掌服务
- 天天要闻:开发者危机!微软GitHub启动裁员:印度工程师团队几乎整体裁撤
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
焦点快报!Dijkstar-And-Astar算法
Dijkstra And A*
目录- Dijkstra And A*
- 1.0 引出
- 2.0 Dijkstar Algorithm
- 2.1 整体流程
- 2.2 算法伪代码
- 2.3 Pros and Cons of Dijkstra’s Algorithm(优缺点)
- 3.0 A* Algorithm
- 3.1 启发式搜索 (Search Heuristic)
- 3.2 A* :Dijkstra with a Heuristic
- 3.3 A* Optimality
- 3.3.1 Admissible Heuristics
- 3.3.2 Heuristic Design
- 3.4 Dijkstra Vs A*
- 3.5 Sub-optimal Solution
1.0 引出
\(\quad\) 首先,在一个实际上的最短路问题中,从图中一个节点到达另外一个邻居节点是有 Cost这一说的,这个 Cost可以是我们平常所说的 Length、Time、Energy. etc.
(资料图片仅供参考)
\(\quad\) 当所有的权重(Cost)都为 \(1\) 的时候,BFS将会找到最优解。所以对于一个通用的情况下,如何去找到一个最小代价的路径呢?这时 Dijkstar算法便出场了。
2.0 Dijkstar Algorithm
\(\quad\) 其实 \(Dijkstar\) 算法解决的是赋权图中最短路径规划问题,但是在日常的无人车的导航过程中,如果地图是基于普通的栅格地图,则每条路线的 \(cost\) 都基本上要么是 \(1\),要么是 \(\sqrt{2}\) ,往往是比较简单的。
2.1 整体流程
\(\quad\)\(Dijkstra\) 弹出节点是根据当前节点中的一个累计 \(cost\),找出最小的那个。简单来说其 Strategy is : expand/visit the node with cheapest accumulated cost \(g(n)\)。通常将其整个流程归结为以下三个步骤:
- g(n): The current best estimates of the accumulated cost from the start state to node “n”.
- Update the accumulated costs g(m) for all unexpanded neighbors “m” of node “n”.
- A node that has been expanded/visited is guaranteed to have the smallest cost from the start state.
\(g(n)\) 表示的是从起点开始到当前节点的一个代价总和。
在弹出、扩展这两步的时候,弹出当前节点 \(n\),然后找到当前节点的所有孩子节点并进行扩展,此时要计算当前节点 \(g(n)\) 和每个孩子节点 \(m\) 的一个代价值,及 \(g(n)+m\) , 首先如果 \(m\) 是没有被扩展过的节点,那么就会检测 g(m) 是否可以通过 \(g(n)\) 进行下降,即把 \(m\) 设置成从 \(n\) 走到 \(m\) ,看看是否新的代价 \(g(m)\) 进行了下降,如果下降了则更新 \(g(m)\)。
\(Dijkstar\) 算法是具有最优性质保证的,即保图中所有被扩展过的节点的 \(cost\)(从起点到当前节点的 \(cost\))是最小的,这里不进行证明,设计具体的图论相关的知识,读者只需记住 \(Dijkstar\) 算法是有完备的数学证明即可。
2.2 算法伪代码
\(\quad\)下面通过伪代码对流程进行详细的解释。
- \(Dijkstra\) 算法伪代码流程
- Mantain a priority queue to store all the nodes to be expanded。维护一个优先级队列去存储所有待扩展的节点。注意这里的优先级队列的意思,不同于之前我们在 BFS 时使用的简单队列,他对自动对当前队列中的元素进行排序,实际上在 C++ 实现的时候使用的是标准库中的 map,具体对应的是哈系表这一数据结构,学过的同学都知道他的查找效率是常数 \(O(1)\)。而我们在每次弹出的时候会自动弹出具有最小 g 值的节点。
- The priority queue is initialized with the start state \(X_S\)。优先级队列在初始化的时候只有一个起点 \(X_S\)。这里其他节点(除了起点)的代价值都初始化为了无穷大,是因为我们不知道从起点能否到达该节点,因此初始化为无穷大。
- Assign \(g(X_S=0\)) and \(g(n)=infinite\) for all other nodes in the graph。对图中的所有初始节点进行赋值。
- Loop
- if the queue is empty; return false; 如果优先级队列是空的,则算法结束,表示没找到节点,比如说是一个迷宫,或者是个死胡同。
- Remove the node "n" with the lowest g(n) from the priority queue。从当前优先级队列中弹出 g 值最小的节点。对应了通用图搜索算法中的"弹出"。
- Mark "n" as expanded。把 "n" 标记为已经扩展过的。throw the "n" into the close set。此时 "n" 已经不会再被扩展了。
- if n is the goal node, return TRUE;break;
- For all unexpanded neighbors "m" of node "n"
- if g(m) = inifinite (说明这是一个仅仅在刚开始的时候初始化的节点,尚未被探索,则要对其进行操作)
- g(m) = g(n) + Cnm(即边的代价)
- Push node "m" into the queue(open set)将该节点添加到优先级队列中去,等待进行访问/扩展。
- if g(m) > g(n) + Cnm (如果得到的新的路径的代价值小于当前的代价值,则需要更新该节点的代价值和父节点等相关信息。
- g(m) g(n) + Cnm
- end
- END LOOP
\(\quad\) 整体的一个流程如下图所示,形象的展示了从弹出到扩展的流程:
2.3 Pros and Cons of Dijkstra’s Algorithm(优缺点)
The Good
- Complete and optimal。完备并且是最优的,也就是说如果该问题有解,则 Dijkstar算法一定能找到并且是最优的。
The Bad
Can only see the cost accumulated so far (i.e. the uniform cost), thus exploring next state in every “direction”。
No information about goal location。
上述两个缺点体现在如下这张图上
\(\quad\) 上述缺点明显是能够通过某种方式解决的,还记得上一篇文章介绍过的贪心搜索,充分利用了起点和目标点的一个信心进行路径的扩展和搜索,是否可以将贪心搜索融入到 Dijkstar算法中去呢?答案是可以的,结合 heuristic search 之后,Dijkstar算法便成为了我们所熟知的 A* 算法。
3.0 A* Algorithm
3.1 启发式搜索 (Search Heuristic)
\(\quad\) 其实前面介绍的贪心搜索就是启发式搜索的一种。通过推断距离目标的最小成本来克服距离每个点都是一样的成本搜索的缺点(例如使用距离目标点的距离函数等)。而对于特定的问题则应该设定不同的一个启发函数,例如欧式距离隐式认为机器人可以朝着对角线的方向移动,但是事实上很多机器人并不是这样的,有的只能平移,有的则要根据前轮的一个角度才能进行转向,也就是自行车模型或者阿克曼转向模型等。因此,对于具体的机器人,要设计不同的一个启发式函数。
\(\quad\) 我们在前面已经提到的启发函数,例如 Manhattan Distance
VS.Euclidean Distance
3.2 A* :Dijkstra with a Heuristic
\(\quad\) 其实,本质上 A* 就是 Dijkstar 算法基础上加入了 Heuristic Function,使用了启发是搜索,进而整体上加快了搜索速度,或者说是加快了朝目标点搜索的速度。下面我们来看一下 A* 算法中比较重要的几个点:
- Accumulated cost (累计代价)
- g(n): The current best estimate of the accumulated cost from the start to end node "n"。从起始状态到节点“n”的累积成本的当前最佳估计。
- Heuristic
- h(n) : The estimated least cost from node n to goal state (i.e. goal cost)。从节点 n 到目标状态的估计最小成本(即目标成本)。
- The least estimated cost from start state to goal state passing through node “n” is f(n) = g(n) + h(n)。通过节点“n”从起始状态到目标状态的最小估计成本为 f(n) = g(n) + h(n)
- Strategy: expand the node with cheapest f(n) = g(n) + h(n)。策略:扩展最便宜的节点 f(n) = g(n) + h(n)。
- Update the accumulated costs g(m) for all unexpanded neighbors “m” of node “n”。更新节点“n”的所有未扩展邻居“m”的累积成本 g(m)
- A node that has been expanded is guaranteed to have the smallest cost from the start state。已扩展的节点保证从开始状态具有最小的成本。
AAlgorithm Wokrflow*
- Mantain a priority queue to store all the nodes to be expanded。维护一个优先级队列去存储所有待扩展的节点。注意这里的优先级队列的意思,不同于之前我们在 BFS 时使用的简单队列,他对自动对当前队列中的元素进行排序,实际上在 C++ 实现的时候使用的是标准库中的 map,具体对应的是哈系表这一数据结构,学过的同学都知道他的查找效率是常数 \(O(1)\)。而我们在每次弹出的时候会自动弹出具有最小 g 值的节点。
- The priority queue is initialized with the start state \(X_S\)。优先级队列在初始化的时候只有一个起点 \(X_S\)。这里其他节点(除了起点)的代价值都初始化为了无穷大,是因为我们不知道从起点能否到达该节点,因此初始化为无穷大。
- Assign \(g(X_S=0\)) and \(g(n)=infinite\) for all other nodes in the graph。对图中的所有初始节点进行赋值。
- Loop
- if the queue is empty; return false; 如果优先级队列是空的,则算法结束,表示没找到节点,比如说是一个迷宫,或者是个死胡同。
- Remove the node "n" with the lowest g(n) from the priority queue。从当前优先级队列中弹出 g 值最小的节点。对应了通用图搜索算法中的"弹出"。
- Mark "n" as expanded。把 "n" 标记为已经扩展过的。throw the "n" into the close set。此时 "n" 已经不会再被扩展了。
- if n is the goal node, return TRUE;break;
- For all unexpanded neighbors "m" of node "n"
- if g(m) = inifinite (说明这是一个仅仅在刚开始的时候初始化的节点,尚未被探索,则要对其进行操作)
- g(m) = g(n) + Cnm(即边的代价)
- Push node "m" into the queue(open set)将该节点添加到优先级队列中去,等待进行访问/扩展。
- if g(m) > g(n) + Cnm (如果得到的新的路径的代价值小于当前的代价值,则需要更新该节点的代价值和父节点等相关信息。
- g(m) g(n) + Cnm
- end
- END LOOP
这里也给出一个 A* 算法的整体流程,如下图所示:
\(\quad\) 与 Dijkstra 算法不同的是,在每次计算 cost 的时候,分成了两个部分,分别是边的权重(通常是距离)和 Heuristic Cost。其他部分则和 Dijkstra 算法并无太大区别。
3.3 A* Optimality
\(\quad\) 但是,加入 Heuristic Function 后,如果 Heuristic Function 设计不当就会打破 Dijkstra 算法原有的最优性的保证,如下图所示:
\(\quad\) 首先说明一点,从节点 S 到节点 G 的最优路径我们一眼即可看出是先经过 A 点,然后到达 G 点,这才是最优路径,但是当加入了 Heuristic 之后,我们再使用 A* 来计算一下。
- 首先弹出节点 S
- 将 A 和 G 入队,保存到 A 和 G 的 cost 和 Heuristic。
- 计算得到 \(f_A=1+6=7\)。\(f_G=5+0\) 。
- 发现 \(f_G
- 是则结束搜索。
- 最终得到的最短路径是 \(S\rightarrow G\)
\(\quad\) 很明显,这并不是最优解,为什么呢,试想一下本身 Dijkstra 算法是能够保证找到的路径是最优解的,但是在加入 Heuristic Function 之后发现却不可以了,很明显是 Heuristic Function 不合理导致的,那么什么样的 Heuristic Function 才是能够真正使用的呢?
The answer is:
启发式函数所估计出的 cost 要至少是小于等于真正的 cost。而是否真正的合理有的时候还要根据机器人的一个运动学模型来进行选择,例如对于全向轮机器人来说,欧式距离是可以的,但是曼哈顿距离则不行。上面那个例子中 A 点的 H 为 6,明显大于真实机器人距离目标点的 cost。
3.3.1 Admissible Heuristics
一个可以接受并进行使用的 Heuristic \(H(\cdot)\) 需要满足如下条件(和上面说的一样)
对于所有的节点来说:\(h(n)<=h^*(n)\) ,其中 \(h^*(n)\) 是所有节点 n 到达目标点的真实最短距离。
如果 heuristic 是 admissible,那么 A* 搜索算法得到的结果一定是最优的。
提出 Admissible Heuristics 是在实践中使用 A* 最为重要核心的部分。
下面是两种不同 Heuristic
3.3.2 Heuristic Design
\(\quad\) Admissible Heuristic Function 需要根据特定的使用场景和机器人模型 design case by case。
Is Euclidean distance (L2 norm) admissible?
Is Manhattan distance (L1 norm) admissible?
Is L∞ norm distance admissible?
Is 0 distance admissible?
3.4 Dijkstra Vs A*
- Dijkstra 算法朝着所有的方向进行扩展,不带目的性。如下图所示:
- A* 则带有目的性的进行扩展,如下图所示:
3.5 Sub-optimal Solution
\(\quad\) 当我们使用了一个过估计的 heuristic function 之后会出现什么效果呢?很明显,上面看到的圆形会更加的椭,但是控制好这个度。这样是能够明显提高我们的一个搜索速度的,但是也要承担相应的风险,因为这样并不能够保证求得的解是最优解。例如 Weighted A* 算法。
\(\quad\) 可以看到和 A* 的区别在于 \(f\) 函数的不同,此时在 Heuristic 前加上了一个系数变成了 \(\mathrm{f}=\mathrm{g}+\varepsilon \mathrm{h}, \varepsilon>1\)。
- Weighted ASearch:*
- 在最优和速度之间进行折中
- \(\varepsilon\)-suboptimal: cost(solution) <= \(\varepsilon\)cost(optimal solution)
- 它可以比 A* 快几个数量级
关键词:
全球实时:一文带你搞懂如何优化慢SQL
焦点快报!Dijkstar-And-Astar算法
用上ChatGPT的这几个功能,你的开发效率不高都难
联想y400什么时候上市的?联想y400笔记本配置
地下城与勇士龙年套装哪个好?地下城与勇士龙年套装有几个宝珠?
HTCG28什么时候上市的?HTCG28手机参数
华为C8813Q如何装sim卡?华为C8813Q手机参数
gprs套餐费是什么意思?怎么关闭GPRS套餐?
楼市回暖背后:多城二手房在售量持续增加
环球关注:编写高质量c#代码的10个建议
环球即时看!插入排序
【世界速看料】【Visual Leak Detector】配置项 StackWalkMethod
环球新消息丨vivo将整合旗下iQOO手机:开启降本增效
王传福:比亚迪目标年底成为中国最大汽车制造商
全球热讯:全球最大游戏展危险了!世嘉、腾讯均宣布不参加本届E3
绿巨人前女友15年后回归漫威!《美国队长4》新剧照曝光:黑人美队现身
环球即时看!联名高达!ROG游戏手机7系列来了:二代骁龙8+6000mAh电池
全球视讯!中国代表敦促个别国家立即解除对叙利亚单边制裁
天天微动态丨KubeVela 1.7 版本解读:接管你的已有工作负载
焦点报道:接通率维持 66% 以上,为什么火山引擎 VeDI 能让企业智能外呼不再难?
【全球快播报】《Python编程快速上手—让繁琐工作自动化》实践项目答案:第四章
天天简讯:四方达(300179)3月28日主力资金净卖出861.62万元
微信QQ出现功能异常 官方紧急修复:微信支付等功能已恢复
天天速看:男子陵园祭祖车雷达显示全是人 网友:啥车?我想试试
PS主机神作好评仅有32%!顽皮狗回应《最后生还者》PC优化翻车
全球速读:专家谈ChatGPT:或让更多人享受生活 一周只工作一天
干货分享|袋鼠云数栈离线开发平台在小文件治理上的探索实践之路
全球热讯:电池级碳酸锂价格腰斩 电动车会降价吗?专家给出结论
环球速看:魔法氛围拉满!Redmi Note 12 Turbo哈利波特版图赏
不用带手机 抬手就能付!微信支付尝试推出微信刷掌服务
天天要闻:开发者危机!微软GitHub启动裁员:印度工程师团队几乎整体裁撤
全球微头条丨同款商超6元/瓶!特仑苏牛奶大促:2.93元/盒相当于半价
讯息:2023华大新高考联盟3月联考各科试题及答案!_老高考老教材
如何隐藏Apache版本号和其它敏感信息
容器安全之 Dockerfile 安全扫描
zookeeper的Leader选举源码解析
焦点要闻:前端设计模式——享元模式
每日观察!使用NSIS打包超大型软件的几个注意事项
环球头条:【手慢无】速来占便宜!三星128GB存储卡仅需49.8元
全球热头条丨汽车雷达在无人陵园内显示全是人影:吓坏车主
985硕士男子失业半年 应聘道士35岁已超龄!做实习生都被拒:现送外卖
没污染!国内首款氢内燃机飞机成功首飞:中国自研
环球新资讯:内地特供的网游性价比神U!酷睿i7-13790F评测:游戏性能强于锐龙9 7950X
环球播报:海豚模拟器登陆Steam
全球实时:半场战报:踢疯了!梅西第38分钟戴帽 阿根廷5-0暂领先库拉索
环球热推荐:Epic独占结束!中国功夫游戏《师父》登陆Steam:139元起
【天天时快讯】Native开发过程中容易忽略的注意事项
全球快播:【国际大宗商品早报】美豆反弹收涨近2% 伊拉克库尔德地区原油出口停顿支撑油价续涨
全固态电池空间电荷层微观机理揭示
环球要闻:核心、显存砍得没法看!RTX 4060 Ti/4060要5月上市:3999元起超值?
天天播报:大作《生化危机4重制版》发售 采用Denuvo正版加密 黑客发声:准备出手破解
天天快看点丨任天堂《塞尔达传说:王国之泪》限定版Switch发布!金黄手柄太酷炫
短讯!《最后生还者》PC版多半差评
每日消息!读SQL进阶教程笔记01_CASE表达式
快讯:成年子女不能与父母在酒店住同一标间引热议 太没道理?酒店回应
Spring整合Mybatis遇到的问题(一)
有关Mongodb 在windows上安装的问题
今头条!JNI知识点总结
天天日报丨【Visual Leak Detector】配置项 ReportTo
【Visual Leak Detector】配置项 SelfTest
环球观察:4个多月第一次!Intel Arc Pro专业显卡终于有了新驱动
当前最新:小米“退钱”了:27万小米空气净化器初代用户 每人899元
全球快报:小金刚手机杀到1999元 卢伟冰喊话友商:欢迎光明磊落竞争
全球播报:人体工学椅从没想过:自己真正的对手会是汽车
天天微资讯!日本海滩惊现大量乌贼尸体 绵延200米
通讯!青石板路图片(青石板规格)
微头条丨喊老公过时了!赵丽颖唐嫣孙俪都这样称呼另一半,网友:甜炸了
项目中如何对XSS统一处理
面向对象设计原则
instanceof的使用
GPT-4救了我狗的命
【全球快播报】你敢坐吗?滴滴能打到自动驾驶汽车了
环球看点!三爱健康集团(01889)发盈喜 预计2022年度股东应占溢利同比增加约223.6%至2922万元
世界头条:用gpt4训练一个简易真人代理
全球热头条丨【Visual Leak Detector】配置项 ReportFile
环球通讯!融创百亿美元境外债务重组成功在即 持债金额超30%的债权人小组已签订重组支持协议
环球新消息丨OpenAI创始人:AI可能毁灭人类 必须开发新技术来解决
焦点速递!美亚柏科:公司将对各类 AIGC 内容的检测、AI 生成文本的检测技术及产品进行布局
聚焦:免费Midjourney AI绘画Prompt提示词平台合集
NCNN 模型推理详解及实战
基于中断的字符串动态显示
全球热推荐:[NOI1999] 生日蛋糕
绿牌将会取消?网友:走好不送
一图看懂Note 12 Turbo:性价比进行到底 16+1TB仅售2599元
一加李杰:用户不会被蒙蔽 将旗舰体验普及到底
视讯!哈迷必备!Redmi Buds 4哈利波特版图赏
首发第二代骁龙7+!Redmi Note 12 Turbo图赏
设备树的概念(四):平台设备驱动和设备树
天天最资讯丨Apache iotdb-web-workbench 认证绕过漏洞(CVE-2023-24829)
Halcon学习教程(一) 之提取十字线中心 图像分割
甲流吃退烧药不退烧怎么办_吃了一粒退烧药多久可以喂奶
环球今日报丨卢伟冰:Note系列全球销量破3.2亿 进入全球单品十强
头条:马斯克为何没做出ChatGPT?揭秘OpenAI创始人的权力斗争
日本推出佛祖版ChatGPT:已经为20多万人解决烦恼
观天下!合资车还咋玩!奇瑞艾瑞泽5 GT上市:起售价仅7.99万
每日快报!Redmi Note 12 Turbo搭载超细四窄边直屏:边框窄至1.42mm!
热消息:一篇文章带你了解面积图
京沪杭等地近期明确将有序放开设摊、允许外摆
全球资讯:德创环保:宁波甬德拟以1.61亿元收购飞乐环保100%股权
每日讯息!12306回应免费坐高铁:积分存在有效期