人工智能A星算法C++.docx
- 文档编号:23304890
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:16
- 大小:17.39KB
人工智能A星算法C++.docx
《人工智能A星算法C++.docx》由会员分享,可在线阅读,更多相关《人工智能A星算法C++.docx(16页珍藏版)》请在冰豆网上搜索。
人工智能A星算法C++
盛年不重来,一日难再晨。
及时宜自勉,岁月不待人。
#include
#include
#include
#include
usingnamespacestd;
#defineM3
classMatrixNode{//定义MatrixNode类
public:
intm;//在位个数
intd;//深度
intp;//牌与其目标位置直接步数之和
intf;//f=d+p,估价函数
intplace[M][M];//当前矩阵
intplacetrue[M][M];//目标矩阵
intkong_x;//空位的横坐标
intkong_y;//空位的纵坐标
//-------------------------------------------------------------------------------
public:
MatrixNode();
MatrixNodestart(MatrixNodeM_Matrix);//初始矩阵
intTruePlace(MatrixNodeT_place);//查找在位数
intp_place(MatrixNodeP_place);//坐标差绝对值之和
intf_kongx(MatrixNodefind_kongx);//找出空格的横坐标
intf_kongy(MatrixNodefind_kongy);//找出空格的纵坐标
boolsolved(MatrixNodeM_Matrix);//判断是否有解,奇偶性相同则有解,否则无解
MatrixNodeup_move(MatrixNodeM_Matrix);//空格上移
MatrixNodedown_move(MatrixNodeM_Matrix);//空格下移
MatrixNodeleft_move(MatrixNodeM_Matrix);//空格左移
MatrixNoderight_move(MatrixNodeM_Matrix);//空格右移
MatrixNodeupdata_m(MatrixNodeM_Matrix);//移动后更新状态
MatrixNodeparents(deque
};
//=========================================================================================
MatrixNode:
:
MatrixNode(){//目标矩阵
placetrue[0][0]=1;
placetrue[0][1]=2;
placetrue[0][2]=3;
placetrue[1][0]=8;
placetrue[1][1]=-1;
placetrue[1][2]=4;
placetrue[2][0]=7;
placetrue[2][1]=6;
placetrue[2][2]=5;
}
//-----------------------------------------------------------------------------------------
MatrixNodeMatrixNode:
:
start(MatrixNodeM_Matrix){//初始矩阵
cout<<"请按如下格式输入初始矩阵(空位用0表示):
"< cout<<"123\n456\n708"< cout<<"八数码的初始状态如下: "< for(inta=0;a for(intb=0;b cin>>M_Matrix.place[a][b]; M_Matrix.d=0; M_Matrix=M_Matrix.updata_m(M_Matrix); M_Matrix.d=M_Matrix.d-1;//初始更新时深度多加1,应该减去 M_Matrix.f=M_Matrix.f-1; returnM_Matrix; } //----------------------------------------------------------------------------------------- boolsolved(MatrixNodeM_Matrix){//判断是否可解 intnum[8]; inttarget[8]; inta=0; intb=0; for(intm=0;m for(intn=0;n {if(M_Matrix.place[m][n]! =0)//不考虑空格 num[a++]=M_Matrix.place[m][n]; if(M_Matrix.placetrue[m][n]! =-1) target[b++]=M_Matrix.placetrue[m][n]; } } inti,j; intcount_num=0,count_target=0; for(i=0;i<(8-1);i++){ for(j=i+1;j<8;j++) { if(num[j] count_num++; if(target[j] count_target++; } } if((count_num%2==0&&count_target%2==0)||(count_num%2==1&&count_target%2==1)) returntrue; else returnfalse; } //------------------------------------------------------------------------------------------ intMatrixNode: : TruePlace(MatrixNodeT_place){//查找在位数 T_place.m=0; intNumT_place=0; for(inti=0;i for(intj=0;j if(T_place.place[i][j]==placetrue[i][j]){ T_place.m=T_place.m+1; NumT_place=NumT_place+1; } } } returnNumT_place; } //---------------------------------------------------------------------------------- intMatrixNode: : p_place(MatrixNodeP_place){//坐标差的绝对值之和 P_place.p=0; intnum=0; for(intPa=0;Pa for(intPb=0;Pb if(P_place.place[Pa][Pb]==1){ P_place.p=P_place.p+(abs(Pa-0)+abs(Pb-0)); } if(P_place.place[Pa][Pb]==2){ P_place.p=P_place.p+(abs(Pa-0)+abs(Pb-1)); } if(P_place.place[Pa][Pb]==3){ P_place.p=P_place.p+(abs(Pa-0)+abs(Pb-2)); } if(P_place.place[Pa][Pb]==4){ P_place.p=P_place.p+(abs(Pa-1)+abs(Pb-2)); } if(P_place.place[Pa][Pb]==5){ P_place.p=P_place.p+(abs(Pa-2)+abs(Pb-2)); } if(P_place.place[Pa][Pb]==6){ P_place.p=P_place.p+(abs(Pa-2)+abs(Pb-1)); } if(P_place.place[Pa][Pb]==7){ P_place.p=P_place.p+(abs(Pa-2)+abs(Pb-0)); } if(P_place.place[Pa][Pb]==8){ P_place.p=P_place.p+(abs(Pa-1)+abs(Pb-0)); } } } num=P_place.p; returnnum; } //---------------------------------------------------------------------------------- intMatrixNode: : f_kongx(MatrixNodefind_kongx){//返回空格横坐标 intnum; for(inti=0;i for(intj=0;j if(find_kongx.place[i][j]==0){ num=i; } } } returnnum; } //----------------------------------------------------------------------------------- intMatrixNode: : f_kongy(MatrixNodefind_kongy){//返回空格纵坐标 intnum; for(inti=0;i for(intj=0;j if(find_kongy.place[i][j]==0){ num=j; } } } returnnum; } //----------------------------------------------------------------------------------- MatrixNodeMatrixNode: : up_move(MatrixNodeM_Matrix){//空格上移 intnum;//num为交换的中间变量 MatrixNodeup_m=M_Matrix; num=up_m.place[up_m.kong_x][up_m.kong_y]; up_m.place[up_m.kong_x][up_m.kong_y]=up_m.place[up_m.kong_x-1][up_m.kong_y]; up_m.place[up_m.kong_x-1][up_m.kong_y]=num; up_m=up_m.updata_m(up_m); returnup_m; } //----------------------------------------------------------------------------------- MatrixNodeMatrixNode: : down_move(MatrixNodeM_Matrix){//空格下移 intnum; MatrixNodeup_m=M_Matrix; num=up_m.place[up_m.kong_x][up_m.kong_y]; up_m.place[up_m.kong_x][up_m.kong_y]=up_m.place[up_m.kong_x+1][up_m.kong_y]; up_m.place[up_m.kong_x+1][up_m.kong_y]=num; up_m=up_m.updata_m(up_m); returnup_m; } //----------------------------------------------------------------------------------- MatrixNodeMatrixNode: : left_move(MatrixNodeM_Matrix){//空格左移 intnum; MatrixNodeup_m=M_Matrix; num=up_m.place[up_m.kong_x][up_m.kong_y]; up_m.place[up_m.kong_x][up_m.kong_y]=up_m.place[up_m.kong_x][up_m.kong_y-1]; up_m.place[up_m.kong_x][up_m.kong_y-1]=num; up_m=up_m.updata_m(up_m); returnup_m; } //----------------------------------------------------------------------------------- MatrixNodeMatrixNode: : right_move(MatrixNodeM_Matrix){//空格右移 intnum; MatrixNodeup_m=M_Matrix; num=up_m.place[up_m.kong_x][up_m.kong_y]; up_m.place[up_m.kong_x][up_m.kong_y]=up_m.place[up_m.kong_x][up_m.kong_y+1]; up_m.place[up_m.kong_x][up_m.kong_y+1]=num; up_m=up_m.updata_m(up_m); returnup_m; } //---------------------------------------------------------------------------------- MatrixNodeMatrixNode: : updata_m(MatrixNodeM_Matrix){//移动后更新状态 MatrixNodeup_m=M_Matrix; up_m.m=up_m.TruePlace(up_m);//查找在位数 up_m.p=up_m.p_place(up_m);//距离和 up_m.d=M_Matrix.d+1;//深度加1 up_m.f=up_m.p+up_m.d;//估价值 up_m.kong_x=up_m.f_kongx(up_m);//找出空格的横坐标 up_m.kong_y=up_m.f_kongy(up_m);//找出空格的纵坐标 returnup_m; } //----------------------------------------------------------------------------------- boolfather(deque MatrixNodeM_Matrix1=ilist.front(); MatrixNodeup_m; intm; up_m=M_Matrix1.up_move(M_Matrix1); m=0; for(inta1=0;a1 for(intb1=0;b1 if(up_m.place[a1][b1]==M_Matrix.place[a1][b1]) m++; } if(m==9) returntrue; up_m=M_Matrix1.down_move(M_Matrix1); m=0; for(inta2=0;a2 for(intb2=0;b2 if(up_m.place[a2][b2]==M_Matrix.place[a2][b2]) m++; } if(m==9) returntrue; up_m=M_Matrix1.left_move(M_Matrix1); m=0; for(inta3=0;a3 for(intb3=0;b3 if(up_m.place[a3][b3]==M_Matrix.place[a3][b3]) m++; } if(m==9) returntrue; up_m=M_Matrix1.right_move(M_Matrix1); m=0; for(inta4=0;a4 for(intb4=0;b4 if(up_m.place[a4][b4]==M_Matrix.place[a4][b4]) m++; } if(m==9) returntrue; else returnfalse; } //----------------------------------------------------------------------------------- voidprintMatrix(constMatrixNodeMatrix){//输出矩阵 for(inti=0;i for(intj=0;j cout< } cout< } cout< } //----------------------------------------------------------------------------------- boolless_f(constMatrixNodeM_Matrix1,constMatrixNodeM_Matrix2){ returnM_Matrix1.f } //----------------------------------------------------------------------------------- boollookout(deque deque : iteratorVi=ilist.begin(); inti,j,m; while(Vi! =ilist.end()){ m=0; for(i=0;i for(j=0;j if((*Vi).place[i][j]==M_Matrix.place[i][j]) m++; } if(m==9) returntrue;//不是新扩展的 Vi++; } returnfalse;//是新扩展的 } //========================================================================== voidmain(){ intstep=0; MatrixNodemat; MatrixNodemat_trn; MatrixNodemat_trn1; MatrixNodemat_trn2; MatrixNodemat_trn3; MatrixNodemat_trn4; MatrixNodeparent; mat=mat.start(mat); deque openlist.push_front(mat); deque if(solved(mat)==false) {cout<<"无法找到路径! ! ! "< return; } mat_trn=openlist.front();//访问第一个元素 while(mat_trn.m! =8){ closedlist.push_front(mat_trn); openlist.pop_front();//删除第一个元素 //-------向上移 mat_trn1=mat_trn; if(mat_trn1.f_kongx(mat_trn1)>=1){ mat_trn1=mat_trn1.up_move(mat_trn1); if(lookout(openlist,mat_trn1)==false&&lookout(closedlist,mat_trn1)==false){//检查新节点是否已扩展 openlist.push_front(mat_trn1); } } //-------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 算法 C+