《搜索求解与编程》唐瑞圭,韩靖编著|(epub+azw3+mobi+pdf)电子书下载

时间: 2022-10-17 10:14:40  41 epub epub 编著

图书名称:《搜索求解与编程》

【作 者】唐瑞圭,韩靖编著
【页 数】 168
【出版社】 广州:中山大学出版社 , 1993.10
【ISBN号】7-306-00782-3
【价 格】$7.00
【分 类】搜索-运算方法 运算方法-搜索
【参考文献】 唐瑞圭,韩靖编著. 搜索求解与编程. 广州:中山大学出版社, 1993.10.

图书目录:

《搜索求解与编程》内容提要:

《搜索求解与编程》内容试读

第一章状态空间问题求解

第一节状态空间问题求解概念

状态空间问题求解是采用试探搜索的方法,在某一可能的解答空间中寻找一个解来解答一个问题的。到底何谓解答空间,搜索方法求解又是什么回事,我们不妨从一实际问题出发来说明它。

八位数码难题是由八个编有数码】至8并放在3×3的方格棋盘上的可走动的棋子组成,棋盘总有一格是空的。以便可以让周围的棋子走进空格,也可以说是移动空格,八位数码难题如(图1.1)所示,图中给出的两种棋局,即初始棋局和目标棋局。

初始棋局

目标棋局

图1.1

如何把初始棋局变成目标棋局呢?最直接的求解方法是尝试各种不同的走步,如“下移棋子8,右移棋子2,上移棋子1,…”等等,直到偶然得到该目标棋局为止。这种尝试在本质上涉及某种试探搜索,从初始棋局开始,我们要计算机由每一合适走步得到各种新棋局,然后计算机再走下一步,又得到下一组棋局,这样继续进行下去,直至找到目标棋局为止。我们把这种在搜索尝试过程中产生的所有棋局的集合看成是这一问题求解的状态空间,最后得出的一条由初始状态到目标状态的走步序列便是搜索求解的具体实现

要计算机实现状态空间求解,首先要解决的是有一计算机能接受的每一状态的表示和从一种状态变成另一状态的重写规则(也可说是产生新状态的途径)。实际上任何类型的数据结构都可用来描述各类问题的状态,其中包括符号、字符串、向量、二维数组、树和表格等。但是我们在解答某一具体问题时应注意所选的数据结构的形式与解决的问题在某些自然特征上要具有相似性,同时还必须注意所选择的这种状态描述具有方便的算法去重写它(即有方便的产生新状态的途径)。对于8数码难题采用3×3阵列表示是自然的,而棋子的正当走步(即改写途径)可以有32条,即左移棋子1,右移棋子1,上移棋子1,下移棋子1,左移棋子2…等。但我们立即可以发现,用左移空格,右移空格,上移空格,下移空格四条改写途径就完全可以代替上述32条途径。而后者的描述和操作要比前者简单得多,也将大大缩小搜索的状态空间,故我们应尽可能用经济的方法描述问题状态和走步规则。它是高效率解决问题的需要。

。1✉

图1.2是八数码难题的四条改写途径的图示。

2

8

3

1

4

65

左移空格

右移空格

上移空格

下移空格

283

8

2

3

2

3

28

1

1

4

8

16

765

7

65

7:6

7

图1.2

1

283

11

765

3

4

5

283

23

283

283

14

184

14■

164

765

765

765

75

6

7

8

9

10

2

12

13

83

283

23

23

28

283

283

283

21M

714

184

18M

143

145

164

164

765

65

765

765

765

76

75

75

14

15

16

17

18

19

20

3

83

283

123

234

28

283

283

283

21M

71M

84

18

143

145

64

16

765

65

765

765

765

76

175

751

22

23

2

25

26

83

813

283

283

123

61M

765

615

65

765

目标节点

图1.3

