西电电院人工智能课程大作业
西电人工智能大作业

人工智能大作业学生:021151**021151**时间:2013年12月4号一.启发式搜索解决八数码问题1. 实验目的问题描述:现有一个3*3的棋盘,其中有0-8一共9个数字,0表示空格,其他的数字可以和0交换位置(只能上下左右移动)。
给定一个初始状态和一个目标状态,找出从初始状态到目标状态的最短路径的问题就称为八数码问题。
例如:实验问题为从初始状态:要求编程解决这个问题,给出解决这个问题的搜索树以及从初始节点到目标到目标状态:节点的最短路径。
2.实验设备及软件环境利用计算机编程软件Visual C++ 6.0,用C语言编程解决该问题。
3.实验方法(1).算法描述:①.把初始节点S放到OPEN表中,计算()f S,并把其值与节点S联系起来。
②.如果OPEN表是个空表,则失败退出,无解。
③.从OPEN表中选择一个f值最小的节点。
结果有几个节点合格,当其中有一个为目标节点时,则选择此目标节点,否则就选择其中任一节点作为节点i。
④.把节点i从OPEN表中移出,并把它放入CLOSED的扩展节点表中。
⑤.如果i是目标节点,则成功退出,求得一个解。
⑥.扩展节点i,生成其全部后继节点。
对于i的每一个后继节点j:a.计算()f j。
b.如果j既不在OPEN表中,也不在CLOSED表中,则用估价函数f把它添加入OPEN表。
从j加一指向其父辈节点i的指针,以便一旦找到目标节点时记住一个解答路径。
c.如果j已在OPEN表或CLOSED表上,则比较刚刚对j计算过的f值和前面计算过的该节点在表中的f值。
如果新的f值较小,则I.以此新值取代旧值。
II.从j指向i,而不是指向它的父辈节点。
III.如果节点j在CLOSED表中,则把它移回OPEN表。
⑦转向②,即GO TO ②。
(2).流程图描述:(3).程序源代码:#include <stdio.h>#include<stdlib.h>struct node{int number[3][3];//用二维数组存放8数码 int W;//W表示与目标状态相比错放的数码数int Depth;//记录当前节点的深度struct node *parent;//指向父节点的指针struct node *next;//指向链表中下一个节点的指针};int CounterW(int Number[3][3]){//函数说明:计算当前状态与目标状态的W值int i,j;int W=0;int Desnode[3][3]={1,2,3,8,0,4,7,6,5};for(i=0; i<3; i++)for(j=0; j<3; j++)if(Number[i][j] != Desnode[i][j])W++;return W;}void PrintNode(node *A){int i,j;for(i=0; i<3; i++){for(j=0; j<3; j++)printf("%d ",A->number[i][j]);printf("\n");}printf("\n");}int CheckNode(node *open, node *close, int a[3][3]) {//检验该节点状态是否出现过的子程序int CheckFlag=0;int flag1,flag2;node *p=open;node *q=close;while(p != NULL){flag1=0;for(int i=0; i<3; i++){for(int j=0; j<3; j++)if(a[i][j]==p->number[i][j])flag1++;}if(flag1 == 9)break;elsep=p->next;}while(q != NULL){flag2=0;for(int i=0; i<3; i++){for(int j=0; j<3; j++)if(a[i][j] == q->number[i][j])flag2++;}if(flag2 == 9)break;elseq=q->next;}if((flag1==9) || (flag2==9))CheckFlag=1;//如果出现过,置标志位为1return CheckFlag;}struct node *FindNextNode(node *Prenode, node *open, node *close) { //扩展Prenode指向的节点,并将扩展所得结点组成一条单链表int i,j,m,n; //循环变量int temp; //临时替换变量int flag=0;int a[3][3];//临时存放二维数组struct node *p, *q, *head;head=(node *)malloc(sizeof(node));//head指向该链表首结点,并且作为返回值p=head;q=head;head->next=NULL;//初始化for(i=0;i<3;i++)//找到二维数组中0的位置{for(j=0;j<3;j++)if(Prenode->number[i][j]==0){flag=1;break;}if(flag==1)break;}//根据0的位置的不同,对a进行相应的变换for(m=0;m<3;m++)//将Prenode->number赋给afor(n=0;n<3;n++)a[m][n]=Prenode->number[m][n];if(i+1<=2)//情况1,0向下移{temp=a[i][j]; a[i][j]=a[i+1][j]; a[i+1][j]=temp;int CheckNum=CheckNode(open, close, a);if(CheckNum == 0)//若该结点未出现过则执行下面的操作{q=(node *)malloc(sizeof(node));for(m=0;m<3;m++)//将a赋给扩展节点q->number for(n=0;n<3;n++)q->number[m][n]=a[m][n];PrintNode(q);q->parent=Prenode;q->Depth=q->parent->Depth+1;//子结点的深度等于其父结点深度加1q->W=CounterW(q->number);q->next=NULL;p->next=q;//扩展节点插入head链表p=p->next;}}for(m=0;m<3;m++)//将Prenode->number重新赋给afor(n=0;n<3;n++)a[m][n]=Prenode->number[m][n];if(i-1>=0)//情况2,0向上移{temp=a[i][j]; a[i][j]=a[i-1][j]; a[i-1][j]=temp;int CheckNum=CheckNode(open, close, a);if(CheckNum == 0)//若该结点未出现过则执行下面的操作{q=(node *)malloc(sizeof(node));for(m=0;m<3;m++)//将a赋给q->numberfor(n=0;n<3;n++)q->number[m][n]=a[m][n];PrintNode(q);q->parent=Prenode;q->Depth=q->parent->Depth+1;q->W=CounterW(q->number);q->next=NULL;p->next=q;p=p->next;}}for(m=0; m<3; m++)for(n=0; n<3; n++)a[m][n]=Prenode->number[m][n];if(j-1>=0)//情况3,0向左移{temp=a[i][j]; a[i][j]=a[i][j-1]; a[i][j-1]=temp;int CheckNum=CheckNode(open, close, a);if(CheckNum == 0)//若该结点未出现过则执行下面的操作{q=(node *)malloc(sizeof(node));for(m=0; m<3; m++)//将a赋给q->numberfor(n=0; n<3; n++)q->number[m][n]=a[m][n];PrintNode(q);q->parent=Prenode;q->Depth=q->parent->Depth+1;q->W=CounterW(q->number);q->next=NULL;p->next=q;p=p->next;}}for(m=0;m<3;m++)for(n=0;n<3;n++)a[m][n]=Prenode->number[m][n];if(j+1<=2)//情况4,0向右移{temp=a[i][j]; a[i][j]=a[i][j+1]; a[i][j+1]=temp;int CheckNum=CheckNode(open, close, a);if(CheckNum == 0)//若该结点未出现过则执行下面的操作{q=(node *)malloc(sizeof(node));for(m=0; m<3; m++)//将a赋给q->numberfor(n=0; n<3; n++)q->number[m][n]=a[m][n];PrintNode(q);q->parent=Prenode;q->Depth=q->parent->Depth+1;q->W=CounterW(q->number);q->next=NULL;p->next=q;p=p->next;}}head=head->next;return head;}node *insert(node *open,node *head){ //将head链表的结点依次插入到open链表相应的位置,//使open表中的结点按从小到大排序。
大工23春《人工智能》大作业题目及要求

