搜索算法
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