人工智能——搜索算法
实验题目
- 求解罗马尼亚度假问题,找到从Arad到Bucharest的一条路径
- 实现两种搜索算法求解该问题
- 罗马尼亚问题的状态空间图如下
实验语言和算法
实验语言:C/C++
算法: D f s D i j k s t r a Dfs\ \ \ Dijkstra Dfs Dijkstra(最小堆优化) A ∗ ( D i j k s t r a 优 化 ) A^*(Dijkstra优化) A∗(Dijkstra优化)
实验算法
1. D F S DFS DFS算法
1. 算法思路:
- 利用邻接表存储地图信息
- 从起始点s开始,利用邻接表开始寻找与起始点相连的点v,并标记vis[s],防止重复搜索
- 将v作为新的当前起始点,进入下一层搜索进行
- 取消步骤2中标记,寻找下一个与当前起点相连的结点,重复步骤2-3
- 该递归程序边界为:当遍历到终点d,进行输出 s 0 − > d s0->d s0−>d的步骤,或者遍历完所有的相连结点,发现均已被访问,则满足两者之一则进行回溯步骤
- 算法结束
2. 算法分析
- 时间复杂度 : O ( b n ) O(b^n) O(bn),其中 b b b为深度因子, n n n为宽度因子
- 空间复杂度: O ( b n ) O(bn) O(bn)
2. Dijkstra最小堆优化
1. 算法思路:
- D i j k s t r a Dijkstra Dijkstra算法采用贪心策略,初始时声明一个 a n s ans ans数组来存储从起点 s s s到各个终点的最短路径长度。
- 初始时, a n s [ s ] = 0 ans[s]=0 ans[s]=0,并声明一个 p r i o r i t y _ q u e u e priority\_queue priority_queue来求当前队列中距离起点最短的路径进行出队列来进行访问,初始 p r i o r i t y _ q u e u e priority\_queue priority_queue加入起点 a n s [ s ] = 0 ans[s]=0 ans[s]=0。
- 当该优先队列非空,将当前距离起点最小的顶点fr出队,并标记其访问,依次遍历其相连的顶点 i i i,若其顶点 i i i当前最短路径 a n s [ i ] > ( a n s [ f r ] ans[i]>(ans[fr]