大工23春《人工智能》大作业题目及要求引言概述:人工智能(Artificial Intelligence,简称AI)是一门关注于使机器能够模仿人类智能行为的科学与技术。
在大工23春的《人工智能》课程中,学生们将面临一项重要的大作业。
本文将介绍大工23春《人工智能》大作业的题目和要求。
正文内容:1. 题目一:机器学习算法的实现与应用1.1 算法选择:学生需选择并实现一个机器学习算法,如决策树、支持向量机、神经网络等。
1.2 数据集准备:学生需准备一个合适的数据集,用于训练和测试所选择的机器学习算法。
1.3 算法实现:学生需要编写代码,实现所选择的机器学习算法,并对数据集进行训练和测试。
2. 题目二:自然语言处理应用开发2.1 文本处理:学生需要选择一个自然语言处理任务,如文本分类、情感分析等,并准备相应的文本数据集。
2.2 特征提取:学生需要设计并实现合适的特征提取方法,将文本数据转化为机器学习算法可以处理的形式。
2.3 模型训练与应用:学生需要选择并实现一个适当的机器学习算法,对提取的特征进行训练,并应用于所选择的自然语言处理任务。
3. 题目三:计算机视觉应用开发3.1 图像处理:学生需要选择一个计算机视觉任务,如图像分类、目标检测等,并准备相应的图像数据集。
3.2 特征提取:学生需要设计并实现合适的特征提取方法,将图像数据转化为机器学习算法可以处理的形式。
3.3 模型训练与应用:学生需要选择并实现一个适当的机器学习算法,对提取的特征进行训练,并应用于所选择的计算机视觉任务。
4. 题目四:强化学习算法的实现与应用4.1 算法选择:学生需选择并实现一个强化学习算法,如Q-learning、Deep Q Network等。
4.2 环境建模:学生需要设计一个适当的环境,用于训练所选择的强化学习算法。
4.3 算法实现:学生需要编写代码,实现所选择的强化学习算法,并对环境进行训练和测试。
5. 题目五:深度学习模型的实现与应用5.1 模型选择:学生需选择并实现一个深度学习模型,如卷积神经网络、循环神经网络等。
人工智能课程大作业

