人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次_第1页
人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次_第2页
人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次_第3页
人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次_第4页
人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 人工智能课内实验报告8次学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏34 学 号: 06153034 目 录课内实验1:猴子摘香蕉问题的VC编程实现1课内实验2:编程实现简单动物识别系统的知识表示5课内实验3:盲目搜索求解8数码问题18课内实验4:回溯算法求解四皇后问题33课内实验5:编程实现一字棋游戏37课内实验6:字句集消解实验46课内实验7:简单动物识别系统的产生式推理66课内实验8:编程实现D-S证据推理算法78人工智能课内实验报告实验1:猴子摘香蕉问题的VC编程实现学 院: 自动化学院 班 级: 智能1501 姓 名: 学 号: 日 期: 2021-3-8 10:

2、15-12:00 实验1:猴子摘香蕉问题的VC编程实现实验目的1熟悉谓词逻辑表示法;2掌握人工智能谓词逻辑中的经典例子猴子摘香蕉问题的编程实现。二、编程环境VC语言问题描述房子里有一只猴子即机器人,位于a处。在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。要求通过VC语言编程实现猴子摘香蕉问题的求解过程。图1 猴子摘香蕉问题 源代码#includeunsigned int i;void Monkey_Go_Box(unsigned char x, unsigned ch

3、ar y) printf(Step %d:monkey从%c走到%cn, +i, x, y);/x表示猴子的位置,y为箱子的位置void Monkey_Move_Box(char x, char y) printf(Step %d:monkey把箱子从%c运到%cn, +i, x, y);/x表示箱子的位置,y为香蕉的位置void Monkey_On_Box() printf(Step %d:monkey爬上箱子n, +i);void Monkey_Get_Banana() printf(Step %d:monkey摘到香蕉n, +i);void main() unsigned char Mo

4、nkey, Box, Banana; printf(*智能1501班*n); printf(*06153034*n); printf(*刘少鹏*n); printf(请用a b c来表示猴子箱子香蕉的位置n); printf(Monkeytboxtbananan); scanf(%c, &Monkey); getchar(); printf(t);scanf(%c, &Box); getchar(); printf(tt); scanf(%c, &Banana); getchar(); printf(n操作步骤如下n); if (Monkey != Box) Monkey_Go_Box(Mon

5、key, Box); if (Box != Banana) Monkey_Move_Box(Box, Banana); Monkey_On_Box(); Monkey_Get_Banana(); printf(n); getchar();实验结果相关截图六、心得体会 通过本次实验,我初步了学会了使用VC的新建工程,并且进行简单的程序编写。此外我还学会如何使用一些谓词来解决生活中的一些简单问题,并且用VC编程给出具体的操作步骤,感觉对VC编程有了新的认识。在实验中我也遇到过许多问题,比方在我写完代码进行编译时总是会出现一个错误“fatal error C1010: 在查找预编译头时遇到意外的文件

6、结尾,是否忘记了向源中添加“#include 关于这个错误我我问了几个同学得不出答案后,我决定通过上网查找,最终找到了解决方法,需要在该工程的每一个cpp结尾的文件属性中设置不使用预编译头即可。在这个过程中也锻炼了自己解决问题的能力。人工智能课内实验报告实验2:编程实现简单动物识别系统的知识表示学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏33 学 号: 06153034 日 期: 2021-3-13 10:15-12:00 实验2:编程实现简单动物识别系统的知识表示一、实验目的1、理解和掌握产生式知识表示方法;2、能够通过VC编程语言实现产生式系统的规那么库。二、实验内容1、

7、以动物识别系统的产生式规那么为例;2、用选定的编程语言建造规那么库和综合数据库,并能对它们进行增加、删除和修改操作。实验步骤确定需要识别的动物及其属性本次实验的简单动物识别系统总共能识别7种动物,即:老虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟和信天翁。建立识别七种动物识别系统的规那么选定编程语言并确定综合数据库和规那么库结构选用C语言作为编程语言 2综合数据库的建立3规那么库的建立四、程序源代码#include #include using namespace std;struct RULES int count; char pre255; char back255; int mark;void

