人工智能-A算法求解8数码问题_第1页
人工智能-A算法求解8数码问题_第2页
人工智能-A算法求解8数码问题_第3页
人工智能-A算法求解8数码问题_第4页
人工智能-A算法求解8数码问题_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验四A*算法求解8数码问题一、实验目的熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解8数码难题,理解求解流程和搜索顺序。二、实验原理A*算法是一种启发式图搜索算法,其特点在于对估价函数的定义上。对于一般的启发式图搜索,总是选择估价函数f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始节点到节点n的实际代价g(n)以及从节点n到达目标节点的估价代价h(n),且h(n)〈二h*(n),h*(n)为n节点到目标节点的最优路径的代价。八数码问题是在3X3的九宫格棋盘上,排放有8个刻有1〜8数码的将牌。棋盘中有一个空格,允许紧邻空格的某一将牌可以移到空格中,这样通过平移将牌可以将某一将牌布局变换为另一布局。针对给定的一种初始布局或结构(目标状态),问如何移动将牌,实现从初始状态到目标状态的转变。如图1所示表示了一个具体的八数码问题求解。图1八数码问题的求解三、实验内容1、参考A*算法核心代码,以8数码问题为例实现A*算法的求解程序(编程语言不限),要求设计两种不同的估价函数。2、在求解8数码问题的A*算法程序中,设置相同的初始状态和目标状态,针对不同的估价函数,求得问题的解,并比较它们对搜索算法性能的影响,包括扩展节点数、生成节点数等。3、对于8数码问题,设置与图1所示相同的初始状态和目标状态,用宽度优先搜索算法(即令估计代价h(n)=0的A*算法)求得问题的解,记录搜索过程中的扩展节点数、生成节点数。4、提交实验报告和源程序。四.实验截图五.源代码#include<iostream>#include"stdio.h"#include"stdlib.h"#include"time.h”#include"string.h”#include<queue>#include<stack>usingnamespacestd;constintN=3;//3*3棋?盘1constintMax_Step=32;//最?大洙?搜?索:深?度仓enumDirection{None,Up,Down,Left,Right};//方?向b,?分?别缝对?应畖上?下?左哩?右?structChess//棋?盘1{intchessNum[N][N];//棋?盘1数筋码?intValue;//评d估d值uDirectionBelockDirec;//所H屏d蔽?方?向bstructChess*Parent;//父?节U点?};voidPrintChess(structChess*TheChess);//打洙?印?棋?盘1structChess*MoveChessstructChess*TheChess,DirectionDirect,boolCreateNewChess);//移?动一棋?盘1数筋字?intAppraisal(structChess*TheChess,structChess*Target);//估d价?函一数筋structChess*Search(structChess*Begin,structChess*Target);//A*搜?索:函一数筋intmain(){〃本?程1序b的?一?组哩?测a试?数筋据Y为a/*初?始?棋?盘1*140**352**678**//*目?标括?棋?盘1*012**345**678**/ChessTarget;Chess*Begin,*ChessList;Begin=newChess;inti;cout<<"请?输?入?初?始?棋?盘1,?各:数筋字?用?空?格?隔?开a:毗"<<endl;for(i=0;i<N;i++){for(intj=0;j<N;j++){cin>>Begin->chessNum[i][j];}}cout<<”请?输?入?目?标括?棋?盘1,?各:数筋字?用?空?格?隔?开a:毗"<<endl;for(i=0;i<N;i++){for(intj=0;j<N;j++){cin〉〉Target.chessNum[i][j];}}〃获?取?初?始?棋?盘1Appraisal(Begin,&Target);Begin-〉Parent=NULL;Begin->BelockDirec=None;Target.Value=0;cout<<”初?始?棋?盘1:";PrintChess(Begin);cout<<”目?标括?棋?盘1:";PrintChess(&Target);ChessList=Search(Begin,&Target);//搜?索://打洙?印?if(ChessList){/*将?返关回?的?棋?盘1列表括?利?用?栈?将?其?倒?叙e*/Chess*p=ChessList;stack<Chess*>Stack;while(p->Parent!=NULL){Stack.push(p);p=p->Parent;}cout<<"搜?索:结d果?:"<<endl;intnum=1;while(!Stack.empty()){cout<<"第台?<<num<<"步?:";num++;PrintChess(Stack.top());Stack.pop();}cout<<"\n完?成e!"<<endl;}elsecout<<"搜?索:不?到?结d果?,?搜?索:深?度仓大洙?于?2\n"<<endl;return0;}//打洙?印?棋?盘1voidPrintChess(structChess*TheChess){cout<<”(评d估d值U为a”;cout<<TheChess->Value;cout<<”)"<<endl;for(inti=0;i<N;i++){cout<<””;for(intj=0;j<N;j++){cout<<TheChess->chessNum[i][j]<<””;}cout<<endl;}}〃移?动一棋?盘1structChess*MoveChess(structChess*TheChess,DirectionDirect,boolCreateNewChess){structChess*NewChess;〃获?取?空?闲D格?位?置?inti,j;for(i=0;i<N;i++){boolHasGetBlankCell=false;for(j=0;j<N;j++){if(TheChess->chessNum[i][j]==0){HasGetBlankCell=true;break;}}if(HasGetBlankCell)break;}intii=i,jj=j;boolAbleMove=true;〃判D断?是?否?可6以?移?动一switch(Direct){caseUp:i++;if(i>=N)AbleMove=false;break;caseDown:i一;if(i<0)AbleMove=false;break;caseLeft:j++;if(j>=N)AbleMove=false;break;caseRight:j--;if(j<0)AbleMove=false;break;};if(!AbleMove)//不?可6以?移?动一则b返^?回?原-节U点?{returnTheChess;}if(CreateNewChess){NewChess=newChess();for(intx=0;x<N;x++){for(inty=0;y<N;y++)NewChess-〉chessNum[x][y]=TheChess-〉chessNum[x][y];//创洹?建*新?棋?盘1,?此?时骸?值U与?原-棋?盘1一?致?}}elseNewChess=TheChess;NewChess-〉chessNum[ii][jj]=NewChess-〉chessNum[i][j];//移?动一数筋字?NewChess->chessNum[i][j]=0;//将?原-数筋字?位?置?设®?置?为a空?格?returnNewChess;}〃估d价?函一数筋intAppraisal(structChess*TheChess,structChess*Target){intValue=0;for(inti=0;i<N;i++){for(intj=0;j<N;j++){if(TheChess-〉chessNum[i][j]!=Target-〉chessNum[i][j])Value++;}}TheChess->Value=Value;returnValue;}//A*搜?索:函一数筋structChess*Search(structChess*Begin,structChess*Target){Chess*p1,*p2,*p;intStep=0;//深?度仓p=NULL;queue<structChess*>Queue;Queue.push(Begin);//初?始?棋?盘1入?队6〃搜?索:do(p1=(structChess*)Queue.front();Queue.pop();//出?队6for(inti=1;i<=4;i++)〃分?别缝从洙?四?个?方?向b推?导?出?新?子哩?节U点?{DirectionDirect=(Direction)i;if(Direct==p1->BelockDirec)//跳?过y屏d蔽?方?向bcontinue;p2=MoveChess(p1,Direct,true);//移?动一数筋码?if(p2!=p1)//数筋码?是?否?可6以?移?动一{Appraisal(p2,Target);//对?新?节U点?估d价?if(p2-〉Value<=p1-〉Value)//是?否?为a优?越?节U点?{p2-〉Parent=p1;switch(Direct)//设®?置?屏d蔽?方?向b,防^?止1往?回?推?{caseUp:p2->BelockDirec=Down;break;caseDown:p2->BelockDirec=Up;break;caseLeft:p2->BelockDirec=Right;break;caseRight:p2->BelockDirec=Left;break;}Queue.push(p2);//存?储洹?节U点?到?待部处^理^?队6列if(p2->Value==0)//为a0则b,搜?索:完?成6{p=p2;i=5;}}else{deletep2;//为a劣W?质。节U点?则b抛X弃Up2=NU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论