搜索

    搜索算法就是在问题的解空间进行搜索,从而得到可行解或最优解。搜索的每一步,都有一个“状态”,搜索的时候需要找到合理的状态,进行搜索。一次成功的搜索就是在“状态”空间中找到一条从起点到终点的路径(可以想象为一棵树从根节点到某个叶子节点的路径)。

1. DFS和BFS

    搜索一般分为两种:深度优先DFS和广度优先BFS。一般地,DFS时,常常将“状态”保存在DFS函数的参数,即栈内存中;而BFS时,常将“状态”单独保存在BFS函数外部的堆内存中。

2. DBFS

    DBFS从起点和终点分别开始进行BFS搜索,直到一个扩展队列中出现另一个队列中已经扩展过的节点。在扩展节点的时候,每次都选择节点比较少的那个队列进行扩展,并不是机械的交替。

    void DBFS(){
    1. 将起点放入队列Q0,终点放入队列Q1
    2. 当两个队列都非空时,做如下操作:
    (1)如果队列Q0里的节点数 < Q1中的节点数,则扩展队列Q0
    (2)否则,扩展队列Q1
    3. 如果队列Q0未空,则不断扩展Q0,直到Q0为空
    4. 如果队列Q1未空,则不断扩展Q1,直到Q1为空
    }
    //扩展函数
    int Expand(int i){ //i 为队列的编号,0或者1
    取队列Qi的头结点H
    对H的每一个相邻节点adj:
    1.如果adj在队列Qi中出现过,则抛弃adj
    2.如果adj在队列Q中未出现过,则
    (1)将adj放入队列Qi
    (2)如果adj曾经在队列Q1-i中出现过,则输出找到的路径
    }

 

剪枝

 
    在一步步求解的过程中使用全局变量记录已经求得的最优解,如果当前节点未到达终点,但是当前的结果已经差于已经求出来的最优结果,则剪枝;同时,每次到达终点时,都更新最优解。

 
    在一步步求解的过程中使用全局变量记录已经求得的最优解,如果继续进行下一步操作得到的结果肯定差于最优解,则不进行扩展;同时,每次到达终点时,都更新最优解。

启发式搜索(A算法)【针对BFS进行优化】

 
h(n): 从当前节点n到终点的估计代价

A*算法【针对BFS进行优化】

 
采用优先队列,扩展时,选取队列头元素(f(n)最小)。

IDA*算法【针对DFS进行优化】

 
(3)K设置为 next_K,重复执行(2)(3)

相关文章:

  • 2021-12-07
  • 2021-04-08
  • 2021-06-10
  • 2021-11-20
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-01
  • 2021-04-10
相关资源
相似解决方案