作业题目摘要:机器博弈是人工智能的一个重要研究分支,本文通过设计一个五子棋智能博奕程序,采用传统的博弈树算法,利用剪枝和极大极小树搜索最佳位置,从而实现人机智能博弈。
并对现有算法存在的问题进行探究改进,最后给出展示,结果表明效果比较理想。
关键词:人工智能;五子棋;博弈本组成员:本人分工:α-β剪枝实现1 引言人工智能[1]是一门综合新型的新兴边缘科学,与生物工程、空间技术并列为三大尖端技术,而机器博弈却是其一个重要的研究分支。
它研究如何利用计算机去实现那些过去只能靠人的智力去完成的工作,博弈为人工智能提供了一个很好的应用场所。
博弈过程可以采用与或树进行知识表达,这种表达形式称为博弈树。
α—β剪枝技术是博弈树搜索中最常采用的策略。
2 算法原理与系统设计根据五子棋游戏规则,此次五子棋游戏我们采用基于极大极小值分析法的α—β剪枝算法来实现计算机走棋。
α—β剪枝技术是博弈树搜索中最常采用的策略,α—β剪枝搜索由极大极小值分析法演变而来[2]。
极大极小分析法其基本思想或算法是:(1) 设博弈的双方中一方为MAX,另一方为MIN。
然后为其中的一方(例如MAX)寻找一个最优行动方案。
(2) 为了找到当前的最优行动方案,需要对各个可能的方案所产生的后果进行比较,具体地说,就是要考虑每一方案实施后对方可能采取的所有行动,并计算可能的得分。
(3) 为计算得分,需要根据问题的特性信息定义一个估价函数,用来估算当前博弈树端节点的得分。
此时估算出来的得分称为静态估值。
(4) 当端节点的估值计算出来后,再推算出父节点的得分,推算的方法是:对“或”节点,选其子节点中一个最大的得分作为父节点的得分,这是为了使自己在可供选择的方案中选一个对自己最有利的方案;对“与”节点,选其子节点中一个最小的得分作为父节点的得分,这是为了立足于最坏的情况。
这样计算出的父节点的得分称为倒推值。
(5) 如果一个行动方案能获得较大的倒推值,则它就是当前最好的行动方案。
人工智能大作业题目

