人工智能实验二图搜索
人工智能实验搜索策略

实验一搜索策略一、实验内容1.熟悉和掌握启发式搜索的定义、估价函数和算法过程,比较不同算法的性能。
2.以八数码问题或路径规划等问题为例设计启发式搜索算法,改变启发函数,观察结果的变化,分析原因。
二、实验目的熟悉和掌握各种启发式搜索策略的思想,掌握A*算法的定义、估价函数和算法过程,理解求解流程和搜索顺序。
三、实验内容1、分别以各种搜索算法为例演示搜索过程,比较不同算法的性能;2、分析各种算法中的OPEN表CLOSE表的生成过程;3、分析估价函数对搜索算法的影响;4、以八数码问题或路径规划等问题为例设计启发式搜索算法,改变启发函数,观察结果的变化,分析原因。
四、实验记录搜索策略实验报告表一启发式搜索A*算法框图路径规划问题中的启发函数在之前的作业中我们就已经写过A*算法的程序代码。
在八数码路径规划问题中,利用A*算法去找出一条最短路,最要关注的就是估价函数,在本实验中,估价函数为路径代价g 和启发函数h之和。
进而我们需要关注启发函数。
在原启发函数的定义用该点到目标点的曼哈顿距离估计从该点到目标节点的代价。
源节点目标节点7 2 4 0 1 25 06 3 4 58 3 1 6 7 8源程序如下:def setH(self, endNode):for x in range(0, 3):for y in range(0, 3):for m in range(0, 3):for n in range(0, 3):if self.array2d[x][y] == endNode.array2d[m][n]:self.h += abs(x-m)+abs(y-n)上图中的多层循环意在取值该节点到目标节点的曼哈顿距离。
而在曼哈顿距离下的花销如下:一共需要26步完成。
并且程序执行速度也比较快。
欧式距离作为启发式def setH(self, endNode):for x in range(0, 3):for y in range(0, 3):for m in range(0, 3):for n in range(0, 3):if self.array2d[x][y] == endNode.array2d[m][n]:#self.h += abs(x-m)+abs(y-n)self.h += (abs(x-m)*abs(x-m) + abs(y-n)*abs(y-n)) ** 0.5用欧式距离代替曼哈顿距离发现同样是26步,可以知道26步是该情况解的最优解。
人工智能实验报告,包括八数码问题八皇后问题和tsp问题

八数码问题(一)问题描述在一个3*3的方棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。
这些数码可以在棋盘上移动,其移动规则是:与空格相邻的数码方格可以移入空格。
现在的问题是:对于指定的初始棋局和目标棋局,给出数码的移动序列。
该问题称八数码难题或者重排九宫问题。
(二)问题分析八数码问题是个典型的状态图搜索问题。
搜索方式有两种基本的方式,即树式搜索和线式搜索。
搜索策略大体有盲目搜索和启发式搜索两大类。
盲目搜索就是无“向导”的搜索,启发式搜索就是有“向导”的搜索。
1、启发式搜索由于时间和空间资源的限制,穷举法只能解决一些状态空间很小的简单问题,而对于那些大状态空间的问题,穷举法就不能胜任,往往会导致“组合爆炸”。
所以引入启发式搜索策略。
启发式搜索就是利用启发性信息进行制导的搜索。
它有利于快速找到问题的解。
由八数码问题的部分状态图可以看出,从初始节点开始,在通向目标节点的路径上,各节点的数码格局同目标节点相比较,其数码不同的位置个数在逐渐减少,最后为零。
所以,这个数码不同的位置个数便是标志一个节点到目标节点距离远近的一个启发性信息,利用这个信息就可以指导搜索。
即可以利用启发信息来扩展节点的选择,减少搜索范围,提高搜索速度。
启发函数设定。
对于八数码问题,可以利用棋局差距作为一个度量。
搜索过程中,差距会逐渐减少,最终为零,为零即搜索完成,得到目标棋局。
(三)数据结构与算法设计该搜索为一个搜索树。
为了简化问题,搜索树节点设计如下:struct Chess//棋盘{int cell[N][N];//数码数组int Value;//评估值Direction BelockDirec;//所屏蔽方向struct Chess * Parent;//父节点};int cell[N][N]; 数码数组:记录棋局数码摆放状态。
int Value; 评估值:记录与目标棋局差距的度量值。
Direction BelockDirec; 所屏蔽方向:一个屏蔽方向,防止回推。
人工智能九宫格重移——搜索的实验报告

