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