拼图游戏及其相关算法

From: http://blog.sina.com.cn/s/blog_4ed8b87701011c6x.html

 

  这个问题其实可以简单表述成,3*3的格子装了1至8,8个数字,数字是随机分布于各个格子中,问是否可以利用空格的格子,移动装有数字的格子最终达到某种序列?比如像常见的拼图游戏,8个图格,然后利用空白格移动图片格子使其成为一幅完整的图案。

如图1所示

图1 随机打乱的数字图格和目标状态

问题隐含的数学原理

这个问题其实涉及到数学中群论。目标状态问题可以归结为一个置换群的问题,一个任意的状态A最终如果能够达到目标状态F,那么我们可以说置换群的个数为1,如果只有50%的可能性,那么这个置换群的个数就是2了。置换群内部的状态可以互相转换,但是却不可能有A群中的状态转向B群中的状态互相转换的情形发生。九宫格的问题其实是一个奇偶置换群的实例,该群无论如何置换奇偶性都不变,所以如果开局和目标的奇偶性相同,就一定有解(因为经过有限次的置换一定循环),如果奇偶性不同,一定无解。

n*n的方格中放入1,2,3,…,n-1及一个空格,在任何一种状态A下,  

定义:f(i)=k,表示i放在第k个格子中,k按照从左至右,从上到下排序;  

定义:g(i,j)=1, 如果(f(i)-f(j))(i-j)<0;否则为0;

定义:F(A)=∑ g(i,j),对所有i,j求和(这里i<j);

针对图1,其目标F(End)=0,其初始F(Begin)=12(f(1)=1 f(2)=9 f(3)=3 f(4)=4 f(5)=8 f(6)=2 f(7)=7 f(8)=5),其奇偶性相同,故有解。利用F函数可以解决所有n为奇数的情况。比如n=3,因为移动空格只有2种方式:在同行中移动不改变F值,在不同行中移动F值+2,-2或不变,故初始和末态的状态不会发生改变。

问题隐含的人工智能原理

在数学上,我们虽然完美解决了问题是否存在解决方案的问题,但是实际上,我们需要实现这个方案的具体内容,即在存在解的情况下,如何移动最少的步数使其达到目标状态。人工智能的启发式搜索算法在这里派上了用场。所谓的启发式搜索就是对于许多应用过程,可以找到领域特有的知识来指导搜索过程,以提高工作效率,而这些知识称为启发式知识。我们先给出状态空间搜索的概念,状态空间搜索,就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果。由于求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间。问题的求解实际上就是在这个图中找到一条路径可以从开始到结果。这个寻找的过程就是状态空间搜索。常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下找,直到找到目标为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止。这两种算法在数据结构书中都有描述,可以参看这些书得到更详细的解释。前面说的广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效率实在太低,甚至不可完成。在这里就要用到启发式搜索了。启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。我们先看看估价是如何表示的。启发中的估价是用估价函数表示的,如:f(n) = g(n) + h(n),其中f(n)是节点n的估价函数,g(n)实在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。

对于这个九宫格游戏,我们采用如下的评价函数,f(n) = d(n) + h(n),其中d(n)为当前状态从初始状态开始移动的步数,h(n)计算当前状态与目标状态相比错位的个数。搜索过程总是往f(n)最小的分枝方向进行,以便快速达到最终状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在移位数组中查找数

题目描述&#xff1a; 一个数组是由一个递减数列左移若干位形成的&#xff0c;比如{4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;6&#xff0c;5}是由{6&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1}左移两位形成的&#xff0c;在这种数组中查…

小程序分享功能记录;小程序页面分享给好友携带参数

需求&#xff1a; 现有首页index和新增车辆页add-car。 正常操作流程是&#xff1a;从首页index点击按钮&#xff0c;会携带参数id跳转到新增车辆页add-car。 现在需求是用户A从首页index携带参数id跳转到新增车辆页add-car&#xff0c;在add-car页面点击分享按钮&#xff0c;将…

关于Application.Lock和Lock(obj)

1.Application.Lock和Application.UnLock一般配对出现&#xff0c;用于锁住Lock与UnLock之间的所有代码&#xff08;注意不光锁住对于Application的赋值&#xff09;。 2.Lock(obj) 于用锁住obj对象&#xff0c;obj对象必须是全局对象&#xff08;如&#xff1a;Application&am…

mysql事务处理

2019独角兽企业重金招聘Python工程师标准>>> ACID:Atomic、Consistent、Isolated、Durable 存储程序提供了一个绝佳的机制来定义、封装和管理事务。 1&#xff0c;MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身&#xff0c;而是与存储引擎相关&#x…

记录一次uni-app页面跳转无效 来回跳转问题

问题&#xff1a;本身代码写的有问题导致的。从首页A跳转到新增页面B&#xff0c;在B页面点击保存后&#xff0c;再跳到首页A。此时在首页A&#xff0c;这时候无论点击跳转哪个页面&#xff0c;跳转成功后都会立即再跳回首页。 原因&#xff1a;B页面保存后&#xff0c;因为加了…

vue props 传值 触发事件方法

先父页传值 到子页用watch 监听show的值改变&#xff0c;触发方法 <dialog :showshowData v-on:listenhandData></dialog>data(){return:{showData:true} } methods:{handData(){....} } props:{show:Boolean} watch:{show:function(indexVal, oldVal){console.…

No1_6.字符串的基本操作2_Java学习笔记

1 import java.util.Scanner;2 import java.util.regex.Pattern;3 4 public class HelloString2 {5 6 public static void main(String[] args) {7 // TODO Auto-generated method stub8 /*******************9 *一、正则表达式&#xff1a;对输入…

IE6双倍边距

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a;IE6双倍边距这个问题其实早在学习CSS之初都已经知道如何解决&#xff0c;但当时只知道如何解决而并不知道引起这个BUG的原因是什么&#xff0c;再接下来工 作过程中不断实践也终于明白是怎么回事了。但最…

centOs 7.2*64 ECS nginx安装教程

在服务器新建个文件夹放nginx下载包 mkdir ./nginx cd ./nginx 跳转到nginx文件下载 wget http://nginx.org/download/nginx-1.13.0.tar.gz 解压 tar -xvf ./(nginx的文件名) 进到解压文件&#xff0c;运行 ./configure --prefix/usr/local/nginx --with-http_ssl_module…

typeid详解

From: http://www.cppblog.com/smagle/archive/2010/05/14/115286.aspx 在揭开typeid神秘面纱之前&#xff0c;我们先来了解一下 RTTI &#xff08;Run-Time Type Identification&#xff0c;运行时类型识别&#xff09;&#xff0c;它使程序能够获取由基指针或引用所指向的对…

H5静态页面跳转微信小程序;从外部浏览器,点击H5链接跳转打开微信小程序;以及在微信内直接点击H5链接打开微信小程序;

参考链接 需求&#xff1a;从外部浏览器&#xff0c;点击H5链接跳转打开微信小程序&#xff1b;以及在微信内直接点击H5链接打开微信小程序&#xff1b; 步骤1&#xff1a; 小程序开发需要使用云开发创建项目&#xff0c;使用云开发生成的项目会自带云函数文件夹&#xff1b;…

构建之法阅读笔记02

构建之法第三章讲述的是如何去评价一位软件工程师。首先&#xff0c;类似于艺术创作&#xff0c;一件好的作品一定是经过一位好的艺术家倾注自己的灵感和情感所创作出来的。同样的&#xff0c;一个好的软件也需要一位好的软件工程师倾注他的智慧和汗水才能得以诞生。首先作为初…

c简单的链表错误及改正

2019独角兽企业重金招聘Python工程师标准>>> 以下代码运行时崩溃&#xff1a; #include <iostream> using namespace std; struct node { int num; struct node * next; }; node * creat() { node * headNULL;node*HEADhead; cout<<"输入数字&…

js数组去重方法

var arrayList [];arrayList arrayList.filter(function (element, index, self) {return self.indexOf(element) index; });

uni-app微信小程序跳转公众号;微信小程序打开公众号;微信小程序识别二维码添加好友;微信小程序通过公众号添加好友;小程序里识别企业微信二维码点击联系人名片无反应?

需求&#xff1a; 在微信小程序页面中&#xff0c;长按识别图片二维码&#xff0c;识别出联系人后&#xff0c;点击添加好友&#xff1b; 问题&#xff1a;微信官方社区说是小程序添加不了好友&#xff1b; 解决方案&#xff1a; 目前只能通过微信小程序跳转至公众号&#xf…

A*算法入门

From: http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前&#xff0c;先介绍几个理论知识&#xff0c;有助于理解A*算法。 启发式搜索&#xff1a;启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估&#xff0c;得到最好的位置&a…

ThinkPHP讲解(一)框架基础

ThinkPHP框架知识点过于杂乱&#xff0c;接下来将以问题的形势讲解tp&#xff08;ThinkPHP的简写&#xff09; 1.tp框架是什么&#xff0c;为什么使用是它&#xff1f; 一堆代码的集合&#xff0c;里边有变量、函数、类、常量&#xff0c;里边也有许多设计模式MVC、AR数据库、单…

Kundera 2.1 发布,NoSQL 的 ORM 框架

Kundera 2.1 发布&#xff0c;Kundera 是一个 JPA 2.0 兼容的 NoSQL 数据存储的对象映射框架。目前支持的 NoSQL 服务器包括&#xff1a;Cassandra、HBase、MongoDB。 Kundera 2.1 包含 bug fixes, 性能提升以及如下的新特性&#xff1a; CQL Version configurationBatch inser…

uni-app文档需要注意细节点

1.非H5端&#xff0c;不能使用浏览器自带对象&#xff0c;比如document、window、localstorage、cookie等&#xff0c;更不能使用jquery等依赖这些浏览器对象的框架。因为各家小程序快应用都不支持这些对象。 2.APP 和小程序的导航栏和 tabbar 均是原生控件&#xff0c;元素区…