迷宫路径搜索人工智能.docx
《迷宫路径搜索人工智能.docx》由会员分享,可在线阅读,更多相关《迷宫路径搜索人工智能.docx(22页珍藏版)》请在冰豆网上搜索。
迷宫路径搜索人工智能
【实验题目】
图搜索与问题求解
【试验目的】
1、熟悉vc++6.0的使用环境
2、理解状态图的搜索问题
3、掌握广度搜索路径的算法
【实验内容】
利用状态图的搜索算法求解走迷宫问题(使用广度优先算法)
【实验步骤】
1、设计程序的界面如下
2、为界面中的复选框绑定变量值
3、代码
(1)seqqueue类
#include
constintmaxsize=25;
struct_open
{
intfather;
intself;
};
classseqqueue
{
public:
_openqueue[maxsize];
intfront;
intrear;
voidiniqueue(seqqueue&);
voidenqueue(seqqueue&,_open);
voiddlqueue(seqqueue&);
_opengetthead(seqqueue&);
boolempty(seqqueue&);
};
voidseqqueue:
:
iniqueue(seqqueue&q)//初始化队列
{
q.front=q.rear=maxsize-1;
}
voidseqqueue:
:
enqueue(seqqueue&q,_opens)//进队列
{
if((q.rear+1)%maxsize==q.front)
{
AfxMessageBox("溢出!
无法完成该动作。
");
}
else
{
q.rear=(q.rear+1)%maxsize;
q.queue[q.rear].father=s.father;
q.queue[q.rear].self=s.self;
}
}
voidseqqueue:
:
dlqueue(seqqueue&q)//出队列
{
if(q.rear==q.front)AfxMessageBox("空队列!
无法完成该动作。
");
else
{
q.front=(q.front+1)%maxsize;
}
}
_openseqqueue:
:
getthead(seqqueue&q)//获得队头元素
{
if(q.rear==q.front)
{
AfxMessageBox("空队列!
无法完成该动作");
returnq.queue[q.front];
}
else
returnq.queue[(q.front+1)%maxsize];
}
boolseqqueue:
:
empty(seqqueue&q)//判断是否为空
{
if(q.rear==q.front)
{
returntrue;
AfxMessageBox("空队列!
无法完成该动作");
}
else
returnfalse;
}
(2)seqstack类
struct_close
{
intfather;
intself;
};
classseqstack
{
public:
_closestack[100];
inttop;
voidinistack(seqstack&);
voidpush(seqstack&,_closex);
voidpop(seqstack&);
_closegettop(seqstack&);
boolempty(seqstack&);
};
voidseqstack:
:
inistack(seqstack&s)
{
s.top=0;
s.stack[s.top].father=0;
s.stack[s.top].self=0;
}
voidseqstack:
:
push(seqstack&s,_closex)
{
if(s.top==99-1)
AfxMessageBox("栈溢出!
sdfasdfasf",NULL,MB_OK);
else
{
s.top++;
stack[s.top]=x;
}
}
voidseqstack:
:
pop(seqstack&s)
{
if(s.top==0)AfxMessageBox("空栈!
无法完成此动作。
",NULL,MB_OK);
else
s.top--;
}
_closeseqstack:
:
gettop(seqstack&s)
{
if(s.top==0)
{
AfxMessageBox("空栈!
无可获取元素。
",NULL,MB_OK);
returns.stack[0];
}
else
{
returns.stack[s.top];
}
}
boolseqstack:
:
empty(seqstack&s)
{
if(s.top==0)
{
returntrue;
}
else
{
returnfalse;
}
}
(3)主要参数
(4)主要时间函数
voidCMY_MISSINGDlg:
:
OnOK()
{
//TODO:
Addextravalidationhere
//if(clicked=true)
//{
//初始化邻接矩阵
for(inti=0;i<9;i++)
for(intj=0;j<9;j++)
{
JV_ZHEN[i][j]=0;
}
//邻接矩阵的变换
CButton*pBtn;
for(intt=0;t<12;t++)
{
pBtn=(CButton*)GetDlgItem(CheckBox[t]);
if(t==0)
{
if(pBtn->GetCheck())
{
JV_ZHEN[0][1]=1;
JV_ZHEN[1][0]=1;
}
else
{
JV_ZHEN[0][1]=0;
JV_ZHEN[1][0]=0;
}
}
if(t==1)
{
if(pBtn->GetCheck())
{
JV_ZHEN[1][2]=1;
JV_ZHEN[2][1]=1;
}
else
{
JV_ZHEN[1][2]=0;
JV_ZHEN[2][1]=0;
}
}
if(t==2)
{
if(pBtn->GetCheck())
{
JV_ZHEN[0][3]=1;
JV_ZHEN[3][0]=1;
}
else
{
JV_ZHEN[0][3]=0;
JV_ZHEN[3][0]=0;
}
}
if(t==3)
{
if(pBtn->GetCheck())
{
JV_ZHEN[1][4]=1;
JV_ZHEN[4][1]=1;
}
else
{
JV_ZHEN[1][4]=0;
JV_ZHEN[4][1]=0;
}
}
if(t==4)
{
if(pBtn->GetCheck())
{
JV_ZHEN[2][5]=1;
JV_ZHEN[5][2]=1;
}
else
{
JV_ZHEN[2][5]=0;
JV_ZHEN[5][2]=0;
}
}
if(t==5)
{
if(pBtn->GetCheck())
{
JV_ZHEN[3][4]=1;
JV_ZHEN[4][3]=1;
}
else
{
JV_ZHEN[3][4]=0;
JV_ZHEN[4][3]=0;
}
}
if(t==6)
{
if(pBtn->GetCheck())
{
JV_ZHEN[4][5]=1;
JV_ZHEN[5][4]=1;
}
else
{
JV_ZHEN[4][5]=0;
JV_ZHEN[5][4]=0;
}
}
if(t==7)
{
if(pBtn->GetCheck())
{
JV_ZHEN[3][6]=1;
JV_ZHEN[6][3]=1;
}
else
{
JV_ZHEN[3][6]=0;
JV_ZHEN[6][3]=0;
}
}
if(t==8)
{
if(pBtn->GetCheck())
{
JV_ZHEN[4][7]=1;
JV_ZHEN[7][4]=1;
}
else
{
JV_ZHEN[4][7]=0;
JV_ZHEN[7][4]=0;
}
}
if(t==9)
{
if(pBtn->GetCheck())
{
JV_ZHEN[5][8]=1;
JV_ZHEN[8][5]=1;
}
else
{
JV_ZHEN[5][8]=0;
JV_ZHEN[8][5]=0;
}
}
if(t==10)
{
if(pBtn->GetCheck())
{
JV_ZHEN[6][7]=1;
JV_ZHEN[7][6]=1;
}
else
{
JV_ZHEN[6][7]=0;
JV_ZHEN[7][6]=0;
}
}
if(t==11)
{
if(pBtn->GetCheck())
{
JV_ZHEN[7][8]=1;
JV_ZHEN[8][7]=1;
}
else
{
JV_ZHEN[7][8]=0;
JV_ZHEN[8][7]=0;
}
}
}
//输出邻接矩阵
CStringstr="";
CStringf_str;
for(intp=0;p<9;p++)
{
for(intq=0;q<9;q++)
{
str.Format("%3d",JV_ZHEN[p][q]);
f_str=f_str+str;
}
f_str=f_str+"\n";
}
GetDlgItem(IDC_JVZHEN)->SetWindowText(f_str);
//MessageBox(f_str,NULL,MB_OK);
open.iniqueue(open);
m_stack.inistack(m_stack);
CStringss="";
//open表操作
if(f_open.self==0)MessageBox("你还没有设置初始位置!
",NULL,MB_OK);
else{
array_xiabiao=0;
array_open[array_xiabiao]=f_open;
open.enqueue(open,f_open);//初始节点入队
close_piont=0;
_opentemp;
do
{
_openr_open=open.getthead(open);//准备出队,获取队首元素
//将open表内出来的元素进入close中;
_closef_close;
f_close.father=r_open.father;
f_close.self=r_open.self;
close[close_piont]=f_close;//进入close表
close_piont++;
array_open[0]=r_open;
temp=r_open;
//如果出OPEN表的元素有扩展节点
for(int_l=0;_l<9;_l++)
{
if(JV_ZHEN[temp.self-1][_l]==1)
{
array_xiabiao++;
f_open.father=temp.self;
f_open.self=_l+1;
array_open[array_xiabiao]=f_open;
for(inti=0;i{
if(array_open[i].self==f_open.self)
{
array_cunzai=true;
break;
}
else
{
array_cunzai=false;
}
}
if(array_cunzai==false)
{
open.enqueue(open,f_open);
}
//open.enqueue(open,f_open);
}
}
open.dlqueue(open);
}while(open.empty(open)==false&&close[close_piont-1].self!
=9);
//如果open表为空了
if(open.empty(open)==true&&close[close_piont-1].self!
=9)
{
MessageBox("没有路径!
搜索不成功。
",NULL,MB_OK);
}
//搜索到路径
if(close[close_piont-1].self==9)
{
MessageBox("you路径!
搜索成功。
",NULL,MB_OK);
m_stack.push(m_stack,close[close_piont-1]);//close表的最后一个元素进栈
_closec_temp;
c_temp=close[close_piont-1];//记录路径节点
for(inti=0;i<10;i++)
{
if(close[i].self==c_temp.father&&close[i].self!
=0)
{
m_stack.push(m_stack,close[i]);
c_temp=close[i];
i=-1;
}
}
CStringstr="";//用于输出路径
do
{
CStrings;
c_temp=m_stack.gettop(m_stack);
m_stack.pop(m_stack);
s.Format("%2d",c_temp.self);
str=str+s;
}while(m_stack.empty(m_stack)==false);
MessageBox("路径是:
"+str,NULL,MB_OK);
}
}
clicked=false;
//}
//else
//{
//MessageBox("请先确定初始化初始点!
",NULL,MB_OK);
//}
CDialog:
:
OnOK();
}
BOOLCMY_MISSINGDlg:
:
Create(LPCTSTRlpszClassName,LPCTSTRlpszWindowName,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID,CCreateContext*pContext)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
returnCDialog:
:
Create(IDD,pParentWnd);
}
voidCMY_MISSINGDlg:
:
OnButton10()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
f_open.father=0;
f_open.self=m_firstroom;
if(f_open.self!
=0)
{
if(f_open.self<10)
{
MessageBox("起始加点已经成功初始化!
",NULL,MB_OK);
}
elseMessageBox("输入的数值有误!
",NULL,MB_OK);
}
elseMessageBox("请在初始位置编辑框输入对应的值!
");
clicked=true;
}
【运行调试】
【运行结果】
【心得体会】
为期两周的实验,首先由open表和closed表的结构体设计,在最后到队列的这个类的设计,然后逐步的求得出实验目标。
这其中遇到过一些问题,比如像节点对象的设置等,但通过老师的讲解突然有一种豁然开朗的感觉,这也导致了后来编写程序比较顺利。
通过这次试验,对于广度优先搜索算法已有了一个清晰的思路,同时对C++6.0环境也有了进一步的了解。