详细介绍如何利用 A star(A*)算法解决8数码问题

文章目录

  • 1. A star(A*)算法简介
  • 2. 利用A*解决8数码问题(含Python代码)
    • 2.1 什么是8数码问题
    • 2.2 A*算法中的开放列表和关闭列表
    • 2.3 A*算法解决8数码问题过程
      • 2.3.1 计算节点(棋盘顺序)间距离
      • 2.3.2 交换数字生成新的节点
      • 2.3.3 A*主求解程序


1. A star(A*)算法简介

A ∗ A^* A 算法是一种常用的高效图搜索算法,用于在静态图中找到从起始节点到目标节点的最短路径。它结合了 D i j k s t r a Dijkstra Dijkstra 算法和 启发式(贪心)搜索算法的思想,通过使用“启发式函数”来控制搜索过程,从而提高大部分场景下的搜索效率。

D i j k s t r a Dijkstra Dijkstra 算法 (一种标号法)是每次优先搜索距离起始节点最近的待搜索节点,常用在带权值的路径搜素问题当中,这是典型的广度优先搜索,该算法能保证找到最短路,也常用在多目标节点或无目标节点的场景(挖宝游戏),但是这类算法在寻路场景下往往效率较低,需要花费大量的时间探索各个方向;启发式(贪心)搜索算法 则恰恰相反,它每次优先探索距离目标节点最近的节点,在无障碍的地图上,该算法效率极高,但如果有障碍,贪心搜索并不能保证找到的路线是最短的,或者遇到像挖宝这种无目标节点的场景则无法计算与目标的距离。

A ∗ A^* A 算法 在考虑探索节点的优先顺序时,既考虑了与起始节点的距离,又考虑了与目标节点的预估距离,即综合考虑:从起始节点出发,经过当前节点到目标节点的总的估计代价(距离),既能保证找到最短路径,又能比广度优先搜索有更高的效率。

2. 利用A*解决8数码问题(含Python代码)

2.1 什么是8数码问题

8数码问题是一个经典的搜索问题。在一个 3 × 3 3\times 3 3×3 的棋盘上,放着数字 1 1 1 8 8 8,还有 1 1 1 个位置空着,通过交换空格与相邻位置的数字,来移动空格(只能上下左右),该问题会给出一个初始的棋盘顺序,以及期望的棋盘顺序,问最少移动多少下空格,能将初始顺序改变为目标顺序?

听着是不是有点像华容道

把空格的移动视作是棋盘顺序的移动,且这种对应关系是确定的,因此可以把8数码问题视为一个路径优化问题,每个棋盘顺序是一个节点。那么现在有个关键的问题,就是如何确定棋盘顺序(节点)与棋盘顺序(节点)之间的距离大小呢? 有两种简单的计算方法:

  1. 计算两个顺序中,未正确摆放的数字数量,对于目标顺序,该值为 0 0 0,该方法仅关注未摆放正确的数字数量,计算方法简单,但实际中,往往又不是这么回事,相同的错摆数量,确实不同的调整难度,如下例子:

    1 , 2 , 3 2 , 3 4 , 5 ,   → 4 , 5 , 6 7 , 8 , 6 7 , 8 , 1 1, 2, 3\quad\quad \quad\quad2,3\\ 4,5, \quad\,\rightarrow\quad4,5,6\\7,8,6\quad\quad\quad7,8,1 1,2,32,34,5,4,5,67,8,67,8,1

  2. 另一个距离公式是所有数字 1 − 8 1-8 18 在两个棋盘顺序中的位置距离之和,而对于二维棋盘上数字的位置,可以用一维的索引值表示,也可以用行列坐标表示,例如上面的例子,数字 6 6 6 在左边棋盘的位置可以是 8 8 8,也可以是 ( 2 , 2 )

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

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

相关文章

算法之模拟

前言 模拟算法通俗地来解释就是 "照葫芦画瓢", 通常这类题的题目中就说明了这道题应该怎么做, 要做的就是把题目的意思转化为代码, 这类题的特点是思路比较简单, 考查的是代码能力. 1. 模拟算法流程, 最好在演草纸上过一遍流程, 凭空想象可能会忽略一些细节 2. 把流…

Vue3:组件间通信-$refs和$parent的使用

一、情景说明 我们在之前,学习了Vue3:标签的ref属性用法 我们知道,父组件中,给子组件使用ref标记后,获取到的是,子组件实例。 那么,我们就可以修改子组件实例暴露的变量值。 与之对应的是&…

软件架构复用

1.软件架构复用的定义及分类 软件产品线是指一组软件密集型系统,它们共享一个公共的、可管理的特性集,满足某个特定市场或任务的具体需要,是以规定的方式用公共的核心资产集成开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。核心…

比较靠谱的测试进度报告

在测试的过程中,不要等领导过问,有一份比较靠谱的测试进度报告,让关心和支持项目的干系人心里有谱,有利于管理层对项目的监控和资源的支持,有利于项目团队成员之间沟通协调,及时发现问题利于项目风险控制等…

八字合盘 api数据接口

