人工智能实验三Word文档格式.docx
- 文档编号:20770268
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:12
- 大小:88.75KB
人工智能实验三Word文档格式.docx
《人工智能实验三Word文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能实验三Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
题目:
8位数码难题的问题求解
要求:
●随机输入1-8数字;
●采用所学过的搜索算法(算法不限,但需要有注释,采用的算法之一,或几种算法实现);
●要求输出算法执行的过程结果;
●按顺序输出1-8数字;
二)实验步骤:
我们将八数码难题分布在3×
3方格棋盘上,分别放置了标有数字1,2,3,4,5,6,7,8的八张牌,初始状态S0,目标状态如图所示,可以使用的操作有:
空格上移,空格左移,空格右移,空格下移。
我们将是用广度优先搜索算法来解决这一问题。
我们先拟定初始数列为035214876(0表示空位)
算法流程图:
初始状态
3
5
2
1
4
8
7
6
结果
数据结构:
本实验使用的数据结构是队列,应用队列先进先出的特点来实现对节点的保存和扩展。
首先建立一个队列,将初始结点入队,并设置队列头和尾指,然后取出队列(头指针所指)的结点进行扩展,从它扩展出子结点,并将这些结点按扩展的顺序加入队列,然后判断扩展出的新结点与队列中的结点是否重复,如果重复则,否则记录其父结点,并将它加入队列,更新队列尾指针,然后判断扩展出的结点是否是目标结点,如果是则显示路径,程序结束。
否则如果队列头的结点可以扩展,直接返回第二步。
否则将队列头指针指向下一结点,再返回第二步,知道扩展出的结点是目标结点结束,并显示路径。
代码如下:
#include<
stdio.h>
stdlib.h>
windows.h>
queue>
stack>
usingnamespacestd;
#defineHashTableSize362881
#defineNOT!
#defineUP0
#defineDOWN1
#defineLEFT2
#defineRIGHT3
#defineBitchar
typedefstructmaps
{
Bitdetail[9];
intmyindex;
//记录自己节点在hash表中的位置
Bitposition;
//记录空格(0)在序列中的位置
}Map,*PMap;
Maporg;
//初始状态
intEndIndex;
//目标,上移,下移,左移,右移
intconstderection[4]={-3,3,-1,1};
//可移动的四个方向
intconstFactorial[9]={40320,5040,720,120,24,6,2,1,1};
intHashTable[HashTableSize]={0};
//hash表,其中记录的是上一个父节点对应的位置
/****八数码的输入(在这里不做任何输入检查,均认为输入数据是正确的)***/
voidinput()
{
inti,j;
intsum,count,index;
printf("
输入九个数:
\n"
);
//必须输入一个0作为空值
for(i=0;
i<
9;
i++)
{
scanf("
%1d"
&
org.detail[i]);
org.detail[i]||(org.position=i);
}
i++)//计算逆序
{
if(0==org.detail[i])
continue;
for(j=0;
j<
i;
j++)
sum+=(0!
=org.detail[j]&
&
org.detail[j]<
org.detail[i]);
for(i=0,index=0;
i<
9;
i++)//计算初始状态的hash值
for(j=0,count=0;
i;
j++)
count+=org.detail[j]>
org.detail[i];
index+=Factorial[org.detail[i]]*count;
org.myindex=index+1;
EndIndex=sum%2?
161328:
322561;
//目标状态的hash值
return;
}
/***hash值的计算*Parent:
父状态的hash值*direct:
移动的方向**/
inlineintHashValue(Map&
Parent,int&
direct)
inti=Parent.position;
intnewindex=Parent.myindex;
Bit*p=Parent.detail;
switch(direct)
caseUP:
{
newindex-=3*40320;
newindex+=(p[i-2]>
p[i-3])?
(Factorial[p[i-3]]):
(-Factorial[p[i-2]]);
newindex+=(p[i-1]>
(-Factorial[p[i-1]]);
break;
}
caseDOWN:
newindex+=3*40320;
newindex-=(p[i+2]>
p[i+3])?
(Factorial[p[i+3]]):
(-Factorial[p[i+2]]);
newindex-=(p[i+1]>
(-Factorial[p[i+1]]);
caseLEFT:
returnnewindex-40320;
caseRIGHT:
returnnewindex+40320;
returnnewindex;
/****广度优先搜索***/
voidBfs()
queue<
Map>
Queue;
Queue.push(org);
HashTable[org.myindex]=-1;
while(NOTQueue.empty())
Mapnode=Queue.front();
Queue.pop();
for(intk=0;
k<
4;
k++)
Maptmp=node;
tmp.position=node.position+derection[k];
if(tmp.position<
0||tmp.position>
8||(k>
1&
tmp.position/3!
=node.position/3))
continue;
tmp.myindex=HashValue(node,k);
if(0!
=HashTable[tmp.myindex])
tmp.detail[node.position]=tmp.detail[tmp.position];
//移动空格
tmp.detail[tmp.position]=0;
HashTable[tmp.myindex]=node.myindex;
//状态记录到hashtable中
if(node.myindex==EndIndex)return;
Queue.push(tmp);
}
/****通过hash表中记录的进行查找路径***/
voidFindPath()
intnowindex;
intcount=0;
intnixu[9],result[9];
inti,j,k;
stack<
int>
Stack;
Stack.push(EndIndex);
nowindex=EndIndex;
while(-1!
=HashTable[nowindex])
Stack.push(HashTable[nowindex]);
nowindex=HashTable[nowindex];
共需:
%d步\n"
Stack.size()-1);
getchar();
while(NOTStack.empty())
nowindex=Stack.top()-1;
Stack.pop();
for(i=0;
i++)//计算出逆序
nixu[i]=nowindex/Factorial[i];
nowindex%=Factorial[i];
memset(result,-1,9*sizeof(int));
for(i=0;
i++)//根据逆序计算排列
for(j=0,k=nixu[i];
{
if(result[j]==-1)
k--;
if(k<
0)
break;
}
result[j]=i;
}
for(i=0;
i++)
printf("
%3d"
result[i]);
if(2==i%3)printf("
if(0!
=Stack.size())
\n↓第%d步\n"
++count);
getchar();
printf("
\nFinish!
return;
intmain()
input();
//输入要排序的序列0--8
longtime=GetTickCount();
Bfs();
计算用时:
%dMS\n"
GetTickCount()-time);
FindPath();
return0;
//返回结果
实验结果
小结
本次实验让我学会了系统的去探索问题,并用科学的方法来解决它,同时也学会了用编程语言实现搜索算法。
评定成绩:
批阅教师:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 实验