搜索算法

Posted cmcshenwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索算法相关的知识,希望对你有一定的参考价值。

最近进行的项目基本没有进展和头绪,上次和老师见面后。老师认为做的很差,只是套用了遗传算法的形,没有做出精髓来。给出了下一阶段的任务:改进遗传算法,或采取新的编码方式,或结合其他的概率算法。
不过也在意料之中,毕竟粗略计算,解空间也已经到了2的100次方,算法的复杂度至少有O(2100),能收敛求解的概率小之又小。目前能做的也只有结合其他概率算法进行优化求解了。

最近发生的其他事就是舍友在做作业时找我讨论了几次,某种程度上帮我复习了几种搜索算法(广度、深度、A*)

广度搜索算法的基本思路是能进来的都进来,先把所有可选择的策略都纳入考虑范围,然后再把每一个可选择的策略的可选择策略纳入考虑范围,一直这样做,总有一次自己的考虑范围里会出现一个最优可选择策略。大致如图
技术图片?

以一个迷宫来解释,那么广度优先算法的伪代码如下

var queue  //定义一个队列结构(考虑范围)
queue.add(maze.start)  //将迷宫的起点加入队列
while !queue.isEmpty
    var temp = first(queue) //让temp为队列中第一个点 
    queue.remove(temp)     //移除temp即第一个点,如果不移除下次循环还是会选定这个点
    /*找到所有可行策略*/
    var neighbors = searchneighbor(temp) //将temp点的所有可以走通的邻点(可行策略)
   /*将所有可行策略都加入考虑范围*/
    for neighbor in neighbors 
        if neighbor == goal              //如果邻点是终点就停止算法
            break
        end
        queue.add(neighbor)            //将每个邻点(可行策略)都添加到队列中   
    end
end   

深度搜索算法的基本思路是一条路走到黑,先把所有可行策略找到,然后选定其中一个,然后再选定这个可行策略的一个可行策略,一直到找不下去为止,再退回到上一次可行策略集合里再选一个继续往下走,一般采用自己调用自己的方法来实现。

以一个迷宫来解释,那么一次深度搜索的思路大致如下

var queue  //定义一个队列结构(考虑范围)
queue.add(maze.start)  //将迷宫的起点加入队列
while !queue.isEmpty
    var temp = first(queue) //让temp为队列中第一个点 
    queue.remove(temp)     //移除temp即第一个点,如果不移除下次循环还是会选定这个点
    /*找到所有可行策略*/
    var neighbors = searchneighbor(temp) //将temp点的所有可以走通的邻点(可行策略)
   /*将可行策略的可行策略加入考虑范围*/
    
        if neighbor == goal              //如果邻点是终点就停止算法
            break
        end
        queue.add(neighbors[0])            //将每个邻点(可行策略)都添加到队列中   
 end

如果要完全实现的话应该自调用

void dfs(int step){
        一次尝试结束while(...){
                继续下一次dfs(step+1)
        }  
}

A*算法的基本思路是有选择的一条路走到黑,它实际上是对Dijkstra算法的改进, Dijkstra只考虑从下一策略执行的成本最小,而A *则加入了到最终状态的成本一起考虑。算法的关键就在于成本函数的定义。它会选择考虑范围里成本最小的策略,再考虑这个策略的考虑范围里成本最小的策略,一直到找到目标策略。

同样以迷宫举例

var queue  //定义一个队列结构(考虑范围)
queue.add(maze.start)  //将迷宫的起点加入队列
while !queue.isEmpty
    var temp = func bestcost(queue) //让temp为成本最小点,其实一开始也是起点
    queue.remove(temp)     //移除temp即第一个点,如果不移除下次循环还是会选定这个点
    /*找到所有可行策略*/
    var neighbors = searchneighbor(temp) //将temp点的所有可以走通的邻点(可行策略)
   /*将可行策略的可行策略加入考虑范围*/
    
        if neighbor == goal              //如果邻点是终点就停止算法
            break
        end
        queue.add(neighbors[0])            //将每个邻点(可行策略)都添加到队列中   
 end
 
 
 func(queue)//成本函数计算,返回到终点距离终点距离最短的点
 {
    var min = queue[0]
    for q in queue
        costA = q.manhattanDistance(to:goal) //计算到终点的汉明斯距离(横纵距离)
        costB = min.manhattanDistance(to:goal)
        if costA< costB
            min = q 
        end。       //更新最小成本点
    end
 }

人生应该是A*,既要莽就完事了,又要保持理智。

以上是关于搜索算法的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

片段(Java) | 机试题+算法思路+考点+代码解析 2023

如何在 BottomNavigationView 的片段上打开搜索界面?

如何在bash终端中实现CTRL-R(反向搜索)?

26个jQuery代码片段使用技巧

搜索文本中多个字符串之一的有效算法?