A*算法解决8数码问题python实现
1.A*的通俗理解
很多游戏特别是rts,rpg类游戏,都需要用到寻路。寻路算法有深度优先搜索(DFS),广度优先搜索(BFS),A星算法等,而A星算法是一种具备启发性策略的算法,效率是几种算法中最高的,因此也成为游戏中最常用的寻路算法。
对于A星算法的具体理解可以参考下面这篇文章,本文着重讲解A星算法,在解决8数码问题的思路以及代码
A*算法的通俗理解
2.8数码问题
首先:估价函数对求解八数码问题有不同的影响。
这里我们介绍4种不同启发函数,我们主要使用第一种:
- 最简单的估价函数:取一格局与目的格局相比,其位置不符的将牌数目。
- 较 好的估价函数:各将牌移到目的位置所需移动的距离的总和
- 第三种估价函数:对每一对逆转将牌乘以一个倍数。
- 第四种估价函数:克服了仅计算将牌逆转数目策略的局限,将位置不符将牌数目的总和与3倍将牌逆转数目相加。
下面我们开始移动,并计算各个状态的估价函数值,然后选估价函数值最小的节点继续移动,直到出现目标状态为止如下图所示**(注意:图种有两处错误A(4)应为A(7),C(4)应为C(7))**:
3.代码
import numpy as np
import operator
O=int(input(("请输入方阵的行/列数:")))
A=list(input("请输入初始状态:"))
B=list(input("请输入目标状态:"))
z=0
M=np.zeros((O,O))
N=np.zeros((O,O))
for i in range(O):for j in range(O):M[i][j]=A[z]N[i][j]=B[z]z=z+1
openlist=[]#open表class State:def __init__(self,m):self.node=m#节点代表的状态self.f=0#f(n)=g(n)+h(n)self.g=0#g(n)self.h=0#h(n)self.father=None#节点的父亲节点init = State(M)#初始状态
goal=State(N)#目标状态
#启发函数
def h(s):a=0for i in range(len(s.node)):for j in range(len(s.node[i])):if s.node[i][j]!=goal.node[i][j] and s.node[i][j]!=0:a=a+1return a
#对节点列表按照估价函数的值的规则排序
def list_sort(l):cmp=operator.attrgetter('f')l.sort(key=cmp)
#A*算法
def A_star(s):global openlist#全局变量可以让open表进行时时更新openlist=[s]fatherlist=[s.node]while(openlist):get=openlist[0] #取出open表的首节点 if (get.node==goal.node).all():#判断是否与目标节点一致return getopenlist.remove(get)#将get移出open表#判断此时状态的空格位置for a in range(len(get.node)):for b in range(len(get.node[a])):if get.node[a][b]==0:breakif get.node[a][b]==0:break#开始移动for i in range(len(get.node)):for j in range(len(get.node[i])):c=get.node.copy()if (i-a)**2+(j-b)**2==1:c[a][b]=c[i][j]c[i][j]=0new=State(c)K=0for k in range(len(fatherlist)):if (new.node==fatherlist[k]).all():breakelse:K=K+1if K==len(fatherlist): new.father=get#此时取出的get节点成为新节点的父亲节点new.g=get.g+1#新节点与父亲节点的距离new.h=h(new)#新节点的启发函数值new.f=new.g+new.h#新节点的估价函数值openlist.append(new)fatherlist.append(new.node)# 递归打印路径
def printpath(f):if f is None:return#注意print()语句放在递归调用前和递归调用后的区别。放在后实现了倒叙输出printpath(f.father)print(f.node)final=A_star(init)
if final:print("有解,解为:")printpath(final)
else:print("无解")
A*算法解决8数码问题python实现相关推荐
- Astar、A星算法解决八数码问题--python实现
一.问题描述 数码问题又称9宫问题,与游戏"华容道"类似.意在给定的3*3棋格的8个格子内分别放一个符号,符号之间互不相同,余下的一格为空格.并且通常把8个符号在棋格上的排列顺序称 ...
- Python实现A*算法解决N数码问题
Python实现A*算法解决N数码问题 A*算法的描述 A*算法的步骤 问题描述 代码以及测试结果 算法优势 算法存在一些不足 A*算法的描述 A*算法是BFS的一个变种,它把原来的BFS算法的无启发 ...
- Python利用A*算法解决八数码问题
资源下载地址:https://download.csdn.net/download/sheziqiong/86790565 资源下载地址:https://download.csdn.net/downl ...
- A*算法解决八数码问题 Java语言实现
A*算法解决八数码问题 Java语言实现 参考文章: (1)A*算法解决八数码问题 Java语言实现 (2)https://www.cnblogs.com/beilin/p/5981483.html ...
- 题目2:隐式图的搜索问题(A*算法解决八数码)
数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...
- 广度优先算法解决8数码问题【c++】
8数码问题 (广度优先算法解决----c++) 8数码问题问题描述 八数码问题也称为九宫问题,在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格(空格用0来表示),空格 ...
- Nilsson's sequence score算法解决八数码问题解释
解决了最近一个人工智能关于解决八数码难题的作业. 图可能看不清,除了黑块外其他位置是英文字母ABCDEFGH A*:f(n)=g(n)+h(n) 其中f为总花费,g为已知花费(深度),h为估计花费 关 ...
- 全局择优搜索、A*算法、宽度优先算法解决八数码问题
1问题描述 使用盲目搜索中的宽度优先搜索算法或者使用启发式搜索中的全局择优搜索或A算法,对任意的八数码问题给出求解结果.例如:对于如下具体的八数码问题: 通过设计启发函数,编程实现求解过程,如果问题有 ...
- A*算法解决八数码问题 人工智能原理实验报告 启发式搜索 python
目录 一.实验主要步骤 ①.设计界面输入规则 ②.判断是否有解 ③.求解 二.实验结果展示 三.附录 完整实验程序代码: 一.实验主要步骤 ①.设计界面输入规则 有且仅有9位数字代表数码和空格,从左到 ...
最新文章
- 专题 6 目录文件编程
- html body div height: 100%;
- 面试有没有看过spring源码_如何看Spring源码、Java每日六道面试分享,打卡第二天...
- 世界公认最好的记忆方法_全球公认最好的12个教育孩子的方法,值得每个家长收藏学习!...
- MySQL LIMIT 如何改写成Oracle limit
- VirtualBox Network设置的NAT和Bridged Adapter模式区别
- matlab考试,MATLAB考试题
- 计算机社团技术部部长述职报告,社团部长个人工作总结(精选6篇)
- 时间管理:战略时间块,缓冲时间块,逃离时间块
- 信道模型时延和路径增益:cost207,cost2100,cost259,cost273,SCM,I-METRA,WINNER II
- win10系统迁移后系统重装_Win10技巧:Windows 10系统迁移方法!
- h2o java,h2o深度学习权重和规范化
- 划片机是芯片切割制造流程中一个重要的环节
- 干货分享丨HDR 技术产品实践与探索
- 微信小程序rich-text图片不显示及图片过大问题解决办法
- android 很多牛叉布局github地址(转)
- 考古中怎么判断化石的年代?碳14的半衰期?然后呢?//2021-2-5 知其然,知其所以然。
- “中国版权第一案”思路网总裁拒不认罪遭重判
- 数据科学系列:plotly可视化入门介绍
- Android 玩机之路(刷第三方recovery twrp+面具Magisk)
热门文章
- 从“棱镜门”事件看数据安全如何保护
- jsp高级DOM和BOM
- idou教你学Istio10 : 如何用Istio实现K8S Egress流量管理
- cloudstack vpc network egress-ingress rules
- Linux下安装配置各种软件和服务
- 2020,感恩陪伴;2021,指令集愿与您同行
- 教你用Python自制拼图小游戏,一起来玩吧
- 如何让同步/刷新的图标(el-icon-refresh)旋转起来
- 流文件和媒体文件的不一样( flv和mp4,avi的区别)
- python shp文件_对python 读取线的shp文件实例详解