启发式搜索算法1 - 最佳优先搜索算法

本文介绍了启发式搜索算法,一种利用问题启发信息引导搜索以提高效率的方法。通过比较最佳优先搜索(BestFirstSearch)与广度优先搜索,展示了如何通过估价函数优化搜索过程,减少搜索次数。虽然启发式搜索可能无法保证最优解,但在许多情况下能显著提升效率。
摘要由CSDN通过智能技术生成

启发式搜索算法有什么优势?

对于复杂问题的盲目搜索,常用广度优先搜索和深度优先搜索这两种盲目搜索算法,极大极小值和Alpha-beta剪枝算法是在盲目搜索过程中,通过剪枝避开一些不可能的结果,从而提高效率。

如果搜索能够智能化一点,通过一些特殊的信息能够避免机械式盲目搜索,就可以提高搜索算法的效率,这就是启发式搜索。

启发式搜索(Heuristically Search)又称为有信息搜索(Informed Search),它是利用问题拥有的启发信息来引导搜索,达到减少搜索范围、降低问题复杂度的目的,这种利用启发信息的搜索过程称为启发式搜索。从定义知道启发式搜索策略是通过某些信息指导搜索向最有希望获取最佳解的方向前进,听起来像突然拿到了一张藏宝地图,根据藏宝图的信息开启了寻找宝藏之旅。根据经验,大部分人也没有找到什么宝藏,所以说启发式搜索策略是极易出错的,通过有限的信息来预测下一步的搜索过程实在太难,不然程序员都可以写个程序预测股票,趟着赚钱,不用上班了。那么能找到非常有价值的启发信息是最为重要,它应该能够降低搜索工作量,而又不牺牲找到最优解的保证。

最佳优先搜索算法(Best First Search)

图的算法中使用的广度优先搜索和深度优先搜索,它们都不考虑任何成本的盲目搜索路径,现在认识了启发式搜索算法,就要对此进行优化,首先来认识这个最佳优先搜索(Best First Search),它是在广度优先搜索的基础上的启发式搜索算法,用估价函数对将要被遍历到的点进行估价,然后选择代价小的进行遍历,直到找到目标节点或者遍历完所有点,算法结束。这样说起来有些抽象,通过下面例子如下图,通过最佳优先搜索来寻找结果。
在这里插入图片描述
想找到从【A】结点到【F】结点的最短路径,如果用广度优先搜索来求解,整个过程会以A为中心点,发散式地寻找,首先会遍历结点【B,D,G】,然后是【H】结点,再到结点【E,C】,最后才发现【F】结点,一共搜索了7次。现在改为最佳优先搜索,设置的估价函数是选取路径代价最小值,分析过程如下表所示。
在这里插入图片描述
估价函数计算的当前路径代价最小值作为信号,引导搜索选取下一个结点,如第一次选择【D】结点,因为它的值为2是当前最小值,同理第二次选择了【B】结点,最后一次选择了【C】结点,仅通过4次搜索就找到了从【A】到【F】的路径,比广度优先搜索少了3次,确实提高了效率,现在用代码来表示以上算法分析过程。

def bfs_path(graph, start, target):
    def find_min_path(queue):
        # 估计函数:寻找代价最小的路径
        temp_queue = [] # 记录每条路径的总代价
        for path in queue:
            total = 0
            for node in path:
                total += node[1]
            temp_queue.append(total)
        # 寻找最小代价的路径
        path_index = 0
        for i in range(len(temp_queue)):
            if temp_queue[i] < temp_queue[path_index]:
                path_index = i
        # 返回此路径,并且在优先队列移除
        return queue.pop(path_index)
    visited = [] # 保存已经访问的结点
    # 优先队列来保存访问结点的成本,初始值为开始位置
    priority_queue = [[(
  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值