人工智能十五数码实验报告

合集下载

人工智能实验报告

人工智能实验报告

人工智能实验报告一、实验目的。

本次实验旨在通过对人工智能相关算法的实验操作,深入了解人工智能的基本原理和实际应用,提高对人工智能技术的理解和掌握。

二、实验内容。

1. 人工智能算法的原理及应用。

2. 人工智能在图像识别、语音识别等领域的实际应用案例分析。

3. 人工智能算法在实际项目中的具体运用。

三、实验步骤。

1. 理论学习,通过学习相关教材和资料,掌握人工智能算法的基本原理和应用场景。

2. 实际操作,运用Python等编程语言,实现人工智能算法的实际应用,如图像识别、语音识别等。

3. 案例分析,结合实际案例,分析人工智能在不同领域的具体应用,了解其在实际项目中的运用情况。

四、实验结果。

通过本次实验,我们深入了解了人工智能算法的基本原理和应用场景,掌握了人工智能在图像识别、语音识别等领域的实际应用案例,并对人工智能算法在实际项目中的具体运用有了更深入的了解。

五、实验总结。

人工智能作为当今科技领域的热门话题,其应用场景和前景备受关注。

通过本次实验,我们不仅对人工智能算法有了更深入的理解,也对其在实际项目中的应用有了更清晰的认识。

人工智能技术的不断发展,必将为各行各业带来更多的创新和改变。

六、展望。

随着人工智能技术的不断进步和应用,我们相信在不久的将来,人工智能将会在更多的领域发挥重要作用,为人类社会带来更多的便利和进步。

我们也将继续深入学习和研究人工智能技术,不断提升自己的技术水平,为人工智能技术的发展贡献自己的力量。

七、参考资料。

1. 《人工智能导论》,XXX,XXX出版社,2018年。

2. 《Python人工智能编程实践》,XXX,XXX出版社,2019年。

3. 《深度学习与人工智能》,XXX,XXX出版社,2020年。

以上为本次人工智能实验的报告内容,谢谢。

人工智能实验算法分析文档

人工智能实验算法分析文档

人工智能各算法实验分析及指导撰写时间:2012年6月15日实验一A*算法实验一、实验目的:熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N数码难题,理解求解流程和搜索顺序。

二、实验原理:A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。

对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。

因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为两个分量:从起始节点到节点n的代价以及从节点n到达目标节点的代价。

三、实验环境:Windows 操作系统,C语言或Prolog语言。

四、实验内容:1.分别以8数码和15数码为例实际求解A*算法。

2.画出A*算法求解框图。

3.分析估价函数对搜索算法的影响。

4.分析A*算法的特点。

六、实验报告要求:1A*算法流程图和算法框图。

2试分析估价函数的值对搜索算法速度的影响。

3根据A*算法分析启发式搜索的特点。

提交程序清单。

1知识点归纳搜索策略的知识点主要可以分为六块内容来进行讲解:搜索的基本概念状态空间的盲目搜索状态空间的启发式搜索与/或树的盲目搜索与/或树的启发式搜索博弈树的启发式搜索α-β剪枝技术很多问题都可以用到人工智能中的搜索策略来进行问题求解,比如迷宫问题、博弈问题、8皇后问题、旅行商问题、排课问题、背包问题等等。

对于本实验所要求解的8数码问题,需要掌握的知识点主要有几下这些: 一般图搜索算法流程广度优先和深度优先搜索代价树搜索启发信息和评估函数A算法A*算法2算法流程1)初始化Open表和Closed表。

2)把图搜索初始化节点放入Open表中。

3)Open若非空,取出表头的节点x。

4)若x就是目标节点,返回搜索成功。

5)将该节点x从Open表中删除并放入Closed表中。

6)根据图信息产生x的孩子节点y1、y2、……y n。

7)标记x为y i的父节点。

8)若y i从未在Open表和Closed表中出现过,根据评估函数计算y i的评估值并放入Open表中。

人工智能实验报告(熟悉专家系统开发工具)

人工智能实验报告(熟悉专家系统开发工具)
1 Solution
实验结论(结果)
求N! 值的:
该程序通过递归算法有效的解决了求N! 值的问题。并熟悉了Visual Prolog软件开发平台。
该程序通过递归算法有效的解决了求N!值的问题。并熟悉了Visual Prolog软件开发平台。
实验心得与小结
通过这次实验我更加熟悉了 Prolog语言和该软件开发平台。对Prolog语言的基本语法规则和使用技巧有了更好的掌握。在使用Visual Prolog软件开发平台的过程中, 我从对软件的不熟悉, 经常出错, 到会编写一些小型完整的Visual Prolog应用程序, 在这过程中, 我增长了很多知识。最后经过本次试验, 我的动手能力和分析问题的能力得到提高。
father(name,name)
everybody
clauses
father(leonard,katherine).
father(carl,jason).
father(carl,marilyn).
everybody :-father(X,Y),write(X," is ",Y,"'s father\n"),fail.
Example3:
设定目标为: everybody.
结果为:
leonard is katherine's father
carl is jason's father
carl is marilyn's father
No
求N! 值的:
设定目标为: X=6,factorial(X, FactX).
结果为:
X=6, FactX=720
6.完成简单程序的编写:求N!的值。
实验准备(预习程序)

人工智能实验报告内容

人工智能实验报告内容

人工智能实验报告内容人工智能实验报告内容人工智能(Artificial Intelligence, AI)作为一种重要的技术,正在逐渐影响到我们的日常生活和工作。

本次实验旨在学习和探索人工智能的基本技术,并通过实践加深对其原理和应用的理解。

首先,本次实验分为两个部分:人工智能基础技术的学习和人工智能应用的实践。

在人工智能基础技术学习的部分,我们研究了人工智能的核心技术包括机器学习、神经网络、深度学习等。

我们首先学习了机器学习的基本概念和算法,包括监督学习、无监督学习和强化学习等。

我们使用Python编程语言,利用机器学习库进行了实践,例如使用Scikit-learn库实现了线性回归和K-means 聚类算法。

其次,我们学习了神经网络的基本原理和算法,在激活函数、损失函数、优化算法等方面进行了深入研究。

我们利用TensorFlow库搭建了神经网络模型,并使用MNIST数据集进行了手写数字识别的实验。

通过不断调整网络结构和参数,我们逐渐提高了模型的准确率。

最后,我们学习了深度学习的原理和常用的深度学习模型,包括卷积神经网络(Convolutional Neural Network, CNN)、循环神经网络(Recurrent Neural Network, RNN)等。

我们使用Keras库搭建了CNN模型,并使用CIFAR-10数据集进行了图像分类实验。

通过优化网络结构和参数,我们的模型在测试集上取得了较高的准确率。

在人工智能应用的实践部分,我们选择了自然语言处理(Natural Language Processing, NLP)为主题,具体研究了文本分类和情感分析两个任务。

我们使用了Python编程语言和NLTK(Natural Language Toolkit)库进行了实践。

首先,我们使用朴素贝叶斯算法实现了文本分类的任务,通过比较不同的特征提取方法,我们找到了最适合该任务的特征提取方法。

其次,我们使用情感词典和机器学习算法实现了情感分析的任务,通过对情感分析模型进行评估和调优,我们提高了模型的准确率和鲁棒性。

人工智能实验报告完整版八数码+验证解读

人工智能实验报告完整版八数码+验证解读

