logo资料库

宽度优先搜索 算法.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
实验报告 课程名称: 人工智能基础 实验项目: 宽度优先搜索算法 专业班级: 姓 名: 实验室号: 实验时间: 指导教师: 学 号: 实验组号: 批阅时间: 成 绩:
沈阳工业大学实验报告 (适用计算机程序设计类) 专业班级: 学号: 姓名: 实验名称:宽度优先搜索算法 1.实验目的: 熟悉人工智能系统中的问题求解过程 掌握宽度优先搜索算法的原理和运行过程 2.实验内容: 采用宽度优先搜索算法,编程实现八数码问题的求解。初始状态和目标状态可自定 (要求搜索次数至少 10 次)。 3. 实验方案(程序设计说明) (1)、设计状态空间表示方式 (2)、设计一组算子,用来求解该问题的算子可以用 4 条规则来描述 (3)、移动方法以及可移动的条件 (4)、判断有无解实现方法 (5)、宽度优先搜索实现方法 4. 实验步骤或程序(经调试后正确的源程序) 见附件 A 5.程序运行结果 6.出现的问题及解决方法 有可能出现无解的情况,需要重新输入起始数据解决。 1
附件 A 沈阳工业大学实验报告 (适用计算机程序设计类) 学号: 姓名: 专业班级: 运行环境:python3.7 需要安装的包:time 程序源码: import time class QNode(object):#定义队列的数据结构 def __init__(self, elem, next=None): self.elem = elem self.next = next class Queue(object): # 队列 def __init__(self): self.head = None self.rear = None def is_empty(self):#判断队列是否为空 return self.head is None def enqueue(self, elem): # 往队列中添加一个elem元素 p = QNode(elem) if self.is_empty(): self.head = p self.rear = p else: self.rear.next = p self.rear = p def dequeue(self): # 从队列的头部删除一个元素 result = self.head.elem self.head = self.head.next return result def Search(self,elem):#搜索队列中是否有与elem相同的元素 temp = self.head while temp is not None: if elem[:9] == temp.elem[:9]: return False temp = temp.next 2
return True def jugde(open,closed,temp,i,creatpoint):#判断是否重复 if open.Search(temp) and closed.Search(temp): temp.append(operato[i]) Open.enqueue(temp) creatpoint += 1 return creatpoint def Jugde(sample):#判断有无解 flag = 0 for i in sample[::-1]: if i != '0': this = sample.index(i) for x in sample[:this]: if x > i: flag += 1 if flag % 2 ==0 : return 0 return 1 if __name__ == '__main__': sample = list(input('请输入初始状态:').split())#存储8数码问题的初始状态 goal = list(input('请输入目标状态:').split(' '))#存储8数码问题的目标状态 m = Jugde(sample) n = Jugde(goal) if m != n:#通过求逆序数判断有无解 print('无解!') break operato = ['up','down','left','right'] k = creatpoint = 0 # k 为搜索的节点数 creatpoint 为生成节点数 Open = Queue()#创建open表 Closed = Queue()#创建closed表 Open.enqueue(sample) Max = input("请输入最大搜索深度:") start = time.time() while(1): if(sample == goal ): print("起始节点为目标结点!") break if Open.is_empty(): print("没有解!") break else: p = Open.dequeue()#从Open表中取出 3
if len(p)-9 >= int(Max)+1:#判断是否超过设置的最大深度 print('已达最大深度,未找到解!') break Closed.enqueue(p)#放入Closed表中 if p[:9] == goal:#判断是否相等 k += 1 print('当前层次:{},已搜索节点数:{},已生成结点数{}\n查找成功! '.format(len(p)-9,k,creatpoint)) print("空格的移动路径依次为:",end = '') for i in p[9:]: print(i,end='->') end = time.time() print('完成\nRunning time:{} Seconds'.format(end - start)) break k += 1 flag = p.index('0')# 返回列表中0的索引 flag = p.index('0') if flag - 3 >= 0 :#空格向上移动 temp = p.copy() temp[flag], temp[flag - 3] = temp[flag - 3], temp[flag] creatpoint = jugde(Open,Closed,temp,0,creatpoint) if flag + 3 <= 8:#空格向下移动 temp = p.copy() temp[flag], temp[flag + 3] = temp[flag + 3], temp[flag] creatpoint = jugde(Open, Closed, temp, 1, creatpoint) if flag % 3 != 0 :#空格向左移动 temp = p.copy() temp[flag], temp[flag - 1] = temp[flag - 1], temp[flag] creatpoint = jugde(Open, Closed, temp, 2, creatpoint) if (flag + 1) % 3 != 0:#空格向右移动 temp = p.copy() temp[flag], temp[flag + 1] = temp[flag + 1], temp[flag] creatpoint = jugde(Open, Closed, temp, 3, creatpoint) 4
分享到:
收藏