这是一个真正靠谱的寻路算法

绝对没有其他看起来高大上 给别人讲都将不明白的理论。管你 人工智能 啥的 ,还有一百度一大篇的a*算法 ,其实大部分文章的理论都是讲不通的 或者没有讲清楚 更别说代码。做事刨根问底的牛脾气又上来了。
 
两周前 偶然原因接触到了寻路算法 于是百度 找到了a* 。讲来将去大概意思就是持续性的找离目标近的节点 并且走过的节点不能重复走。反正百度搜a*算法 一搜一大片。在很简单的障碍的情况下是没问题 :
 
但是拐个弯就不行了,不是找最近的么,我让你一直找最近的。 直接迂在里面出不来了:
 
期间我曾经想过为什么不让旁边的叶子节点继续开枝散叶 继续寻找呢。当时就觉得这种方式是可行的。因为起点跟终点我们始终在同一个能够联通的领域嘛 我就像水一样不断的蔓延不断的蔓延到你那去。始终是能到达的。这可能就是网上说的所谓的广度搜索。节点 又继续节点 当时就想到递归嘛,没想到粗糙的用递归 把我自己给绕进去了 。本身是一个树状结构。哪些节点遍历了 哪些没有遍历 容易形成交叉 或者死循环 。最终要形成一个线性的遍历流程 。 程序要有一个严密的理论基础 ,如果达不到这一点随便怎么倒腾始终会崩溃的。就在这个问题上我遇到了瓶颈,始终不能解决 ,因为自己太菜了 处理不好这种数据结构。在最近两天看数据结构二叉树那一部分的时候 看到了 那种严密的遍历和组织二叉树 数据的方式  于是我觉得有方法了。
 
换作人的思维 如果我们想 接近一个目标 我们该怎么做, 废话 走直路咯 ,当然是怎么近怎么走 。对咯 那么我们应该在下一步上下左右的。所有坐标中 选择 离目标最近的那个,这个已经在第一个图a*算法中就说明了。遇到阻挡了怎么办呢 ,开枝散叶 让接近出口的节点继续蔓延,这里有一个细节 就是接着继续找的时候要以距离近的节点优先。 就是这样根本没啥复杂的理论。我们要想办法用程序语言 组织一个“树”来解决这些问题 ,并且不能让他们产生交叉 和循环遍历的逻辑错误。
 
nice 就是这样 这就是我想要的结果 。还差最后一步。
既然已经触及到最终目标了 那么剩下的 自然就是用“顺藤摸瓜”的方式找回去的路径。最后一个节点依次找他的父节点  直至找到起点为止  来形成一个唯一的路径。
 
 
哇咔咔 不由得佩服我自己。这是属于我的领域 我将以我的上帝之眼 和我的灵魂感知触及世界的所有能触及的领域  你是逃不掉的 。哇哈哈哈哈,是不是好好玩。 最后一看 我ca 竟然自动就是最优路径 。 我本来还想继续处理这个问题的。自然界就是这么神奇 ,微妙的关系里存在着一种平衡 ,就像我说的hsl颜色处理的那篇博文一样 。你看 他选择最佳直线路径的时候 如果遇到了阻挡 自动就迂回在里面了 并且事先把这个坑填满了  最终达到坏死  ,然后让外面的路径直接越过坑的外延 到达了目标 。 有时候想想 既是科学 又是一种平衡的哲学 自然界 造物主就是这么的神奇。 源码
其实这种广度搜索方式 只能说在这种迷宫搜索的环境下用的比较好 ,因为就像森林样 通路比较少空间狭窄 正适合这种场景。 而对于比较空旷的环境 目标比较明显  如果应用这种算法就要浪费一些效率 应该直击目标的方式  也就是深度搜索 会比较好。还有就是对于数据结构处理 天生就决定了 要用到一些指针 和绕来绕去的思维。c#写程序是要简单一些 但对于这种数据结构的处理 比如 十字链表啊 二叉树啊 图啊 这些 确实要弱一些 所以一般的数据结构的书都是c描述的。但是只要你深入理解了某个东西的原理精髓后 用c#也是一样可以写出来的 语言只是工具。诺 这就有大师用c#写出了数据结构的书: 
http://www.cnblogs.com/abatei/archive/2008/10/12/1309615.html
posted @ 2016-06-20 22:48  assassinx  阅读(14470)  评论(9编辑  收藏  举报