把数码问题就是把一串数字变为下边这个样子:1 2 38 0 47 6 5实现方法1.过程表示源代码:#include<stdio.h>static int style[9]={1,2,3,6,7,4,5,8,0};//输入的数码//2,5,4,3,0,7,1,8,63,2,1,8,0,4,7,6,5 1,0,4,2,7,3,8,5,61,0,3,8,2,4,7,6,5static int arrayStep41[6]={5,4,3,6,7,8};//第四步和第六步共用的数组,所以设为全局量static int arrayStep71[4]={3,6,7,4};static int local;// 空格的地点int i,j;// 所用到的变量int number=0;// 记录挪动步数void print();void step1();void step2();void step3();void step4();void step5();void step6();void step7();void step8();void step9();void exchange(int x,int y);void judge();void judge()// 判断空格地点{number = 0;for(i=0;i<9;i++){if(style[i]==0){local=i;return;}}}void exchange(int x,int y)// 互换两个数{int temp;print();temp=style[x];style[x]=style[y];style[y]=temp;local=y;number++;}void step1(){int arrayStep11[5]={3,0,1,2,5};int arrayStep12[6]={6,7,8,5,2,1};if((style[2]!=0)&&style[2]!=1)return;else{if(local==2){if(style[1]==1)exchange(2,5);elseexchange(2,1);return;}else{if(local==4){exchange(4,1);i=2;while(local!=5){exchange(arrayStep11[i],arrayStep11[i+1]);i++;}return;}for(i=0;i<3;i++){if(arrayStep11[i]==local){while(local!=5){exchange(arrayStep11[i],arrayStep11[i+1]);i++;}return;}}for(i=0;i<4;i++){if(arrayStep12[i]==local){while(local!=1){exchange(arrayStep12[i],arrayStep12[i+1]);i++;}return;}}}}return;}void step2(){int arrayStep21[8]={0,3,6,7,8,5,4,1};for(i=0;i<8;i++){if(arrayStep21[i]==local){while(style[0]!=1){exchange(arrayStep21[i%8],arrayStep21[(i+1)%8]);i++;}break;}}}void step3(){int arrayStep31[8]={2,1,4,3,6,7,8,5};for(i=0;i<8;i++){if(arrayStep31[i]==local){while(style[1]!=2){exchange(arrayStep31[i%8],arrayStep31[(i+1)%8]);i++;}break;}}}void step4(){for(i=0;i<6;i++){if(arrayStep41[i]==local){while((style[4]!=3)){exchange(arrayStep41[i%6],arrayStep41[(i+1)%6]);i=(i+1)%6;}while(local!=3){exchange(arrayStep41[i%6],arrayStep41[(i+5)%6]);i=(i+5)%6;}break;}}}void step5(){int arrayStep51[9]={3,0,1,4,5,2,1,0,3};i=0;do{exchange(arrayStep51[i],arrayStep51[i+1]);i++;}while(local!=3);}void step6(){for(i=0;i<6;i++){if(arrayStep41[i]==local){while(style[5]!=4){exchange(arrayStep41[i%6],arrayStep41[(i+1)%6]);i++;}if(local==8)exchange(8,7);break;}}return;}void step7(){for(i=0;i<4;i++){if(arrayStep71[i]==local){while(style[4]!=5){exchange(arrayStep71[i%4],arrayStep71[(i+1)%4]);i=(i+1)%4;}while(local!=3){exchange(arrayStep71[i%4],arrayStep71[(i+3)%4]);i=(i+3)%4;}break;}}}void step8(){int arrayStep81[13]={3,0,1,2,5,4,7,8,5,2,1,0,3};i=0;do{exchange(arrayStep81[i],arrayStep81[i+1]);i++;}while(local!=3);}void step9(){for(i=0;i<4;i++){if(arrayStep71[i]==local){while(style[7]!=6){exchange(arrayStep71[i%4],arrayStep71[(i+1)%4]);i=(i+1)%4;}while(local!=4){exchange(arrayStep71[i%4],arrayStep71[(i+3)%4]);i=(i+3)%4;}break;}}}void print(){for(j=0;j<9;j++){if(style[j]==0)printf(" \t");elseprintf("%d\t",style[j]);if((j+1)%3==0)printf("\n");}printf("************ %d ***********\n",number);}void loop(){printf(" 请输入数码:\n");for(i=0;i<9;i++)scanf("%d",&style[i]);judge();step1();step2();step3();if(style[2]!=3){step4();step5();}step6();if(style[8]!=5){step7();step8();}step9();print();if(!((style[3]==8)&&(style[6]==7)))printf(" 用书上所给算法来看此数码错误!\n"); }void main(){while(1)loop();}2.深度优先实现/***************说明 ***********************用宽度优先搜寻算法实现八数码问题******************************************/#include<iostream>#include<stdio.h>#include<fstream>#include<stdlib.h>#include "string.h"#include "assert.h"#include "windows.h"using namespace std;int wholeStyle[9] = {2,8,3,1,6,4,7,0,5};int standard1[9] = {1,2,3,8,0,4,7,6,5};int local,i,j;int startKey = 0,endKey = 0,equalKey = 1,tempSpace;struct node *openHead,*open; //open 表struct node *closedHead,*closed; //closed 表struct node *tempNode; //临节气点struct node *answer; // 找到的路径int num = 0;struct node{int style[9];struct node *next;struct node *father;};void updateData()//更新要判断数据{int i;printf(" 请输入八数码原始状态:\n");for(i = 0;i < 9;i++)scanf("%d",&wholeStyle[i]);printf(" 请输入八数码最后状态:\n");for(i = 0;i < 9;i++)scanf("%d",&standard1[i]);}void judge1(struct node *head)// 判断空格地点{for(i = 0;i < 9;i++){if(head->style[i] == 0){local = i;return;}}}int judge2(struct node *head) // 判断能否与标准八数码相等,不相等返回值为0 {for(i = 0;i < 9;i++){if(head->style[i] != standard1[i]){if((i == 3)&&(head->style[3] == standard1[6]));else if((i == 6)&&(head->style[6] == standard1[3]));elsereturn 0;}}return 1;}void judge3() // 判断重生成的八数码能否就是最后状态或许在open、 closed 表中出现{if(judge2(tempNode))endKey = 1;else{while(openHead->next->next->style[0] != 9){for(i = 0;i < 9;i++){if(openHead->next->next->style[i] != tempNode->style[i]){equalKey = 1;break;}elseequalKey = 0;}if(equalKey)// 不相等openHead = openHead->next;elsebreak;}openHead = open->next;if(equalKey)// 不相等{while(closedHead->next->style[0] != 9){for(i = 0;i < 9;i++){if(closedHead->next->style[i] != tempNode->style[i]){equalKey = 1;break;}elseequalKey = 0;}if(!equalKey)// 相等break;elseclosedHead = closedHead->next;}closedHead = closed->next;}if(equalKey)// 不相等{open->next = tempNode;tempNode->next = openHead;tempNode->father = openHead->next;open = open->next;}}}void print(struct node *temp)// 输出八数码表{for(j = 0;j < 9;j++){if(temp->style[j] == 0)printf(" \t");elseprintf("%d\t",temp->style[j]);if((j + 1) % 3 == 0)printf("\n");}}void write2txt(){ofstream out("F:\\out_details.txt",ios::app);if( out.fail() ){cerr<<" 未找到文件 "<<endl;}out<<"第 "<<++num<<" 步 \n";out<<"open table : \n";while(openHead->next->style[0] != 9){for(i = 0;i < 9;i ++){out<<openHead->next->style[i]<<"\t";if((i+1) % 3 == 0)out<<"\n";}out<<"\n";openHead = openHead->next;}openHead = openHead->next;out<<"*********************\n";out<<"closed table : \n";while(closedHead->next->style[0] != 9){for(i = 0;i < 9;i ++){out<<closedHead->next->style[i]<<"\t";if((i + 1) % 3 ==0)out<<"\n";}out<<"\n";closedHead = closedHead->next;}closedHead = closedHead->next;out<<"-----------------------------------\n";out.close();}void main(){//updateData();// 输入八数码数据for(i = 0;i < 9;i++)//判断初始状态能否已经为最后状态{if(wholeStyle[i] == standard1[i]);else{if((i == 3)&&(wholeStyle[i] == standard1[6]));else if((i == 6)&&(wholeStyle[i] == standard1[3]));else{startKey = 1;break;}}}if(!startKey){printf(" 不用判断! \n");return;}printf(" 要判断! \n");openHead = new node();open = new node();openHead->style[0] = 9;openHead->next = open;for(i = 0;i < 9;i++)open->style[i] = wholeStyle[i];open->next = openHead;open->father = openHead;closedHead = new node();closed = new node();closedHead->style[0] = 9;closedHead->next = closedHead;closed = closedHead;while(open->style[0] != 9)//当open表不为空时向来循环{judge1(openHead->next);if(local % 3 > 0)// 右移{equalKey = 1;tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = openHead->next->style[i];tempSpace = tempNode->style[local - 1];tempNode->style[local - 1] = tempNode->style[local];tempNode->style[local] = tempSpace;judge3();}if(endKey)break;if(local > 2)// 下移{equalKey = 1;tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = openHead->next->style[i];tempSpace = tempNode->style[local - 3];tempNode->style[local - 3] = tempNode->style[local];tempNode->style[local] = tempSpace;judge3();}if(endKey)break;if(local % 3 < 2)// 左移{equalKey = 1;tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = openHead->next->style[i];tempSpace = tempNode->style[local + 1];tempNode->style[local + 1] = tempNode->style[local];tempNode->style[local] = tempSpace;judge3();}if(endKey)break;if(local < 6)// 上移{equalKey = 1;tempNode = new node();//tempNode = malloc(sizeof(struct node));for(i = 0;i < 9;i++)tempNode->style[i] = openHead->next->style[i];tempSpace = tempNode->style[local + 3];tempNode->style[local + 3] = tempNode->style[local];tempNode->style[local] = tempSpace;judge3();}if(endKey)break;closed->next = openHead->next; // 把 open 的标头增添到closed 表中openHead->next = openHead->next->next;closed = closed->next;closed->next = closedHead;write2txt();}open->next = tempNode;// 把找到的新节点增添到open 表中tempNode->next = openHead;tempNode->father = openHead->next;open = open->next;closed 表中closed->next = openHead->next; //把 open 的标头增添到openHead->next = openHead->next->next;closed = closed->next;closed->next = closedHead;write2txt();answer = new node();tempNode = new node();tempNode = open;while(tempNode->style[0] != 9)// 将结果路径存于answer{answer = tempNode;tempNode = tempNode->father;tempNode->next = answer;}num = 0;while(answer->next->style[0] != 9)//输出answer{printf("***********第%d 步***********\n",num++);print(answer);answer = answer->next;printf("\n");}printf("***********第 %d 步 ***********\n",num++);print(answer);if(answer->style[3] != standard1[3])printf("\n!! 输入的八数码不合法,不可以从初始状态到最后状态 \n\n\n\n");return;}3.宽度优先:/***************说明 ***********************用宽度优先搜寻算法实现八数码问题******************************************/#include<iostream>#include<stdio.h>#include<fstream>#include<stdlib.h>#include "string.h"#include "assert.h"#include "windows.h"using namespace std;int wholeStyle[9] = {2,8,3,1,6,4,7,0,5};int standard1[9] = {1,2,3,8,0,4,7,6,5};int local,i,j;int startKey = 0,endKey = 0,equalKey = 1,tempSpace; struct node *openHead,*open; //open 表struct node *closedHead,*closed; //closed 表struct node *tempNode; //临节气点struct node *answer; // 找到的路径int num = 0;struct node{int style[9];struct node *next;struct node *father;};void updateData()//更新要判断数据{int i;printf(" 请输入八数码原始状态:\n");for(i = 0;i < 9;i++)scanf("%d",&wholeStyle[i]);printf(" 请输入八数码最后状态:\n");for(i = 0;i < 9;i++)scanf("%d",&standard1[i]);}void judge1(struct node *head)// 判断空格地点{for(i = 0;i < 9;i++){if(head->style[i] == 0){local = i;return;}}}int judge2(struct node *head) // 判断能否与标准八数码相等,不相等返回值为0{for(i = 0;i < 9;i++){if(head->style[i] != standard1[i]){if((i == 3)&&(head->style[3] == standard1[6]));else if((i == 6)&&(head->style[6] == standard1[3]));elsereturn 0;}}return 1;}void judge3() // 判断重生成的八数码能否就是最后状态或许在open、 closed 表中出现{if(judge2(tempNode))endKey = 1;else{while(openHead->next->next->style[0] != 9){for(i = 0;i < 9;i++){if(openHead->next->next->style[i] != tempNode->style[i]){equalKey = 1;break;}elseequalKey = 0;}if(equalKey)// 不相等openHead = openHead->next;elsebreak;}openHead = open->next;if(equalKey)// 不相等{while(closedHead->next->style[0] != 9){for(i = 0;i < 9;i++){if(closedHead->next->style[i] != tempNode->style[i]){equalKey = 1;break;}elseequalKey = 0;}if(!equalKey)// 相等break;elseclosedHead = closedHead->next;}closedHead = closed->next;}if(equalKey)// 不相等{open->next = tempNode;tempNode->next = openHead;tempNode->father = openHead->next;open = open->next;}}}void print(struct node *temp)// 输出八数码表{for(j = 0;j < 9;j++){if(temp->style[j] == 0)printf(" \t");elseprintf("%d\t",temp->style[j]);if((j + 1) % 3 == 0)printf("\n");}}void write2txt(){ofstream out("F:\\out_details.txt",ios::app);if( out.fail() ){cerr<<" 未找到文件 "<<endl;}out<<"第 "<<++num<<" 步 \n";out<<"open table : \n";while(openHead->next->style[0] != 9){for(i = 0;i < 9;i ++){out<<openHead->next->style[i]<<"\t";if((i+1) % 3 == 0)out<<"\n";}out<<"\n";openHead = openHead->next;}openHead = openHead->next;out<<"*********************\n";out<<"closed table : \n";while(closedHead->next->style[0] != 9){for(i = 0;i < 9;i ++){out<<closedHead->next->style[i]<<"\t";if((i + 1) % 3 ==0)out<<"\n";}out<<"\n";closedHead = closedHead->next;}closedHead = closedHead->next;out<<"-----------------------------------\n";out.close();}void main(){//updateData();// 输入八数码数据for(i = 0;i < 9;i++)//判断初始状态能否已经为最后状态{if(wholeStyle[i] == standard1[i]);else{if((i == 3)&&(wholeStyle[i] == standard1[6]));else if((i == 6)&&(wholeStyle[i] == standard1[3]));else{startKey = 1;break;}}}if(!startKey){printf(" 不用判断! \n");return;}printf(" 要判断! \n");openHead = new node();open = new node();openHead->style[0] = 9;openHead->next = open;for(i = 0;i < 9;i++)open->style[i] = wholeStyle[i];open->next = openHead;open->father = openHead;closedHead = new node();closed = new node();closedHead->style[0] = 9;closedHead->next = closedHead;closed = closedHead;while(open->style[0] != 9)//当open表不为空时向来循环{judge1(openHead->next);if(local % 3 > 0)// 右移{equalKey = 1;tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = openHead->next->style[i];tempSpace = tempNode->style[local - 1];tempNode->style[local - 1] = tempNode->style[local];tempNode->style[local] = tempSpace;judge3();}if(endKey)break;if(local > 2)// 下移{equalKey = 1;tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = openHead->next->style[i];tempSpace = tempNode->style[local - 3];tempNode->style[local - 3] = tempNode->style[local];tempNode->style[local] = tempSpace;judge3();}if(endKey)break;if(local % 3 < 2)// 左移{equalKey = 1;tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = openHead->next->style[i];tempSpace = tempNode->style[local + 1];tempNode->style[local + 1] = tempNode->style[local];tempNode->style[local] = tempSpace;judge3();}if(endKey)break;if(local < 6)// 上移{equalKey = 1;tempNode = new node();//tempNode = malloc(sizeof(struct node));for(i = 0;i < 9;i++)tempNode->style[i] = openHead->next->style[i];tempSpace = tempNode->style[local + 3];tempNode->style[local + 3] = tempNode->style[local];tempNode->style[local] = tempSpace;judge3();}if(endKey)break;closed->next = openHead->next;// 把 open 的标头增添到closed 表中openHead->next = openHead->next->next;closed = closed->next;closed->next = closedHead;write2txt();}open 表中open->next = tempNode;// 把找到的新节点增添到tempNode->next = openHead;tempNode->father = openHead->next;open = open->next;closed 表中closed->next = openHead->next; //把 open 的标头增添到openHead->next = openHead->next->next;closed = closed->next;closed->next = closedHead;write2txt();answer = new node();tempNode = new node();tempNode = open;while(tempNode->style[0] != 9)//将结果路径存于answer{answer = tempNode;tempNode = tempNode->father;tempNode->next = answer;}num = 0;while(answer->next->style[0] != 9)//输出answer{printf("***********第%d 步***********\n",num++);print(answer);answer = answer->next;printf("\n");}printf("***********第 %d 步 ***********\n",num++);print(answer);if(answer->style[3] != standard1[3])printf("\n!! 输入的八数码不合法,不可以从初始状态到最后状态\n\n\n\n");return;}4.A 算法/***************说明 ************************* A 算法实现八数码问题********************************************/#include<iostream>#include<fstream>#include<iomanip>using namespace std;void print(struct node *temp);int wholeStyle[9] = {2,8,3,1,6,4,7,0,5};int standard1[9] = {1,2,3,8,0,4,7,6,5};int local,i,j;int tempSpace;struct node *openHead,*open; //open 表struct node *closedHead,*closed; //closed 表struct node *tempNode; //临节气点struct node *answer; // 找到的路径int num = 0;bool endKey;struct node{int depth;int judgement_based;int style[9];struct node *next;struct node *father;};void updateData()//更新要判断数据{int i;cout<<" 请输入八数码原始状态:"<<endl;for(i = 0;i < 9;i++)cin>>wholeStyle[i];cout<<" 请输入八数码最后状态:"<<endl;for(i = 0;i < 9;i++)cin>>standard1[i];}int judge1(struct node *head)// 判断空格地点{for(i = 0;i < 9;i++){if(head->style[i] == 0)return i;}}int evaluation_function(struct node *head) //计算不在正确地点的点的个数{int not_correct_position = 0;for(i = 0;i < 9;i++)if((head->style[i] != 0)&&(head->style[i] != standard1[i]))not_correct_position++;return not_correct_position;}void print(struct node *temp)// 输出八数码表{for(j = 0;j < 9;j++){if(temp->style[j] == 0)cout<<" \t";elsecout<<temp->style[j]<<"\t";if((j + 1) % 3 == 0)cout<<endl;}}void write2txt()// 将过程记录到文本文档中{ofstream out("F:\\out_details4.txt",ios::app);if( out.fail() ){cerr<<" 未找到文件 "<<endl;}out<<"第 "<<++num<<" 步 \n";out<<"open table : \n";while(openHead->next->style[0] != 9){for(i = 0;i < 9;i ++){out<<openHead->next->style[i]<<"\t";if((i+1) % 3 == 0)out<<"\n";}out<<" 估值: ";out<<openHead->next->judgement_based<<"\n";openHead = openHead->next;}openHead = openHead->next;out<<"*********************\n";out<<"closed table : \n";while(closedHead->next->style[0] != 9){for(i = 0;i < 9;i ++){out<<closedHead->next->style[i]<<"\t";if((i + 1) % 3 ==0)out<<"\n";}out<<"深度:"<<closedHead->next->depth<<"估值:"<<closedHead->next->judgement_based<<"\n";closedHead = closedHead->next;}closedHead = closedHead->next;out<<"-----------------------------------\n";out.close();}void basic_exchange_oper()// 每一次基本的互换都要进行的动作{if(judge1(tempNode) != judge1(closed->father))// 当重生成节点的空格地点与 closed 父亲节点的空格地点不相等{tempNode->father = closed; // 重生成节点的指向它的父亲节点 tempNode->depth =closed->depth + 1;// 深度加 1 tempNode->judgement_based =evaluation_function(tempNode) + tempNode->depth;//计算估值while(openHead->next->style[0] != 9){if(tempNode->judgement_based > openHead->next->judgement_based){openHead = openHead->next;}else{tempNode->next = openHead->next;openHead->next = tempNode;openHead = open->next;return;}}//插入的值比最后一个还大进行下边的操作openHead = open->next;// 先恢复表头不然 Head 指向为最后一个open->next = tempNode;tempNode->next = openHead;open = open->next;return;}}void main(){//updateData();// 输入八数码数据openHead = new node();//初始化 open 表open = new node();openHead->style[0] = 9;openHead->next = open;for(i = 0;i < 9;i++)open->style[i] = wholeStyle[i];open->next = openHead;open->father = openHead;open->depth = 0;open->judgement_based = evaluation_function(open) + open->depth;// 这行能够不写closedHead = new node(); //初始化 closed 表closed = new node();closedHead->style[0] = 9;closedHead->next = closedHead;closed = closedHead;int min_judgement1 = open->judgement_based;while(open->style[0] != 9)//当open表不为空时向来循环{//updateData();// 输入八数码数据write2txt();closed->next = openHead->next;//把 open 表中第一组八数码移到closed 表中openHead->next = openHead->next->next;closed = closed->next;closed->next = closedHead;if(openHead->next->style[0] == 9)// 假如是第一次则 open 暂时指向openHead open = openHead;if(closed->judgement_based == closed->depth)// 判断新移进 closed 表中的八数码的 f 值能否等于它的层数{cout<<"succeed!"<<endl;write2txt();answer = new node();while(closed->style[0] != 9)// 将结果存于answer 表中{answer = closed;closed = closed->father;closed->next = answer;}num = 0;while(answer->style[0] != 9)//控制台显示步骤{cout<<"****** 第 "<<num++<<" 步 ***********\n";print(answer);cout<<endl;answer = answer->next;}return;}else //假如 closed 表末的八数码是最后状态则拓展新的八数码{local = judge1(closed);if(local % 3 > 0)// 右移{tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = closed->style[i];tempSpace = tempNode->style[local - 1];tempNode->style[local - 1] = tempNode->style[local];tempNode->style[local] = tempSpace;basic_exchange_oper();}if(local < 6)// 上移{tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = closed->style[i];tempSpace = tempNode->style[local + 3];tempNode->style[local + 3] = tempNode->style[local];tempNode->style[local] = tempSpace;basic_exchange_oper();}if(local > 2)// 下移{tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = closed->style[i];tempSpace = tempNode->style[local - 3];tempNode->style[local - 3] = tempNode->style[local];tempNode->style[local] = tempSpace;basic_exchange_oper();}if(local % 3 < 2)// 左移{tempNode = new node();for(i = 0;i < 9;i++)tempNode->style[i] = closed->style[i];tempSpace = tempNode->style[local + 1];tempNode->style[local + 1] = tempNode->style[local];tempNode->style[local] = tempSpace;basic_exchange_oper();}}}cout<<"false!"<<endl;}神经网络实验群神经网络实验一、实验目的:理解反向流传网络的构造和原理,掌握反向流传算法对神经元的训练过程,认识反向流传公式。

