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

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

对于复杂问题的盲目搜索,常用广度优先搜索和深度优先搜索这两种盲目搜索算法,极大极小值和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 = 0for node in path:total += node[1]temp_queue.append(total)# 寻找最小代价的路径path_index = 0for 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 = [[(start,0)]]# 特殊情况,开始位置与目标位置相同if start == target:return "开始位置就是目标位置"  while priority_queue: # 尝试所有可能,直到队列为空print('优先队列:', priority_queue)# 选择优先队列里的一条路径path = find_min_path(priority_queue)node = path[-1]if node[0] not in visited: # 没有访问过neighbours = graph[node[0]] # 获取这个结点的邻接结点for neighbour in neighbours:# 遍历所有邻接结点,创建新的路径添加到优先队列里面if neighbour[0] not in visited:new_path = list(path)new_path.append(neighbour)if neighbour[0] == target:return new_pathpriority_queue.append(new_path)visited.append(node[0]) # 结点已经访问# 没有找到路径return "两个结点没有路径相连"

可以和2.7.3小节图的遍历中广度优先搜索的程序作对比,程序基本思路是一致的,只是在选择下一条路径的时候,不是盲目地选取第一条路径,而是通过估价函数find_min_path()来选择下一条路径。现在通过上面的例子来测试程序,这里使用邻接列表来表示有权无向图。

graph = {"A": [("B",3), ("D",2), ("G",12)],"B": [("A",3), ("H",9)],"C": [("D",4),("F",3)],"D": [("A",2), ("C",4), ("E",7)],"E": [("D",7),("F",1)],"F": [("C",3),("E",1)],"G": [("A",12)],"H": [("B",9)],
}
print("求解得到路径:", bfs_path(graph, "A", "F"))
# -----------结果-----------------
优先队列: [[('A', 0)]]
优先队列: [[('A', 0), ('B', 3)], [('A', 0), ('D', 2)], [('A', 0), ('G', 12)]]
优先队列: [[('A', 0), ('B', 3)], [('A', 0), ('G', 12)], [('A', 0), ('D', 2), ('C', 4)], [('A', 0), ('D', 2), ('E', 7)]]
优先队列: [[('A', 0), ('G', 12)], [('A', 0), ('D', 2), ('C', 4)], [('A', 0), ('D', 2), ('E', 7)], [('A', 0), ('B', 3), ('H', 9)]]
求解得到路径: [('A', 0), ('D', 2), ('C', 4), ('F', 3)]

不但结果一致,算法整个分析过程与手动计算过程也是一致的。看来挺幸运的,刚好找到了最优解,其实在最开始的时候已经提醒过大家,启发式搜索不一定能找到最优解。例如这个例子,若修改【D-E】边的值为5,重新运行程序,大家会发现结果还是一样,但是【A-D-C-F】则不是最优解了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

春秋云镜 CVE-2023-50563

靶标介绍&#xff1a; SEMCMS是一套支持多种语言的外贸网站内容管理系统&#xff08;CMS&#xff09;。SEMCMS v4.8版本存在SQLI&#xff0c;该漏洞源于SEMCMS_Function.php 中的 AID 参数包含 SQL 注入 开启靶场&#xff1a; 开始实验&#xff1a; 1、使用后台扫描工具&…

ENVI实战—一文搞定遥感图像的计算机解译

人工进行矢量化制图虽然可以达到相应的精度要求&#xff0c;但是在工作量大&#xff0c;内容繁琐&#xff0c;时间成本高&#xff0c;利用计算机帮助我们对各类图像进行解译是目前制图的趋势。 本文基于&#xff08;ENVI和Arcgis&#xff09;给出利用遥感图像制作某地土地利用…

分享一份物联网 SAAS 平台架构设计

一、架构图**** 二、Nginx**** 用于做服务的反向代理。 三、网关**** PaaS平台所有服务统一入口&#xff0c;包含token鉴权功能。 四、开放平台**** 对第三方平台开放的服务入口。 五、MQTT**** MQTT用于设备消息通信、内部服务消息通信。 六、Netty**** Socket通信设…

有货源和分销单品爆款玩法课

该课程专注于教授如何利用有货源和分销渠道&#xff0c;打造单品爆款销售策略。学员将学习货源获取、产品定位、市场推广等关键技巧&#xff0c;通过实战案例和实操训练&#xff0c;掌握成功销售单品爆款的方法&#xff0c;提升销售业绩和市场竞争力。 课程大小&#xff1a;6.…

服务器部署开源大模型完整教程 Ollama+Llama3+open-webui

前言 最近大语言模型大火&#xff0c;正好最近打比赛可能会用得上LLMs&#xff0c;今天就在学校的服务器上面进行一次部署。这样之后就可以直接在内网里面使用学校的LLMs了。 介绍 Ollama&#xff1a;一款可以让你在本地快速搭建大模型的工具 官网&#xff1a;https://olla…

Visual studio 2019 编程控制CH341A芯片的USB设备

1、硬件 买了个USB可转IIC、或SPI、或UART的设备&#xff0c;主芯片是CH341A 主要说明USB转SPI的应用&#xff0c;绿色跳线帽选择IIC&SPI&#xff0c;用到CS0、SCK、MOSI、MISO这4个引脚 2、软件 2.1、下载CH341A的驱动 点CH341A官网https://www.wch.cn/downloads/CH34…

