人工智能导论实验报告姓名:蔡鹏学号:1130310726实验一一、实验内容有如下序列,试把所有黑色格移到所有白色格的右边,黄色格代表空格,黑色格和白色格可以和距离不超过三的空格交换。
二、实验代码#include <iostream>#include <stdlib.h>#include <stdio.h>#define N 10#define inf 9999int g=999;void tree_gener(struct node *fn,struct node *root);struct node{char seq[7];int f,g,n;struct node *sn[N];};struct stack{int num;struct node *n[50];};void Enstack(struct node *sn,struct stack *S){S->n[S->num]=sn;S->num++;}struct node *Destack(struct stack *S){S->num--;return S->n[S->num];}void find_min_f(struct node *root){int i;struct node *n,*min;struct stack S;S.num=0;min=root;Enstack(root,&S);while(S.num!=0){n=Destack(&S);if(n->f < min->f){min=n;}for(i=0;i<n->n;i++){Enstack(n->sn[i],&S);}}tree_gener(min,root);if(g>min->g){printf("seq:%c %c %c %c %c %c %c | g:%d \n",min->seq[0],min->seq[1],min->seq[2],min->seq[3],min->seq[4],min->seq[5],min->seq[6],min->g);}g=min->g;}void swap(struct node *sn,struct node *fn,int n,int m){int i;for(i=0;i<7;i++){sn->seq[i]=fn->seq[i];}sn->seq[n]=fn->seq[m];sn->seq[m]=fn->seq[n];}int calcu_h(char seq[]){int m=0,n=0,i;for(i=0;i<7;i++){if(seq[i]=='B'){m++;}if(seq[i]=='W'){n=n+m;}}return n;}void tree_gener(struct node *fn,struct node *root){if (calcu_h(fn->seq)!=0){int i;int j=0,k;for (i=0;i<7;i++){if(fn->seq[i]=='#'){for(k=1;k<=3;k++){if(i+k<7){fn->sn[j]=(struct node *)malloc(sizeof(struct node));swap(fn->sn[j],fn,i,i+k);fn->sn[j]->g = fn->g+k;fn->sn[j]->f = fn->sn[j]->g + 3*calcu_h(fn->sn[j]->seq);fn->sn[j]->n=0;j++;}if(i-k>=0){fn->sn[j]=(struct node *)malloc(sizeof(struct node));swap(fn->sn[j],fn,i,i-k);fn->sn[j]->g = fn->g+k;fn->sn[j]->f = fn->sn[j]->g + 3*calcu_h(fn->sn[j]->seq);fn->sn[j]->n=0;j++;}}}}fn->n=j;fn->f=inf;find_min_f(root);}}int main() {struct node *root;printf("seq:每一次选择的f最小的序列\ng:当前节点已花费的代价\nf:预计花费和已花费的代价的和。
\n");printf("倒序输出:\n");root=(struct node *)malloc(sizeof(struct node));root->seq[0]='B';root->seq[1]='B';root->seq[2]='B';root->seq[3]='W';root->seq[4]='W';root->seq[5]='W';root->seq[6]='#';root->g=0;root->f=0;tree_gener(root,root);}三、实验结果四、代码解释4.算法介绍这里用到了A*算法(1)main函数首先生成一个根节点,调用tree_gener(根节点,根节点)(2)tree_gener,为传入的节点生成所有可能的子节点,并计算每个节点的g、f,调用find_min_f(根节点)(3)find_min_f深搜遍历树节点,找到f最小的的叶节点,调用tree_gener(f最小叶节点,根节点)(4)直到find_min_f找不到最小叶节点为止路径即为解。
5.计算f用到的策略f=g+h,h等于所有白格子左边黑格子个数和的和。
6.A*算法(引用百度百科)A* (A-Star)算法是一种静态路网中求解最短路最有效的直接搜索方法。
注意是最有效的直接搜索算法。
之后涌现了很多预处理算法(ALT,CH,HL等等),在线查询效率是A*算法的数千甚至上万倍。
公式表示为:f(n)=g(n)+h(n),其中f(n) 是从初始点经由节点n到目标点的估价函数,g(n) 是在状态空间中从初始节点到n节点的实际代价,h(n) 是从n到目标节点最佳路径的估计代价。
保证找到最短路径(最优解的)条件,关键在于估价函数f(n)的选取:估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。
但能得到最优解。
并且如果h(n)=d(n),即距离估计h(n)等于最短距离,那么搜索将严格沿着最短路径进行,此时的搜索效率是最高的。
如果估价值>实际值,搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
实验二一、实验内容编程实现mgu一般合一算法二、mgu一般和一算法的定义•置换:可以简单的理解为是在一个谓词公式中用置换项去置换变量。
•定义:置换是形如{t1/x1, t2/x2, …, t n/x n}的有限集合。
其中,x1, x2, …, x n是互不相同的变量,t1, t2, …, t n是不同于x i的项(常量、变量、函数);t i/x i表示用t i置换x i,并且要求t i与x i不能相同,而且x i不能循环地出现在另一个t i中。
例如:{a/x,c/y,f(b)/z}是一个置换。
{g(y)/x,f(x)/y}不是一个置换。
置换的合成•设θ={t1/x1, t2/x2, …, t n/x n},λ={u1/y1, u2/y2, …, u n/y n},是两个置换。
则θ与λ的合成也是一个置换,记作θ·λ。
它是从集合{t1·λ/x1, t2·λ/x2, …, t n·λ/x n, u1/y1, u2/y2, …, u n/y n }中删去以下两种元素:–当t iλ=x i时,删去t iλ/x i (i = 1, 2, …, n);–当y i∈{x1,x2, …, x n}时,删去u j/y j (j = 1, 2, …, m) 最后剩下的元素所构成的集合。
合成即是对t i先做λ置换然后再做θ置换•例:设:θ={f(y)/x, z/y},λ={a/x, b/y, y/z},求θ与λ的合成。
解:先求出集合{f(b/y)/x, (y/z)/y, a/x, b/y, y/z}={f(b)/x, y/y, a/x, b/y, y/z}其中,f(b)/x中的f(b)是置换λ作用于f(y)的结果;y/y中的y是置换λ作用于z的结果。
在该集合中,y/y满足定义中的条件i,需要删除;a/x,b/y满足定义中的条件ii,也需要删除。
最后得θ·λ={f(b)/x,y/z}合一•合一可以简单地理解为“寻找相对变量的置换,使两个谓词公式一致”。
•定义:设有公式集F={F1,F2,…,F n},若存在一个置换θ,可使F1θ=F2θ=…=F nθ,则称θ是F的一个合一。
同时称F1,F2,... ,F n是可合一的。
•例:设有公式集F={P(x, y, f(y)), P(a,g(x),z)},则λ={a/x, g(a)/y, f(g(a))/z}是它的一个合一。
注意:一般说来,一个公式集的合一不是唯一的。
最一般合一•设σ是谓词公式集F的一个合一,如果对F的任意一个合一 都存在一个置换λ,使得θ=σ.λ,则称σ是一个最一般合一。
•最一般合一求取方法–令W={F1,F2}–令k=0,W0=W, σ0=ε–如果W k已合一,停止,σk=mgu,否则找D k–若D k中存在元素v k和t k,其中,v k不出现在t k中,转下一步,否则,不可合一。
–令σk+1= σk.{t k/v k},W k+1=W k{t k/v k}=W σk+1–K=k+1转第3步。
例:W={P(a,x,f(g(y))),P(z,f(a),f(u))},其中,F1= P(a,x,f(g(y))),F2=P(z,f(a),f(u))求F1和F2的mgu解:由mgu算法(1)W= {P(a,x,f(g(y))),P(z,f(a),f(u))}(2)W0=W,σ0=ε(3) W0 未合一,从左到右找差异集,有D0={a,z}(4)取V0=z,t0=a(5)’’令σ3=σ2. {t2/v2}={a/z,f(a)/x,g(y)/u}W3= W2 σ3={P(a,f(a),f(g(y))),P(a,f(a),f(g(y)))}(3)’’’ W3 已合一σ3= {a/z,f(a)/x,g(y)/u}便是F1和F2的mgu。