「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」
递归寻走
- 首先我们常规的寻路是不可能出现首尾相同的情况。但是项目中得处理这种情况,如果其实节点和目标节点是地图上的统一节点,那么我们的路径就是当前节点。
- 选择当前节点周围可用的节点,如果不在openList集合中则分别计算三基数的值并且加入到openList集合中,计算三基数的同事将待加入openList的节点的父节点设置为当前节点。
- 如果已经存在openList集合中且结合中的G值大于当前节点(周围节点之一)的G值,则将当前节点更新到openList集合中。否则不加入也不更新。
- 周围节点选择完之后我们就把该节点(起始节点)加入closedList中,然后从openList中选择F值最小的节点,在继续重复上面三步骤。
图示流程
- 按照图5中我们可以获得起始节点(2,3)的周围节点列表如图6。并逐个分析是否该加入openList中。
图6
- 通过比较我们发现目前周围的八个节点全部有效且全不在openList中,那么我们就全部加入并计算三基数的值,并设置他们的父节点为(2,3)。如图7
图7
-
从图7中我们可以看出在起始节点(2,3)周围(3,3)这个节点的F值此时在openList中最小,所以此时我们将(2,3)移除openList并将(2,3)加入到closedList中。此时(2,3)由高亮方格显示表示加入closedList集合,
-
(2,3)节点就算是结束了他的使命了,加入了closedList集合中的节点我们将不会再去考虑,我们可以认为加入到closedList集合中的点已经成墙了。那么下面我们从openList中选取F值最小(3,3)为新的起始节点,开始重复上面的流程,但是我们发现(3,3)的右上、正右、右下都是墙,还有正左(2,3)在closedList集合中。这四点我们是不用考虑的。那么只剩下 (2,2),(3,2),(2,4),(3,4)这四个点。但是这四个点恰巧有全部在openList中。依照上面的流程我们得以此比较这四个点和openList集合中对应的点的G值谁大谁小。就一个原则谁小留谁。由图8我们可以知道,新获得的这四个点的G值均大于openlist里对应的点的G值,所以我们这里放弃这四个点。他们没有被我们喜欢,我们抛弃这些点。这一轮结束我们将(3,3)加入到closedList集合中。如果新节点G值小于对应的openList中的点的G值得话,我们就要更新openList集合中的对应的那个点。所谓的更新就是将新节点替换原来那个节点。注意此时新节点和openList对应的那个点出了三基数不同,还有父节点也不同了。
-
这里需要解释下为什么新节点的G值都会加10呢,那是因为我们最起始的节点是(2,3),而此时的起始节点是(3,3),比如我们算(2,2)G值得时候实际上是(2,3)--->(3,3)--->(2,2)整个过程的G值。所以是10+14。
-
由图9我们能够看到此时我们openList中最小F值应该是(3,4),下面的步骤就是一直重复。