图搜索算法(一):图搜索的一般算法
一、引言
图搜索技术时人工智能中的核心技术之一,并且在其他场合也有着非常广泛的应用。这里的图称为状态图,指由节点和有向(带权)边所做成的网络,每个节点即状态。按照搜索的方式不同,图搜索一般分为树式搜索和线式搜索。两者最大的区别就在于搜索过程中所记录的轨迹不同,顾名思义,树式搜索记录的是一颗搜索树,而线式搜索是一条折线。我们一般用一个Closed表的数据结构来记录搜索节点,对于树式搜索来说,Closed表存储的正是一颗不断成长的搜索树,而线式搜索存储的则是一条不断伸长的折线,如果能找到目标节点的话,它本身就是搜索的路径。而树式搜索需要通过目标节点进行回溯,直至初始节点,从而找到路径。
二、树式搜索的一般算法
对于树式搜索算法,我们需要将待考察的节点放在一起,并做某种排列,以控制搜索顺序,实现某种策略。因此,使用一个Open表的数据结构来记录当前待考察的节点。(这是可回溯线式搜索和深度优先搜索的区别)。
下面给出Open表和Closed表的数据结构:
节点 | 父节点编号 |
编号 | 节点 | 父节点编号 |
下面给出图搜索一般算法:
GRAPHSEARCH:
(1)建立一个只含有起始节点S的搜索图G,图中每个节点有一个指向其父节点的指针, S的这一指针为一特殊值(如0), 并把S放入未扩展节点表OPEN中.
(2)建立已扩展的节点表CLOSED,初始时该表为空.
(3)LOOP:若OPEN表为空,则失败退出.
(4)把OPEN表中的第一个节点移出,放入CLOSED表中, 称其为n节点.
(5)若n为目标节点,则成功退出. 问题的解是沿指针 追踪G中从n到S的路径而得到的.
(6)扩展节点n, 生成不是n的祖先的那些后继节点的集合M.如果没有后继节点,则转LOOP.
(7)把那些不在G中的M的成员作为n的后继节点加入G,并设置一个通向n的指针,把它们加入OPEN表. 对已在G中的M的成员,调整有关指针.
(8)按某种方式, 重排OPEN表.
(9)转LOOP.
三、基于一般图搜索算法的搜索策略
根据搜索策略的不同,图搜索算法一般分为两大类:盲目搜索和启发式搜索。顾名思义,盲目搜索是一种无向导的搜索,穷举所有可能的状态,这种算法实现简单,但效率很低;启发式搜索是根据具体的问题,在搜索的过程中产生启发性的信息,指导搜索过程,启发式搜索能极大提高搜索效率,并且有可能得到问题的最优解。
之所以有这样的搜索策略的区分,是因为在图搜索一般算法中的Open表设计造成的,Open表是待考察的节点状态,那么考察Open表中节点的顺序,便指导了整个搜索的顺序,从而产生了不同的搜索策略。以常见的盲目搜索算法:广度优先算法和深度优先算法为例,不难想象,广度优先算法中的Open表是一个队列,即先进先出,那么后加入的节点永远都是后扩展的节点,即深度小的节点永远都是优先扩展的,因为他们是先加入Open表的。而深度优先算法的Open表是一个栈结构,即后进先出,扩展总是沿着一条线纵深扩展,再回溯的。
对启发式搜索,又根据所依据的估价值不同,分为基于代价函数g(x)的搜索,基于启发函数h(x)的搜索,和基于估价函数f(x) = g(x)+h(x)的搜索(A算法和A*算法)。
图搜索算法(一):图搜索的一般算法相关推荐
- 算法之图搜索算法(一)
1. 介绍 本文介绍了比较初级的图搜索算法,包括深度优先遍历,广度优先遍历和双向广度优先遍历. 2. 深度优先遍历DFS 2.1 算法思想 从图中某个顶点v开始,访问此节点,然后依次从v中未被访问的邻 ...
- Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)
Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...
- 地图绘制和四色算法,图搜索算法,最小生成树算法,最短路径算法
基于简易Web墨卡托计算实现地图绘制,四色染色,实现图的深度优先搜索,广度优先搜索,Kruskal算法最小生成树,Prime算法最小生成树,Dijkstra最短路径算法. 使用Java & S ...
- A*算法求解迷宫问题(算法讲解与证明、python实现与可视化)
目录 一.引入 二.具体细节 1.BFS(Breadth First Search) 2.Dijkstra(Uniform Cost Search) 3.启发式(Heuristic search) 4 ...
- 【数据结构与算法】第二篇:算法部分
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.程序的时间和空间复杂度分析 (1)理解算法时间复杂度的表示法 ( ...
- 回归算法分类,常用回归算法解析
回归算法分类,常用回归算法解析 回归是数学建模.分类和预测中最古老但功能非常强大的工具之一.回归在工程.物理学.生物学.金融.社会科学等各个领域都有应用,是数据科学家常用的基本工具. 回归通常是机器学 ...
- 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)
Bellman-Ford算法 Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高.而SPFA算法是使用队列优化的Bellman-Ford版本,其在时间复杂度和编 ...
- K-means聚类算法和模糊C-means聚类算法
K-means聚类算法和模糊C-means聚类算法 1.K-means聚类算法 K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数, ...
- TSNE算法是什么?该算法有什么缺陷?
TSNE算法是什么?该算法有什么缺陷? TSNE算法是什么? TSNE是一种通过在二维或三维地图中给每个数据点一个位置来实现高维数据可视化的统计方法.它是基于Sam Roweis和Geoffrey H ...
- java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)
一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...
最新文章
- python3 byte_「Python3学习笔记」读书笔记—字节数组
- opencv_python 读取4通道png图片
- JMeter和JMeterPlugin 下载安装
- 模型训练 准确率下降_手写批量线性回归算法:在Python3中梯度下降方法实现模型训练
- 200818C链表的查询插入删除
- 三星电子宣布已开始大规模量产5nm芯片,并正在研发4nm工艺
- php table转json,html table表数据转Json格式示例代码分析
- 怎么做装修预算?装修预算需要注意的三大事项
- 8.configurable product
- Atitit.木马 病毒 免杀 技术 360免杀 杀毒软件免杀 原理与原则 attilax 总结
- jquery form表单序列化,并ajax实现提交后台
- 合并下载ts流媒体视频
- 苹果8参数配置_苹果MacBook Air/MacBook Pro/Mac mini参数配置详细介绍_智能硬件
- “洋葱狗”潜伏3年终曝光,定期偷袭能源及交通行业
- 基于python语言设计的词云定制器
- 智能电话机器人--基于 UniMRCP 实现讯飞 ASR MRCP Server
- 010 极限的四则运算例题
- 如何解释vue的生命周期才能令面试官满意?
- Nehe教程16课雾
- Linux CentOS7.0 使用root登录桌面