人工智能课后作业_python实现A*算法实现8数码问题(附源码)

news2024/11/25 2:32:36

3 A*算法实现8数码问题

  • 3.1算法介绍
  • 3.2实验代码
  • 3.3实验结果
  • 3.4实验总结

3.1算法介绍

Astar算法是一种求解最短路径最有效的直接搜索方法,也是许多其他问题的常用启发式算法。它的启发函数为f(n)=g(n)+h(n),其中,f(n) 是从初始状态经由状态n到目标状态的代价估计,g(n) 是在状态空间中从初始状态到状态n的实际代价,h(n) 是从状态n到目标状态的最佳路径的估计代价。

h(n)是启发函数中很重要的一项,它是对当前状态到目标状态的最小代价h*(n)的一种估计,且需要满足

h(n)<=h*(n)

也就是说h(n)是h*(n)的下界,这一要求保证了Astar算法能够找到最优解。这一点很容易想清楚,因为满足了这一条件后,启发函数的值总是小于等于最优解的代价值,也就是说寻找过程是在朝着一个可能是最优解的方向或者是比最优解更小的方向移动,如果启发函数值恰好等于实际最优解代价值,那么搜索算法在一直尝试逼近最优解的过程中会找到最优解;如果启发函数值比最优解的代价要低,虽然无法达到,但是因为方向一致,会在搜索过程中发现最优解。

h是由我们自己设计的,h函数设计的好坏决定了Astar算法的效率。h值越大,算法运行越快。但是在设计评估函数时,需要注意一个很重要的性质:评估函数的值一定要小于等于实际当前状态到目标状态的代价。否则虽然程序运行速度加快,但是可能在搜索过程中漏掉了最优解。相对的,只要评估函数的值小于等于实际当前状态到目标状态的代价,就一定能找到最优解。所以,在这个问题中我们可以将评估函数设定为1-8八数字当前位置到目标位置的曼哈顿距离之和。

Astar算法与BFS算法的不同之处在于每次会根据启发函数的值来进行排序,每次先出队的是启发函数值最小的状态。

Astar算法可以被认为是Dijkstra算法的扩展。Dijkstra算法在搜索最短距离时是已知了各个节点之间的距离,而对于Astar而言,这个已知的距离被启发函数值替换。

3.2实验完整源代码

下载链接:https://download.csdn.net/download/DeepLearning_/87280770

3.3实验结果

仍然用相同的例子,用Astar进行搜索。

在这里插入图片描述

将找出的解从初始状态一步一步输出到解状态。

在这里插入图片描述

从结果中可以看出总共进行了9次遍历,并在第4层时找到了解状态。

下面我们来看一看Astar的所有9次遍历,以此来更深入的理解Astar的原理。稍微对代码进行改动,使其输出遍历次数和当前状态的启发信息(其中F是启发值,G是当前深度,H是不在位棋子的曼哈顿距离之和)。由于结果太长,为了方便展示,下面将以树的形式展示。

在这里插入图片描述

上面输出的解就是按照红色路线标注找到的,从遍历次数和相应状态的启发信息可以看出每次对启发函数值最小的状态进行扩展,依次进行搜索。

3.4实验总结

从三个算法的遍历次数可以看出Astar算法更加优秀,能够更快的找到解。但是因为上面给出的八数码题目太简单了,只需要4步就能解决问题,所以看起来优势没有那么明显。下面我们选择另一个比较难的,需要更多移动步数的题目,以此来体现启发式搜索相较于盲目搜索的优越性。用三种算法搜索下面八数码的解。

在这里插入图片描述

下面是比较的结果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

显。下面我们选择另一个比较难的,需要更多移动步数的题目,以此来体现启发式搜索相较于盲目搜索的优越性。用三种算法搜索下面八数码的解。

可以看出来Astar在一百次遍历之内就找到了解,而另外两个盲目搜索算法则需要几千次才搜索到。

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

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

相关文章

竞拍拍卖管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系我门、公告信息、拍卖物品&#xff0c;拍卖完成 管理员功影&#xff1a; 1、管理关…

信贷反欺诈体系介绍及其策略规则应用

在信贷业务的风控体系中&#xff0c;反欺诈始终是一个重要话题&#xff0c;与信用评估构成的贷前风控两大模块&#xff0c;对于贷前风险的防范控制发挥着决定性作用。反欺诈虽然在理解层面上感觉略显简单&#xff0c;但由于场景的复杂性与丰富度&#xff0c;使得反欺诈在研究开…

PD QC快充诱骗取电方案:输出9V12V15V20V

手机快充充电器或充电宝&#xff0c;在没有与手机通讯时&#xff0c;快充充电器相当于普通的充电器只输出5V电压&#xff0c;要想得到充电器的9V/12V等电压&#xff0c;可以使用快充取电电路。 或者也可以使用电子元件来搭建诱骗电路&#xff0c;但是和专用的取电芯片方案相比&…

Part 1:RPA的发展历程

Robot一词的来源 捷克科幻小说家卡雷尔恰佩克创作&#xff0c;于1921 年在布拉格首映的《罗素姆万能机器人》作品中首次出现“robot”&#xff08;机器人&#xff09;一词。这个词源于捷克语的“robota”&#xff0c;意思是“苦力”。恰佩克的机器人原本是为它们的人类主人服务…

Python使用Selenium Webdriver爬取网页所有内容

Python使用Selenium Webdriver爬取网页所有内容一、为什么我抓不到网页的全部html内容二、Selenium的基本使用三、使用Selenium抓取全部HTML一、为什么我抓不到网页的全部html内容 有时候&#xff0c;我们在用urllib或者requests库抓取页面时&#xff0c;得到的html源代码和浏…

4年测试在岗,薪资却被春招来的年轻人超过了,其实你一直在假装努力~

