人工智能A星算法C++文档格式.docx
- 文档编号:22286598
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:15
- 大小:17.15KB
人工智能A星算法C++文档格式.docx
《人工智能A星算法C++文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能A星算法C++文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
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>
ilist,MatrixNodeM_Matrix);
//找到该节点的父亲
};
//=========================================================================================
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表示):
endl;
123\n456\n708"
八数码的初始状态如下:
<
endl;
for(inta=0;
a<
M;
a++)
for(intb=0;
b<
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<
m++){
for(intn=0;
n<
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]<
num[i])
count_num++;
if(target[j]<
target[i])
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;
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;
//----------------------------------------------------------------------------------
p_place(MatrixNodeP_place){//坐标差的绝对值之和
P_place.p=0;
intnum=0;
for(intPa=0;
Pa<
Pa++){
for(intPb=0;
Pb<
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;
f_kongx(MatrixNodefind_kongx){//返回空格横坐标
intnum;
j++){
if(find_kongx.place[i][j]==0){
num=i;
//-----------------------------------------------------------------------------------
f_kongy(MatrixNodefind_kongy){//返回空格纵坐标
intnum;
if(find_kongy.place[i][j]==0){
num=j;
up_move(MatrixNodeM_Matrix){//空格上移
//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;
down_move(MatrixNodeM_Matrix){//空格下移
MatrixNodeup_m=M_Matrix;
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;
left_move(MatrixNodeM_Matrix){//空格左移
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;
right_move(MatrixNodeM_Matrix){//空格右移
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);
updata_m(MatrixNodeM_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);
//找出空格的纵坐标
boolfather(deque<
ilist,MatrixNodeM_Matrix){//寻找父节点
MatrixNodeM_Matrix1=ilist.front();
MatrixNodeup_m;
intm;
up_m=M_Matrix1.up_move(M_Matrix1);
m=0;
for(inta1=0;
a1<
a1++)
for(intb1=0;
b1<
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);
for(inta2=0;
a2<
a2++)
for(intb2=0;
b2<
b2++){
if(up_m.place[a2][b2]==M_Matrix.place[a2][b2])
up_m=M_Matrix1.left_move(M_Matrix1);
for(inta3=0;
a3<
a3++)
for(intb3=0;
b3<
b3++){
if(up_m.place[a3][b3]==M_Matrix.place[a3][b3])
if(m==9)
returntrue;
up_m=M_Matrix1.right_move(M_Matrix1);
for(inta4=0;
a4<
a4++)
for(intb4=0;
b4<
b4++){
if(up_m.place[a4][b4]==M_Matrix.place[a4][b4])
else
voidprintMatrix(constMatrixNodeMatrix){//输出矩阵
for(inti=0;
cout<
Matrix.place[i][j]<
"
;
cout<
boolless_f(constMatrixNodeM_Matrix1,constMatrixNodeM_Matrix2){
returnM_Matrix1.f<
M_Matrix2.f;
//-----------------------------------------------------------------------------------
boollookout(deque<
ilist,MatrixNodeM_Matrix){//检查新生成的节点是否已扩展
deque<
iteratorVi=ilist.begin();
inti,j,m;
while(Vi!
=ilist.end()){
m=0;
for(i=0;
i++)
for(j=0;
if((*Vi).place[i][j]==M_Matrix.place[i][j])
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;
openlist.push_front(mat);
closedlist;
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);
//--------向下移
mat_trn2=mat_trn;
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 算法 C+