人工智能与计算机基础实验报告

人工智能与计算机基础实验报告

人工智能与计算机基础实验报告《人工智能与计算机基础实验报告》嘿!同学们,你们知道吗?最近我参加了一个超级酷的活动——人工智能与计算机基础实验!这可真是让我大开眼界,就像走进了一个充满魔法的世界。

一开始,老师带着我们走进实验室,哇塞,那一排排的电脑,闪闪发光的屏幕,就好像在对我说:“快来探索我们的秘密吧!”我心里那个激动呀,简直没法形容。

我们分成了几个小组,每个小组都有一台电脑可以操作。

我和我的小伙伴们围坐在一起,眼睛都紧紧地盯着屏幕,迫不及待地想要开始实验。

老师先给我们介绍了什么是人工智能,他说:“人工智能就像是一个超级聪明的大脑,能帮我们解决很多复杂的问题。

”我心里想:“真的有这么神奇吗?”然后,我们开始了第一个实验,是关于图像识别的。

老师给我们展示了一张图片,让我们猜猜电脑能不能认出图片里的东西。

我心里直犯嘀咕:“这能行吗?”结果,电脑一下子就说出了图片里是一只可爱的小狗!这也太厉害了吧,难道电脑也有眼睛不成?接着,我们又尝试了语音识别的实验。

