上传文件至 ''

This commit is contained in:
YTii 2023-01-31 02:34:53 +00:00
parent 56fc92b5aa
commit 612a40939c
1 changed files with 7 additions and 17 deletions

View File

@ -81,7 +81,7 @@
#### 2.1 宽度优先搜索 #### 2.1 宽度优先搜索
<img src="pic\\1.png" style="zoom:67%;" /> ![](https://www.writebug.com/myres/static/uploads/2023/1/31/226d40a69fa9715fc0d919ca31b344c9.writebug)
判断队列是否有终点和输出路径较为简单,下面只讨论算法终点部分。 判断队列是否有终点和输出路径较为简单,下面只讨论算法终点部分。
@ -121,7 +121,7 @@ def expand_node(queue, x, y)
在宽度优先搜索的基础上应用双向搜索。原先的单个队列变为由起点和终点拓展成的两个队列,当两个队列元素有交集时找到相应的路径。两个队列都为空时无解,流程图只给出了一般的求解步骤,没有加入判断无解的情况,在代码中考虑了这一问题。 在宽度优先搜索的基础上应用双向搜索。原先的单个队列变为由起点和终点拓展成的两个队列,当两个队列元素有交集时找到相应的路径。两个队列都为空时无解,流程图只给出了一般的求解步骤,没有加入判断无解的情况,在代码中考虑了这一问题。
<img src="pic\\2.png" style="zoom: 67%;" /> ![](https://www.writebug.com/myres/static/uploads/2023/1/31/d4ed17c9437b51df6f6b74fdda9897bf.writebug)
拓展节点和判断节点是否加入队列和一般的宽度优先搜索一样,不再赘述。底下的具体代码会给出具体的分析。 拓展节点和判断节点是否加入队列和一般的宽度优先搜索一样,不再赘述。底下的具体代码会给出具体的分析。
@ -350,19 +350,13 @@ def expandNode(node_set, path_set):
print(ans) print(ans)
``` ```
宽度优先搜索和双向搜索算法的输出分别为:
![]()
![]()
从输出的路径上看,二者找到了相同的解。考虑到从状态空间树上看,宽度优先搜索的拓展顺序是按树的层次顺序来进行的。这样一来,短的路径会在任何比它长的路径之前被遍历,因此如果找到了解,绝对是开销最小的,也就是最优解。而如果存在解且解的开销优先时,小于解开销的所有路径是有限的,因此宽度优先搜索在有解时能找到解。综上,宽度优先搜索具有完备性和最优性。而我的双向搜索中,起点和终点的搜索方法都为宽度优先搜索,同样也具有完备性和最优性。 从输出的路径上看,二者找到了相同的解。考虑到从状态空间树上看,宽度优先搜索的拓展顺序是按树的层次顺序来进行的。这样一来,短的路径会在任何比它长的路径之前被遍历,因此如果找到了解,绝对是开销最小的,也就是最优解。而如果存在解且解的开销优先时,小于解开销的所有路径是有限的,因此宽度优先搜索在有解时能找到解。综上,宽度优先搜索具有完备性和最优性。而我的双向搜索中,起点和终点的搜索方法都为宽度优先搜索,同样也具有完备性和最优性。
#### 4.2 时间复杂度 #### 4.2 时间复杂度
定义$b$为问题中一个状态最大的后继状态个数,$d$为最短解的动作个数。理论上,宽度优先搜索的复杂度为: 定义$b$为问题中一个状态最大的后继状态个数,$d$为最短解的动作个数。理论上,宽度优先搜索的复杂度为:
![](https://www.writebug.com/myres/static/uploads/2023/1/31/75f552d435d5ab8415884db645ccd947.writebug) ![](https://www.writebug.com/myres/static/uploads/2023/1/31/4e2011651a4ea6e01ed0ed7c018c3d3f.writebug)
而双向搜索的时间复杂度为:$O(b^{d/2})$。 而双向搜索的时间复杂度为:$O(b^{d/2})$。
@ -383,13 +377,9 @@ print('start:',node_from_start)
print('end:',node_from_end) print('end:',node_from_end)
``` ```
节点数最多的时候,宽度优先搜索可以达到 9 个 节点数最多的时候,宽度优先搜索可以达到 9 个
![]() 而若不考虑交点,双向搜索最多的时候有 11 个
而若不考虑交点,双向搜索最多的时候有 11 个:
![]()
若只考虑复杂度,双向搜索中的起点队列和终点队列的空间复杂度相同,只考虑一个即可,即最多为起点队列中的 9 个。但是在实际运行的过程中也的确出现了双向搜索的空间开销比宽度优先搜索大的情况。二者差别并不大,只相差两个节点。在迷宫更加复杂、规模更大的时候,空间复杂度的差距应该能更好地体现出来。 若只考虑复杂度,双向搜索中的起点队列和终点队列的空间复杂度相同,只考虑一个即可,即最多为起点队列中的 9 个。但是在实际运行的过程中也的确出现了双向搜索的空间开销比宽度优先搜索大的情况。二者差别并不大,只相差两个节点。在迷宫更加复杂、规模更大的时候,空间复杂度的差距应该能更好地体现出来。
@ -431,7 +421,7 @@ IDA* 是迭代加深深度优先搜索算法IDS的扩展。因为它不需
### 2. 流程图和伪代码 ### 2. 流程图和伪代码
<img src="pic\\7.png" style="zoom:67%;" /> ![](https://www.writebug.com/myres/static/uploads/2023/1/31/749039ad5143336aae197950a2edc762.writebug)
流程算法原理部分的步骤基本一致。 流程算法原理部分的步骤基本一致。
@ -619,6 +609,6 @@ def validNode(open_list, open_parent_node, g, x, y, x_expand, y_expand, min_idx)
D值和拓展节点数的关系如下 D值和拓展节点数的关系如下
<img src="pic\\8.png" style="zoom: 50%;" /> ![](https://www.writebug.com/myres/static/uploads/2023/1/31/6fc96f6dc944e69a5e3338f3aa75c3e4.writebug)
在D值较小时拓展节点数相差不太大其路径长度都为69可以看出都找到了最优解。在D达到4时可以看到拓展节点数大大下降了从200多直接降到了79也就是运算效率大大提升了。同时开放列表最大节点数也有一定的下降所占内存空间变少了。然而在这种情况下路径长度却变成了77也就是说找到的解不是最优解。这就对应了上述启发式函数$h(n)>h^*(n)$的情况,启发式函数过大找到的解不是最优的。 在D值较小时拓展节点数相差不太大其路径长度都为69可以看出都找到了最优解。在D达到4时可以看到拓展节点数大大下降了从200多直接降到了79也就是运算效率大大提升了。同时开放列表最大节点数也有一定的下降所占内存空间变少了。然而在这种情况下路径长度却变成了77也就是说找到的解不是最优解。这就对应了上述启发式函数$h(n)>h^*(n)$的情况,启发式函数过大找到的解不是最优的。