当前位置: 首页 > news >正文

详细介绍如何利用 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 )

相关文章:

  • 基于Java,SSM,html,Vue在线视频播放管理系统网站设计
  • Windows通过git配置github代码仓库全流程
  • Android compose 使用指纹验证
  • GDAL升级到3.0之后遇到的坑
  • MySQL与SQLite区别
  • 【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection
  • 【并发编程】CountDownLatch
  • 多线程中常用的一些方法介绍
  • Mongodb中一个小巧的数据更新命令$inc
  • Arraylist,TreeSet,TreeMap的增删改查及遍历
  • 自我认识的方法模型图
  • 二维码:技术、商业与未来
  • 【Qt 学习笔记】认识QtSDK中的重要工具
  • 代码随想录Day43
  • 2024最新版Android studio安装入门教程(非常详细)
  • Android系统模拟器绘制实现概述
  • Angular 4.x 动态创建组件
  • C++入门教程(10):for 语句
  • es6
  • MySQL的数据类型
  • PaddlePaddle-GitHub的正确打开姿势
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Twitter赢在开放,三年创造奇迹
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 前端
  • 入门到放弃node系列之Hello Word篇
  • 使用Gradle第一次构建Java程序
  • 在Docker Swarm上部署Apache Storm:第1部分
  • FaaS 的简单实践
  • #if 1...#endif
  • #include
  • (09)Hive——CTE 公共表达式
  • (1)STL算法之遍历容器
  • (八)c52学习之旅-中断实验
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (力扣题库)跳跃游戏II(c++)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (区间dp) (经典例题) 石子合并
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)UDP基本编程步骤
  • (一一四)第九章编程练习
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 8.0 中有哪些新的变化?
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 服务 ServiceController
  • .NET 使用 XPath 来读写 XML 文件
  • .NET企业级应用架构设计系列之结尾篇
  • .NET下ASPX编程的几个小问题
  • @Bean有哪些属性
  • @DependsOn:解析 Spring 中的依赖关系之艺术