我对着麦克风说了一句话:“今天天气真好!”电脑居然一字不差地把我说的话显示在了屏幕上。

这难道不是像有一个隐形的小精灵在电脑里偷听我说话吗?在实验过程中,我和小伙伴们可兴奋啦!“哎呀,这个太好玩啦!”“快看,又成功啦!”我们的笑声和惊叹声在实验室里回荡。

小组里的小明还出了个主意,说:“咱们试试说一句很难的话,看看电脑能不能听懂。

”于是,我就说了一句绕口令:“打南边来了个吃葡萄不吐葡萄皮的喇嘛,打北边来了留恋榴莲甜的哑巴。

”结果电脑被我们弄得晕头转向,我们哈哈大笑起来。

后来,我们还学习了一些简单的计算机编程。

这就像是在给计算机下达命令,让它按照我们的想法做事。

我感觉自己就像是一个指挥官,指挥着计算机这个“小兵”冲锋陷阵。

通过这次实验,我深深地感受到了人工智能和计算机的神奇之处。

它们就像是一把神奇的钥匙,能打开无数未知的大门,带我们走进一个全新的世界。

难道我们不应该好好学习这些知识,去探索更多的奥秘吗?我相信,在未来,人工智能和计算机一定会给我们的生活带来更多的惊喜和便利!这就是我的实验报告,同学们,你们是不是也觉得很有趣呢?。

人工智能实验报告

人工智能实验报告

人工智能实验报告摘要:人工智能(AI)是一种模拟和模仿人类智能的技术,它可以模拟人类的思维和决策过程。

本实验报告旨在介绍人工智能的基本概念、发展历程、应用领域以及实验结果。

实验结果显示,人工智能在各个领域都取得了显著的成果,并且在未来的发展中有着广泛的应用前景。

引言:人工智能是一个非常有趣和有挑战性的领域,吸引了许多研究人员和企业的关注。

人工智能技术可以应用于各种领域,包括医疗、金融、交通、教育等。

本实验报告将通过介绍人工智能的基本概念和应用案例,以及展示实验结果,来展示人工智能的潜力和发展前景。

一、人工智能的基本概念人工智能是一种模拟和模仿人类智能的技术,主要包括以下几个方面:1. 机器学习:机器学习是人工智能的一个重要分支,它通过让机器学习自己的模式和规则来实现智能化。

机器学习的方法包括监督学习和无监督学习。

2. 深度学习:深度学习是机器学习的一个子集,它模拟了人类大脑的神经网络结构,可以处理更复杂的问题并取得更好的结果。

3. 自然语言处理:自然语言处理是指让计算机理解和处理人类语言的能力。

这个领域涉及到语音识别、语义分析、机器翻译等技术。

二、人工智能的发展历程人工智能的发展可以追溯到上世纪50年代,当时研究人员开始探索如何使计算机具备智能。

但是由于当时计算机的处理能力和算法的限制,人工智能的发展进展缓慢。

直到近年来,随着计算机技术和机器学习算法的快速发展,人工智能迎来了一个新的发展阶段。

如今, 人工智能技术在各个领域中得到了广泛的应用。

三、人工智能的应用领域1. 医疗领域:人工智能可以应用于医疗影像分析、疾病诊断和预测等方面。

例如,利用人工智能技术,可以提高病理切片的诊断准确率,帮助医生更好地判断病情。

2. 金融领域:人工智能可以应用于风险管理、投资决策和交易监测等方面。

例如,利用机器学习和数据分析,可以预测股票市场的走势并制定相应的投资策略。

3. 交通领域:人工智能可以应用于交通管理、无人驾驶和交通预测等方面。

人工智能_实验报告

人工智能_实验报告

人工智能_实验报告在当今科技飞速发展的时代,人工智能(Artificial Intelligence,简称 AI)已经成为了备受瞩目的领域。

为了更深入地了解人工智能的原理和应用,我们进行了一系列的实验。

本次实验的目的是探究人工智能在不同场景下的表现和能力,以及其对人类生活和工作可能产生的影响。

实验过程中,我们使用了多种技术和工具,包括机器学习算法、深度学习框架以及大量的数据样本。

首先,我们对图像识别这一领域进行了研究。

通过收集大量的图像数据,并使用卷积神经网络(Convolutional Neural Network,简称 CNN)进行训练,我们试图让计算机学会识别不同的物体和场景。

在实验中,我们发现,随着训练数据的增加和网络结构的优化,计算机的图像识别准确率得到了显著提高。

然而,在面对一些复杂的图像,如光线昏暗、物体遮挡等情况下,识别效果仍有待提升。

接着,我们转向了自然语言处理(Natural Language Processing,简称 NLP)的实验。

利用循环神经网络(Recurrent Neural Network,简称RNN)和长短时记忆网络(Long ShortTerm Memory,简称 LSTM),我们尝试让计算机理解和生成人类语言。

在文本分类和情感分析任务中,我们取得了一定的成果,但在处理语义模糊和上下文依赖较强的文本时,计算机仍会出现理解偏差。

在实验过程中,我们还遇到了一些挑战和问题。

数据的质量和数量对人工智能模型的性能有着至关重要的影响。

如果数据存在偏差、噪声或不完整,模型可能会学到错误的模式,从而导致预测结果不准确。

此外,模型的训练时间和计算资源需求也是一个不容忽视的问题。

一些复杂的模型需要在高性能的计算机集群上进行长时间的训练,这对于普通的研究团队和个人来说是一个巨大的负担。

为了应对这些问题,我们采取了一系列的措施。

对于数据质量问题,我们进行了严格的数据清洗和预处理工作,去除噪声和异常值,并通过数据增强技术增加数据的多样性。

人工智能实验报告

人工智能实验报告

人工智能实验报告
一、实验介绍
人工智能(Artificial Intelligence,AI)是计算机科学的一个领域,以模拟或增强人类智能的方式来实现人工智能。

本实验是基于Python的人工智能实验,使用Python实现一个简单的语音识别系统,可以识别出句话中的关键词,识别出关键词后给出相应的回答。

二、实验内容
1.安装必要的Python库
在使用Python进行人工智能实验前,需要先安装必要的Python库,例如NumPy、SciPy、Pandas等。

2.准备必要的数据集
为避免过拟合,需要准备数据集并对数据进行分离、标准化等处理,以便为训练和测试模型提供良好的环境。

3.训练语音识别模型
使用Python的TensorFlow库训练语音识别模型,模型会自动学习语音特征,以便准确地识别语音输入中的关键词。

4.实现语音识别系统
通过训练好的语音识别模型,使用Python实现一个简单的语音识别系统,实现从语音输入中识别出句话中的关键词,并给出相应的回答。

三、实验结果
本实验使用Python编写了一个简单的语音识别系统,实现从语音输
入中识别出句话中的关键词,并给出相应的回答。

通过对训练数据集的训练,模型可以准确地识别语音输入中的关键词,对测试数据集的准确率达到了87.45%,表示模型的效果较好。

四、总结。

人工智能十五数码实验报告

人工智能十五数码实验报告

目录1 实验概述 (2)2 十五数码问题分析 (2)2.1十五数码问题简介 (2)2.2可行性分析 (3)3问题的求解策略 (3)3.1算法分析 (3)3.2 A*算法设计 (4)4 实验总结 (5)4.1 实验可视化界面 (5)4.2个人体会 (7)4.3 详细代码: 71 实验概述十五数码问题来源于美国的科学魔术大师萨姆.洛伊德(Sam I.oyd)在1978年推出的著名的“14-15”智力玩具。

这个游戏曾经风靡欧美大陆" 。

洛伊德的发明其实只是将重排九宫(即八数码问题)中的3阶方阵扩大到4 阶方阵罢了。

由于这个细微的变化, 十五数码问题的规模远远大于八数码问题, 八数码问题的规模较小, 总的状态数为9!(=362880)个, 而十五数码问题的状态,数为16!()个。

故十五数码问题更能评价一个算法的“智能”水平。

2 十五数码问题分析2.1十五数码问题简介15数码问题又叫移棋盘问题, 是人工智能中的一个经典问题。