八字合盘可以双方的生辰八字来以本命卦,年支同气,月令合,日干合,天干五合,合盘论吉凶,并给出相应分数,测算结果仅供参考。 接口名称:八字-八字合盘 接口平台:缘份居国学…

OpenHarmony实战:CMake方式组织编译的库移植

以double-conversion库为例,其移植过程如下文所示。 源码获取 从仓库获取double-conversion源码,其目录结构如下表: 表1 源码目录结构 名称描述double-conversion/cmake/CMake组织编译使用到的模板double-conversion/double-conversion/源…

【漏洞复现】某科技X2Modbus网关多个漏洞

漏洞描述 最近某科技X2Modbus网关出了一个GetUser的信息泄露的漏洞,但是经过审计发现该系统80%以上的接口均是未授权的,没有添加相应的鉴权机制,以下列举多个未授权接口以及获取相关敏感信息的接口。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律…

【C++11】异常机制

文章目录 一. 什么是异常?二. 为什么要引入抛异常机制?方法一:直接终止程序方法二:返回错误码方法三:C 标准库中的 setjmp 和 longjmp 组合总结 C 中处理异常的方式 三. 如何进行抛异常?1. 关于抛出的异常对…

前端性能监控、异常监控的一些记录

文章目录 常见异常类型常用的一些异常监控的方法window.errorwindow.addEventListener(error)window.addEventListener(load)window.addEventListener(DOMContentLoaded)window.performancenavigator.sendBeacon1*1像素gifaxios 请求/响应拦截器Vue的errorHandlerReact的ErrorB…

C#网站系统如何监控登录过期

原理 网站系统监控登录过期通常涉及多个层面的技术和策略。以下是一些建议的方法来实现这一功能: 会话管理 会话超时设置 为每个用户会话设置一个超时时间。一旦用户在这个时间段内没有与系统进行任何交互,会话将被视为过期,用户需要重新…

[QOpenGLWidget+QMouseEvent]实时绘制长方形

复现moho-打卡第1天 - 20240402 1.1--QOpenGLWidget中显示长方形 实现方法:顶点着色器中给定长方形的四个顶点数据,代码如下: // 顶点位置 GLfloat vertics[1][4][3] { {{mousePressPosX,mousePressPosY,0.0},{mousePressPosX,mouseMoveP…

网络爬虫:爬取假数据

网络爬虫:爬取假数据 文章目录 网络爬虫:爬取假数据前言一、项目介绍:二、项目来源:三、架构图:(流程图)四、使用了什么技术:(知识点)五、结果示意图&#xf…

Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图 2 代码实现 2.1 .h文件 #ifndef VIDEORECORDWIDGET_H #define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp>using name…

Linux实验过程

答案截图获取&#xff0c;代写&#xff1a; https://laowangall.oss-cn-beijing.aliyuncs.com/studentall.pdf 基本任务&#xff1a; 1.Linux操作系统安装 2.vi文本编辑 3. Linux用户及文件管理命令 4. Linux权限管理命令 5. Linux网络服务 提高任务&#xff1a; 1、Li…

DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文 1. 键盘报文体验 一个键盘对于用户的体验是&#xff0c;用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的&#xff1f; 其实很简单&#xff0c;只要键盘发送下面的两个报文给主机&#xff0c;字母A就能在主机上显示出来。 (1)…

数据结构——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

目录 1.最小生成树 1.概念回顾——生成树 2.最小生成树概念 2.构造最小生成树 1.MST性质 2.Prim算法 3.Kruskal 算法 4.两种算法比较 3.最短路径 1.两点间最短路径 2.某源点到其它各点最短路径 3.单源最短路径——用Dijkstra算法 4.所有顶点间的最短路径…

Flask Python:模糊查询filter和filter_by,数据库多条件查询

数据库&#xff08;sqlalchemy&#xff09;多条件查询 前言一、filter、filter_by实现过滤查询1、filter_by()基础查询并且查询&#xff08;多条件查询&#xff09; 2、filter()like&#xff1a;模糊查询and&#xff1a;并且查询or&#xff1a;或者查询 二、all(),first(),get(…

【一站式学会Kotlin】第一节 kotlin 介绍

作者介绍&#xff1a; 百度资深Android工程师T6&#xff0c;在百度任职7年半。 目前&#xff1a;成立赵小灰代码工作室&#xff0c;欢迎大家找我开发Android、微信小程序、鸿蒙项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默。给大家…

嵌入式系统基础知识(二):什么是实时系统?

实时系统越来越广泛地应用于各个领域&#xff0c;也越来越受到人们的重视。那什么是实时系统呢&#xff1f; 一.定义 实时系统&#xff0c;英文全称为Real-time Operating System&#xff0c;简称RTOS&#xff0c;它的正确性不仅依赖于系统计算的逻辑结果&#xff0c;还依赖于…

中文Mistral模型介绍(Chinese-Mistral)——中文大语言模型

中文Mistral简介 Chinese-Mistral由清华大学地学系地球空间信息科学实验室开发。 该模型基于Mistral发布的Mistral-7B-v0.1训练得到。首先进行中文词表扩充&#xff0c;然后采用实验室提出的PREPARED训练框架&#xff08;under review&#xff09;在中英双语语料上进行增量预训…