八数码难题Matlab.docx
- 文档编号:26160369
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:17
- 大小:106.29KB
八数码难题Matlab.docx
《八数码难题Matlab.docx》由会员分享,可在线阅读,更多相关《八数码难题Matlab.docx(17页珍藏版)》请在冰豆网上搜索。
八数码难题Matlab
、实验目的
1、熟悉和掌握启发式搜索的定义、估价函数和算法过程。
2、利用A*算法求解N数码难题,理解求解流程和搜索顺序。
二、实验内容
以八数码为例实现A或A*算法。
1、分析算法中的OPE表CLOS表的生成过程。
1)建立一个队列,计算初始结点的估价函数f,并将初始结点入队,设置队列头和尾指针。
2)取出队列头(队列头指针所指)的结点,如果该结点是目标结点,则输出路径,程序结束。
否则对结点进行扩展。
3)检查扩展出的新结点是否与队列中的结点重复,若与不能再
扩展的结点重复(位于队列头指针之前),则将它抛弃;若新结点与待扩展的结点重复(位于队列头指针之后),则比较两个结点的估价函数中g的大小,保留较小g值的结点。
跳至第五步。
4)如果扩展出的新结点与队列中的结点不重复,则按照它的估价函数f大小将它插入队列中的头结点后待扩展结点的适当位置,使它们按从小到大的顺序排列,最后更新队列尾指针。
5)如果队列头的结点还可以扩展,直接返回第二步。
否则将队列头指针指向下一结点,再返回第二步。
2、分析估价函数对搜索算法的影响。
3、分析启发式搜索算法的特点。
广度优先搜索和双向广度优先搜索都属于盲目搜索,这在状态空间不大的情况下是很合适的算法,可是当状态空间十分庞大时,它们的效率实在太低,往往都是在搜索了大量无关的状态结点后才碰到解答,甚至更本不能碰到解答。
搜索是一种试探性的查寻过程,为了减少搜索的盲目性引,增加试探的准确性,就要采用启发式搜索了。
所谓启发式搜索就是在搜索中要对每一个搜索的位置进行评估,从中选择最好、可能容易到达目标的位置,再从这个位置向前进行搜索,这样就可以在搜索中省略大量无关的结点,提高了效率。
[1__8_
起始棋局目标棋局*
T
T
S
■-…
1
6
5+J
启发式函数选取为:
f*(n)=g*(n)+h*(n)
其中:
g*(n)是搜索树中节点n的深度
h*(n)用来计算对应于节点n的数据中错放的棋子个数。
三、实验结果
!
(L-A£x)e=(A£x)|,e
!
e=|,e!
(O==e)pujj=[A1x](m)onz=[|/q1|/e]uoipunj
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%gE)OEL|N=gq=(心+x)店!
(A1|/+x)e=(A1x)|/e乜=店!
(O==e)pujj=[A1x](眈冷[口阖uoipunj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%gE)OEL|N=gg=(人1-X)店!
(A1|/-x)e=(A1x)|/e乜=店!
(O==e)pujj=[A1x](e)6ueqs=[|/q1|/e]uoipunj
MOpLII/^puPdULUO^
£
3
0可
I
=(tK
9
t
a
■
l
:
i
0
二UK
E
a
1
9
I
£
0
z
={EK
g
T
9
D
■
l
C
3
3
=UH
flAopu!
制pueujiuoQ
怕M琼叫站[7ppv8肌QH
[7sinjyo^
=【軒耳
={SH
a1(x,y-1)=0;
b1=zhao(a1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[a1,b1]=you(a)
[x,y]=find(a==0);
a1=a;
a1(x,y)=a(x,y+1);
a1(x,y+1)=0;
b1=zhao(a1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
functionz=panduan(a)
globalE;
globalI;
I=2;
[x,y]=size(E);
z=1;
fori=1:
y
b=E{i};
v=(b-a)42;
ifsum(sum(v))==0
z=0;
break;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
functiony=zhao(a)
wan=[123;804;765];
y=0;
b=a-wan;
fori=1:
3
forj=1:
3
ifb(i,j)~=0
y=y+1;
end
end
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%globalE
globalI
a=[283;104;765];
b=[123;804;765];
I=1;
E
(1)={a};
fori=2:
20
q=b-E{i};
ifsum(sum(q.A2))
E(i)={kaka(E{i-1})};
celldisp(E(i))
else
break;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[a1]=kaka(a)
globalI;
globalE;
c=[283;104;765];
E
(1)={c};
[x,y]=find(a==0);
z=9;
ifx==1
ify==1[x1,y1]=xia(a);
ify1 ifpanduan(x1) b=x1; z=y1; end end[x2,y2]=you(a); ify2 ifpanduan(x2) b=x2; z=y2; end end a1=b; end ify==2 [x1,y1]=xia(a); ify1 ifpanduan(x1) b=x1; z=y1; end end[x2,y2]=zuo(a); ify2 ifpanduan(x2) b=x2; z=y2; end end [x3,y3]=you(a); ify3 ifpanduan(x3)b=x3;z=y3; end end a1=b; end ify==3 [x1,y1]=xia(a); ify1 ifpanduan(x1)b=x1;z=y1; end end [x2,y2]=zuo(a); ify2 ifpanduan(x2) b=x2; z=y2; end end a1=b; end end ifx==2 ify==1 [x1,y1]=shang(a); ify1 ifpanduan(x1) b=x1; z=y1; end end [x2,y2]=xia(a); ify2 ifpanduan(x2) b=x2; z=y2; end end[x3,y3]=you(a); ify3 ifpanduan(x3) b=x3; z=y3; end end a1=b; end ify==2[x1,y1]=shang(a); ify1 ifpanduan(x1); b=x1; z=y1; end end[x2,y2]=xia(a); ify2 ifpanduan(x2); b=x2; z=y2; end end[x3,y3]=zuo(a); ify3 ifpanduan(x3); b=x3; z=y3; end end[x4,y4]=you(a); ify4 ifpanduan(x4) b=x4; z=y4; end end a1=b; end ify==3 [x1,y1]=shang(a); ify1 ifpanduan(x1) b=x1; z=y1; end end [x2,y2]=xia(a); ify2 ifpanduan(x2) b=x2; z=y2; endend[x3,y3]=zuo(a); ify3 ifpanduan(x3)b=x3;z=y3; end end a1=b; end end ifx==3 ify==1[x1,y1]=shang(a); ify1 ifpanduan(x1) b=x1; z=y1; end end [x4,y4]=you(a); ify4 ifpanduan(x4) b=x4; z=y4; end end a1=b; end ify==2 [x1,y1]=shang(a); ify1 ifpanduan(x1) b=x1; z=y1; end end[x3,y3]=zuo(a); ify3 ifpanduan(x3) b=x3; z=y3; endend[x4,y4]=you(a);ify4 ifpanduan(x4) b=x4; z=y4; end end a1=b; end ify==3[x1,y1]=shang(a); ify1 ifpanduan(x1) b=x1; z=y1; end end[x3,y3]=zuo(a); ify3 ifpanduan(x3) b=x3; z=y3; end end a1=b; endendE(I)={a1};五、实验结论 1、启发式搜索算法A*流程图和算法框图 算法框图: 算法方法: 利用MATLA软件,因为MATLA是基于矩阵运算的,八数码可以看做是一个3*3的矩阵,将八数码中的空位可看成矩阵的为0代替,已进行矩阵之间的运算,首先建立了4个函数,这4个函数应有在矩阵的上,下,左,右的变换,然后经过变换,输出两个值,一个为变换后的矩阵,一个为变化后的放错位置的数值,然后利用kaka函数,分别分9中情况来条用这4个函数,来输出下一层的矩阵并判断最小放错位 置的数值,然后将其矩阵放入全局变量E中的元胞数组中,记录下其实的矩阵,然后再每次生成下一层矩阵时,利用panduan函数来判断 生成的矩阵是否和E元胞数组中的矩阵相同,防止出现矩阵变化中的内部死循环。 然后利用celldisp函数输出E元胞数组中的矩阵,即为起始棋局到目标棋局的路径。 2、分析估价函数的值对搜索算法速度的影响。 考虑到八数码问题的特点,在本实验中使用A*算法求解。 A*搜索是一种效的搜索算法,它把到达节点的耗散g(n)和从该节点到目标节点的消耗h(n)结合起来对节点进行评价: f(n)=g(n)+h(n)。 当h(n)是可采纳时,使用Tree-Search的A*算法将是最优的。 3、根据A*算法分析启发式搜索的特点。 启发式搜索是一种试探性的查寻过程,为了减少搜索的盲目性引,增 加试探的准确性,就要采用启发式搜索了。 所谓启发式搜索就是在搜索中要对每一个搜索的位置进行评估,从中选择最好、可能容易到达 目标的位置,再从这个位置向前进行搜索,这样就可以在搜索中省略大量无关的结点,提高了效率。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数码 难题 Matlab