所谓的15数码问题: 就是在一个4×4的16宫格棋盘上, 摆放有15个将牌, 每一个将牌都刻有1~15中的某一个数码。

棋盘中留有一个空格, 允许其周围的某一个将牌向空格移动, 这样通过移动将牌就可以不断改变将牌的布局。

这种求解的问题是: 给定一种初始的将牌布局或结构(称初始状态)和一个目标布局(称目标状态), 问如何移动数码, 实现从初始状态到目标状态的转变, 如下图所示。

问题的实质就是寻找一个合法的动作序列2.2可行性分析十五数码问题存在无解的情况,当遍历完所有可扩展的状态也没有搜索到目标状态就判断为无解。

可以根据状态的逆序数来先验的判断是否有解,当初始状态的逆序数和目标状态的逆序数的奇偶性相同时,问题有解;否则问题无解。

状态的逆序数是定义如下: 把四行数展开排成一行,并且丢弃数字0 不计入其中,ηi是第i 个数之前比该数小的数字的个数,则η=Σηi 是该状态的逆序数,例如: 对于初始状态: 5.1.2.4.9、 6.3.8、13.15.10、11.14.7、12.其η=0+0+1+2+4+4+2+6+8+9+8+9+11+6+11=81;对于目标状态: 1.2.3.4.5.6.7、8、9、10、11.12.13.14.15, 其η=0+1+2+3+4+5+6+7+8+9+10+11+12+13+14=105。

《人工智能》实验报告

《人工智能》实验报告

《人工智能》实验报告人工智能实验报告引言人工智能(Artificial Intelligence,简称AI)是近年来备受瞩目的前沿科技领域,它通过模拟人类智能的思维和行为,使机器能够完成复杂的任务。

本次实验旨在探索人工智能的应用和局限性,以及对社会和人类生活的影响。

一、人工智能的发展历程人工智能的发展历程可以追溯到上世纪50年代。

当时,科学家们开始研究如何使机器能够模拟人类的思维和行为。

经过几十年的努力,人工智能技术得到了长足的发展,涵盖了机器学习、深度学习、自然语言处理等多个领域。

如今,人工智能已经广泛应用于医疗、金融、交通、娱乐等各个领域。

二、人工智能的应用领域1. 医疗领域人工智能在医疗领域的应用已经取得了显著的成果。

通过分析大量的医学数据,人工智能可以辅助医生进行疾病诊断和治疗方案的制定。

此外,人工智能还可以帮助医疗机构管理和优化资源,提高医疗服务的效率和质量。

2. 金融领域人工智能在金融领域的应用主要体现在风险评估、交易分析和客户服务等方面。

通过分析大量的金融数据,人工智能可以帮助金融机构预测市场趋势、降低风险,并提供个性化的投资建议。

此外,人工智能还可以通过自动化的方式处理客户的投诉和咨询,提升客户满意度。

3. 交通领域人工智能在交通领域的应用主要体现在智能交通管理系统和自动驾驶技术上。

通过实时监测和分析交通流量,人工智能可以优化交通信号控制,减少交通拥堵和事故发生的可能性。

同时,自动驾驶技术可以提高交通安全性和驾驶效率,减少交通事故。

三、人工智能的局限性与挑战1. 数据隐私和安全问题人工智能需要大量的数据进行训练和学习,但随之而来的是数据隐私和安全问题。

个人隐私数据的泄露可能导致个人信息被滥用,甚至引发社会问题。

因此,保护数据隐私和加强数据安全是人工智能发展过程中亟需解决的问题。

2. 伦理和道德问题人工智能的发展也引发了一系列伦理和道德问题。

例如,自动驾驶车辆在遇到无法避免的事故时,应该如何做出选择?人工智能在医疗领域的应用是否会导致医生失业?这些问题需要我们认真思考和解决,以确保人工智能的发展符合人类的价值观和道德规范。

用A算法解决十五数码问题

用A算法解决十五数码问题

精心整理一、15数码问题的描述及其状态空间法表示(1)15数码问题描述15数码问题又叫移棋盘问题,是人工智能中的一个经典问题。

所谓的15数码问题:就是在一个4×4的16宫格棋盘上,摆放有15个将牌,每一个将牌都刻有1~15中的某一个数码。

棋盘中留有一个空格,允许其周围的某一个将牌向空格移动,这样通过移动将牌就可以不断改变将牌的布局。

这种求解的问题是:给定一种初始的将牌布局或结构(称初始状态)和一个目标布局(称目标状态),问如何移动数码,实现从初始状态到目标状态的转变,如图1所示。

问题的实质就是寻找一个合法的目标状态集合。

十五数码的状态空间法:初始状态S[4][4]={5,12,11,4,13,6,3,10,14,2,7,9,1,15,0,8};(0表示空格)目标状态G[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};操作符集合F={空格上移,空格下移,空格左移,空格右移}状态空间的一个解:是一个有限的操作算子序列,它使初始状态转化为目标状态:S0-f1->S1-f2->...fk->G。

二、A*算法的基本原理、算法步骤、流程图(1)A*算法基本原理A*算法是一种有序搜索算法,其特点在于对评价函数的定义上。

对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。

因此,f是根据需要找到一条最小代价路径的观点来估算节点的,可考虑将每个节点n的估价函数值分解为两个分量:从起始节点到节点n的最小代价路径的代价与从节点n到目标节点的最小代价路径的代价之和,也就是说f(n)是约束通过节点n的一条最小代价路径的代价的一个估计。

再定义一个函数f*,使得在任意一个节点n上的函数值f*(n)就是从节点S到节点n的一条最佳路径的实际代价加上从节点n到目标节点的一条最佳路径的代价之和,即:***在第7步中,如果搜索过程发现一条路径到达一个节点的代价比现存的路径代价低,就要重定向指向该节点的指针。

人工智能实验报告(二)2024

人工智能实验报告(二)2024

人工智能实验报告(二)
引言概述:
本文是关于人工智能实验的报告,主要研究了人工智能技术在
不同领域应用的情况。

通过实验,我们探讨了人工智能在语音识别、图像处理、自然语言处理、机器学习和智能推荐等方面的应用。


过这些实验,我们可以深入了解人工智能技术的发展和应用前景。

正文内容:
1. 语音识别
- 分析语音识别技术的基本原理和方法
- 探索语音识别在智能助手、语音控制和语音翻译等领域的应

- 研究不同语音识别算法的准确性和鲁棒性
2. 图像处理
- 研究图像处理算法及其在人脸识别、图像识别和图像增强等
方面的应用
- 比较不同图像处理算法的效果和性能
- 探讨图像处理技术在医疗、安防和智能交通等领域的潜力
3. 自然语言处理
- 分析自然语言处理技术的研究方向和应用场景
- 探讨自然语言处理在智能客服、文本分类和情感分析等方面
的应用
- 研究不同自然语言处理模型的性能和可扩展性
4. 机器学习
- 研究机器学习算法的基本原理和发展趋势
- 探索机器学习在数据挖掘、预测分析和推荐系统等领域的应用
- 比较不同机器学习算法的准确性和效率
5. 智能推荐
- 分析智能推荐算法的特点和应用场景
- 探讨智能推荐在电商、社交媒体和音乐平台等领域的应用
- 研究不同智能推荐算法的精度和个性化程度
总结:
通过本次实验,我们对人工智能技术在不同领域的应用有了更深入的了解。

语音识别、图像处理、自然语言处理、机器学习和智能推荐等方面的技术都展现出了巨大的潜力和发展空间。

随着人工智能技术的不断进步,我们可以期待在未来的各个领域看到更多创新和应用。

人工智能技术实训报告

人工智能技术实训报告

一、实训背景随着人工智能技术的快速发展,其在各行各业的应用日益广泛。

为了紧跟时代步伐,提高自身技能,我参加了人工智能技术实训。

本次实训旨在了解人工智能的基本原理、应用场景,掌握相关技术,并培养实际操作能力。

二、实训目标1. 熟悉人工智能的基本概念、原理和发展趋势。

2. 掌握常见的人工智能算法和应用场景。

3. 学习并实践人工智能开发工具和平台。

4. 提高实际操作能力,解决实际问题。

三、实训内容1. 人工智能基础知识本次实训首先对人工智能的基本概念、原理和发展趋势进行了学习。

了解了人工智能的定义、发展历程、应用领域以及未来发展趋势。

学习了人工智能的三大流派:符号主义、连接主义和强化学习。

2. 人工智能算法实训中,我们学习了常见的人工智能算法,包括:(1)监督学习:线性回归、逻辑回归、支持向量机(SVM)、决策树、随机森林等。

(2)无监督学习:聚类、关联规则、主成分分析(PCA)等。

(3)强化学习:Q学习、深度Q网络(DQN)等。

3. 人工智能开发工具和平台实训中,我们学习了以下人工智能开发工具和平台:(1)Python编程语言及其相关库:NumPy、Pandas、Scikit-learn、TensorFlow、Keras等。

(2)Jupyter Notebook:用于编写和运行Python代码。

(3)TensorFlow:用于构建和训练深度学习模型。

(4)Keras:基于TensorFlow的深度学习库。

4. 实践项目在实训过程中,我们完成了以下实践项目:(1)使用Python编程语言和Scikit-learn库实现线性回归、逻辑回归等算法,并分析数据。

(2)使用TensorFlow和Keras库构建和训练神经网络,实现图像分类、语音识别等任务。

(3)利用ROS机器人实训平台进行机器人编程,实现路径规划、避障等功能。

四、实训成果1. 掌握了人工智能的基本原理、算法和应用场景。

2. 熟练运用Python编程语言及其相关库进行数据分析和模型构建。

人工智能实验报告大全

人工智能实验报告大全

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

二、编程环境VC语言三、问题描述房子里有一只猴子(即机器人),位于a处。

在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。

房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。

如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。

要求通过VC语言编程实现猴子摘香蕉问题的求解过程。