202012青少年软件编程(Python)等级考试试卷(一级)(2)

第 1 题 【单选题】 执行语句 print(1010.0)的结果为&#xff1f;&#xff08; &#xff09; A :10 B :10.0 C :True D :False 正确答案:C 试题解析: 第 2 题 【单选题】 Turtle 库中&#xff0c; 画笔绘制的速度范围为&#xff1f;&#xff08; &#xff09; A :任意…

C++11:shared_ptr循环引用问题

一、shared_ptr的弊端 struct Listnode {int _val;std::shared_ptr<Listnode> _prev;std::shared_ptr<Listnode> _next;Listnode(int val ):_val(val),_prev(nullptr),_next(nullptr){}~Listnode(){cout << "~Listnode()" << endl;} }; in…

翻译《The Old New Thing》 - How do I cover the taskbar with a fullscreen window?

How do I cover the taskbar with a fullscreen window? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050505-04/?p35703 Raymond Chen 2005年5月5日 如何用全屏窗口覆盖任务栏&#xff1f; 很多时候&#xff0c;人们总是想得太多。…

使用 scikit-learn 进行机器学习的基本原理-2

介绍 scikit-learn 估计器对象 每个算法都通过“Estimator”对象在 scikit-learn 中公开。 例如&#xff0c;线性回归是&#xff1a;sklearn.linear_model.LinearRegression 估计器参数&#xff1a;估计器的所有参数都可以在实例化时设置&#xff1a; 拟合数据 让我们用 nump…

[附源码]SpringBoot+Vue网盘项目_仿某度盘

视频演示 [附源码]SpringBootVue网盘项目_仿某度盘 功能介绍 支持秒传支持视频音频播放、拖拽进度条、倍速播放等支持图片预览&#xff0c;旋转&#xff0c;放大支持多人一起上传&#xff0c;共享上传进度&#xff08;例如a上传苍老师学习资料到50%&#xff0c;突然b也上传苍老…

uniapp + uView动态表单校验

项目需求&#xff1a;动态循环表单&#xff0c;并实现动态表单校验 页面&#xff1a; <u--form label-position"top" :model"tmForm" ref"tmForm" label-width"0px" :rulesrules><div v-for"(element, index) in tmForm…

低功耗数字IC后端设计实现典型案例| UPF Flow如何避免工具乱用Always On Buffer?

下图所示为咱们社区低功耗四核A7 Top Hierarchical Flow后端训练营中的一个案例&#xff0c;设计中存在若干个Power Domain&#xff0c;其中Power Domain2(简称PD2)为default Top Domain&#xff0c;Power Domain1&#xff08;简称PD1&#xff09;为一个需要power off的domain&…

mac/windows下安装docker,minikube

1、安装docker Get Started | Docker 下载安装docker 就行 启动后&#xff0c;就可以正常操作docker了 使用docker -v 验证是否成功就行 2、安装minikube&#xff0c;是基于docker-desktop的 2.1、点击设置 2.2、选中安装&#xff0c;这个可能需要一点时间 这样安装后&…

机器学习实战 —— 工业蒸汽量预测(二)

目录 文章描述背景描述数据说明数据来源实战内容2.数据特征工程2.1数据预处理和特征处理2.1.1 异常值分析2.1.2 归一化处理2.1.3 特征相关性 2.2 特征降维2.2.1 相关性初筛2.2.2 多重共线性分析2.2.3 PCA处理降维 文章描述 数据分析&#xff1a;查看变量间相关性以及找出关键变…

面试经典算法题之双指针专题

力扣经典面试题之双指针 ( 每天更新, 每天一题 ) 文章目录 力扣经典面试题之双指针 ( 每天更新, 每天一题 )验证回文串收获 392. 判断子序列 验证回文串 思路 一: 筛选 双指针验证 class Solution { public:bool isPalindrome(string s) {// 所有大写字母 > 小写 去除非字母…

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象基础、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript&#xff08;简称ES&#xff0c;是JavaScript的标准规范&#xff09;支持面向对象编程&#xff0c;通过构造函数模拟类&#xff0c;原型链实现继承&#xff0c;以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建&#xff0c;使用原型链共享方法和属…

max各种相机导出到ue4匹配镜头的工具集

总览 rollout export_UE4Cam_v2 "导出UE4Cam_v2:半自动" width:200 height:120(HyperLink explain "在打开的max文件中使用" pos:[25,12] width:200 height:15 color:(color 255 155 0) GroupBox grp1 "要导出的相机名" pos:[5,28] width:179 …

一个单例模式中使用std::unique_ptr引起的莫名其妙的COFF损坏的问题(未解决)

使用static std::unique_ptr和static std::shared_ptr都不行struct IElementAgendaEvents {//! Called to allow listeners to modify the agenda by adding/removing entries before applying tool operation. Return true if entries added or invalidated.virtual bool …

【Vue 2.x】学习vue之一基础部分

文章目录 Vue 一基础部分第一章1、git两个分支主分支子分支 使用方法方式1&#xff1a;采用命令的方式操作分支方式2&#xff1a;在idea中使用git的分支 向git远程仓库提交时忽略文件使用git时的一些冲突注意事项 2、Vue问题1&#xff1a;什么是Vue&#xff1f;问题2&#xff1…