人工智能九宫格重移——搜索1.问题描述:八数码问题也称为九宫问题。
在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。
棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。
要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
所谓问题的一个状态就是棋子在棋盘上的一种摆法。
棋子移动后,状态就会发生改变。
解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。
2.九宫重移有无答案检查(逆序数)我们把每个9宫格横向展开,如第一个123456789,我们把左边数大于右边数的组数称为这个九宫格的逆序数,显然123456789的逆序数为0;考虑横向平移,那么逆序数的增量为2或0或-2;纵向平移,逆序数的增量为4或0或-4;但147258369的逆序数为奇数。
所以147258369是无解的情况。
由此也可以类推当将9宫格展开后,如果数据序列的逆序数为奇数,则此数据序列对应的九宫格是无解的。
3.BFS算法队列: Queue open = new Queue();存放待扩展的节点List: List<Bfstr> closed = new List<Bfstr>();存放已被扩展过的节点ArrayList map = new ArrayList();//存放答案HashTale: Hashtable table = new Hashtable();构造哈希表以方便查找3.1.BFS算法介绍广度优先搜索算法BFS基本思想:从图中某顶点v出发,逐层对节点进行拓展,并考察是否为目标节点,在第n层节点没有全部扩展并考察前,不对第n+1层节点进行扩展。
对九宫重排问题,即构造广度优先搜索树,从初始状态,利用广度优先搜索算法逐步找到目标状态的节点。
3.2.状态空间表示状态空间用一维数组表示,每个节点存放在Bfstr结构体中的字符now中,从第一行开始从左往右给九宫格标号0……8,字符串now元素下标代表格子位置,而now数组中对应数组的值代表九宫格中存放的数码,用数值9代表空格。
人工智能《启发式搜索》实验大作业

《人工智能》实验大作业实验题目:启发式搜索一、实验目的:熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A算法求解九宫问题,理解求解流程和搜索顺序。
二、实验方法:1.先熟悉启发式搜索算法;2.用C、C++或JA V A 语言编程实现实验内容。
三、实验背景知识:1.估价函数在对问题的状态空间进行搜索时,为提高搜索效率需要和被解问题的解有关的大量控制性知识作为搜索的辅助性策略。
这些控制信息反映在估价函数中。
估价函数的任务就是估计待搜索节点的重要程度,给这些节点排定次序。
估价函数可以是任意一种函数,如有的定义它是节点x处于最佳路径的概率上,或是x节点和目标节点之间的距离等等。
在此,我们把估价函数f(n)定义为从初始节点经过n节点到达目标节点的最小代价路径的代价估计值,它的一般形式是:f(n) = g(n) + h(n)其中g(n)是从初始节点到节点n的实际代价,g(n)可以根据生成的搜索树实际计算出来;h(n)是从n到目标节点的最佳路径的代价估计,h(n)主要体现了搜索的启发信息。
2. 启发式搜索过程的特性(1)可采纳性当一个搜索算法在最短路径存在的时候能保证能找到它,我们就称该算法是可采纳的。
所有A*算法都是可采纳的。
(2)单调性一个启发函数h是单调的,如果a)对所有的状态n i和n j,其中n j是n i的子孙,h(n i )- h(n j )≤cost(n i,n j ),其中cost(n i,n j )是从n i到n j 实际代价。
b)目标状态的启发函数值为0,即h(Goal)=0.具有单调性的启发式搜索算法在对状态进行扩展时能保证所有被扩展的状态的f值是单调递增(不减)。
(3)信息性比较两个启发策略h1和h2,如果对搜索空间中的任何一个状态n都有h1(n) ≤h2(n),就说h2比h1具有更多的信息性。
一般而言,若搜索策略h2比h1有更多的信息性,则h2比h1考察的状态要少。
但必须注意的是更多信息性需要更多的计算时间,从而有可能抵消减少搜索空间所带来的益处。
产生式实验报告