图1 猴子摘香蕉问题四、源代码#include<stdio.h>unsigned int i;void Monkey_Go_Box(unsigned char x, unsigned char y){printf("Step %d:monkey从%c走到%c\n", ++i, x, y);//x表示猴子的位置,y为箱子的位置}void Monkey_Move_Box(char x, char y){printf("Step %d:monkey把箱子从%c运到%c\n", ++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 Monkey, Box, Banana;printf("********智能1501班**********\n");printf("********06153034************\n");printf("********刘少鹏**************\n");printf("请用a b c来表示猴子箱子香蕉的位置\n");printf("Monkey\tbox\tbanana\n");scanf("%c", &Monkey);getchar();printf("\t");scanf("%c", &Box);getchar();printf("\t\t");scanf("%c", &Banana);getchar();printf("\n操作步骤如下\n");if (Monkey != Box){Monkey_Go_Box(Monkey, Box);}if (Box != Banana){Monkey_Move_Box(Box, Banana);}Monkey_On_Box();Monkey_Get_Banana();printf("\n");getchar();}五、实验结果相关截图六、心得体会通过本次实验,我初步了学会了使用VC的新建工程,并且进行简单的程序编写。

人工智能实验2报告

人工智能实验2报告
//h(n) { int c=0; //启发函数值 for(int i=0;i<=8;i++) if(cb[i]!=cbg[i]) //将当前棋盘 cb[]与目标棋盘 cbg[]比较 if(cbg[i]!=0) // 除去空格 c++; return c; } //扩展节点 TEM,depth 为 TEM 节点深度,tag 为扩展子节点时使用的规则 NodeLink *makenode(NodeLink *TEM,int depth,int tag) { NodeLink *temp=new NodeLink; // 将 temp 初始设置为待扩展节点 TEM 的值 for(int i=0;i<=8;i++) temp->cs.pos[i]=TEM->cs.pos[i];
OPEN=addnode(OPEN,makenode(TEMP,depth,1);//将 TEMP 棋盘中的空格左 //移 1 格生成子节点并加入到 OPEN 表最前面
if(TEMP->cs.pos[0]+1<=8) //如果空格至少在棋盘第 9 个位置前,空格才 //能右移 1 格
if(TEMP->cs.e!=1) )//如果当前棋盘不是通过空格左移 1 格得到的,防止棋子回 //到原状态
北京联合大学自动化学院实践教学报告用纸
第4页
//根据不同的规则生成 TEM 的子节点 temp switch(tag) { case 1: // 空格左移 1 格,即空格左边棋子右移 1 格,生成子节点 temp { temp->cs.pos[0]--; // 空格左移 1 格 temp->cs.pos[cbt[temp->cs.pos[0]]]++; //空格左边棋子右移 1 格 break; } case 2: // 空格右移 1 格,即空格右边棋子左移 1 格,生成子节点 temp { temp->cs.pos[0]++; // 空格右移 1 格 temp->cs.pos[cbt[temp->cs.pos[0]]]--; //空格右边棋子左移 1 格 break; } case 3: // 空格上移 1 格, 即空格上边棋子下移 1 格,生成子节点 temp { temp->cs.pos[0]-=3; // 空格上移 1 格 temp->cs.pos[cbt[temp->cs.pos[0]]]+=3; // 空格上边棋子下移 1 格 break; } case 4: // 空格下移 1 格,即空格下边棋子上移 1 格,生成子节点 temp { temp->cs.pos[0]+=3; // 空格下移 1 格 temp->cs.pos[cbt[temp->cs.pos[0]]]-=3; //空格下边棋子上移 1 格 break; } } temp->cs.d=depth+1; // 设置子节点 temp(当前棋局)深度 synchronize(cbt,temp->cs.pos,1); // 把当前棋局 temp 输出到 cbt 数组中 temp->cs.f=temp->cs.d+valuew(cbt,1); //计算当前棋局 temp 的评价函数值 temp->cs.e=tag; //记录生成子节点 temp 时使用的规则 temp->parent=TEM;// //记录子节点 temp 的父节点 return temp; //返回子节点 temp }

AI人工智能实验报告

AI人工智能实验报告

AI人工智能实验报告引言:人工智能(Artificial Intelligence,简称AI)是一项使用计算机技术模拟和复制人的智能的研究与应用。

AI的发展已经引发了广泛的关注和应用,被认为具有革命性的影响。

本实验旨在探索AI在不同领域中的应用,以及其对社会和经济的潜在影响。

实验方法:1. 实验步骤:(详细描述实验步骤,例如训练AI模型,收集和处理数据等)2. 实验材料:(列出实验所用的软件、硬件设备,以及实验所需要的数据)3. 实验设计:(阐述实验的目的和假设,如何设计实验来验证假设,并选择合适的评估指标)实验结果:通过实验的进行我们得到了以下结果:1. 在医疗领域中,AI能够准确识别影像中的疾病和异常情况。

经过训练,AI模型可以对X光片、MRI扫描等进行自动诊断,且诊断结果的准确率超过了人类医生的水平。

2. 在交通领域,AI技术被广泛应用于自动驾驶汽车的开发。

通过搜集和分析大量的交通数据和驾驶行为,AI能够实现智能规划路线、减少交通事故并提高驾驶效率。

3. 在金融领域,AI能够分析海量的金融数据,并根据市场趋势进行智能投资决策。

通过机器学习和数据挖掘的方法,AI能够识别潜在的交易风险,并提供可靠的投资建议。

4. 在教育领域,AI技术被应用于个性化教学和智能辅导。

AI能够根据学生的学习进度和学习习惯,提供个性化的学习建议和辅导,提高学生的学习效果。

实验讨论:根据实验结果的分析和讨论,我们可以得出以下结论:1. AI在医疗领域的应用能够提高诊断的准确性和效率,对于改善医疗服务质量具有重要意义。

2. 自动驾驶技术的发展可能会改变未来的交通方式,并促进交通安全和节能减排。

3. 金融领域的AI应用不仅能提高投资决策的准确性,还能优化交易流程,提高金融市场的运行效率。

4. 教育领域的AI应用有助于满足不同学生的学习需求,促进个性化教育的发展。

结论:AI人工智能在医疗、交通、金融和教育等领域的应用给社会带来了巨大的改变和机遇。

人工智能实验报告

人工智能实验报告

人工智能实验报告一、实验背景随着科技的迅猛发展,人工智能(AI)已经成为当今世界最具影响力的技术之一。

它在各个领域的应用不断拓展,从医疗保健到金融服务,从交通运输到娱乐产业,都能看到人工智能的身影。

为了更深入地了解人工智能的工作原理和性能表现,我们进行了一系列的实验。

二、实验目的本次实验的主要目的是探究人工智能在不同任务中的能力和局限性,评估其对数据的处理和分析能力,以及观察其在复杂环境中的学习和适应能力。

三、实验设备与环境我们使用了高性能的计算机服务器,配备了先进的图形处理单元(GPU),以加速模型的训练和运算。

实验所使用的软件包括主流的深度学习框架,如 TensorFlow 和 PyTorch 等。

实验环境为一个安静、稳定的实验室,确保实验过程不受外界干扰。

四、实验内容1、图像识别任务我们选取了大规模的图像数据集,如 ImageNet ,让人工智能模型学习识别不同的物体类别。

通过调整模型的架构和参数,观察其在图像分类任务中的准确率和召回率的变化。

2、自然语言处理任务利用大规模的文本数据集,如维基百科和新闻文章,训练人工智能模型进行文本分类、情感分析和机器翻译等任务。

比较不同模型在处理自然语言时的表现和效果。

3、强化学习任务通过构建虚拟环境,让人工智能模型通过与环境的交互和试错来学习最优的行为策略。

例如,在游戏场景中,让模型学习如何取得最高分或最优的游戏结果。

五、实验步骤1、数据准备首先,对收集到的图像和文本数据进行清洗和预处理,包括去除噪声、转换数据格式、标记数据类别等。

2、模型选择与构建根据实验任务的特点,选择合适的人工智能模型架构,如卷积神经网络(CNN)用于图像识别,循环神经网络(RNN)或长短时记忆网络(LSTM)用于自然语言处理。

3、模型训练使用准备好的数据对模型进行训练,调整训练参数,如学习率、迭代次数、批量大小等,以获得最佳的训练效果。

4、模型评估使用测试数据集对训练好的模型进行评估,计算各种性能指标,如准确率、召回率、F1 值等,以衡量模型的性能。

人工智能 实验报告

人工智能 实验报告

人工智能实验报告人工智能实验报告引言:人工智能(Artificial Intelligence,简称AI)是一门研究如何使计算机能够像人类一样思考、学习和解决问题的科学。

随着科技的发展,人工智能已经在各个领域展现出巨大的潜力和应用价值。

本实验报告将介绍我对人工智能的实验研究和探索。

一、人工智能的定义与分类人工智能是指通过计算机技术实现的、模拟人类智能的一种能力。

根据不同的研究方向和应用领域,人工智能可以分为强人工智能和弱人工智能。

强人工智能是指能够完全模拟人类智能的计算机系统,而弱人工智能则是指在特定领域内模拟人类智能的计算机系统。

二、人工智能的应用领域人工智能的应用领域非常广泛,包括但不限于以下几个方面:1. 机器学习机器学习是人工智能的核心技术之一,通过让计算机从大量数据中学习并自动调整算法,实现对未知数据的预测和分析。

机器学习已经在图像识别、语音识别、自然语言处理等领域取得了重大突破。

2. 自动驾驶自动驾驶是人工智能在交通领域的应用之一,通过计算机系统对车辆的感知、决策和控制,实现无人驾驶。

自动驾驶技术的发展将极大地提升交通安全性和效率。

3. 机器人技术机器人技术是人工智能在制造业和服务业中的应用之一,通过模拟人类的感知、思考和行动能力,实现自主操作和协作工作。

机器人技术已经广泛应用于工业生产、医疗护理、农业等领域。

4. 金融科技金融科技是人工智能在金融行业中的应用之一,通过数据分析和算法模型,实现智能风控、智能投资和智能客服等功能。

金融科技的发展将推动金融行业的创新和变革。

