zoukankan      html  css  js  c++  java
  • 搜索算法心得

    • 对于迷宫一般维护参数为当前这个点的坐标x,y以及当前走过的步数。判断是否到达某个点就是判断当前坐标是否等于目标坐标。若不等于,继续搜索,正常迷宫一般有四个方向可以走,可以定义一个方向数组int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; (→ /↓/ ← / ↑)那么下一步的横坐标tx可以表示为tx=x+next[k][0];x控制上下行的变化;y控制左右列的变化。
    • 注意点:是否越界,是否为障碍物,是否已经访问过···记录访问可以设置标记数组b[i];
    • 因为行是递增(不一定是加1)往下存放棋子的,故只要存储列的状态就可以保证列和行都不重复;如果我们逐行放置皇后/棋子,则肯定没有任意两个皇后/棋子位于同一行,只需要判断列和对角线即可。
    • 标记数组可以设为int型(0/1),也可以设为bool型(false/ture)
    • 尝试结束要取消这个点的标记
    • 如果是visit[i]这种标记,回溯后i点应该视为没访问过,所以需要还原,不管是全局变量还是局部;类比/因为在上一次摆放尝试结束后,如果不把刚刚放入棋盘的棋子收回,那将无法进行下一次摆放。
    • history[i]这种,用来记录第i点的值(颜色或者数字...),一般回溯到i之前的点时,第i点的取值就无所谓了,对dfs递归不影响,所以不用还原,还原也不会错;
    • int ans这种记录全局的变量,全局变量需要还原,局部不需要;
    • 只要枚举当前的状态可行,就继续枚举下去,当找到一种方案无法继续枚举下去时回到上一状态。退回到上一状态的过程叫做回溯,枚举下一状态的过程叫做递归。
    • 暴力搜索:又称枚举算法:列举问题的所有状态从而寻找符合问题的解的方法。适用于状态较少,比较简单的问题上。
    • 广度优先搜索:
      • 从初始点开始,根据规则展开第一层节点,并检查目标节点是否在这些节点上,若没有,再将所有的第一层的节点逐一展开,得到第二层节点,如没有,则扩展下去,直到发现目标节点为止。
      • 比较适合求最少步骤或最短解序列的题目。
      • 一般设置一个队列queue ,将起始节点放入队列中,然后从队列头取出一个节点,检查是否是目标节点,如不是则进行扩展,将扩展出的所有节点放到队尾,然后再从队列头取出一个节点,直至找到目标节点。
    • 深度优先搜索:
      一般设置一个栈

    stack

       ,将起始节点放入栈中,然后从栈中弹出一个节点,检查是否是目标节点,如不是则进行扩展,将扩展出的所有节点入栈,然后再从栈顶弹出一个节点,直到找到目标节点。

    深度优先搜索得到的第一个解,不一定是最优解。

    • 双向广度优先搜索
      • 双向搜索:从起始节点向目标节点方向搜索,同时从目标节点向起始节点方向搜索。
      • 双向搜索只能用于广度优先搜索中。
      • 双向搜索扩展的节点数量要比单向少的多。

     A*算法

    利用问题的规则和特点来制定一些启发规则,由此来改变节点的扩展顺序,将最有希望扩展出最优解的节点优先扩展,使得尽快找到最优解。

    对每一个节点,有一个估价函数F来估算起始节点经过该节点到达目标节点的最佳路径的代价。

    每个节点扩展的时候,总是选择具有最小的F的节点。

    F=G+B×H:G为从起始节点到当前节点的实际代价,已经算出,H为从该节点到目标节点的最优路径的估计代价。F要单调递增。

    B最好随着搜索深度成反比变化,在搜索深度浅的地方,主要让搜索依靠启发信息,尽快的逼近目标,而当搜索深的时候,逐渐变成广度优先搜索

    回溯算法:

    和深度优先相似,不同之处在于对一个节点扩展的时候,并不将所有的子节点扩展出来,而只扩展其中的一个。因而具有盲目性,但内存占用少。

     搜索中的优化:

    • 在搜索前,根据条件降低搜索规模。
    • 广度优先搜索中,被处理过的节点,充分释放空间。
    • 给据问题的约束条件进行剪枝。
    • 利用搜索过程中的中间解,避免重复计算。
  • 相关阅读:
    git系列3之简单命令(查看不同|文件提交|文件移除|重命名)
    git系列2之简单命令(乱码问题|修改文件提交|忽略文件)
    git系列1之安装初体验(windows)
    mongodb主从复制副本集(12)
    mongodb系统知识(11)
    mongodb系统知识(10)
    linux下h2集群创建,及java集成详细步骤
    windows下创建h2集群,及java集成详细步骤
    MySQL与Oracle 差异比较之一数据类型
    快速恢复update了的orcale数据表
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7250568.html
Copyright © 2011-2022 走看看