产生式实验报告一、引言产生式(Production)是一种用于表示语法规则的形式化工具,它在人工智能领域具有广泛的应用。
本实验报告旨在介绍产生式的基本概念、产生式的应用领域以及在实验中如何使用产生式来实现推理和搜索。
二、产生式的基本概念1. 产生式的定义产生式是一种形式化的表示语法规则的工具。
它由一个左部(Left-hand side)和一个右部(Right-hand side)组成,左部表示一个非终结符号,右部则表示一串终结符号和非终结符号的序列。
2. 产生式的形式产生式的形式通常为:左部 -> 右部,其中右部由终结符和非终结符组成,可以为空。
3. 产生式的应用产生式在人工智能领域有广泛的应用,例如在自然语言处理中,可以使用产生式来表示句子的语法结构;在专家系统中,可以使用产生式来表示知识库中的规则;在编译原理中,可以使用产生式来描述语言的语法规则等。
三、产生式的应用领域1. 自然语言处理在自然语言处理中,产生式被广泛应用于句子的语法分析、语义分析以及机器翻译等任务。
通过定义一系列产生式规则,可以构建一个语法分析器,用于自动识别和分析句子的结构和意义。
2. 专家系统专家系统是一种基于知识库的智能系统,其中的知识被表示为一组产生式规则。
通过使用产生式来表示知识和推理规则,专家系统可以根据用户提供的问题和条件进行推理和决策,给出相应的解答和建议。
3. 编译原理编译原理是计算机科学中的一个重要领域,其中的产生式被广泛应用于编译器的前端处理,用于描述语言的语法规则和语义规则。
通过使用产生式和对应的语法分析算法,可以将源代码转化为中间代码或目标代码。
四、产生式在实验中的应用在实验中,我们可以使用产生式来实现推理和搜索。
以人工智能领域的经典问题“图搜索”为例,我们可以使用产生式规则来描述搜索的过程。
1. 初始状态假设我们需要解决一个迷宫问题,迷宫可以表示为一个二维矩阵,其中的元素可以是墙壁、路径或终点。
实验二 A星算法实验

人工智能基础(第2版)
实验二A*算法实验
1.提交期限和方法
2.实验目的
熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N 数码难题,理解求解流程和搜索顺序。
3.实验任务
1)实现类似于如图所示N数码难题演示程序。
2)用你所熟悉的程序语言实现,可以B/S实现,也可以C/S实现。
4、实验内容
1)分别以8数码和15数码为例实际求解A*算法。
2)画出A*算法求解框图。
3)分析估价函数对搜索算法的影响。
4 )分析A*算法的特点。
5、提交要求
1、本次实验为个人任务,需独立完成,以纸质和电子档的形式把实验报告提交给学习委员,再由学习委员在规定期限内提交给任课老师。
2、要求把所做的程序的演示图附加到实验报告上,代码不需要添加到实验报告上。
3、撰写实验报告
实验报告具体内容如下:
实验题目、实验目的、实验原理、实验条件、实验内容、实验步骤、程序代码、个人实验小结。
4、未按时提交实验报告者,每迟交一天扣1分,扣完为止。
经辅导员同意并签字的事病假时间不计入迟交范围。
凡被发现实验报告有抄袭者,本次成绩以零分记。
人工智能实验指导书+作业展示

