人工智能之迷宫

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、问题描述

迷宫图从入口到出口有若干条通路,求从入口到出口最短路径的走法。

图1.1 迷宫示意图

二、设计原理

图1.1为一简单迷宫示意图的平面坐标表示。以平面坐标图来表示迷宫的通路时,问题的状态以所处的坐标位置来表示,即综合数据库定义为{(x, y) | 1≤x, y ≤ 4 },则迷宫问题归结为求解从 (1, 1) 到 (4, 4)的最短路径。迷宫走法规定为向东、南、西、北前进一步,由此可得规则集简化形式如下。

右移 R1:if(x, y) then (x+1, y) 如果当前在(x, y)点,则向右移动一步

下移 R2:if(x, y) then (x,y -1) 如果当前在(x, y)点,则向下移动一步

左移 R1: if(x, y) then (x -1,y) 如果当前在(x, y)点,则向左移动一步

上移 R2:if(x, y) then (x, y+1) 如果当前在(x, y)点,则向上移动一步

给出其状态空间如图2.1所示

为求得最佳路径,可使用A*算法。

A*算法f 函数定义 f(n) = g(n) +h(n)

设:每一步的耗散值为1(单位耗散值)

定义:g(n) =d(n) 从初始节点s到当前节点n的搜索深度

h(n) =| X

g -X

n

| + | Y

g

-Y

n

| 当前节点n与目标节点间的坐标距离

其中:( X

g , Y

g

) 目标节点g坐标 ( X

n

, Y

n

)当前节点n坐标

显然满足:h(n) ≤h*(n)

OPEN表节点排序

⑴ 按照f 值升序排列

⑵ 如果f 值相同,则深度优先

A*算法的搜索过程如下:

1、OPEN=(s), f(s)=g(s)+h(s)

2、LOOP:if OPEN=( ) then EXIT(FAIL)

3、n ← FIRST(OPEN)

4、if GOAL(n) THEN EXIT(SUCCESS)

5、REMOVE(n,OPEN),ADD(n,CLOSED)

6、{m

i

﹜← EXPAND(n)

①计算f(n,m

i )=g(n,m

i

)+h(m

i

),(自s过n,m

i

到目标节点的耗散值)

② ADD(m

j ,OPEN),标记m

j

到n的指针(m

j

不在OPEN和CLOSED中)

③ if f(n,m

k ) < f(m

k

) then f(m

k

) ← f(n,m

k

),标记m

k

到n的指

针(m

k

在 OPEN中)

④ if f(n,m

l ) < f(m

l

) then f(m

l

) ← f(n,m

l

),标记m

l

到n的指

针(m

l

在 CLOSED中)

ADD(m

l ,OPEN),把m

l

放回到OPEN中

7、OPEN中的节点按照f值升序排列

8、GO LOOP

A*算法的搜索图示如图2.2所示。

则其搜索结果如图2.3所示。

图2.3 迷宫搜索结果示意图

三、详细设计

(1)数据结构设计

①为了在程序中表示迷宫图,定义了一个6*6的二维整型数组

int Maze[7][7]={{3,1,3,1,3,0,3},

{0,4,1,4,1,4,1},

{3,1,3,0,3,1,3},

{1,4,1,4,1,4,1},

{3,0,3,1,3,0,3},

{1,4,1,4,1,4,1},

{3,0,3,1,3,1,3}};

其中数字3代表坐标点,1代表两个坐标点之间存在路径,0代表两个坐标点之间不存在路径,数字4没有意义。

从这个二维整型数组抽象出来的迷宫如下所示:

②每个坐标点的数据结构如下:

struct Data

{

int x;

int y;

int g;

int f;

struct Data *parent;

};

其中x代表数组的第几行对应实际坐标的y值,y代表数组的第几列对应实际坐标的x值,g代表从入口到该坐标点的耗散值,f代表代表评价函数值,parent代表路径上的该坐标点的前一个坐标点。

③程序中对应入口坐标为(6,0)也就是实际中的入口(1,1),实际中每走一步对应程序中是x+2或x-2或y+2或y-2。程序中对应的出口坐标为(0,6)实际对应着出口(4,4)。

④实际中的h函数对应程序中的h(n) =|x-0|/2+| y-6 |/2。

⑤因为实际坐标与程序中坐标不对应,所以需要一个转换公式,

如下:

实际坐标的x值等于程序中坐标点的y值除以2再加1

实际坐标的y值等于5减去程序中坐标点的x值除以2再减1

⑥判断两个坐标点a,b之间是否存在路径:

p=(a->x+b->x)/2; q=(a->y+b->y)/2;

如果Maze[p][q]==1,则说明a,b之间存在路径,Maze[p][q]==0,则说明不存在路径。为了将搜索结果图形输出,则又设置了Maze[p][q]==5,代表“←”, Maze[p][q]==6,代表“→”,Maze[p][q]==7,代表“↑”,Maze[p][q]==8,代表“↓”。

⑦为了满足open表中节点如果f 值相同,则深度优先,使用一个栈来表示open表,closed表也是用一个栈来表示。

(2)函数说明

bool bound(Data *a)

函数功能:判断一个坐标点是否越过边界,返回值bool值

int h(Data *a)

函数功能:h函数

Data* Nopen(Data *a)

函数功能:在open表中搜索结点a.若找到则返回结点a的地址,否则返回0

Data* Nclosed(Data *a)

函数功能: 在closed表中搜索结点a.若找到则返回结点a的地址,否则返回0

void sort()

函数功能:对open表中节点按照f值升序排列

void Expand(Data *a)

函数功能: 扩展当前结点a

void printmaze()

函数功能:输出迷宫

void printpath(Data *a)

相关文档
最新文档