当前位置:文档之家› 631306050123黄嘉城+谓词演算+启发式搜索

631306050123黄嘉城+谓词演算+启发式搜索

重庆交通大学计算机与信息学院验证性实验报告班级:计软专业 13 级 1 班学号: 631306050123姓名:黄嘉城实验项目名称:谓词演算实验项目性质:验证性实验实验所属课程:人工智能实验室(中心):软件中心实验室(语音楼8楼)指导教师:朱振国实验完成时间: 2016 年 6 月 10 日一、实验目的理解和掌握谓词演算二、实验内容及要求在一个空房间中,机器人将A桌子上的盒子搬移到B桌子上,用选定的编程语言编写程序,演示谓词演算过程。

三、实验设备及软件visual studio四、设计方案㈠题目机器人搬盒子㈡设计的主要思路设在房内c处有一个机器人,在a及b处各有一张桌子,a桌上有一个盒子。

为了让机器人从c处出发把盒子从a处拿到b处的桌上,然后再回到c处,需要制订相应的行动规划。

现在用一阶谓词逻辑来描述机器人的行动过程。

㈢主要功能实现机器人搬盒子移动五、主要代码#include "stdio.h"//定义初始状态char state[10][20]={"AT(robot,c)","EMPTY(robot)","ON(box,a)","TABLE(a)","TABLE(b)"};//定义目标状态char end_state[5][20]={"AT(robot,c)","EMPTY(robot)", "ON(box,b)","TABLE(a)","TABLE(b)"};int state_num=5;int number;//记录某字符串在总数据库中的位置bool IsInState(char *S1) /*判断字符串(状态)是否在总数据库中*/ {int i,j;bool flag;//printf("S1:%s\n state[0]: %s state[1]: %s\n",S1,state[0],state[1]);//printf("%d\n",state_num);for(i=0;i<state_num;i++){j=0;flag=true;while(S1[j]!='\0'){if(S1[j]!=state[i][j]){flag=false;break;}j++;}if(flag && state[i][j]=='\0'){//printf("%d\n",i);number=i;return true;}}return false;}void Delete(int k)/*删除总数据库中的第k个状态(字符串)*/ {if(k>=state_num){printf("The appointed state is not in the state set!");return;}int i,j;for(i=k;i<state_num;i++){for(j=0;*(state[i+1]+j)!='\0';j++)state[i][j]=state[i+1][j];state[i][j]='\0';}state_num--;}void Insert(char *S)/*将状态(字符串S)插入到总数据库中*/ {if(state_num>=10){printf("The state space is overwrited!");return;}int j;for(j=0;S[j]!='\0';j++)state[state_num][j]=S[j];state[state_num][j]='\0';state_num++;}bool GoTo(char x,char y){char S1[20]="AT(robot,x)",S2[20]="AT(robot,x)";//printf("%s,%s\n",S1,S2);S1[9]=x; S2[9]=y;//printf("%s,%s\n",S1,S2);if(IsInState(S1)){Delete(number);Insert(S2);return true;}else{printf("Cannot go from %c to %c\n",x,y);return false;}}bool PickUp(char x){charS[5][20]={"ON(box,x)","TABLE(x)","AT(robot,x)","EMPTY(robot)","HOLDS(robot,box)"};S[0][7]=x;S[1][6]=x;S[2][9]=x;if(IsInState(S[1]) && IsInState(S[2])){if(IsInState(S[0]))Delete(number);else{printf("Cannot pickup %c",x);return false;}if(IsInState(S[3]))Delete(number);else{printf("Cannot pickup %c",x);return false;}Insert(S[4]);return true;}{printf("Cannot pickup %c",x);return false;}}bool SetDown(char x){charS[5][20]={"AT(robot,x)","TABLE(x)","HOLDS(robot,box)","EMPTY(robot)","ON(box,x)"};S[0][9]=x;S[1][6]=x;S[4][7]=x;if(IsInState(S[0]) && IsInState(S[1])){if(IsInState(S[2]))Delete(number);else{printf("Cannot set down %c",x);return false;}Insert(S[3]); Insert(S[4]);return true;}return false;}void ShowState(char s[10][20],int num){int i;printf(" ");for(i=0;i<num;i++)printf("%s ",s[i]);printf("\n");}void main(){printf("the process as follows:\n\nThe start state:\n");ShowState(state,state_num);printf("(1) Go from c To a:\n");if(!GoTo('c','a'))return;ShowState(state,state_num);printf("(2) PickUp a:\n");if(!PickUp('a'))return;ShowState(state,state_num);printf("(3) Go from a To b:\n");if(!GoTo('a','b'))return;ShowState(state,state_num);printf("(4) SetDown b:\n");if(!SetDown('b'))return;ShowState(state,state_num);printf("(5) Go from b To c:\n");if(!GoTo('b','c'))return;ShowState(state,state_num);}六、测试结果及说明实验很成功七、实验体会让我了解到人工智能的先进化,开阔我的眼界通过,本次实验,让我更加了解启发式搜索算法的原理,见识了其广泛的应用;同时加强了本人阅读程序能力和编程能力,以及如何将理论问题解决实际应用的能力。

在编程实现过程中出现过不少问题,通过一次次调试得以解决,并一定程度上提高了我的编程能力,而且让我对人工智能这一课程有了更直接的认知重庆交通大学计算机与信息学院验证性实验报告班级:计软专业 13 级 1 班学号: 631306050123姓名:黄嘉城实验项目名称:启发式搜索实验项目性质:验证性实验实验所属课程:人工智能实验室(中心):软件中心实验室(语音楼8楼)指导教师:朱振国实验完成时间: 2016 年 6 月 10 日评阅意见:实验成绩:签名:年月日一实验目的理解和掌握A*算法二实验内容及要求在8数码问题中,利用策略函数判断搜索,并使用A*算法减少搜索目标,用选定的编程语言编写程序,利用不同的搜索策略进行状态空间搜索(如宽度优先搜索、深度优先搜索、有界深度优先搜索等)。

三实验设备及软件visual studio四、设计方案㈠题目启发式搜索㈡设计的主要思路(一)问题描述在一个3*3的方棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。

这些数码可以在棋盘上移动,其移动规则是:与空格相邻的数码方格可以移入空格。

现在的问题是:对于指定的初始棋局和目标棋局,给出数码的移动序列。

该问题称八数码难题或者重排九宫问题。

(二)问题分析八数码问题是个典型的状态图搜索问题。

搜索方式有两种基本的方式,即树式搜索和线式搜索。

搜索策略大体有盲目搜索和启发式搜索两大类。

盲目搜索就是无“向导”的搜索,启发式搜索就是有“向导”的搜索。

启发式搜索:由于时间和空间资源的限制,穷举法只能解决一些状态空间很小的简单问题,而对于那些大状态空间的问题,穷举法就不能胜任,往往会导致“组合爆炸”。

相关主题