三、人工智能的挑战与未来发展尽管人工智能取得了许多成果,但仍然面临着一些挑战和难题。

首先,人工智能的算法和模型需要更加精确和可解释,以提高其可靠性和可信度。

其次,人工智能的伦理和法律问题也需要重视和解决,例如隐私保护、人工智能武器等。

此外,人工智能的发展还受到数据质量和计算能力的限制。

然而,人工智能的未来发展依然充满希望。

人工智能实验报告范文

人工智能实验报告范文

人工智能实验报告范文一、实验名称。

[具体的人工智能实验名称,例如:基于神经网络的图像识别实验]二、实验目的。

咱为啥要做这个实验呢?其实就是想搞清楚人工智能这神奇的玩意儿是咋在特定任务里大显神通的。

比如说这个实验,就是想看看神经网络这个超酷的技术能不能像人眼一样识别图像中的东西。

这就好比训练一个超级智能的小助手,让它一眼就能看出图片里是猫猫还是狗狗,或者是其他啥玩意儿。

这不仅能让我们深入了解人工智能的工作原理,说不定以后还能应用到好多超有趣的地方呢,像智能安防系统,一眼就能发现监控画面里的可疑人物或者物体;或者是在医疗影像识别里,帮助医生更快更准地发现病症。

三、实验环境。

1. 硬件环境。

咱用的电脑就像是这个实验的战场,配置还挺重要的呢。

我的这台电脑处理器是[具体型号],就像是大脑的核心部分,负责处理各种复杂的计算。

内存有[X]GB,这就好比是大脑的短期记忆空间,越大就能同时处理越多的数据。

显卡是[显卡型号],这可是在图像识别实验里的得力助手,就像专门负责图像相关计算的小专家。

2. 软件环境。

编程用的是Python,这可是人工智能领域的明星语言,简单又强大。

就像一把万能钥匙,可以打开很多人工智能算法的大门。

用到的深度学习框架是TensorFlow,这就像是一个装满各种工具和模型的大工具箱,里面有好多现成的函数和类,能让我们轻松搭建神经网络,就像搭积木一样简单又有趣。

四、实验原理。

神经网络这个概念听起来就很科幻,但其实理解起来也不是那么难啦。

想象一下,我们的大脑是由无数个神经元组成的,每个神经元都能接收和传递信息。

神经网络也是类似的,它由好多人工神经元组成,这些神经元分层排列,就像一个超级复杂的信息传递网络。

在图像识别里,我们把图像的数据输入到这个网络里,第一层的神经元会对图像的一些简单特征进行提取,比如说图像的边缘、颜色的深浅等。

然后这些特征会被传递到下一层神经元,下一层神经元再对这些特征进行组合和进一步处理,就像搭金字塔一样,一层一层地构建出对图像更高级、更复杂的理解,最后在输出层得出图像到底是什么东西的结论。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录1 实验概述 (2)2 十五数码问题分析 (2)2.1十五数码问题简介 (2)2.2可行性分析 (3)3问题的求解策略 (3)3.1算法分析 (3)3.2 A*算法设计 (4)4 实验总结 (5)4.1 实验可视化界面 (5)4.2个人体会 (6)4.3 详细代码: (7)1 实验概述十五数码问题来源于美国的科学魔术大师萨姆.洛伊德(Sam I.oyd)在1978年推出的著名的“14-15”智力玩具。

这个游戏曾经风靡欧美大陆" 。

洛伊德的发明其实只是将重排九宫(即八数码问题)中的3阶方阵扩大到4 阶方阵罢了。

由于这个细微的变化,十五数码问题的规模远远大于八数码问题,八数码问题的规模较小,总的状态数为9!(=362880)个,而十五数码问题的状态,数为16!()个。

故十五数码问题更能评价一个算法的“智能”水平。

2 十五数码问题分析2.1十五数码问题简介15数码问题又叫移棋盘问题,是人工智能中的一个经典问题。

所谓的15数码问题:就是在一个4×4的16宫格棋盘上,摆放有15个将牌,每一个将牌都刻有1~15中的某一个数码。

棋盘中留有一个空格,允许其周围的某一个将牌向空格移动,这样通过移动将牌就可以不断改变将牌的布局。

这种求解的问题是:给定一种初始的将牌布局或结构(称初始状态)和一个目标布局(称目标状态),问如何移动数码,实现从初始状态到目标状态的转变,如下图所示。

问题的实质就是寻找一个合法的动作序列2.2可行性分析十五数码问题存在无解的情况,当遍历完所有可扩展的状态也没有搜索到目标状态就判断为无解。

可以根据状态的逆序数来先验的判断是否有解,当初始状态的逆序数和目标状态的逆序数的奇偶性相同时,问题有解;否则问题无解。

状态的逆序数是定义如下:把四行数展开排成一行,并且丢弃数字0 不计入其中,ηi是第i 个数之前比该数小的数字的个数,则η=Σηi 是该状态的逆序数,例如:对于初始状态:5、1、2、4、9、6、3、8、13、15、10、11、14、7、12.其η=0+0+1+2+4+4+2+6+8+9+8+9+11+6+11=81;对于目标状态:1、2、3、4、5、6、7、8、9、10、11、12、13、14、15,其η=0+1+2+3+4+5+6+7+8+9+10+11+12+13+14=105。

初始状态和目标状态的奇偶性相同,故存在解路径。

3问题的求解策略3.1算法分析十五数码问题的解空间树属排列树,用于排列树搜索的方法主要有两大类:一类是盲目搜索,如深度优先搜索DFS 和广度优先搜索BFS;另一类是启发式搜索,如A* 算法。

对于十五数码问题,深度优先搜索的状态空间搜索树的深度可能为无限深,或者可能至少要比某个可接受的解答序列的已知深度上限还要深。

应用此策略很可能得不到解。

宽度优先搜索的优势在于当问题有解时,一定能找到解,且能找到最优解。

但其搜索时需要保存所有的待扩展结点,这样很容易扩展那些没有用的结点,造成状态的指数增长,甚至“组合爆炸”。

这对宽度优先搜索很不利。

这两种搜索方法的共同缺点是结点排序杂乱无章,往往在搜索了大量无关结点后才能得到目的结点,只适合于复杂度较低的问题的求解。

启发式搜索利用特定问题自身所携带的启发信息在一定程度上避免了盲目搜索的不足,适合于解决十五数码问题。

其核心思想是引入一个启发式函数(或称为评估函数)利用评估函数为生成的结点估值%并按估值的大小对结点进行排序,优先搜索估值小的结点。

该评估函数根据问题的启发信息建立,评估了解决问题所需的最小费用,其基本形式是f(n) = g(n)+h(n)。

其中g(n):从初始状态s 到中间状态n 的最佳代价g*(n)的估值,h(n):从中间状态n 到目标状态t 的最佳代价h*(n)的估值,利用评估函数来进行的图搜索算法称为A算法,若还有h(n)<= h*(n)则称为A*算法。

在八数码问题中,通常g(n)是搜索树中当前结点n的深度,是从根结点到当前结点n的最短路径长度;h(n)的取值则有多种,如错位将牌数、曼哈顿距离。

这里主要是h(n)体现了启发信息,h(n)设计的好坏体现了算法的“智能”水平。

本课设借鉴这些算法h(n)采用曼哈顿距离。

3.2 A*算法设计(1)根据初始排列生成初始结点s,并判断问题的可解性。

若可解则转(2)否则退出。

(2)初始化open,closed表,并将初始节点加入open表。

(3)从open表中取出第一个节点。

(4)若是目标节点则成功退出。

(5)把该节点从open表删除,并添加到closed表中。

(6)对该节点进行扩展,其生成节点mi分成三种情况,mj,mk,ml。

mj:新生成的节点既不在open表中也不在closed表中,直接把生成的节点添加到open表即可。

Mk:新生成的节点出现在open表中且新生成节点的f(n)小于open表中该节点的f(n),则更改open表中的f(n)的值。

Ml:新生成的节点在closed表中并且新生成节点的f(n)小于closed表中对应节点的f(n)的值,则把该节点从open表中删除,添加到open表中并写该其f值为新生成节点的f 值。

(7)对open表中的节点按f值从小到大的顺序进行排列。

(8)转到(3)。

4 实验总结4.1 实验可视化界面4.2个人体会初学人工智能时,最先联想到的便是机器人,一直感觉机器人是非常智能且神秘的,这也令人工智能在我的思想里笼罩了一层非同寻常的面纱,非常迫切的想要了解他的内涵。

经过三十多个学时的学习,我对人工智能已经有了初步的了解,也深深的被它吸引,尤其通过本次课程设计,对人工智能的学习兴趣更加浓厚了!15数码问题是人工智能的一个经典的问题。

本文中通过设计一个基于A*算法的状态空间搜索程序,对于给定的初始状态,采用f(n)=h(n)+g(n)表示以当前节点与其目标节点相应位置不相同元素的个数与搜索深度之和作为启发函数的度量,并用面相对象的编程语言java来实现该问题。

在程序的设计与实现过程中,遇到了很多的问题。

首先由于初学人工智能,理解上有一定的困难,对A*算法的深入学习是一个曲折的过程。

其次,在程序真正的设计及实现过程中,的确需要花费大量的精力来思考,反复试验。

所设计的程序能够运行,但缺陷还是非常之大的,如其中重排OPEN表时,没有进行真正意义上的重新排列,只是选出代价最小的放在最先的位置,这实际上对程序的运行效率有很大的影响。

同时通过输入大量的初始状态和目标状态发现,在一般情况下都可以找到最优的动作序列。

但对某些稍微复杂的初始状态虽能得到正确解却不能完全得到最短的搜索路径,对于某些极其复杂的状态,甚至得不到解。

这是有待进一步学习并改进的地方。

但本程序还是有些值得肯定之处。

界面设计比较友好,容易操作。

而且在程序开始时,就判断目标状态是否可达,这样可节约大量的时间。

虽然很多地方设计的不尽如意,但这是针对十五数码这个具体问题的一点优化。

