您的位置:首页 > 其它

A*算法在八数码问题上的应用

2008-12-21 12:26 447 查看
刚完成人工智能的作业,就发上来

A*算法的关键在于启发函数和设计,这个启发函数也上在网上找到的F(X)=g(x)+h(x) 表示节点当前的层次 表示每个数码与目标之间的曼哈顿距离之和,每次从F(X)最小的节点开始扩展,放入表中后排序

#include<iostream>

#include<fstream>

#include<algorithm>

#include<ctime>

using namespace std;

int ten[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};

struct zhan

{

int x;

int y;

}arry[9];

struct abc

{

int t;//press number

int dis;

int orgl;

int no;//leveal

}arr[20000];

int ptr=0;

bool cmp(abc a,abc b)

{

if(a.dis+a.no<b.dis+b.no)

return true;

return false;

}

bool abcd(abc a,abc b)

{

if(a.no<b.no)

return true;

return false;

}

bool app(int a)

{

for(int i=0;i<ptr;i++)

if(arr[i].t==a)

return true;

return false;

}

int des=123804765;

int desarr[9]={1,2,3,8,0,4,7,6,5};

int temparr[9];//={8,7,5,6,4,3,2,1,0};

int temp;

int sta;

int main()

{

clock_t t1,t2;

//ofstream cout("abcde.txt");

int ne=0;

for(int i=0;i<9;i++)

{

arry[desarr[i]].x=i/3;

arry[desarr[i]].y=i%3;

}

cout<<"please input original series,spaced by a blank"<<endl;

for(int i=0;i<9;i++)

{

cin>>temparr[i];

}

t1=clock();

for(int i=0;i<9;i++)

if(temparr[i]!=0)

for(int j=i+1;j<9;j++)

if(temparr[j]!=0)

if(temparr[j]<temparr[i])

ne++;

//int tttttttttttt;

if((ne&1)==0)

{

cout<<"NO SOLUTION"<<endl;

return 0;

}

//int

for(int j=0;j<9;j++)

{

temp+=temparr[j]*ten[8-j];

}

int t=0;

for(int i=0;i<9;i++)

{

t+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);

//t++;

}

arr[ptr].t=temp;

arr[ptr].no=0;

arr[ptr].orgl=0;

arr[ptr++].dis=t;

int tag=t;

cout<<endl;

while(1)

{

int tt,t=arr[0].t;

arr[0].dis=100000;

tt=t;

int NO;

//arr[0].dis=10;

NO=arr[0].no;

int pos;

for(int i=0;i<9;++i)

{

temparr[i]=t/ten[8-i];

if(temparr[i]==0)

pos=i;

t%=ten[8-i];

}

/*for(int i=0;i<9;i++)

{

if(i!=0&&i%3==0)

cout<<endl;

cout<<temparr[i]<<" ";

}*/

//cout<<endl<<endl;

if(tt==des)

{

cout<<ptr<<endl;

cout<<arr[0].no<<" "<<"steps to target"<<endl;

int trail=arr[0].no+1;

int po[50],tttt=arr[0].no;

sort(arr,arr+ptr,abcd);

while(arr[ptr-1].t!=des)

ptr--;

ptr--;

int ok=ptr;

po[tttt--]=ok;

while(arr[ok].orgl!=0)

{

if(arr[ok].t==arr[ptr].orgl)

{

po[tttt--]=ok;

ptr=ok;

}

ok--;

}

po[tttt--]=ok;

for(int i=0;i<trail;i++)

{

for(int j=0;j<9;j++)

{

if(j%3==0)

cout<<endl;

cout<<arr[po[i]].t/ten[8-j]<<" ";

arr[po[i]].t%=ten[8-j];

}

cout<<endl;

}

t2=clock();

cout<<"Time Cosume:"<<t2-t1<<"ms"<<endl;

break;

}

if(pos>2)

{

int tp=0;

temparr[pos-3]=temparr[pos-3]^temparr[pos];

temparr[pos]=temparr[pos-3]^temparr[pos];

temparr[pos-3]=temparr[pos-3]^temparr[pos];

temp=0;

//if(ptr>10&&arr[ptr-1].dis==1000)

//ptr--;

for(int i=0;i<9;i++)

{

//if(temparr[i]!=desarr[i])

tp+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);

temp+=temparr[i]*ten[8-i];

}

if(!app(temp))

{

arr[ptr].dis=tp;

arr[ptr].no=NO+1;

arr[ptr].orgl=arr[0].t;

arr[ptr++].t=temp;

sta=1;

}

temparr[pos-3]=temparr[pos-3]^temparr[pos];

temparr[pos]=temparr[pos-3]^temparr[pos];

temparr[pos-3]=temparr[pos-3]^temparr[pos];

}

if(pos<6)

{

int tp=0;

temparr[pos+3]=temparr[pos+3]^temparr[pos];

temparr[pos]=temparr[pos+3]^temparr[pos];

temparr[pos+3]=temparr[pos+3]^temparr[pos];

temp=0;

//if(ptr>10&&arr[ptr-1].dis==1000)

//ptr--;

for(int i=0;i<9;i++)

{

//if(temparr[i]!=desarr[i])

tp+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);

//tp++;

temp+=temparr[i]*ten[8-i];

}

if(!app(temp))

{

arr[ptr].dis=tp;

arr[ptr].no=NO+1;

arr[ptr].orgl=arr[0].t;

arr[ptr++].t=temp;

sta=1;

}

temparr[pos+3]=temparr[pos+3]^temparr[pos];

temparr[pos]=temparr[pos+3]^temparr[pos];

temparr[pos+3]=temparr[pos+3]^temparr[pos];

}

if(pos%3>0)

{

int tp=0;

temparr[pos-1]=temparr[pos-1]^temparr[pos];

temparr[pos]=temparr[pos-1]^temparr[pos];

temparr[pos-1]=temparr[pos-1]^temparr[pos];

temp=0;

//if(ptr>10&&arr[ptr-1].dis==1000)

//ptr--;

for(int i=0;i<9;i++)

{

//if(temparr[i]!=desarr[i])

tp+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);

//tp++;

temp+=temparr[i]*ten[8-i];

}

if(!app(temp))

{

arr[ptr].dis=tp;

arr[ptr].no=NO+1;

arr[ptr].orgl=arr[0].t;

arr[ptr++].t=temp;

sta=1;

}

temparr[pos-1]=temparr[pos-1]^temparr[pos];

temparr[pos]=temparr[pos-1]^temparr[pos];

temparr[pos-1]=temparr[pos-1]^temparr[pos];

}

if(pos%3<2)

{

int tp=0;

temparr[pos+1]=temparr[pos+1]^temparr[pos];

temparr[pos]=temparr[pos+1]^temparr[pos];

temparr[pos+1]=temparr[pos+1]^temparr[pos];

temp=0;

//if(ptr>10&&arr[ptr-1].dis==1000)

//ptr--;

for(int i=0;i<9;i++)

{

//if(temparr[i]!=desarr[i])

tp+=abs(i/3-arry[temparr[i]].x)+abs(i%3-arry[temparr[i]].y);

//tp++;

temp+=temparr[i]*ten[8-i];

}

if(!app(temp))

{

arr[ptr].dis=tp;

arr[ptr].no=NO+1;

arr[ptr].orgl=arr[0].t;

arr[ptr++].t=temp;

sta=1;

}

temparr[pos+1]=temparr[pos+1]^temparr[pos];

temparr[pos]=temparr[pos+1]^temparr[pos];

temparr[pos+1]=temparr[pos+1]^temparr[pos];

}

if(sta==1)

{

sort(arr,arr+ptr,cmp);

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: