解决了最近一个人工智能关于解决八数码难题的作业。

图可能看不清,除了黑块外其他位置是英文字母ABCDEFGH

A*:f(n)=g(n)+h(n)

其中f为总花费,g为已知花费(深度),h为估计花费

关于Nilsson sequence score这个估计花费算法(也就是计算h的,估计函数)

Nilsson's sequence score 

A tile in the center scores 1 (since it should be empty)

For each tile not in the center, if the tile clockwise to it is not the one that should be clockwise to it then score 2.

Multiply this sequence by three and finally add the total distance you need to move each tile back to its correct position.

公式:h(n)=P(n)+3S(n)

P(n)是每一个滑块距离正确位置的曼哈顿(Manhattan)距离之和,即P(n)所得分数;

曼哈顿距离P=水平位移+垂直位移

S(n):对于当前状态(块的分布)而言,如果中心的块非空,则得1分(对于八数码问题,目标状态的中心块是空的);然后轮流检查除了中心块之外的每一个块,如果该块的后继结点是错误的后继结点,得2分。其余块不得分;

把P(n)的分数与S(n)的分数的三倍相加即为Nilsson sequence score

举一个例子

初始状态I
*AC

HBD

GFE

目标状态T

ABC

H*D

GFE

开始计算

1.计算曼哈顿距离

从初始状态看,

对于A,从I(A)移到T(A)需要一步(向左移一步),得1分;

对于C,D,E,F,G,H位置一致,不得分;

对于B,需要向上移一步,得1分;

P(n)总共得分为1+1=2分。

2.计算S

①B位于中心块,得1分;

②将其他块按顺时针顺序排好:

I:*ACDEFGBH

T:ABCDEFGH

使[当前点,后继点]组成如下数对

目标状态的数对:[A,B], [B,C], [C,D], [D,E], [E,F], [F,G], [G,H], [H,A]

当前状态的数对:[A,C], [C,D], [D,E], [E,F], [F,G], [G,H], [H,*]

([*,A] 不考虑,因为不存在*这样的前继)

其中有2对是当前点相同,后继点不同的:[A,C], [H,*]    因此 2*2=4分;

再把S乘以3:3*(1+2*2)=15分;

总得分h=P+3S=2+15=17分

再通过求所有情况的每一步的总花费f=g+h就可以重新对open表排序来进行选择最优策略了。

附上自己对求单步h值的Python脚本

#h(n)=P(n)+3S(n)
Current=[0,1,3,8,2,4,7,6,5]
Target=[1,2,3,8,0,4,7,6,5]
#顺时针排序
closewise=[0,1,2,5,8,7,6,4,0]
#左下角代表坐标原点(0,0)
Coordinate=[13,23,33,12,22,32,11,21,31]
p=0
s=0
h=0
#ManhattanDistance
for i in range(9):for j in range(9):if Current[i]==Target[j] and Current[i]!=0:x1 = int(Coordinate[i] / 10) - 1y1 = int(Coordinate[i] % 10) - 1x2 = int(Coordinate[j] / 10) - 1y2 = int(Coordinate[j] % 10) - 1p+=abs(x1-x2)+abs(y1-y2)#A tile in the center scores 1 (since it should be empty)
if Current[4]:s+=1#For each tile not in the center,
# if the tile clockwise to it is not the one that
# should be clockwise to it then score 2.
for i in range(8):for j in range(8):if Current[closewise[i]]!=0:if Target[closewise[i]]==Current[closewise[j]] and Target[closewise[i+1]]!=Current[closewise[j+1]]:s+=2
h=p+3*s
print(h,p,3*s)

