Algorithm - 算法思想 - 搜索
盲目性搜索
深度优先搜索:
介绍: 深度为优先考虑的搜索方式
框架:
void DepthFirstSearch(状态){ if(状态 == 解){ return 答案; } for(新状态 in 状态.下个状态的集合){ if(新状态 合法){ DepthFirstSearch(新状态) } } }
扩展:
剪枝优化
备忘录优化
广度优先搜索:
介绍: 以广度为优先考虑的搜索方式
框架:
void BreadFirstSearch(状态){ map<key, value> map;
// 可用优先队列进行存储 Queue.Push(状态) while(Queue.Count() != 0){ 临时变量 = Queue.Pop() if(临时变量 == 解){ return 答案; } for(新状态 in 状态.下个状态的集合){ // 用于判定是否符合题目规则(边界, 剪枝等) // 用于判定是否已经遍历过, 也可以用于判定在遍历过中是否是最优解 if(新状态 合法 && (map<新状态> 不存在 || map<新状态> 存在且不优于 新状态){ Queue.Push(新状态) } } } }
扩展:
路径状态的保存
双向广度优先搜索
介绍: 从终点和起点一起进行广度优先搜索
框架:
启发性搜索:
AStar 搜索:
介绍: 根据曼哈顿估值函数来进行节点的排序, 优先访问离终点近的节点
框架:
int AStarSearch() { 开队列.Push(当前状态); while(开队列.size()!=0) { 开队列按照权值排序; 节点 = 开队列.Pop(); 闭队列.Push(节点); if(节点 == 答案) return 答案 else { for(新状态 in 节点.下个状态集合) if(新状态 合法 && 新状态符合题目条件 && 不在开队列 && 不在闭队列) { 新状态.权值 = 估算函数; 开队列.Push(新状态) } } } return 0; }
注意:
需要设置一个保存 待扩展节点 的节点表1, 和所有(待扩展和已扩展)的表2, 表1用堆来实现, 表2用排序二叉树来实现.
IDAStart
介绍: 基于迭代加深的AStart算法, 忽略所有f值大于深度限制的节点.
框架:
DFSBnB:
介绍: 深度优先+最优性剪枝
博弈问题算法:
极大小值搜索
Alpha-Beta 剪枝
敌对搜索 MemSSS* 算法