在图1.2图中我们可以把每一棋局看成一个节点,把从一棋局遵照所有可能的改写途径得出一组棋局的过程,称作扩展节点过程。最上方的一个节点称为下面4个节点的父节点,而下面4个节点又称为是上面一个节点的子节点(或称后继节点)。遵照这四条

·2。

改写途径,我们可将图1.1中初始棋局变换成目标棋局的一种搜索过程用图1.3表示出来,图1.3是一种树结构,初始节点为树根,它的深度为0,其它节点的深度等于其父节点的深度加1,也即第2行的节点深度为1,第3行节点深度为2…。其中每一节点左上方的数字是搜索过程中产生该节点的序号,同时也是用来扩展节点的顺序。按这种搜索方法从初始节点到目标节点遵照我们规定的走步原则共产生了26个棋局,也就是说这一问题求解的整个状态空间由26个节点组成,而粗线连接的一条走步序列就是一条解答路径。

第二节状态空间搜索要点

1.起始节点,对应于初始状态的描述。

2.扩展子节点,即用适合问题求解的改写途径扩展新节点。

3.为子节点设定指针,即记录其父辈节点的标号,以便找到目标节点时,沿指针能找出一条回到起始节点的途径。

4.检查各子节点是否为目标节点,如果还没有找到目标节点则又转回2,继续进行扩展子节点和设定指针的工作:当找到目标节点时,沿着有关指针从目标节点回湖!起始节点,打印这条解答路径。

从上面八数码难题例子,我们可能已经发现了一个问题,在我们扩展的所有节点中,没有两个状态是完全相同的,也就是说,在一般搜索过程中,我们把凡产生的节点状态与以前产生的某节点状态相同的节点都删掉,这就避免了搜索过程在原地兜图子的现象。

上述要点只是对状态空间搜索的一种简单描述,而当我们实际做某一具体搜索过程时,都会遇到被扩展节点的次序问题。我们可以根据被扩展节点的不同次序,分成宽度优

先、深度优先、等代价和A*算法几种不同的搜索方法。

L

