| 84 | 84 |
"\n",
|
| 85 | 85 |
"在详细描述搜索算法之前,先看看下面四个重要的概念。\n",
|
| 86 | 86 |
"\n",
|
| 87 | |
"+ **状态**。状态可以认为是搜索算法在某一时刻所处的位置,相应地,搜索算法在开始和结束时所处的位置成为**初始状态**和**终止状态**。\n",
|
|
87 |
"+ **状态**。\n",
|
| 88 | 88 |
"\n"
|
| 89 | 89 |
]
|
| 90 | 90 |
},
|
|
| 92 | 92 |
"cell_type": "markdown",
|
| 93 | 93 |
"metadata": {},
|
| 94 | 94 |
"source": [
|
| 95 | |
"+ **测试目标**。用于判断当前状态是不是目标状态。例如在此问题中目标点是 G,因此目标测试只需要判断当前状态是否为 G 即可。当然,即使到达了目标状态,找到路径也未必是代价最小的。"
|
| 96 | |
]
|
| 97 | |
},
|
| 98 | |
{
|
| 99 | |
"cell_type": "markdown",
|
| 100 | |
"metadata": {},
|
| 101 | |
"source": [
|
| 102 | |
"+ **动作**。动作指的是搜索算法从一个状态转变到另外一个状态所采取的行为。一般假设在每个状态下所能够采取的行为数量都是有限的。例如:在起点 A,只有 B 和 C 两个节点与之相连,所以只有转移到 B 或者转移到 C 这两种选择。一般情况从一个状态到另外一个状态的过程叫做**状态转移**。"
|
|
95 |
"+ **测试目标**。"
|
|
96 |
]
|
|
97 |
},
|
|
98 |
{
|
|
99 |
"cell_type": "markdown",
|
|
100 |
"metadata": {},
|
|
101 |
"source": [
|
|
102 |
"+ **动作**。"
|
| 103 | 103 |
]
|
| 104 | 104 |
},
|
| 105 | 105 |
{
|
|
| 122 | 122 |
"cell_type": "markdown",
|
| 123 | 123 |
"metadata": {},
|
| 124 | 124 |
"source": [
|
| 125 | |
"+ **路径**。完成一系列连续的状态转移所得到的状态序列,就构成了从起点到终点的路径,如从状态 A 到状态 B,接着到状态 D,最后到状态 G,就形成了A -> B -> D -> G 这样的一条路径。很显然,路径的总代价,等于路径上各个节点之间代价的总和。在路径搜索问题中,任何一条路径的代价都不会是负数。\n",
|
|
125 |
"+ **路径**。\n",
|
| 126 | 126 |
"\n"
|
| 127 | 127 |
]
|
| 128 | 128 |
},
|
|
| 171 | 171 |
"\n",
|
| 172 | 172 |
"搜索算法从初始节点出发,不断选择后续节点,完成了搜索树的构造。一开始,搜索树中只有根节点,在每一步中搜索算法将选择与搜索树中某个节点相邻的一个后续节点加入搜索树,这个操作叫做**扩展一个节点**。\n",
|
| 173 | 173 |
"\n",
|
| 174 | |
"能够扩展的节点需满足条件:\n",
|
| 175 | |
"+ 该节点不能已经在搜索树中,即该节点不能已经被扩展过;\n",
|
| 176 | |
"+ 该节点能够从搜索树中某个节点出花通过执行一个动作抵达,被扩展节点和搜索树节点的某个节点是相邻的。 \n",
|
|
174 |
"能够扩展的节点需满足两个条件:\n",
|
|
175 |
"+ 1.\n",
|
|
176 |
"+ 2.\n",
|
| 177 | 177 |
"\n",
|
| 178 | 178 |
"这些能够被扩展的节点构成的集合称为未访问节点集合。\n",
|
| 179 | 179 |
"\n",
|
|
| 192 | 192 |
"cell_type": "markdown",
|
| 193 | 193 |
"metadata": {},
|
| 194 | 194 |
"source": [
|
| 195 | |
"**深度优先搜索**总是沿着某个分支进行搜索、直至不能再深入为止,即优先扩展搜索树当前未访问节点集合中最深的节点。深度优先搜索算法在搜索过程中总是倾向于沿着一条分支前进,直到该分支上所有的节点都被访问完,再返回上一层进行另一轮深度优先搜索。"
|
|
195 |
"**深度优先搜索**"
|
| 196 | 196 |
]
|
| 197 | 197 |
},
|
| 198 | 198 |
{
|
|
| 208 | 208 |
"cell_type": "markdown",
|
| 209 | 209 |
"metadata": {},
|
| 210 | 210 |
"source": [
|
| 211 | |
"**广度优先搜索**总是优先扩展为访问节点集合中最浅的节点,在执行中倾向于优先把同一层的所有可能节点访问完后再考虑进行更深的探索。"
|
|
211 |
"**广度优先搜索**"
|
| 212 | 212 |
]
|
| 213 | 213 |
},
|
| 214 | 214 |
{
|