人工智能大作业题目嘿,同学们!咱们今天来聊聊这个听起来超级酷的“人工智能”。
要说这人工智能啊,那可真是个神奇的东西。
就拿我前几天的一次经历来说吧。
我去商场逛街,看到有个智能机器人在给顾客指引方向,回答各种问题,那叫一个溜!它不仅能清楚地告诉你各个店铺的位置,还能根据你的需求推荐合适的商品。
我当时就在想,这人工智能发展得也太快了,说不定哪天它就能完全替代人类的某些工作啦。
咱们先从小学的教材说起。
在小学阶段,人工智能的内容更多是通过一些有趣的故事和简单的示例来引入的。
比如说,会讲一个小朋友和智能小助手一起完成任务的故事,让小朋友们初步感受人工智能的神奇。
就像有个故事里,小明同学做作业的时候遇到了难题,他的智能学习伙伴一下子就给出了详细的解题步骤和思路,帮助小明轻松解决了问题。
到了初中,教材里的人工智能内容就逐渐深入啦。
会开始介绍一些基本的原理和概念,像什么是机器学习、什么是图像识别。
记得有一次,我看到一群初中生在讨论他们做的一个关于智能垃圾分类的小项目。
他们可积极了,有的在研究如何让机器通过图像准确识别不同的垃圾类别,有的在想办法提高分类的效率。
看着他们那认真的劲儿,我就知道,这人工智能的种子已经在他们心里生根发芽了。
高中的教材那可就更有深度了。
不仅要深入理解人工智能的算法和模型,还要能够运用所学知识去解决一些实际的问题。
比如说,会让同学们去设计一个简单的智能交通系统,优化城市的交通流量。
我听说有个高中班级,为了完成这个作业,分成了好几个小组。
有的去收集交通数据,有的负责建立模型,还有的负责测试和优化。
最后他们呈现出来的成果还真让人眼前一亮,连老师都忍不住竖起大拇指呢!其实啊,人工智能不仅仅是在教材里的知识,它已经渗透到我们生活的方方面面啦。
比如说,我们用的智能手机里的语音助手,能够听懂我们的话,帮我们完成各种操作;还有家里的智能家电,能根据我们的习惯自动调节工作模式。
这一切都离不开人工智能的功劳。
西安电子科技大学人工智能复习课习题

1.请选用框架法和语义网络法表示下述报道的沙尘暴灾害事件。
(虚拟新华社3月16日电)昨日,沙尘暴袭击韩国汉城,气场与高速公路被迫关闭,造成的损失不详。
此次沙尘暴起因中韩专家认为是由于中国内蒙古地区过分垦牧破坏植被所致。
(提示:分析概况用下划线标出的要点,经过概念化形成槽或节点)2. 请用归结反演的方法求解下述问题。
已知:(1)John 是贼。
(2)Paul 喜欢酒(wine )。
(3)Paul 也喜欢奶酪(cheese )。
(4)如果Paul 喜欢某物,那么John 也喜欢某物。
(5)如果某人是贼,而且他喜欢某物,那么他就会偷窃该物。
请回答下面的问题:John 会偷窃什么?3. MYCIN 是一个用于细菌感染性疾病诊断的专家系统,它的不确定性推理模型中采用可信度作为不确定性量度。
请简述什么是不确定性推理及不确定性推理几个关键问题,并按照MYCIN 系统的推理方法计算结论B1和B2的可信度。
已知初始证据A1,A2,A3的可信度值均为1,推理规则如下:R1: IFA1 THEN B1 (0.8) R2: IFA2 THEN B1 (0.5) R3: IF A3∧B1 THENB2 (0.8) 求CF(B1)和CF(B2)的值。
()()()(),()0,()0121212()()()()(),()0,()012121212()()12,()()0121min{|()|,|()|}12CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H CF H ⎧⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎩+-⨯≥≥=++⨯<<+⨯<- 4.设A 、B 分别是论域U 、V 上的模糊集,U=V={1,2,3,4,5}, A=1/1+ 0.5/2, B=0.4/3+0.6/4+1/5并设模糊知识及模糊证据分别为:IF x is A THEN y is B x is A ’其中,A ’的模糊集为:A ’=1/1+ 0.4/2+ 0.2/3假设A 和A ’可以匹配,请利用模糊推理的方法求出该模糊知识和模糊证据能得出什么样的模糊结论。
人工智能大作业