(M

F

(F

(a)

(b】

宽度优先搜索节点扩展次序

深度优先搜索节点扩展次序

图1.4

如搜索是以接近起始节点的程度依次扩展节点的,就叫宽度优先搜索法。如图1.4()所示。图1.3所示八位数码难题搜索方法也就是用宽度优先搜索法进行的,在对下一层任一节点进行搜索之前,必须搜索完本层所有节点。

如果搜索是首先扩展最新产生的节点,则称这种搜索为深度优先搜索,如图1.4(b)

·3

所示。对于深度优先搜索,除非搜索失败(即不存在任何子节点,有时是指达到约定的最大深度还未找到目标节点),而需要退出来去搜索其它原来被暂时忽略的节点外,否则每层只对一个节点进行扩展。

上述两种搜索方法都属盲目或称无信息搜索过程。

对于许多任务来说,有可能存在某些经验法则或原则来简化搜索。我们可以把这种经验法则称作一种启发信息,利用这些信息往往能首先扩展最有希望的节点,从而把搜索较

快地推向目标。这正是A·算法在搜索过程中最突出的长处,它往往能使搜索过程的时间

和状态空间大大缩小,对于那些因内存容量限制而难于解答的问题,采用带启发信息的

A·算法往往容易获得满意的解答。

还有一种搜索要求求解具有最小代价的特定解,对于这类问题,节点之间的连线具有

一定的代价,从起始节点到每一节点n都有一路径代价,我们用cost(n)表示,如果我们在搜索过程中,节点的扩展顺序按cost值的递增顺序扩展的。我们称此为等代价搜索(旧称等费用搜索)。它也是一种无信息搜索。

下面就各种搜索方法加以叙述。

第二章状态空间问题求解常用算法及例解

本章讲述状态空间中的各种搜索的算法和程序实现模式,并附实例说明。

第一节宽度优先搜索

一、定义与算法

在这种搜索过程中,树上的节点扩展是沿着深度的“断层”进行的,比如要对深度为的任一节点进行搜索扩展之前,深度为3的所有节点必须全部被搜索出来。所以这种搜索方法一定能保证找到最短(步数最少)的解答序列。在不少题中要求找到经历步骤最少而达到目标的方案时,多采用此种搜索方法。

宽度优先搜索的算法:

l.把初始节点放入待扩展节点的opn表中,此表开始只有起始节点,其结构为队结构,即先进先处理。

2.如果open表空,(即待扩展节点已全部扩展完毕),失败退出。

3.把opn表中队列前的节点取出,按合适的途径扩展全部子节点,并把新生的子节点依次加入opn表的后面,同时提供这些子节点返回父节点的指针,若无子节点,则返回2。

4.如果有任一子节点为目标节点,则找到一个解,打印路径退出。否则转2继续。

二、宽度优先搜索的程序实现

如何用程序实现宽度优先搜索法呢?下面介绍其具体的程序实现算法。为方便描述和阅读,本书对所有程序和算法描述中统一规定各变量的意义(有改变时再另行说明)。

算法描述中各变量意义

state(x):表示节点X的状态。state(1)表示初始状态。object:

表示作扩展的节点。

top:

表示由节点object扩展的子节点。也是栈顶指针或队尾指针。

father (x):表示节点X的父节点标号。也称父指针。

way(x):

表示扩展子节点的途径的第X种途径。

waymax:表示所有可能扩展子节点的途径的总数目。

waynum:

表示所选途径编号。

next(x):

链指针,用于表示按代价从小到大排序中节点的先后次序。

m(i,j):

表示从i节点到j节点的实际代价。

cost(x):

表示从初始节点到节点X的总代价。

·5

guess(x):表示节点X到目标节点的估计代价。也称启发函数的值

guesscost(x):表示从初始节点到节点X的总代价加上节点X到目标节点的估价函数作

有:

guesscost(X)=cost(X)+guess(X)

例题程序中对上述变量进行了简化。算法中

Pascal程序中

PC-BASIC和True BASIC中

state(x)

state (x)

S(x)

object

object

P

top

top

T

father(x)

father(x)

F(x)

way(x)

w(x)

W(x)

waynum

wayn

w

waymax

waymax

M

next(x)

next(x)

N(x)

cost (x)

cost(x)

C(x)

guesscost (x)

gcost(x)

G(x)

注意:下文算法中的1,2,3,4与流程图及程序实现模式中的1,2,3,4对应,与例题程序注释中的part 1,part2,part3,part4对应。另外在例题程序中Pascal程序中的数据文件可参考Basic程序中的data语句。

宽度搜索程序实现算法

1.把初始状态赋值到队头state(1)中,并初始化指针,1→object,.1→top。

2.分别用waymax种途径扩展object的子节点。

①从途径l开始扩展新节点,l→waynum。

②判断途径waynum可行吗?(即可否扩展新节点),若不可行转2一⑤。

③按途径waynum改写state(object)得到新节点状态,对新节点设父指针,新状

态入队。

top+l→top,object--→father(top),新状态→state(top)。

④state(top)是目标状态吗?是则调用打印结果子程序print打印路径。若只要求

一个方案则结束,否则top一1→top。

⑤waynum+l→waynum(选择下一途径再扩展),若waynum≤waymax,则转2

-②。

3.选择用来扩展的新节点。

取队列首节点用来扩展节点,即object-+l→object,若object>top(即open表已

空)则结束,否则转2。

·仿

···试读结束···

  • 声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,以上内容仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站内容来自网络收集整理或网友投稿,所提供的下载链接也是站外链接,版权争议与本站无关。您必须在下载后的24个小时之内,从您的设备中彻底删除上述内容。如果您喜欢该程序和内容,请支持正版!我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!邮箱:121671486@qq.com,微信:diqiuren010101

学习考试资源网-58edu © All Rights Reserved.  湘ICP备12013312号-3 
站点地图| 免责说明| 合作请联系| 友情链接:学习乐园