搜索策略-DFS,BFS,爬山法,分支界限法
2017-11-24 00:26
591 查看
最小生成树
Prim
基本思路:将点的集合分为C 和 V-C ,分别为访问过的。Krusal
将每个顶点维护成单顶点连通分量C(v1),…C(vn)1. 先将边进行排序
2. 每次加入权值最小的边,如果两个节点在不同的连通分量,则加入,否则丢弃 最好的实现方式是使用并查集,时间复杂度为O(|E|log|E|) 使用链表,算法复杂度O(|V|3)
广度优先
思想:逐层访问搜索树中的节点,用到了队列Q。访问队列Q的第一个节点:
如果绑定函数B(x)可能存在可行解,则将它的所有孩子节点压入队列Q末尾;
如果是可行解,如果是目标节点,则输出x对应的解
如果不可能存在可行解,重复操作。
当队列Q为空时,算法结束。
深度优先
思想: 尽可能深的访问树的节点,优先扩展最近访问过的节点,用到了栈S。访问栈顶S的第一个元素:
如果绑定函数B(x)可能存在可行解,则将它的所有孩子节点压入栈S;
如果是可行解,如果是目标节点,则输出x对应的解
如果不可能存在可行解,重复操作。
当栈S为空时,算法结束。
爬山法
定义了隐式约束P(x),可以判断X是否为目标节点,还可以衡量x与目标节点的距离。在深度优先的策略进行修改,当扩展一个节点X时,如果不是目标节点,则根据隐式函数P()的值从大到小将x的每一个节点压入栈。 局部贪心
访问栈顶S的第一个元素:
如果绑定函数B(x)可能存在可行解,根据隐式函数P()的值从大到小将x的每一个节点压入栈;
如果是可行解,如果是目标节点,则输出x对应的解
如果不可能存在可行解,重复操作。
当栈S为空时,算法结束。
最佳优先
思想: 结合了深度优先和广度优先的简单搜索策略,其实也是爬山法由局部扩展到全局。 最佳优先用到了堆管理扩展节点。访问堆顶Q的第一个元素:
如果绑定函数B(x)可能存在可行解,根则将所有孩子节点插入堆;
如果是可行解,如果是目标节点,则输出x对应的解
如果不可能存在可行解,重复操作。
当栈Q为空时,算法结束。
分支界限法
与前面四种策略不同的是,分支界限法可以用于求解优化问题。 特点:利用已经得到的可行解,剪除不能得到优化解的分支两个要素:
产生可行解的策略,可以用前面的深度优先,爬山法,最佳优先。
剪除分支的策略: 判断以x为根节点可行解代价是否大于已知可行解的最小代价。绑定函数,具体判断。
应用
代价矩阵: 为了提高分界法的剪枝能力,可以用代价矩阵的变换得到一个所有可行解的代价下界。行列进行变化: 使得每一行每一列至少存在一个0的元素。最小代价为减去的值。
代价上升: 得到代价矩阵之后,选择一个0元素,对可行解空间进行划分,右子树(不包含0)代价下界增加最大,每个分支的代价矩阵也发生变化。
A*算法
求解最小化或者最大化问题。g(n)为搜索树根节点到节点n的精确代价。
h∗(n)为节点n到目标节点的最小代价。
f∗(n)为从根节点到目标节点的最小代价。
f(n) 为f∗(n)的估计值,f(n)<=f∗(n)
其实A*算法有点类似于最佳优先策略
访问栈顶S的第一个元素:
如果绑定函数B(x)可能存在可行解,根据总代价值f(x)从小到大将x的每一个节点压入栈;
如果是可行解,如果是目标节点,则输出x对应的解
如果不可能存在可行解,重复操作。
当栈S为空时,算法结束。
剪枝: 找到的f(n) > 已知可行解的cost
相关文章推荐
- 搜索策略实现-DFS,BFS,爬山法,分支界限法
- DFS BFS 搜索总结
- ZOJ-1709 DFS和BFS两种搜索方法
- 图搜索——使用DFS和BFS耗时比较
- UVA 11882 Biggest Number (dfs搜索+bfs 剪枝)
- HDU 1312Red and Black(简单搜索 bfs或dfs)
- matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
- 经典算法研究系列:四、教你通透彻底理解:BFS和DFS优先搜索算法
- DFS BFS 搜索总结
- HDU 1312 Red and Black 红与黑 搜索 dfs bfs
- 搜索总结 - DFS&BFS&DBFS框架
- HDU 1372 Knight Moves (搜索 使用 dfs bfs两种实现)
- DFS BFS 搜索总结
- HDU1254 推箱子 DFS+BFS 算是不错的搜索题了
- POJ 3414 Pots——bfs搜索+dfs输出
- DFS BFS 搜索总结
- [HDU 2102] A计划(搜索题,典型dfs or bfs)
- 啊哈算法搜索应用之再解炸弹人(DFS与BFS)
- hdu 1181 (搜索BFS,深搜DFS,并查集)
- 图论中的优先级搜索——DFS,BFS,Prim,Dijkstra