《人工智能技术导论》实验指导书西北工业大学计算机学院目录一实验纲要 (1)二上机要求 (2)三实验内容 (3)实验一图搜索与问题求解 (3)实验1.1 启发式搜索 (3)实验1.2 A*算法搜索 (9)实验1.3 其他应用问题 (12)实验二产生式系统推理 (14)实验三TSP问题的遗传算法实现 (20)四实验报告模板 (27)人工智能实验一实验报告 (27)人工智能实验二实验报告 (28)人工智能实验三实验报告 (29)附件1 TSP问题的遗传算法程序模板 (30)附件2 学生作业作品展示 (35)一实验纲要一实验教学的目的、任务与要求将人工智能基础理论应用于实际问题的解决当中,加深学生对所学知识的理解,提高学生的实际动手能力。
二实验项目内容1图搜索策略实验用启发式搜索方法/A*算法求解重排九宫问题/八数码问题。
2产生式系统的推理以动物识别系统为例,实现基于产生式规则的推理系统。
3 TSP问题的遗传算法实现以N个结点的TSP问题为例,用遗传算法加以求解。
三参考教材人工智能技术导论-第3版,廉师友编著,西安电子科技大学出版社,2007。
四使用主要仪器设备说明在Windows2000/XP上,选用Java/C/C++/Matlab等语言进行实现。
五实验考核实验为12学时,分4次课完成。
每个实验题目在课堂上分别按百分制给出。
其中包括课堂纪律、程序运行结果、课堂回答问题及实验报告成绩等。
实验课总成绩为3个实验题目的平均成绩。
实验课要求学生提前预习,上课时需向辅导老师提交预习报告,报告格式和内容不作过多要求,只需简要说明自己本次实验的大体思想。
预习报告形式不限,电子版或手写版均可。
1 考核方法由各班辅导老师当堂检查源程序和运行结果,并提问相关问题,课堂上给出成绩并记录。
每个题目完成后把源代码和实验报告提交,由辅导老师检查实验报告并给出报告成绩。
2 评分标准每个实验题目根据以下标准进行考核:1)考勤分20分。
人工智能实验二-图搜索技术