人工智能大作业在当今科技飞速发展的时代,人工智能无疑是最具影响力和变革性的领域之一。
它已经悄然渗透进我们生活的方方面面,从智能手机中的语音助手,到医疗领域的疾病诊断,再到交通系统的智能调控,其身影无处不在。
人工智能的定义其实并不复杂,通俗地说,就是让机器能够像人类一样思考、学习和行动。
然而,要实现这一点,背后涉及到的技术和理论却极其复杂和深奥。
让我们先来谈谈人工智能在图像识别方面的应用。
以往,要让计算机理解一张图片的内容,几乎是天方夜谭。
但现在,通过深度学习算法,计算机可以准确地识别出图片中的物体、人物甚至是场景。
这一技术的应用范围十分广泛,比如在安防领域,能够快速识别出可疑人员;在自动驾驶中,帮助车辆识别道路标志和障碍物。
再来说说自然语言处理。
我们每天使用的语音助手,如 Siri 和小爱同学,就是自然语言处理的实际应用。
它们能够理解我们的语言,并给出相应的回答。
不仅如此,在机器翻译领域,人工智能也取得了巨大的进步。
以往的机器翻译往往生硬且不准确,而如今,借助深度学习和大规模语料库,翻译结果越来越流畅和准确。
人工智能在医疗领域的应用更是给人们带来了新的希望。
通过对大量医疗数据的分析,人工智能可以辅助医生进行疾病诊断,提高诊断的准确性和效率。
例如,在癌症的早期筛查中,人工智能系统能够从海量的影像数据中发现细微的病变迹象,为患者争取到宝贵的治疗时间。
然而,人工智能的发展也并非一帆风顺。
其中一个重要的挑战就是数据的质量和隐私问题。
高质量的数据对于训练有效的人工智能模型至关重要,但获取和整理这些数据并非易事。
同时,数据的隐私保护也成为了公众关注的焦点,如何在利用数据的同时确保个人隐私不被泄露,是亟待解决的问题。
另一个挑战是人工智能的伦理和道德问题。
比如,在决策过程中,如果人工智能系统存在偏见,可能会导致不公平的结果。
此外,当人工智能系统出现错误时,责任的界定也变得模糊不清。
尽管面临诸多挑战,但人工智能的未来依然充满无限可能。
人工智能大作业

人工智能大作业人工智能(Artificial Intelligence,AI)是计算机科学的一个重要分支领域,旨在使计算机能够模拟和执行人类智能任务。
随着人工智能技术的发展和应用范围的不断拓展,越来越多的领域开始借助人工智能来解决问题,提高效率。
作为人工智能大作业的一部分,我们将探讨人工智能在医疗领域的应用和前景。
1. 人工智能在医疗领域的应用1.1 医学影像诊断人工智能能够通过分析医学图像(如CT扫描、MRI等)提供准确的诊断结果和判断,辅助医生进行疾病诊断和治疗方案选择。
通过对海量医学影像数据的学习和分析,人工智能可以帮助医生更快速、精确地识别和定位疾病。
1.2 个性化治疗通过分析患者个体化的生理数据和基因信息,人工智能可以为每位患者设计出最佳的治疗方案。
人工智能可以根据患者的基因型、病史以及其他相关数据,进行风险评估和治疗效果预测,为患者提供更精确的治疗建议。
1.3 机器人辅助手术借助人工智能技术,机器人可以在手术过程中提供精确的操作和辅助。
机器人可以通过高精度的定位和手术规划,提高手术的准确性和安全性。
此外,机器人还可以在手术过程中收集和分析数据,帮助医生做出更准确的决策。
1.4 医疗健康管理通过人工智能技术的支持,可以开发出智能化的医疗健康管理系统。
这些系统可以实时监测患者的生理数据,并根据患者的状况提供个性化的健康指导和建议。
患者可以通过智能设备和手机应用来管理和监控自己的健康状况。
2. 人工智能在医疗领域的前景随着人工智能技术的不断发展和完善,它在医疗领域的应用前景非常广阔。
2.1 提高医疗效率和精准度人工智能可以通过分析和处理大量的医学数据,帮助医生快速准确地做出诊断和治疗决策。
这将大大提高医疗效率,缩短患者等待时间,并降低医疗错误率,提高精确度。
2.2 实现个性化医疗人工智能可以根据患者的个体差异,提供个性化的诊断和治疗方案。
通过分析患者的基因、生理数据和病史等信息,人工智能可以为每位患者定制适合其的医疗方案,提高治疗效果。
大工《人工智能》大作业参考题目及要求【内容仅供参考】592