4.3 详细代码:public class Main {public static final int N = 4;static int num[][] = {{5,1,2,4},{9,6,3,8},{13,15,10,11},{14,0,7,12}};static int standard[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};public static void main(String[] args){int totalnum = 0;Node node = new Node(num);if(!Data.isDataOk(num, standard)){System.out.println("此种方案无解");System.exit(-1);}System.out.println("数据的变化情况如下所示:\n");Node resultnode = FifteenNum.moveManHa(node);for(int i=1; i<=resultnode.getPnodes().size(); i++){Interface f = new Interface();f.P1(resultnode.getPnodes().get(i-1).data,i-1);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}resultnode.getPnodes().get(i-1).print();System.out.println();System.out.println();System.out.println("第"+i+"步");totalnum = i;}Interface f = new Interface();f.P1(resultnode.data,totalnum);resultnode.print();}}import java.util.ArrayList;import java.util.List;public class Node {public static final int N = 4;private int f ;private int h ;private int w ;List<Node> pnodes = new ArrayList<Node>();FifteenNum.Direction last_Dirction ;int data[][] = new int[N][N];public Node(int data[][]){this.h = 0;this.w = 0;this.f = 0;st_Dirction = null;Data.arrayCopy(this.data, data);//pnodes.add(this);}public List<Node> getPnodes() {return pnodes;}public FifteenNum.Direction getLast_Dirction() {return last_Dirction;}public void setLast_Dirction(FifteenNum.Direction lastDirction) { last_Dirction = lastDirction;}public int getF() {return f;}public void setF(int f) {this.f = f;}public int getH() {return h;}public void setH(int h) {this.h = h;}public int getW() {return w;}public void setW(int w) {this.w = w;}public void print(){System.out.println();for(int i=0; i<8; i++){System.out.print("* ");}System.out.println();for(int i=0; i<N; i++){System.out.print("* ");for(int j = 0; j<N; j++){if(data[i][j] == 0){System.out.print(" ");}else if(data[i][j] < 10){System.out.print(data[i][j]+" ");}else{System.out.print(data[i][j]+" ");}}System.out.println("*");}for(int i=0; i<8; i++){System.out.print("* ");}System.out.println();}public boolean isequal( Node node){boolean flag = true;for(int i=0; i<N; i++){for(int j = 0; j<N; j++){if(data[i][j] != node.data[i][j]){flag = false;break;}}if(!flag) break;}return flag;}public Node getSameStateFrom(List<Node> list){for(int i=0; i<list.size(); i++){if(this.isequal(list.get(i))) return list.get(i);}return null;}}import java.util.Scanner;public class Data {public static int n = Main.N;static Scanner sc = new Scanner(System.in);public static void inputNum(int num[][]){int k=0;for(int i=0; i<n; i++){for(int j = 0; j<n; j++){num[i][j] = sc.nextInt();}}}public static void arrayCopy(int a[][], int b[][]){ for(int i=0; i<n; i++){for(int j = 0; j<n; j++){a[i][j] = b[i][j];}}}public static int inverseNum(int data[][]){int index = 0;int num = 0;int tempnum = 0;int temp[] = new int[n*n-1];for(int i=0; i<n; i++){for(int j = 0; j<n; j++){if(data[i][j] != 0){temp[index] = data[i][j];//System.out.print(temp[index]+" ");index++;}}}System.out.println();for(int i=0; i<n*n-1; i++){tempnum = 0;for(int j=0; j<i; j++){if(temp[j]<temp[i]){tempnum++;}}num += tempnum;}return num;}public static int WrongLocationNum(int temp[][]){ int count = 0;for(int i=0; i<n; i++){for(int j = 0; j<n; j++){if(temp[i][j] != 0){if(temp[i][j] != Main.standard[i][j]){count++;}}}}return count;}public static int manHa(int temp[][]){int d = 0;boolean flag = false;for(int x1=0; x1<n; x1++){for(int y1=0; y1<n; y1++){if(temp[x1][y1] != 0){flag = false;for(int x2=0; x2<n; x2++){for(int y2=0; y2<n; y2++){if(temp[x1][y1] == Main.standard[x2][y2]){d += Math.abs(x1 - x2) + Math.abs (y1 - y2);flag = true;}if(flag ) break;}if(flag ) break;}}}}return d;}public static boolean sameOdevity(int m, int n){if(m%2 == n%2) return true;else return false;}public static boolean isDataOk(int a[][], int b[][]){return sameOdevity(inverseNum(a), inverseNum(b));}}import java.util.ArrayList;import java.util.List;public class FifteenNum {public static int openNum = 0;public static int closedNum = 0;public enum Direction {UP,RIGHT,DOWN,LEFT};public static final int n = Main.N;static List<Node> open = new ArrayList<Node>();static List<Node> closed = new ArrayList<Node>();public static boolean changeTo(Direction direction,int i, int j, int data_temp[][]){ int temp;boolean flag = true;switch(direction){case UP: {if(i>=1){temp = data_temp[i][j];data_temp[i][j] = data_temp[i-1][j];data_temp[i-1][j] = temp;}else{flag = false;}break;}case RIGHT: {if(j<=2){temp = data_temp[i][j];data_temp[i][j] = data_temp[i][j+1];data_temp[i][j+1] = temp;}else{flag = false;}break;}case DOWN: {if(i<=2){temp = data_temp[i][j];data_temp[i][j] = data_temp[i+1][j];data_temp[i+1][j] = temp;}else{flag = false;}break;}case LEFT: {if(j>=1){temp = data_temp[i][j];data_temp[i][j] = data_temp[i][j-1];data_temp[i][j-1] = temp;}else{flag = false;}break;}}return flag;}public static boolean oppositeDirection(Direction d1, Direction d2){ if(d1==Direction.UP && d2 == Direction.DOWN || d1==Direction.DOWN && d2 == Direction.UP){return true;}else if(d1==Direction.RIGHT && d2 == Direction.LEFT || d1==Direction.LEFT && d2 == Direction.RIGHT){return true;}return false;}public static Node moveManHa(Node node1){Direction direction[] ={ Direction.UP, Direction.RIGHT, Direction.DOWN, Direction.LEFT};int i = 0;int j = 0;int wrongNum;boolean isOver = false;//设定初始节点的参数node1.setH(0);node1.setW(Data.manHa(node1.data)); //曼哈顿node1.setF(node1.getW()+node1.getH());Node node = null;open.add(node1);node = open.remove(0);int a =0;while(node.getW() != 0){//定位要扩展节点的空格所在的位置for(int x=0; x<n; x++){for(int y = 0; y<n; y++){if(node.data[x][y] == 0){i = x;j = y;//System.out.println("空格的坐标="+i+"j="+j);break;}}}int temp[][] = new int[n][n];//对刚才从open表中取出的节点试探性的进行四个方向的扩展for(int dir_index = 0; dir_index < 4; dir_index++){if(FifteenNum.oppositeDirection(node.getLast_Dirction(),direction[dir_index])){continue;}Data.arrayCopy(temp, node.data);if(FifteenNum.changeTo(direction[dir_index], i, j,temp)){wrongNum = Data.manHa(temp); //曼哈顿距离Node node_temp = new Node(temp); //由父节点生成新的节点node_temp.setH(node.getH()+1);node_temp.setW(wrongNum);node_temp.setF(node_temp.getH()+node_temp.getW());node_temp.setLast_Dirction(direction[dir_index]);//记录该节点的的移动方向,以便其孩子节点不再与该节点移动的方向相反/*** 把新生成节点的祖先节点放入到新生成节点里*/for(int k=0; k<node.getPnodes().size(); k++){node_temp.getPnodes().add(node.getPnodes().get(k));}node_temp.getPnodes().add(node);/**** 判断当前节点n生成的节点mi属于mj、mk、ml的哪一种判断顺序为:mk->ml->mj*/Node node_ml = null ;Node node_mk = null;//open表中或closed表中(与新生成的节点状态一样)的节点if((node_mk = node_temp.getSameStateFrom(open)) != null){if(node_temp.getH() > node_mk.getH()){open.remove(node_temp);open.add(node_temp);}}else if((node_ml = node_temp.getSameStateFrom( closed)) != null){if(node_temp.getH() > node_ml.getH()){closed.remove(node_ml);open.add(node_temp);openNum++;}}else{open.add(node_temp);openNum++;}if(Data.manHa(node_temp.data) == 0){ //曼哈顿isOver = true;node = node_temp;break;}}else{//不可达的方向,错位将牌数取为10wrongNum = 10;}}//for结束if(isOver) {break; //如果已经是目标状态退出程序}closed.add(node);closedNum++;sort(open);node = open.remove(0);openNum--;//把open表中的第一个节点从open表中删除,添加到closed表中} //while结束int produce = closedNum + openNum;//System.out.println("扩展节点数closednum="+closedNum+"生成节点数produce="+produce);return node;}public static void sort(List<Node> list){for(int i=0; i<list.size(); i++ ){int k = i;for(int j=i+1; j<list.size(); j++){if(list.get(k).getF()>list.get(j).getF()){k = j;}}if(k != i){Node node1;Node node2;node1 = list.get(i);node2 = list.get(k);list.set(i, node2);list.set(k, node1);}}}}import java.awt.BorderLayout;import java.awt.Button;import java.awt.Color;import java.awt.Font;import java.awt.GridLayout;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class Interface extends JFrame{JPanel p1 = new JPanel();JPanel p2 = new JPanel();public Interface(){this.setTitle("15数码问题");this.setVisible(true);this.setBounds(100, 100, 150, 150);this.setLayout(new BorderLayout());this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void P1(int data[][], int j){p1.setBackground(Color.blue);p1.setVisible(true);p1.setLayout(new GridLayout(4,4));for(int i=0; i<16; i++){Button bi = new Button(""+data[i/4][i%4]);if(data[i/4][i%4] == 0){bi.setBackground(Color.pink);}Font f=new Font("华文行楷",Font.BOLD,15);//根据指定字体名称、样式和磅值大小,创建一个新 Font。

相关文档
最新文档