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* 算法

 

 

posted @ 2016-04-26 21:44  `Laimic  阅读(221)  评论(0)    收藏  举报