8、check();RULES r100 = 1,有毛发,哺乳动物,0 ,/所有规那么静态数据库 1,有奶,哺乳动物,0 , 1,有羽毛,鸟,0 , 2,会飞&下蛋&,鸟,0 , 1,吃肉,食肉动物,0 , 3,有锋利的牙齿&有爪&眼睛盯着前方&,食肉动物,0 , 2,哺乳动物&有蹄&,有蹄类哺乳动物,0 , 2,哺乳动物&反刍&,有偶蹄类哺乳动物,0 , 4,哺乳动物&食肉动物&黄褐色&有暗斑&,金钱豹,0 , 4,哺乳动物&食肉动物&黄褐色&黑色条纹&,老虎,0 , 4,有蹄类哺乳动物&有长脖子&有长腿&有暗斑&,长颈鹿,0 , 2,有蹄类哺乳动物&黑条纹&,斑马,0 , 5,鸟&不会飞&有长

9、脖子&有长腿&黑白色&,鸵鸟,0 , 4,鸟&不会飞&会游泳&黑白色&,企鹅,0 , 2,鸟&会飞&,信天翁,0 , 1,反刍,哺乳动物,0 ;int number;int m;int cat = 15;int a;int length;/输入的事实长度string f255;/输入的事实数组void input() while (1) cat+; cout number rcat.count; cout 输入事实,两种以上的事实请在每个事实后加上&符号 rcat.pre; cout 输入结果 rcat.back; rcat.mark = 0; while (1) cout 输入“1继续添加规

10、那么,输入“2查看规那么库 p;if (p = 1)input();elseif (p = 2)check();elsecout 输入错误,重新输入 endl; void delate() cout 输入要删除的条数 bar; for (int t = 0; t = cat; t+) rbar - 1 = rbar; bar+; cat-; check();void check() cout endl 规那么库如下 endl; for (int i = 0; i = cat; i+) cout i + 1 . 由 ri.pre 可得 ri.back endl; cout endl; while

11、 (1) cout 输入“1继续添加规那么,输入“3删除选定的规那么 m; if (m = 1) input(); else if (m = 3)delate(); int find_rule(int s)/查找规那么库中是否还有可使用的规那么for (int i = 0; i = 15; i+)s = s*ri.mark;/coutfind_rule结果sendl;return s;int compare1(RULES r) /当前提条件为1时int j = 0, i = 1;string str, str2;str = r.pre;while (i = length)if (fi = st

12、r)str2 = r.back;flength + 1 = str2;/参加事实库length+;/事实库的长度加1r.mark = 1;/标记规那么已使用过break;elsei+;return r.mark;int compare2(RULES r)/前提条件不为1string b10;string str, str2;int i, j = 1, num = 0;int a = 0;str = r.pre;for (i = 0; i != 10; +i) /转换数组bi = ;for (i = 0; i != str.length(); +i)if (str.at(i) != &)bj +

13、= str.at(i);elsej+;i = 1;while (i = r.count)for (j = 1; j != length + 1; j+)if (fj = bi)a += 1;i+;if (a = r.count)str2 = r.back;flength + 1 = str2;/参加事实库length+;/事实库的长度加1r.mark = 1;/标记规那么已使用过return r.mark;void result()int i = 1, m = 0;while (i != length + 1)if (fi = 金钱豹)cout 该动物是金钱豹 endl;m = 1;break

14、;elseif (fi = 老虎)cout 该动物是老虎 endl;m = 1;break;elseif (fi = 长颈鹿)cout 该动物是长颈鹿 endl;m = 1;break;elseif (fi = 斑马)cout 该动物是斑马 endl;m = 1;break;elseif (fi = 鸵鸟)cout 该动物是鸵鸟 endl;m = 1;break;elseif (fi = 企鹅)cout 该动物是企鹅 endl;m = 1;break;elseif (fi = 信天翁)cout 信天翁 endl;m = 1;break;elsei+;if (m = 0)cout 没有符合的动物