实验二图搜索技术一、实验目的1.加深学生对图搜索技术的理解。
2.掌握图搜索基本编程方法。
3.能初步运用图搜索技术解决一些实际应用问题。
二、预习要求1.复习广度优先搜索算法。
2.复习深度优先搜索算法。
3.设计初步的搜索算法。
三、实验内容1.(必做)利用深度优先和广度优先搜索技术解决传道士和野人问题。
修道士和野人问题如下:有三个传教士和三个野人一起来到河边准备渡河,河边有一条空船,且传教士和野人都会划船,但每次最多可供两人乘渡。
河的任何一岸以及船上一旦出现野人人数超过传教士人数,野人就会把传教士吃掉。
为完全地渡河,传教士应如何规划渡河方案?2.(选做)若传教士和野人的数目均为五人,渡船至多可乘三人,请定义一个启发函数,并给出相应的搜索树。
四、实验要求:1.程序运行时,应能在屏幕上显示结果。
2. 界面直观、友好。
3.交实验报告。
五、实验结果:实验截图:实验代码:// yeren.cpp : Defines the entry point for the console application.//#include"stdafx.h"#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef struct{int xds; //xiudaoshiint yr; //yerenint cw; //chuanwei}DataType;DataType fa[50000];typedef struct node{DataType data;struct node *son;struct node *bro;struct node *par;struct node *next;}Ltable;void Ltableinit(Ltable**head) //初始化邻接表的操作{*head=(Ltable *)malloc(sizeof (Ltable)); //动态分配空间(*head)->son=NULL;(*head)->bro=NULL;(*head)->par=NULL;(*head)->next=NULL;}void insertson(Ltable *head, DataType x) //在邻接表中插入儿子结点的操作{Ltable *q,*s;q=(Ltable *)malloc(sizeof (Ltable)); q->data=x;head->son=q;s=head;while (s->next!=NULL)s=s->next; q->par=head;q->son=NULL;q->bro=NULL;s->next=q;q->next=NULL;}void insertbro(Ltable *head,DataType x) //在邻接表中插入兄弟结点的操作,所有的兄弟结点都指向他们右边的结点;{Ltable *q,*s;q=(Ltable *)malloc(sizeof (Ltable));s=head->son;q->data=x;while (s->bro!=NULL)s=s->bro;s->bro=q;s->next=q;q->next=NULL;q->bro=NULL;q->par=head;q->son=NULL;}int findfa(DataType x,int n) //生成在船上修道士仍安全的几种情况;{int i=0,a,b,t=0;if(x.cw){a=0;b=n-a;while (a+b>=1){t++;while (b>=0){fa[i].xds=a;fa[i].yr=b;i++;a++;b--;}a=0;b=n-a-t;}}else{a=1;b=0;t=0;while (a+b<=n){t++;while (a>=0){fa[i].xds=a*(-1);fa[i].yr=b*(-1);i++;a--;b++;}a=fa[0].xds*(-1)+t;b=0;}return i;}int jiancha(DataType x,int n) //安全性检测,检查当前情况下,修道士是否安全{if((x.xds>=x.yr||x.xds==0)&&((n-x.xds)>=(n-x.yr)||x.xds==n)&&x.xds>=0&&x.xds<=n&&x.y r>=0&&x.yr<=n)return 1;elsereturn 0;}void print(Ltable *q,Ltable *p) //输出安全渡河的过程{DataType a[100];int i=1;a[0].cw=0;a[0].xds=0;a[0].yr=0;while (q!=p){a[i++]=q->data;q=q->par;}while ((--i)>-1){ printf("( %d %d %d )",a[i].xds, a[i].yr,a[i].cw);if(!(a[i].xds==0&&a[i].yr==0&&a[i].cw==0)) {if (a[i].cw==1)printf(" --> ( %d %d ) --> ( %d %d 0 )\n",a[i].xds-a[i-1].xds,a[i].yr-a[i-1] .yr,a[i-1].xds,a[i-1].yr);elseprintf(" <-- ( %d %d ) <-- ( %d %d1 )\n",(a[i].xds-a[i-1].xds)*(-1),(-1)*(a[i].yr-a[i-1].yr),a[i-1].xds,a[i-1].yr);}else printf("\n");}printf("渡河成功!\n");void work(Ltable *p,int n,int c)//渡河过程{Ltable *q,*t;DataType tem;int i,flag,flag1,g=0,j,count=0;q=p->son;while (q!=NULL){flag=0;j=findfa(q->data,c);for (i=0;i<j;i++){tem.xds=q->data.xds-fa[i].xds; tem.yr=q->data.yr-fa[i].yr;tem.cw=1-q->data.cw;t=q;if (jiancha (tem,n)){flag1=1;while (t!=p){if(tem.xds==t->data.xds&&tem.yr==t->data.yr&&tem.cw==t->data.cw){flag1=0;break; }t=t->par;}if(flag1==1){if (flag==0){insertson(q, tem);flag=1;}elseinsertbro(q,tem);if(tem.xds==0&&tem.yr==0&&tem.cw==0){ print(q,p);count++;}}}}q=q->next;}if (count==0)printf("无法渡河成功。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能技术基础图搜索问题求解
实验报告
一、实验目的
加强对图搜索技术的理解,初步掌握图搜索基本编程方法,并能运用图搜索技术解决一些应用问题。
二、实验要求
(1)可使用第3章中的状态图搜索通用程序,这时只需编写规则集程序;也可以用PROLOG 语言或其他语言另行编写。
(2)程序运行时,应能在屏幕上显示程序运行结果。
三、实验内容或题目
实验题目:迷宫求解
实验内容:利用状态图搜索方法求解下列迷宫图
入口
出口12345
12345
四、实验步骤与源程序
实验步骤:
(1) 理解题目;
(2) 对状态进行编码;
(3)转换规则集;
(4)编写程序;
(5)调试运行;
源程序:
/*状态图搜索通用程序*/
DOMAINS
state=symbol %例如:state=symbol
DATABASE-mydatabase
open(state,integer) %用动态数据库实现OPEN表
closed(integer,state,integer) %和CLOSED表
res(state)
open1(state,integer)
min(state,integer)
mark(state)
fail_
PREDICATES
solve
road(state,state)
search(state,state)
result
searching
step4(integer,state)
step56(integer,state)
equal(state,state)
repeat
resulting(integer)
rule(state,state)
GOAL
solve.
CLAUSES
solve:- search(s,e),result.
/*例如
solve:-
search(st(0,1,2,3,4,5,6,7,8),st(0,2,8,3,4,5,6,7,1)),result. */
search(Begin,End):- %搜索
retractall(_,mydatabase),
assert(closed(0,Begin,0)),
assert(open(Begin,0)), %步1 将初始节点放入OPEN表
assert(mark(End)),
repeat,
searching,!.
result:- %输出解
not(fail_),
retract(closed(0,_,0)),
closed(M,_,_),
resulting(M),!.
result:- %输出解
not(fail_),
retract(closed(0,_,0)),
closed(M,_,_),
resulting(M),!.
result:- beep,write("sorry don't find a road!").
searching:-
open(State,Pointer), %步2 若OPEN表为空,则失败,退出
retract(open(State,Pointer)), %步3 取出OPEN表中第一个节点,给其
closed(No,_,_),No2=No+1, %编号
asserta(closed(No2,State,Pointer)), %放入CLOSED表
!,step4(No2,State).
searching:-assert(fail_).
%步4 若当前节点为目标节点,则成功
step4(_,State):- mark(End),equal(State,End). %转步2
step4(No,State):- step56(No,State),!,fail.
step56(No,StateX):- %步5 若当前节点不可扩展,转步2
rule(StateX,StateY), %步6 扩展当前节点X得Y
not(open(StateY,_)), %考查Y是否已在OPEN表中
not(closed(_,StateY,_)), %考查Y是否已在CLOSED表中
assertz(open(StateY,No)), %可改变搜索策略
fail.
step56(_,_):-!.
equal(X,X).
repeat.
repeat:-repeat.
resulting(N):- closed(N,X,M),asserta(res(X)),resulting(M).
resulting(_):- res(X),write(X),write("\t"),fail.
resulting(_):- !.
rule(X,Y):-road(X,Y).
road(s,s11).road(s11,s12).road(s12,s11).road(s12,s13).road(s13,s12).road(s13,s14).r oad(s14,s13).road(s11,s21).road(s21,s11).road(s12,s22).
road(s15,s25).road(s25,s15).road(s23,s24).road(s24,s23).road(s24,s25).road(s25,s24) .road(s21,s31).road(s31,s21).road(s23,s33).road(s33,s23).
road(s24,s34).road(s34,s24).road(s25,s35).road(s35,s25).
road(s31,s32).road(s32,s31).road(s32,s33).road(s33,s32).road(s34,s35).
road(s35,s34).road(s31,s41).road(s41,s31).road(s34,s44).road(s44,s34).road(s42,s43) .
road(s43,s42).road(s43,s44).road(s44,s43).road(s44,s45).road(s45,s44).road(s42,s52) .
road(s52,s42).road(s51,s52).road(s52,s51).road(s52,s53).road(s53,s52).road(s53,s54) .road(s54,s53).road(s54,s55).road(s55,s54).road(s55,e) .
%例如:rule(X,Y):-road(X,Y).
五、实验结果
六、实验总结
该实验的例题较为特殊,要实现深度优先和广度优先搜索,在源代码中修改一致,只需将assertz(open(StateY,No))改为asserta(open(StateY,No))。
实验刚开始出现运行错误,road未定义,在PREDICATES中给road加以定义
road(state,state)。
之后运行还有一个报错,经过反复检查,发现最后结尾语句没加句号。
因为急于验收,修改完代码,直接加载,导致犯下一个结尾少加句号的低级错误,耗时耗力,影响进度。
随着今后编程的增多,深深体会到编程时要静心严谨,否则一个小小的疏忽,将增加额外的工作量。
通过第二次上机实验,自己对prolog运行平台的使用更为熟练。
今后课下会多多关注人工智能方面的科研资讯,学习课外的知识,增加自己知识储备,提高自己的专业技能。