实验5树的深度搜索.docx

上传人:b****7 文档编号:9647235 上传时间:2023-02-05 格式:DOCX 页数:10 大小:135.61KB
下载 相关 举报
实验5树的深度搜索.docx_第1页
第1页 / 共10页
实验5树的深度搜索.docx_第2页
第2页 / 共10页
实验5树的深度搜索.docx_第3页
第3页 / 共10页
实验5树的深度搜索.docx_第4页
第4页 / 共10页
实验5树的深度搜索.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

实验5树的深度搜索.docx

《实验5树的深度搜索.docx》由会员分享,可在线阅读,更多相关《实验5树的深度搜索.docx(10页珍藏版)》请在冰豆网上搜索。

实验5树的深度搜索.docx

实验5树的深度搜索

实验5树的深度搜索

一实验原理

1、定义

  在此搜索中,首先扩展最新产生的(即最深的)节点。

深度相等的节点可以任意排列。

  这种盲目(无信息)搜索叫做深度优先搜索(depth-firstsearch)。

2、特点

  首先,扩展最深的节点的结果使得搜索沿着状态空间某条单一的路径从起始节点向下进行下去;只有当搜索到达一个没有后裔的状态时,它才考虑另一条替代的路径。

3、深度界限

  为了避免考虑太长的路径(防止搜索过程沿着无益的路径扩展下去),往往给出一个节点扩展的最大深度棗深度界限。

任何节点如果达到了深度界限,那么都将把它们作为没有后继节点处理。

二实验目的

掌握有关树的深度优先搜索和图的搜索算法

三实验内容与结果

四实验心得

5.1树的深度搜索

深度搜索

在人工智能领域,经常使用到搜索技术。

常见的搜索方式有深度优先搜索与宽度优先搜索两种。

问题:

树的搜索

树在计算机科学领域是一种数据结构的概念。

例如下图就表示一棵树:

树中的字母表示树的节点,节点a叫做树的根,节点b、c、d叫做节点a的子节点。

b、c、d又分别有它们的子节点。

树的搜索的意思就是要找到一条连接两个节点的路径,例如连接节点a与g的路径是a-c-g。

上面的例子是显而易见的,不过要想让计算机也能够找到这条路径,就必须编程解决。

下面介绍它的Prolog程序的编法。

树的表达

首先我们需要把上面的树翻译为Prolog的语言,这不难办到,只要使用事实就可以轻易地搞定:

上面的每一条事实对应树中的一条树枝。

树的搜索

先给出搜索程序:

(事实框中输入)

树的深度搜索完整源程序:

测试用例及结果(目标框中输入):

route(a,f,L).

L=[c,f];

1Solution

route(a,h,L)

L=[d,h]

1Solution

我们可以看出,上面的route/3是使用递归的方法书写的。

前两个参数为要考虑的节点,第三个参数储存找出来的路由表。

route的第一个子句为边界条件;第二个子句递归调用route/3本身。

在这个程序中,当找到X的一个子节点后,系统就开始寻找这个子节点的子节点,一直到找到目标,搜索就成功地结束,而如果某个节点没有子节点,就会引起回溯,去寻找它的父节点的另一个子节点。

这种搜索方式就叫做深度优先搜索。

由于Prolog内建的自动回溯功能,使得我们可以非常容易地实现深度搜索。

所以在一般情况下,通常使用深度搜索,而只在特殊的情况下才使用宽度搜索。

5.2图的搜索-树的搜索拓展

有向图

如果在前面的事实中增加一条sub(d,g),那么g既是d的子节点,又是c得子节点。

我们把这样的树叫做有向图。

有向图的搜索与树的搜索过程是相同的。

图的搜索

图是最复杂的数据结构了。

在图中不分什么父节点与子节点,每个节点都与一定数量的其它节点相连,一条连接叫做一条路经。

每条路径都有不同的权值,从某个节点到另外的节点所走过的路径就叫做这两个节点之间的通路。

图的搜索的目的就是要找出这些通路,有时还需要所有的权值加起来最小(后面实验将会涉及)。

图的最典型的例子就是地理上的地图了,每个城市相当于一个节点,城市之间的道路就是路径了。

搜索工作就是一个旅游向导,它能够帮助你决定到达另外一个城市所需的路径。

图的搜索和树的搜索是类似的,不过由于图中存在着环路,所以如果不加以控制,而直接使用前面的程序就会导致永远不会结束。

(此处及以下的解决搜索主要是针对无向图)

解决环路的办法也很简单:

使用一个列表储存已经考虑过的节点,如果正在考虑的节点已经在此列表中就表明没有必要再搜索此节点了。

下面是完整的Prolog程序。

上图为源程序及程序注解说明。

源程序备注说明:

1.谓词c/2

定义了图的信息,你也可以自己根据事实给出的信息在纸上画画此有向图。

2.findroad/4

findroad/4为寻找路由的谓词,它的调用方式为findroad(a,e,[],X)。

3.findroad(X,X,L,L).

第一个子句定义了边界条件,它用来把第三个参数传给第四个参数,第三个参数为临时的路由表,第四个参数为最终的路由表。

4.findroad(X,Y,L,L1):

-%L为储存的路由表。

connect(X,Z),

not(member(Z,L)),%X所连接的节点Z不在已经储存的路由表中。

findroad(Z,Y,[Z|L],L1).

第二个子句先找出与X相连的节点Z,然后判断Z是否在临时的路由表中,如果不在,就把Z加入到临时路由表中,并且寻找从Z到Y的路由。

下面是运行结果:

findroad(a,e,[],L),write(L),nl,fail

[e,b]

[e,f,b]

[e,b,c]

[e,f,b,c]

[e,b,a,c]

[e,f,b,a,c]

[e,b,d,a,c]

[e,f,b,d,a,c]

[e,b,a,d]

[e,f,b,a,d]

[e,b,c,a,d]

[e,f,b,c,a,d]

[e,b,d]

[e,f,b,d]

Nosolutions

findroad(a,f,[],L),write(L),nl,fail

[f,e,b]

[f,b]

[f,e,b,c]

[f,b,c]

[f,e,b,a,c]

[f,b,a,c]

[f,e,b,d,a,c]

[f,b,d,a,c]

[f,e,b,a,d]

[f,b,a,d]

[f,e,b,c,a,d]

[f,b,c,a,d]

[f,e,b,d]

[f,b,d]

Nosolutions

对于结果正确与否,同学们可以通过参照下图自己来验证。

这里有两点需要说明:

第一,我们找出来的路由表是倒过来的,不过这并不影响结果;

第二,这个程序找出了所有的通路,但是并不能判断哪条通路是最短通路,另外我们还没有加入路径的权值。

作业

要求:

实验结果均要求保存在电子文档中,同时实验报告中也要选一个测试用例,同时给出实验输出结果

1.请编写下面相应树的深度搜索源程序,并给出至少两个测试用例及结果

2.参照给出的图,请编写有关图的搜索算法及源程序,并给出测试用例及结果。

例如,请找出从I到!

路径,注意有关事实描述中大小写之别.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1