15、,请确认特征,重新输入 endl;void idetify()int i = 0, u = 0;if (find_rule(u) = 0) /如果规那么库中还有未使用的规那么/cout还有未使用的规那么endl;int num = length;while (i16)/从第一条规那么开始遍历if (ri.mark = 0)/如果该条规那么未使用if (ri.count = 1)/该条规那么前提数为1u = compare1(ri);if (u = 1)ri.mark = 1;if (ri.mark = 1)cout 使用规那么 i + 1;cout 且参加的新事实为 ri.back endl;

16、elseu = compare2(ri);if (u = 1)ri.mark = 1;if (ri.mark = 1)cout 使用规那么 i + 1;cout 且参加的新事实为 ri.back endl;if (i = 15)if (num != length)i = 0;num = length;elsei = 16;elsei+;elsecout 所有的规那么都已使用 endl;result();/*主函数*/void main()cout *智能1501班* endl;cout *06153034* endl;cout *刘少鹏* endl;cout 进行动物识别请输入7 endl;c

17、out 进行规那么库操作请输入8 a;while (a = 8) while (1)cout 添加规那么输入1,查看已有规那么输入2 m;if (m = 1)input();elseif (m = 2)check();elsecout 输入错误请重新输入 endl; if (a = 7)int u = 0;cout 请输入动物的特征数 length;cout 请输入动物的特征 endl;for (int i = 1; i fi;idetify();system(pause);实验结果相关截图1、程序总体结构 规那么库操作查看规那么库 规那么库操作添加规那么添加袋鼠规那么规那么库操作删除规那么删

18、除袋鼠规那么5、动物识别识别长颈鹿六、心得体会 通过本次实验我深刻的理解和掌握产生式知识表示方法,并且能够通过VC编程语言实现产生式系统的规那么库。本次实验我同样遇到许多问题,我通过自己查阅资料,与同学们讨论,逐步的将自己的问题解决,在这个过程中提高了我的问题解决能力。最后因为本次实验只有对数据库有清楚的掌握,同时熟悉规那么才能合理编程,因此我在平时的学习中应当加大数据库与数据结构的学习力度,提高自己的编程能力。人工智能课内实验报告实验3:盲目搜索求解八数码问题学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏 33 学 号: 06153034 日 期: 2021-03-30 10

19、:15-12:00 人工智能课内实验3:盲目搜索求解8数码问题实验目的熟悉人工智能系统中的问题求解过程;熟悉状态空间中的盲目搜索策略;掌握盲目搜索算法,重点是宽度优先搜索和深度优先搜索算法。实验要求用VC语言编程,采用宽度优先搜索和深度优先搜索方法,求解8数码问题实验内容采用宽度优先算法,运行程序,要求输入初始状态假设给定如下初始状态S02 8 31 6 47 0 5 和目标状态Sg 2 1 6 4 0 8 7 5 3 验证程序的输出结果,写出心得体会。 2对代码进行修改选作,实现深度优先搜索求解该问题提示:每次选扩展节点时,从数组的最后一个生成的节点开始找,找一个没有被扩展的节点。这样也需要

20、对节点添加一个是否被扩展过的标志。4 源代码及实验结果截图实验源代码 #include #include Typedef struct Node int num9; /棋盘状态 int deepth; /派生的深度 g(n) int diffnum; /不在位的数目 h(n) int value; /耗散值 f(n)=g(n)+h(n) struct Node * pre; struct Node * next; struct Node * parent;numNode; /* - end of struct numNode - */int origin9; /棋盘初始状态int target

21、9; /棋盘目标状态int numNode_num, total_step;numNode *open, *close; /Open表和Close表numNode *create_numNode() return (numNode *)malloc(sizeof(numNode);numNode *open_getfirst(numNode *head); /返回第一项,并从Open表中删除void open_insert(numNode *head, numNode *item); /向Open表中按序插入新节点void close_append(numNode *head, numNode

22、 *item); /向Close表中插入新节点int expand(numNode *item); /扩展节点int print_result(numNode *item); /打印结果numNode *copy_numNode(numNode *orgin);char isNewNode(numNode *open, numNode *close, int num9); /是否在Open表或Close表中void print_num(int num9); /打印棋盘状态int diff(int num9); /求不在位棋子的个数void init(); /初始化,获得棋盘初始状态和目标状态v

23、oid swap(int *a, int *b);int operate(int num, int op);void free_list(numNode *head);/* Name: 主函數/* Description: 程序入口int main(int argc, char *argv) /初始化Open表和Close表 printf(*智能1501*n); printf(*刘少鹏*n); printf(*06153034*n); open = create_numNode(); close = create_numNode(); open-pre = open-next = close-

24、pre = close-next = NULL; init(); /由用户输入初始和目标状态/初始化初始节点 numNode *p1; p1 = create_numNode(); p1-parent = NULL; p1-deepth = 0; int i = 0; for (i = 0; inumi = origini; open_insert(open, p1); numNode_num = 1; p1 = open_getfirst(open); while (p1 != NULL) close_append(close, p1); if (expand(p1)return EXIT_

25、SUCCESS;p1 = open_getfirst(open); printf(No solution!n); return EXIT_SUCCESS; /* - end of function main - */void init()while (1)printf(Please input opriginal status:nFor example:123456780 stands forn1 2 3n4 5 6n7 8 0n);char temp10;scanf(%s, &temp);int i = 0;for (i = 0; i= 0 & tempi - 0 = 8; i+)origi

26、ni = tempi - 0;printf(Please input target status:n);scanf(%s, &temp);int j = 0;for (j = 0; j= 0 & tempj - 0 next;q = head;while (p != NULL & item-value p-value)q = p;p = p-next;q-next = item;item-pre = q;item-next = p;if (p != NULL)p-pre = item; /* - end of function open_insert - */numNode *open_get

27、first(numNode *head)numNode *p;if (head-next = NULL)return NULL;p = head-next;head-next = p-next;if (p-next != NULL)p-next-pre = head;p-pre = NULL;p-next = NULL;return p; /* - end of function open_getfirst - */void close_append(numNode *head, numNode *item)item-next = head-next;item-pre = head;head-

28、next = item;if (item-next != NULL)item-next-pre = item; /* - end of function close_append - */int expand(numNode *p1)numNode * p2;int op = 1;for (op = 1; op num, op);if (isNewNode(open, close, p2-num) = N)p2-parent = p1;p2-deepth = p1-deepth + 1;p2-diffnum = diff(p2-num);p2-value = p2-deepth + p2-di

29、ffnum;if (p2-diffnum = 0)total_step = print_result(p2);printf(Total step: %dn, total_step);free_list(open);free_list(close);return 1;elsenumNode_num+;open_insert(open, p2);elsefree(p2);return 0; /* - end of function expand - */int operate(int m, int op)int blank;blank = 0;while (mblank != 0 & blank2

30、)swap(m + blank, m + blank - 3);break;case 2: /* down */if (blankdeepth = origin-deepth;p-diffnum = origin-diffnum;p-value = origin-value;int i;for (i = 0; inum)i = (origin-num)i;return p; /* - end of function copy_numNode - */intdiff(int num9)int i, diffnum = 0;for (i = 0; inext;while (p != NULL)fo

31、r (i = 0; inumi != numi)break;if (i = 9)return O; /Openp = p-next;p = close-next;while (p != NULL)for (i = 0; inumi != numi)break;if (i = 9)return C; /Closep = p-next;return N; /* - end of function isNewNode - */void free_list(numNode *head)numNode *p, *q;p = head-next;while (p != NULL) q = p-next;f

32、ree(p);p = q;free(head); /* - end of function free_list - */void print_num(int num9) int i;for (i = 0; iparent);printf(nStep %d:n, step + 1);print_num(p-num);return step + 1;elsereturn -1;2实验截图5 心得体会 本次实验对我最大的收获就是我再解决问题的过程中提高了C语言编程能力,对用编程解决实际问题有了更加深刻的认识。此次实验我采用了宽度优先算法,成功的完成了本次实验,我对宽度优先算法有了更为深刻的理解,我相

33、信我再经过几次宽度优先算法的练习,我就可以用它来解决一些生活中的实际问题。 人工智能课内实验报告实验4:回溯算法求解四皇后问题学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏 33 学 号: 06153034 日 期: 2021-04-05 10:15-12:00 实验4 回溯算法求解四皇后问题1实验目的:理解搜索的概念,掌握回溯搜索算法,用回溯算法求解四皇后问题.2实验要求: 用VC 编程实现求解四皇后问题的回溯过程,根据实验结果写出回溯算法的总结.3 实验结果分析:回朔算法总结:回朔算法是从一条路往前走,能进那么进,不能进那么退回来,换一条路再试。本次四皇后就是回溯算法,第一

34、步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有位置符合要求,那么就要改变第一个皇后的位置,重新放第2个皇后的位置,直到找到符合条件的位置就可以了。回朔算法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,那么跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否那么,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回朔算法在用来求问题的任

35、一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。4实验的心得体会: 通过本次实验我理解了搜索的概念,掌握了回溯搜索算法,学会了用回溯算法求解四皇后问题。实验中我遇到了很多问题,但是通过自己的努力,和同学的帮助,我顺利的完成了实验,在此过程中我有了很大的收获,我对回朔算法有了更深刻的理解,我在此次实验结束后,我想回朔算法可以求解四皇后问题,那么八皇后,十皇后,N皇后问题该怎么解决,我想通过自己的不断学习这些问题都将一一解决。参考例如代码:#include #define bool int#define false

36、0#define true 1int Num=1; /用来记录有几种实现方法int q5;bool C5;/C1C4,布尔型变量,当前列是否平安 bool L9; /L2L8,布尔型变量,i-j对角线从左上角到右下角是否平安 2=(i-j)+5=8;bool R9; /R2R8,布尔型变量,i+j对角线从右上角到左下角是否平安 2=i+j=8int qipan44=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;void Try(int i) /皇后放置函数int j,k,n,m;for(j=1;j5;j+)if(Cj=true)&(Li-j+5=true)&(Ri+j=tru

37、e)/表示第i行 第j列 是平安的 qi = j; / 第一件事,既然i行,j列平安,就放置皇后在i,j处Cj = false; / i行,j列 放置皇后后不再平安Li-j+5 = false; / (i,j)所在的从左上角到右下角的对角线将不再平安Ri+j = false;if(i4) /第二件事,判断是否放完4个皇后 Try(i+1); /未放完四个皇后,那么接着放下一个else /四个皇后已经放完Num+;printf(方案:%dn,Num);for(k=1;k5;k+) qipank-1qk-1=1;/输出棋盘,皇后用1表示,0表示该位置无皇后for(m=0;m4;m+)for(n=0

38、;n4;n+) printf(%dt,qipanmn);printf(n); for(m=0;m4;m+) /棋盘再次初始化for(n=0;n4;n+)qipanmn=0;Cj=true; /第三件事,修改平安的标志,回溯Li-j+5=true;Ri+j=true;int main(void) int i;Num = 0;printf(*实验四 回溯算法四皇后*n); printf(*智能1501班*n); printf(*06153034*n);printf(*刘少鹏*n);printf(1表示该位置有皇后,0表示该位置无皇后n);for(i=1;i5;i+)Ci=true;for(i=0;

39、i9;i+)Li = Ri = true;Try(1);return 0; 人工智能课内实验报告实验5:编程实现一字棋游戏学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏 33 学 号: 06153034 日 期: 2021-04-11 10:15-12:00 实验5 编程实现一字棋游戏1实验目的: 1理解和掌握博弈树的启发式搜索过程; 2熟悉博弈中两种最根本的搜索方法极大极小过程和过程; 3能够用VC编程语言设计简单的博弈游戏。2实验要求: 用VC 编程实现一字棋,根据实验结果写出总结。3 实验结果分析:实验代码#include #include #include #inclu

40、de #include using namespace std;#define MAX_NUM 1000 /计算机获胜的标志#define NO_BLANK -1001/人获胜的标志#define TREE_DEPTH 3 /递归深度#define NIL 1001 /根节点的函数走步评估值class State /棋盘状态节点,一个State实例就是一个棋盘的状态节点,从而形成一颗树状结构public:int QP33; /当前棋盘数组int e_fun; /评分结果int child9; /当前棋盘状态下的后一步的所有状态节点int parent; /当前棋盘状态下的父母节点下标int b

41、estChild; /在child9里e_fun最优的节点下标;class Ticpublic:int tmpQP33; /用于层递归的临时棋盘static int s_count;/叶子节点的静态总数State StatesMAX_NUM;/棋盘状态节点数组Tic()void init() /初始化棋盘,将各个位置的棋盘都置为s_count = 0;for (int i = 0; i3; i+)for (int j = 0; j3; j+)States0.QPij = 0;States0.parent = NIL;void PrintQP()/棋盘界面显示 for (int i = 0; i

42、3; i+)for (int j = 0; j3; j+)cout States0.QPij t;cout endl;int IsWin(State s) /判断当前的棋盘状态是否有令任何一方获胜int i = 0;for (i = 0; i3; i+)if (s.QPi0 = 1 & s.QPi1 = 1 & s.QPi2 = 1)return 1;if (s.QPi0 = -1 & s.QPi1 = -1 & s.QPi2 = -1)return -1;for (i = 0; i3; i+)if (s.QP0i = 1 & s.QP1i = 1 & s.QP2i = 1)return 1;

43、if (s.QP0i = -1 & s.QP1i = -1 & s.QP2i = -1)return -1;if (s.QP00 = 1 & s.QP11 = 1 & s.QP22 = 1) | (s.QP20 = 1 & s.QP11 = 1 & s.QP02 = 1)return 1;if (s.QP00 = -1 & s.QP11 = -1 & s.QP22 = -1) | (s.QP20 = -1 & s.QP11 = -1 & s.QP02 = -1)return -1;return 0;int e_fun(State s)/机器智能判定评价函数bool flag = true;in

44、t i = 0;for (i = 0; i3; i+)for (int j = 0; j3; j+)if (s.QPij = 0)flag = false;if (flag)return NO_BLANK;if (IsWin(s) = -1)return -MAX_NUM;if (IsWin(s) = 1)return MAX_NUM;int count = 0;for (i = 0; i3; i+)for (int j = 0; j3; j+)if (s.QPij = 0)tmpQPij = 1;else tmpQPij = s.QPij;for (i = 0; i3; i+)count +

45、= (tmpQPi0 + tmpQPi1 + tmpQPi2) / 3;for (i = 0; i3; i+)count += (tmpQP0i + tmpQP1i + tmpQP2i) / 3;count += (tmpQP00 + tmpQP11 + tmpQP22) / 3;count += (tmpQP20 + tmpQP11 + tmpQP02) / 3;for (i = 0; i3; i+)for (int j = 0; j3; j+)if (s.QPij = 0)tmpQPij = -1;else tmpQPij = s.QPij;for (i = 0; i3; i+)count

46、 += (tmpQPi0 + tmpQPi1 + tmpQPi2) / 3;for (i = 0; i3; i+)count += (tmpQP0i + tmpQP1i + tmpQP2i) / 3;count += (tmpQP00 + tmpQP11 + tmpQP22) / 3;count += (tmpQP20 + tmpQP11 + tmpQP02) / 3;return count;virtual bool AutoDone()return false;void UserInput()/获取用户的输入int pos, x, y;L1: cout pos;x = pos / 10,

47、y = pos % 10;if (x0 & x0 & y4 & States0.QPx - 1y - 1 = 0)States0.QPx - 1y - 1 = -1;elsecout 非法输入!;goto L1;int Tic:s_count = 0;/初始化棋盘状态节点总数,刚开始置为class demo : public Ticpublic:demo()bool Judge()int i, j, a = 0;for (i = 0; i3; i+)for (j = 0; j3; j+)if (States0.QPij = 0) a+;if (a = 0)return true;return

48、false;virtual bool AutoDone()int a, b, i, j, m, n, max, min, x, y;if (IsWin(States0) = -1)cout 恭喜您获胜! endl;return true;a = 0, b = 0;max = -10000;for (x = 0; x3; x+)for (y = 0; y3; y+)States11.QPxy = States0.QPxy;for (i = 0; i3; i+)for (j = 0; j3; j+)if (States0.QPij = 0)a = 1;for (x = 0; x3; x+)for

49、(y = 0; y3; y+)Statesa.QPxy = States0.QPxy;Statesa.QPij = 1;min = 10000;for (m = 0; m3; m+)for (n = 0; n3; n+)if (Statesa.QPmn = 0)b = 1;for (x = 0; x3; x+)for (y = 0; y3; y+)States10.QPxy = Statesa.QPxy;States10.QPmn = -1;States10.e_fun = e_fun(States10);if (States10.e_funmax)max = Statesa.e_fun;fo

50、r (x = 0; x3; x+)for (y = 0; y3; y+)States11.QPxy = Statesa.QPxy;for (x = 0; x3; x+)for (y = 0; y3; y+)States0.QPxy = States11.QPxy;cout 计算机走棋 endl;PrintQP();if (IsWin(States0) = 1)cout 抱歉你输了,计算机获胜! endl;return true;else if (IsWin(States0) = -1)cout 恭喜您获胜! endl;return true;return false;void main()co

51、ut *工程名称:一字棋游戏的实现* endl;cout *班 级:智 能 1 5 0 1 * endl;cout *姓 名:刘 少 鹏* endl;cout *学 号:0 6 1 5 3 0 3 4 * endl; cout *说 明:-1代表人落子位置,1代表电脑落子位置,0代表该位置无棋子 * endl;system(title #子棋智能小游戏);system(color A2);char IsFirst;bool IsFinish;cout 假设您为先手,请输入Y!反之,请输入N: IsFirst;demo *p = new demo();p-init();cout 棋盘的初始状态:

52、 PrintQP();do if (!p-Judge()if (IsFirst = Y)p-UserInput(); p-PrintQP();if (!p-Judge()IsFinish = p-AutoDone();else if (IsFirst = N)IsFinish = p-AutoDone();if (!p-Judge()if (!IsFinish) p-UserInput(); p-PrintQP(); if (p-Judge() IsFinish = true; while (!IsFinish);if (p-IsWin(p-States0) = 0) & p-Judge()c

53、out 平局 endl;system(pause);3.2、实验运行结果截图4、实验心得本次实验,我通过学习用VC编程语言设计简单的博弈游戏,从而理解和掌握博弈树的启发式搜索过程,熟悉博弈中两种最根本的搜索方法极大极小过程和过程。并且将这种思想通过代码表现出来。本次实验我最大的收获不仅仅是学到了课本上的知识,更是学会了如何主动的求解问题的答案。实验中我遇到了许多困难,不仅仅是有关编程算法方面的,还有一些代码逻辑流程的设计。这些困难我通过上网和去图书馆查找资料或者向同学请教等方式,逐一解决了困难,我收获良多。 人工智能课内实验报告实验6:子句集消解实验学 院: 自动化学院 班 级: 智能1501

54、 姓 名: 刘少鹏 33 学 号: 06153034 日 期: 2021-05-8 10:15-12:00 实验6子句集消解实验一、实验目的熟悉子句集化简的九个步骤;理解消解规那么,能把任意谓词公式转换成子句集。二、编程环境 Visual Studio 2021三、实验原理 在谓词逻辑中,任何一个谓词公式都可以通过应用等价关系及推理规那么化成相应的子句集。其化简步骤如下:(1) 消去连接词“和“反复使用如下等价公式: PQ PQ PQ (PQ)(PQ)即可消去谓词公式中的连接词“和“。(2) 减少否认符号的辖域反复使用双重否认率 (P) P 摩根定律 (PQ) PQ (PQ) PQ 量词转换率

55、 (x)P(x) (x) P(x) (x)P(x) (x)P(x)将每个否认符号“移到仅靠谓词的位置,使得每个否认符号最多只作用于一个谓词上。(3) 对变元标准化在一个量词的辖域内,把谓词公式中受该量词约束的变元全部用另外一个没有出现过的任意变元代替,使不同量词约束的变元有不同的名字。 (4) 化为前束范式化为前束范式的方法:把所有量词都移到公式的左边,并且在移动时不能改变其相对顺序。消去存在量词(6) 化为Skolem标准形 对上述前束范式的母式应用以下等价关系 P(QR) (PQ)(PR)消去全称量词(8) 消去合取词在母式中消去所有合取词,把母式用子句集的形式表示出来。其中,子句集中的每

56、一个元素都是一个子句。(9) 更换变量名称对子句集中的某些变量重新命名,使任意两个子句中不出现相同的变量名。四、实验结果及代码/化简子句集的九步法演示/作者:刘少鹏#include#include#include#includeusing namespace std;/一些函数的定义void initString(string &ini);/初始化string del_inlclue(string temp);/消去蕴涵符号string dec_neg_rand(string temp);/减少否认符号的辖域string standard_var(string temp);/对变量标准化str

57、ing del_exists(string temp);/消去存在量词string convert_to_front(string temp);/化为前束形string convert_to_and(string temp);/把母式化为合取范式string del_all(string temp);/消去全称量词string del_and(string temp);/消去连接符号合取%string change_name(string temp);/更换变量名称/辅助函数定义bool isAlbum(char temp);/是字母string del_null_bracket(string

58、 temp);/删除多余的括号string del_blank(string temp);/删除多余的空格void checkLegal(string temp);/检查合法性char numAfectChar(int temp);/数字显示为字符/主函数void main()cout -求子句集九步法演示- P);/orign = (#x)y(x);/orign = (x)x!b(x);/orign = (x!y);/orign = (a(b);string orign, temp;char command, command0, command1, command2, command3, c

59、ommand4, command5,command6, command7, command8, command9, command10;/=cout 请输入(Y/y)初始化谓词演算公式 command;if (command = y | command = Y)initString(orign);elseexit(0);/=cout 请输入(Y/y)消除空格 command0;if (command0 = y | command0 = Y)/del_blank(orign);/undonecout 消除空格后是 endl orign endl;elseexit(0);/=cout 请输入(Y/

60、y)消去蕴涵项 command1;if (command1 = y | command1 = Y)orign = del_inlclue(orign);cout 消去蕴涵项后是 endl orign endl;elseexit(0);/=cout 请输入(Y/y)减少否认符号的辖域 command2;if (command2 = y | command2 = Y)dotemp = orign;orign = dec_neg_rand(orign); while (temp != orign);cout 减少否认符号的辖域后是 endl orign endl;elseexit(0);/=cout

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论