最近和一位同行朋友聊天&#xff0c;一开始大家也没有谈工作&#xff0c;毕竟是出来聚聚&#xff0c;放松一下&#xff0c;吃饭的时候&#xff0c;喝了点小酒&#xff0c;酒过三巡&#xff0c;这个朋友开始诉苦水&#xff0c;大概意思嘞&#xff0c;我给大家概况一下&#xff0…

STM32F4的关键要点分析

1. 从以上截图信息可以看出&#xff1a; 1.当外设数据宽度和内存数据宽度不相等时&#xff0c;要传输的数据项数目的数据宽度由外设数据宽度确定&#xff1b; 2.在直接模式下&#xff08;不使用FIFO&#xff09;&#xff0c;不能进行数据的封装/解封&#xff0c;且源数据宽度和…

Docker-Docker安装nginx

目录 一&#xff0c;容器之间的相互通信 ping 1.1 两个容器在同一网段 1.2 两个容器在不同网段 二&#xff0c;安装Nginx 2.1 nginx是什么 安装步骤 2.4 部署前端项目 上传项目 步骤 一&#xff0c;容器之间的相互通信 ping 1.1 两个容器在同一网段 1.2 两个容器在不同网段…

旋转机械 | 基于ANSYS WB平台的滑动轴承分析工具(一)

导读&#xff1a;本文主要针对Tribo-X inside ANSYS的功能及各方向应用实例进行介绍&#xff0c;限于篇幅关系会分五篇进行介绍&#xff0c;第一篇主要结合软件的需求、理论、功能及应用方向进行介绍&#xff0c;第二篇至第五篇将结合具体应用方向的示例进行介绍。本篇为第一篇…

软件测试工程师的简历项目经验该怎么写?

想要找一份高薪的软件测试工作&#xff0c;简历项目必不可少&#xff08;即使是应届生&#xff0c;你也要写上实习项目&#xff09;。所以很多自学的朋友找工作时会碰到一个令人颇感绝望的拦路虎&#xff1a;个人并没有实际的项目工作经验怎么办&#xff1f; 怎么办&#xff1…

【PS】画笔工具

目录 画直线 拾取颜色 改变画笔大小 改变画笔硬度 不透明度 流量 画笔预设 自定义图片做笔刷 工具预设 画笔面板 画直线 Shift键可画出直线只用点两个点就画出直线&#xff1a;先点一个点&#xff0c;按住shift&#xff0c;再在别处点一点&#xff0c;这时候直线就形…

Python 中如何使用pybind11调用C++

Python 中如何使用pybind11调用C1. pybind11简介与环境安装2. 求和函数3. STL和python内建数据类型的对应关系3.1 **返回vector**3.2 **返回struct**4. pybind11与numpy图像数据接口和速度对比&#xff1a;以图像rgb转化为gray的例子Reference: 混合编程&#xff1a;如何用pyb…

银联卡8583协议小额免密免签交易总结

之前做过金融支付这块儿。到过北京石景山区银行卡检测中心过检PBOC的level&#xff12;认证&#xff0c;去过上海银联总部和湖南银联对接银联卡和扫码支付。对金融支付和卡交易这块儿熟悉。现在这块儿知识用不上了总结下留作备忘&#xff0c;同时分享给有需要的人。 关于免密免…

【云原生 | Kubernetes 实战】12、K8s 四层代理 Service 入门到企业实战应用(下)

目录 一、创建 Service&#xff1a;type 类型是 NodePort 1.1 创建一个 pod 资源 1.2 创建 service&#xff0c;代理 pod 在集群外访问 service&#xff1a; 数据转发流程&#xff1a; 二、创建 Service&#xff1a;type 类型是 ExternalName 2.1 创建 pod 2.2 创建…

相关数据库

h2 需要用以下 初始化一下 第一次启动需要加入下面代码 h2 创建表 可以直接用jdbc 然后进行测试 不需要链接mysql redis 想要启动redis 现在 该目录下 输入俩个cmd 一个cmd 输入redis-cli 到启动太 输入 shutdown 然后再另一个cmd 输入 redis-server.exe redis.windows.con…

如何利用电商模式,灵活结合当地产品生态全力助农,实现乡村振兴

随着互联网时代的发展&#xff0c;人们的消费观念和消费习惯逐渐被改变&#xff0c;绿色环保观念深入人心&#xff0c;人们加大了对农产品的高要求和高需求&#xff0c;同时&#xff0c;近年来国家对农业的重视和政策支持&#xff0c;促进了农产品电商的蓬勃发展&#xff0c;已…

YOLOV7学习记录之原理+代码介绍

博主计划做一个目标检测跟踪项目&#xff0c;考虑使用YOLO系列模型来作为目标检测器&#xff0c;如今YOLO项目已经更新到了YOLOV7版本&#xff0c;因此便来学习一下相关原理&#xff0c;完成相关实验工作。 论文链接&#xff1a;https://arxiv.org/abs/2207.02696 网络结构 YO…

【字节码】Java Instrumentation 简介 以及 ASM 组合案例

1.概述 本文来自:深入理解JVM字节码 并且对其进行补充。 2.Java Instrumentation简介 JDK从1.5版本开始引人了java.lang.instrument 包,开发者可以更方便的实现字节码增强。其核心功能由java.lang.instrument.Instrumentation 提供,这个接口的方法提供了注册类文件转换器…

python列表添加元素append(),extend(),insert(),+list的区别及说明

这篇文章主要介绍了python列表添加元素append(),extend(), insert(),list的区别及说明&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。 列表添加元素append(),extend(),insert(),list区别 回忆初学python的时候&#xff0c;对列表list添加元素时&#xff0c…

[附源码]Nodejs计算机毕业设计基于web技术的米其林轮胎管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…