题目:广度优先搜索算法1.谈谈你对本课程学习过程中的心得体会与建议?人工智能是一门前沿且综合性非常强的课程,自己在整个课程的学习中,认识到人工智能领域的许多方面,以及了解和学习了人工智能课程相关的一些课程的学习过程中,涉及到了较多的计算机知识点,包括很多计算机个人建议学完这门课程后,多去尝试做一些简单的实践练习,实践中除了相关理论知识如算法等作为分析支撑,还要能够通过代码来编写实现一些简单案例,并进行测试验证和推导,最后尽可能将实现的案例进行举一反三,学习效果会大大提升。
在尝试实现练习案例中,涉及到编程技术,首先至少应该熟练使用一门编程语言,比较推荐Python作为主要编程语言进行实现案例以及日常练习,而且在Python编程相关的领域内,本身已经有很多相关成熟的代码demo去借鉴参考,这也有助于自己快速的上手和试验。
另外,无论是课程学习中,还是学习完后,一定要善于作笔记总结,汇总遇到的每个难点知识。
现在互联网比早以前发展的更成熟,我们可以通过互联网搜索相关知识,进行课外补充,这也是一种非常有效的提升课程知识的方式。
同时,利用互联网进行沟通探讨也是一种良好的学习方式,比如自己写博客交流,或者在相关论坛进行发帖提问式交流,都是非常方便且有效的,最后不要忘记将知识点进行再次归纳、记录进自己的笔记中。
目前人工智能技术的发展已经进入了更广泛的领域,而且目前还在不断的发展并且欣欣向荣,所以该课程是一门非常有意义的课程,学完这门课程后,个人推荐应该对这个领域进行持续关注,结合现代化人工智能需求,以及融入到身边的日常案例,积极进行更广泛和有深度的自我研究学习。
2.《人工智能》课程设计,从以下5个题目中任选其一作答。
题目:广度优先搜索算法广度优先搜索算法算法介绍:广度优先搜索算法又称为宽度优先搜索算法,英文全称是Breadth First Search(BFS),它是属于一种盲目搜索算法,该算法按照广度或宽度进行扩展搜索的,如果目标节点存在,用该算法总可以找到该目标节点,而且是最短路径节点,但该算法的时间和空间复杂度都相对比较高。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西电人工智能大作业八数码难题一.实验目的八数码难题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。
例如:(a) 初始状态 (b) 目标状态图1 八数码问题示意图请任选一种盲目搜索算法(深度优先搜索或宽度优先搜索)或任选一种启发式搜索方法(A 算法或 A* 算法)编程求解八数码问题(初始状态任选),并对实验结果进行分析,得出合理的结论。
本实验选择宽度优先搜索:选择一个起点,以接近起始点的程度依次扩展节点,逐层搜索,再对下一层节点搜索之前,必先搜索完本层节点。
二.实验设备及软件环境Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI 等编程语言。
三.实验方法算法描述:(1)将起始点放到OPEN表;(2)若OPEN空,无解,失败;否则继续;(3)把第一个点从OPEN移出,放到CLOSE表;(4)拓展节点,若无后继结点,转(2);(5)把n的所有后继结点放到OPEN末端,提供从后继结点回到n的指针;(6)若n任意后继结点是目标节点,成功,输出;否则转(2)。
流程图:代码:#include <stdlib.h>#include <stdio.h>typedef struct Node {int num[9]; //棋盘状态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 origin[9]; //棋盘初始状态int target[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 *item); //向Close表中插入新节点int expand(numNode *item); //扩展节点int print_result(numNode *item); //打印结果numNode *copy_numNode(numNode *orgin);char isNewNode(numNode *open,numNode *close,int num[9]);//是否在Open表或Close表中void print_num(int num[9]); //打印棋盘状态int diff(int num[9]); //求不在位棋子的个数void init(); //初始化,获得棋盘初始状态和目标状态void 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表open=create_numNode();close=create_numNode();open->pre=open->next=close->pre=close->next=NULL; init(); //由用户输入初始和目标状态//初始化初始节点numNode *p1;p1=create_numNode();p1->parent=NULL;p1->deepth=0;int i=0;for ( i=0; i<9; i++){p1->num[i]=origin[i];}open_insert(open,p1);numNode_num=1;p1=open_getfirst(open);while (p1!=NULL){close_append(close,p1);if(expand(p1))return EXIT_SUCCESS;p1=open_getfirst(open);}printf("No solution!\n");return EXIT_SUCCESS;} /* ---------- end of function main ---------- */voidinit ( ){while(1){printf("Please input opriginal status:\nFor example:123456780 stands for\n""1 2 3\n""4 5 6\n""7 8 0\n");char temp[10];scanf("%s",&temp);int i=0;for ( i=0;i<9 && temp[i]-'0'>=0 && temp[i]-'0'<=8; i++){origin[i]=temp[i]-'0';}printf("Please input target status:\n");scanf("%s",&temp);int j=0;for ( j=0; j<9 && temp[j]-'0'>=0 && temp[j]-'0'<=8; j++){target[j]=temp[j]-'0';}system("cls");if ( i==9&&j==9){break;}}} /* ----- end of function init ----- */voidopen_insert (numNode *head,numNode *item){numNode *p,*q;p=head->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_getfirst (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 ----- */voidclose_append (numNode *head,numNode *item){item->next=head->next;item->pre=head;head->next=item;if ( item->next!=NULL ){item->next->pre=item;}} /* ----- end of function close_append ----- */intexpand (numNode *p1){numNode * p2;int op=1;for ( op=1; op<=4; op++){p2=copy_numNode(p1);operate(p2->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->diffnum;if(p2->diffnum==0){total_step=print_result(p2);printf("Total step: %d\n",total_step); free_list(open);free_list(close);return 1;}else{numNode_num++;open_insert(open,p2);}}elsefree(p2);}return 0;} /* ----- end of function expand ----- */intoperate(int m[], int op){int blank;blank=0;while (m[blank]!=0 && blank<9 )++blank;if (blank==9)return 1;switch (op) {case 1: /* up */if (blank>2)swap(m+blank,m+blank-3);break;case 2: /* down */if (blank<6)swap(m+blank,m+blank+3);break;case 3: /* left */if (blank!=0 && blank!=3 && blank!=6) swap(m+blank,m+blank-1);break;case 4: /* right */if (blank!=2 && blank!=5 && blank!=8) swap(m+blank,m+blank+1);break;default : return 1;}return 0;}voidswap(int *a, int *b){int c;c=*a;*a=*b;*b=c;}numNode *copy_numNode (numNode *origin){numNode *p;p=create_numNode();p->deepth=origin->deepth;p->diffnum=origin->diffnum;p->value=origin->value;int i;for ( i=0; i<9; i++){(p->num)[i]=(origin->num)[i];}return p;} /* ----- end of function copy_numNode ----- */intdiff (int num[9]){int i,diffnum=0;for(i=0;i<9;i++)if(num[i]!=target[i])diffnum++;return diffnum;} /* ----- end of function diff ----- */charisNewNode (numNode *open,numNode *close,int num[9]) {numNode *p;int i=0;p=open->next;while ( p!=NULL ){for ( i=0; i<9; i++){if(p->num[i]!=num[i])break;}if(i==9)return 'O'; //Openp=p->next;}p=close->next;while ( p!=NULL ){for ( i=0; i<9; i++){if(p->num[i]!=num[i])break;}if(i==9)return 'C'; //Closep=p->next;}return 'N';} /* ----- end of function isNewNode ----- */voidfree_list (numNode *head){numNode *p,*q;p=head->next;while ( p!=NULL ){q=p->next;free(p);p=q;}free(head);} /* ----- end of function free_list ----- */voidprint_num (int num[9]){int i;for ( i=0; i<9; i++){printf("%d\t",num[i]);if((i%3)==2)printf("\n");}} /* ----- end of function print_num ----- */intprint_result ( numNode *item){numNode *p;int step;p=item;if(p!=NULL){step=print_result(p->parent);printf("\nStep %d:\n",step+1);print_num(p->num);return step+1;}else{return -1;}}四.结果:下图实验结果中,一步代表一层的搜索结果中的最优解;八数码难题的宽度优先搜索树:五.实验分析宽度优先搜索属于一种盲目搜索算法,可以系统的展开所有节点,理论上一定能达到搜寻目的。