ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

基于c++的A-star算法

2020-02-28 10:42:53  阅读:344  来源: 互联网

标签:star 代价 路径 c++ 算法 当前 close open 指针


资料:https://www.cnblogs.com/guxuanqing/p/9610780.html
一、基础原理
1、从起点开始,向周围八个方向扩展。测试新扩展的点的路径代价,路径代价由已走的路径和距离终点的期望加和而成。这个路径代价是选择路径的标准。
2、有两个表open、close。
close:生成并且考察过的点,存在两种点。一种是当前选择的路径,是最终想要的结果。另一种是考察但没有用到的点,是考察过但是比最终路径代价大的路线,可能父指针可以指回起点,也可能无法指回起点(曾经进入死胡同的路线)。
open:生成但是没有考察的点
·若形象的想的话,open中的点,close中的最终路线,close中的没用的路线用不同的图形画出。open在最外侧一层,close在中间,有一条线根据父指针逐层引出。
3、具体步骤
(1)最开始的时候只有起点在open中.
(2)从open中找到最小的点n。
(3)n向八个方向扩展,就获得了八个新点x1~x8,接下来判断八个点的存入的地方。
(4)如果x存在于close中,则比较close中和当前点的代价大小。若新的点小,则用新的点代替旧的。若旧的点小,则放弃新的点。
如果x存在于open中,则比较close中和当前点的代价大小。若新的点小,则用新的点代替旧的。若旧的点小,则放弃新的点。
如果都不存在,就放入open。
根据这个方法,进行八个点的判定。
(5)将n放入close。
(6)返回(2),直到open中没有点或者到达目的地。
·close和open中都是没有重复的点的。整套算法,就是生成新的点,然后每一步做局部最优解,有错的情况下纠正,积累以后获得整体的最优解。
·局部最优解+多次尝试然后纠错=全局最优解

二、代码具体细节
·上面那个原理看起来很简单,但是实施起来尤其是需要关注效率的时候就有些困难了
1、每一个点包含的信息
·用一个结构体进行封装
(1)自身坐标
(2)父指针,实际上就是当前点存储着自己是由哪一个点扩展而来的。这个方法可以减轻很多代码负担,要改变路径的时候,只要在关键位置将代价更小的点放入close,将之前路径在这一个关键点后面的close中的点放回open就可以了。
(3)代价,代价由当前路径的代价和期望组成。路径期望的算法是路径规划效果好坏的关键。每一个点都存储着独一无二的当前路径的代价,这个代价是从父指针指着的点、父指针的父指针点、父指针的父指针的父指针点······一层层累加而得的。当前路径代价和父指针共同组成了,到达目前这个点的第一无二的路径信息和代价。
2、数据类型的选用
close、open都是长度不定的数据类型,我这里的想法是用一个结构体封装
要使用vector

未完待续······

田彼南山 发布了3 篇原创文章 · 获赞 0 · 访问量 26 私信 关注

标签:star,代价,路径,c++,算法,当前,close,open,指针
来源: https://blog.csdn.net/weixin_41652700/article/details/104532071

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有