迷宫路径搜索人工智能.docx

上传人:b****7 文档编号:9534454 上传时间:2023-02-05 格式:DOCX 页数:22 大小:239.13KB
下载 相关 举报
迷宫路径搜索人工智能.docx_第1页
第1页 / 共22页
迷宫路径搜索人工智能.docx_第2页
第2页 / 共22页
迷宫路径搜索人工智能.docx_第3页
第3页 / 共22页
迷宫路径搜索人工智能.docx_第4页
第4页 / 共22页
迷宫路径搜索人工智能.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

迷宫路径搜索人工智能.docx

《迷宫路径搜索人工智能.docx》由会员分享,可在线阅读,更多相关《迷宫路径搜索人工智能.docx(22页珍藏版)》请在冰豆网上搜索。

迷宫路径搜索人工智能.docx

迷宫路径搜索人工智能

【实验题目】

图搜索与问题求解

【试验目的】

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环境也有了进一步的了解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1