人工智能及其应用杨青锋谭旭1Word文档下载推荐.docx
- 文档编号:22656258
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:41
- 大小:430.07KB
人工智能及其应用杨青锋谭旭1Word文档下载推荐.docx
《人工智能及其应用杨青锋谭旭1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《人工智能及其应用杨青锋谭旭1Word文档下载推荐.docx(41页珍藏版)》请在冰豆网上搜索。
structnode*bef,*late,*son;
}treenode;
typedefstruct{
treenode*beg,*end;
}quenode;
inti=0,flag=0,count=0,num=0;
voidposition(treenode*s,quenode*open,quenode*close,treenode*s1);
voidextend(treenode*r1,treenode*s,treenode*s1,quenode*open,quenode*close);
voidprintstr(treenode*open);
intsearch(treenode*s1,treenode*s2);
voidxuhao(treenode*s);
voidinitquenode(quenode*&
p);
voidset(treenode*s);
voidcpynode(treenode*s1,treenode*s2);
voidadd(treenode*s,quenode*close);
voidadjust1(treenode*close);
inttest(treenode*s1,treenode*s2);
voidinput(treenode*s);
intcmpnode(treenode*s1,treenode*s2);
voidprint(treenode*s);
voidmain(){
treenode*s0,*s1,*s;
quenode*open,*close;
initquenode(open);
initquenode(close);
s0=(treenode*)malloc(sizeof(treenode));
set(s0);
s1=(treenode*)malloc(sizeof(treenode));
set(s1);
printf("
请输入八数码(8+1=9位数)的初始状态,以空格分隔:
\n"
);
input(s0);
请输入八数码(8+1=9位数)的目标状态,以空格分隔:
input(s1);
xuhao(s0);
add(s0,open);
while(open->
beg->
late!
=NULL&
&
flag==0){
s=(treenode*)malloc(sizeof(treenode));
cpynode(s,open->
late);
open->
beg=open->
late;
if(test(s,s1)==0){
add(s,close);
flag=1;
}
else{
position(s,open,close,s1);
};
}if(open->
=NULL){
printf("
输出结果:
adjust1(close->
beg);
printstr(close->
printstr(open->
%d步,%d个节点\n"
num,count);
}
else{printf("
查找错误!
\n"
p)
{p=(quenode*)malloc(sizeof(quenode));
p->
beg=(treenode*)malloc(sizeof(treenode));
late=NULL;
end=p->
beg;
voidset(treenode*s){
s->
i=i;
father=0;
exp=0;
degree=0;
son=NULL;
bef=NULL;
voidinput(treenode*s){
intj,k;
for(j=0;
j<
3;
j++)
for(k=0;
k<
k++)
scanf("
%d"
&
s->
a[j][k]);
intcmpnode(treenode*s1,treenode*s2){
k++){
if(s1->
a[j][k]!
=s2->
a[j][k])
return0;
return1;
voidcpynode(treenode*s1,treenode*s2){
s1->
a[j][k]=s2->
a[j][k];
s1->
bef=s2->
bef;
exp=s2->
exp;
degree=s2->
degree;
i=s2->
i;
father=s2->
father;
inttest(treenode*s1,treenode*s2){
intj,k,n=0;
n++;
};
exp=n;
returnn;
voidprint(treenode*s){
intj,k;
j++){
%2d"
s->
}
if(j==1)printf("
n=%2dd=%2df=%2d"
i,s->
degree,s->
father);
voidposition(treenode*s,quenode*open,quenode*close,treenode*s1){
intm,n,t,k;
treenode*r1;
for(m=0;
m<
m++){
for(n=0;
n<
n++){
k=s->
a[m][n];
if(k==0)
break;
if(k==0)break;
if(m+1<
=2&
flag==0){
r1=(treenode*)malloc(sizeof(treenode));
cpynode(r1,s);
t=r1->
a[m+1][n];
r1->
a[m+1][n]=r1->
a[m][n]=t;
extend(r1,s,s1,open,close);
if(m-1>
=0&
cpynode(r1,s);
a[m-1][n];
a[m-1][n]=r1->
if(n-1>
=0&
flag==0){
a[m][n-1];
a[m][n-1]=r1->
if(n+1<
=2&
a[m][n+1];
a[m][n+1]=r1->
}}
voidprintstr(treenode*s){
treenode*t;
t=s->
while(t!
print(t);
t=t->
num++;
intsearch(treenode*s1,treenode*close){
treenode*r,*t;
r=s1;
t=close->
if(r->
exp==t->
exp){
if(cmpnode(r,t)==1)
voidadd(treenode*s,quenode*close){
close->
end->
late=s;
end=s;
voidextend(treenode*r1,treenode*s,treenode*s1,quenode*open,quenode*close){
r1->
bef=s;
degree=s->
degree+1;
father=s->
if(test(r1,s1)!
=0){
if(search(r1,close->
beg)==1&
search(r1,open->
beg)==1){
add(r1,open);
xuhao(r1);
count++;
elsefree(r1);
else{
add(r1,open);
xuhao(r1);
count++;
}}
voidxuhao(treenode*s){
i++;
voidadjust1(treenode*close){
treenode*s,*t;
s=close;
late->
while(s->
=NULL)
s=s->
bef!
t=s->
t->
son=s;
d)运行结果:
i.截图:
ii.详细结果:
283
164
705
123
804
765
283
164n=1d=0f=0
705
104n=2d=1f=1
765
164n=3d=1f=1
075
164n=4d=1f=1
750
203
184n=5d=2f=2
014n=6d=2f=2
140n=7d=2f=2
064n=8d=2f=3
175
160n=9d=2f=4
754
023
184n=10d=3f=5
230
184n=11d=3f=5
714n=12d=3f=6
065
083
214n=13d=3f=6
145n=14d=3f=7
760
280
143n=15d=3f=7
264n=16d=3f=8
604n=17d=3f=8
163n=18d=3f=9
106n=19d=3f=9
123
084n=20d=4f=10
234
180n=21d=4f=11
714n=22d=4f=12
605
803
214n=23d=4f=13
145n=24d=4f=14
706
208
143n=25d=4f=15
264n=26d=4f=16
674n=27d=4f=17
105
684n=28d=4f=17
640n=29d=4f=17
163n=30d=4f=18
156n=31d=4f=19
704
186n=32d=4f=19
016n=33d=4f=19
784n=34d=5f=20
804n=35d=5f=20
35步,34个节点
Pressanykeytocontinue
(二)启发式搜索:
a)算法描述
1.将S放入open表,计算估价函数f(s)
2.判断open表是否为空,若为空则搜索失败,否则,将open表中的第一个元素加入close表并对其进行扩展(每次扩展后加入open表中的元素按照代价的大小从小到大排序,找到代价最小的节点进行扩展)
注:
代价的计算公式f(n)=d(n)+w(n).其中f(n)为总代价,d(n)为节点的度,w(n)用来计算节点中错放棋子的个数。
判断i是否为目标节点,是则成功,否则拓展i,计算后续节点f(j),利用f(j)对open表重新排序
b)程序流程图:
//启发式搜索代码:
typedefstructnode{
inti,cost,degree,exp,father;
structnode*bef,*late;
structnode*son;
intflag=0,count=1,num=0,i=0;
voidadd1(treenode*s,treenode*open);
voidjscost(treenode*s);
voidtiaozheng(treenode*open);
voidsortopen(treenode*open);
voidposition(treenode*s,treenode*open,treenode*close,treenode*s1);
voidadd(treenode*s,treenode*close);
voidextend(treenode*r1,treenode*s,treenode*s1,treenode*open,treenode*close);
treenode*open,*close,*opend,*closed;
open=(treenode*)malloc(sizeof(treenode));
close=(treenode*)malloc(sizeof(treenode));
open->
opend=open;
closed=close;
add(s0,opend);
open=open->
add(s,close);
sortopen(open);
if(open->
adjust1(close);
printstr(close);
\n%d步,%d个节点\n"
else{
voidset(treenode*s){
voidinput(treenode*s){
scanf("
intcmpnode(treenode*s1,treenode*s2){
return0;
cost=s2->
cost;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 及其 应用 杨青锋谭旭