以上是我自己理解的,要是没讲清楚的话大家最好直接去看看这些解释(全英

http://www.cs.rpi.edu/academics/courses/fall00/ai/assignments/assign3heuristics.html

http://heyes-jones.com/astar.php

https://cs.stackexchange.com/questions/1904/nilssons-sequence-score-for-8-puzzle-problem-in-a-algorithm/1910#1910

Nilsson's sequence score算法解决八数码问题解释相关推荐

  1. A*算法解决八数码问题 Java语言实现

    A*算法解决八数码问题 Java语言实现 参考文章: (1)A*算法解决八数码问题 Java语言实现 (2)https://www.cnblogs.com/beilin/p/5981483.html ...

  2. 题目2:隐式图的搜索问题(A*算法解决八数码)

    数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...

  3. Python利用A*算法解决八数码问题

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790565 资源下载地址:https://download.csdn.net/downl ...

  4. Astar、A星算法解决八数码问题--python实现

    一.问题描述 数码问题又称9宫问题,与游戏"华容道"类似.意在给定的3*3棋格的8个格子内分别放一个符号,符号之间互不相同,余下的一格为空格.并且通常把8个符号在棋格上的排列顺序称 ...

  5. 全局择优搜索、A*算法、宽度优先算法解决八数码问题

    1问题描述 使用盲目搜索中的宽度优先搜索算法或者使用启发式搜索中的全局择优搜索或A算法,对任意的八数码问题给出求解结果.例如:对于如下具体的八数码问题: 通过设计启发函数,编程实现求解过程,如果问题有 ...

  6. A*算法解决八数码问题 人工智能原理实验报告 启发式搜索 python

    目录 一.实验主要步骤 ①.设计界面输入规则 ②.判断是否有解 ③.求解 二.实验结果展示 三.附录 完整实验程序代码: 一.实验主要步骤 ①.设计界面输入规则 有且仅有9位数字代表数码和空格,从左到 ...

  7. 题目2:隐式图的搜索问题(A*算法解决八数码)代码实现

    从起点 开始,把它加入到一个由方格组成的open list(开放列表) 中,这个open list像是一个购物清单.Open list里的格子是可能会是沿途经过的,也有可能不经过.因此可以将其看成一个 ...

  8. 人工智能实现a*算法解决八数码_小白带你学回溯算法

    微信公众号:小白算法 关注可了解更多算法,并能领取免费资料.问题或建议,请公众号留言;小白算法,简单白话算法,每个人都能看懂的算法 上一期算法回顾--贪婪法:https://mp.weixin.qq. ...

  9. C++ 使用A*算法解决八数码问题

    主要过程: 通过一个当前最好状态即best矩阵,移动0或者空白的位置,上下左右生成4个方向的子结点(如果0没有越界),把子结点加入到open表中,当前的best加入到closed表.然后在open表中 ...

最新文章

  1. 【Python】Matplotlib太臃肿,试试Seaborn
  2. MySQL 高级 - 索引 - 索引语法
  3. 知识工程.Vs.软件构架,框架,设计模式.
  4. 如何正确创建DLL和使用DLL
  5. java中事物的注解_编程式事务、XML配置事务、注解实现事务
  6. [css] 如何做图片预览,如何放大一个图片?
  7. 基于公开数据的特殊人群在线活动特征挖掘
  8. SpringCloud微服务2-服务提供者和消费者
  9. 文本删除空行_Word的空行、空格、页眉线删不了?8秒一次性处理,教你删掉它们...
  10. 网易严选退出双十一:“抵制”鼓吹过度消费
  11. 牛客网SQL数据库实战之查找入职员工时间排名倒数第三的员工所有信息
  12. jmeter 一个可能引起性能严重下降的断言设置
  13. 2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)
  14. 讨厌的任意门事件,删了会出系统提示:安装prosheild.msi问题,不要乱删!
  15. 流畅的python学习记录——第五章:一等函数
  16. 将Solidworks Toolbox中的标准件更改为普通零件
  17. dompdf中文乱码、换行解决方案
  18. Tampermonkey油猴脚本 jquery 常用组件
  19. 笔记本电脑拔掉电源屏幕会黑一下怎么办
  20. Ceres 曲线拟合

热门文章

  1. VS1005 VSOS 固件和 MegaLib 亮点
  2. PPTV网络电视 3.1.9.0042官方正式版下载 (原PPLive)
  3. 用“网文快捕”破解不能复制文字的网站
  4. 全景软件拼接完全景图后的拼接痕迹如何用PS处理?
  5. STM32F4 discovery 开发板 UART1 问题
  6. C语言/gets()函数和scanf()函数关于字符串的输入
  7. 设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?
  8. 电脑内存占用过高 解决方法
  9. mysql添加user表中的用户
  10. java cup_使用JFlex、JavaCUP