Scratch 游戏传统导路算法

1 深度优先算法(DFS)

        这个算法不是最短路算法,只是一个基本的搜索算法,但是可以得出图中是否能找到指定节点

大致的思路:

  1. 从起始节点开始,将其标记为已访问。

  2. 检查当前节点的相邻节点中是否存在未访问的节点。

  3. 若存在未访问的节点,则选择其中一个未访问节点作为下一个当前节点,并将其标记为已访问。然后回到步骤 2。

  4. 若不存在未访问的节点,则回溯到上一个节点,即回到该节点的上一级节点,并重复步骤 2。

  5. 重复步骤 4,直到所有节点都被访问。


具体的实现

递归

        存在一个全局变量存储一个二维数组或邻接表,描述整张图

        建立一个函数dfs,参数标记当前节点在图中的位置,以及目标节点的特征或位置,返回值可以为是否找到

        进入函数,先将当前节点设为已访问

        如果当前节点是目标,直接返回真

        按照一定顺序读取周围可以到达的未访问过的节点,递归调用dfs函数,如果dfs返回真,则函数立即返回真,如果dfs返回伪,继续寻找周围可走的节点

        如果周围的节点都不能走,即函数执行到了这一里,则返回伪

  1. 依旧是存在一个全局变量存储一个二维数组或邻接表,描述整张图
  2. 建立一个栈s
  3. 将起点入栈,并且标记起点为已访问
  4. 只要栈中有元素循环:
  5. 获取栈顶元素为当前节点
  6. 弹掉栈顶元素
  7. 如果当前节点满足终点,就跳出循环
  8. 按照一定顺序读取周围可以到达的未访问过的节点,将其入栈并且标记为已访问

广度优先算法(BFS)

        虽然一般都是先学dfs再学bfs,但是我认为,bfs比dfs简单

思路是:

  1. 从起始节点开始,将其标记为已访问,并将其加入队列。

  2. 从队列中取出一个节点作为当前节点。

  3. 判断这个节点是否为终点,如果是,循环的次数就是最短路径长,且可以

  4. 检查当前节点的所有相邻节点中是否存在未访问的节点。

  5. 若存在未访问的节点,则将其标记为已访问,并将其加入队列。

  6. 重复步骤 2-5,直到队列为空。

它的实现差不多是这样,


Dijkstra 算法

        现在我们看一个早期的启发式搜索,它在图寻路中引用场景最广因为它考虑到边权,但是,边权为0时,它会退化为广度优先搜索

思路是:

  1. 初始化:将起始节点标记为已访问,距离起始节点的距离设置为0,并将所有其他节点的距离设置为无穷大。

  2. 找到最短路径:从起始节点开始,按照当前已知的最短距离,在未访问的节点中选择一个距离最小的节点进行访问。

  3. 更新节点距离:对于所选的节点,计算该节点与其相邻节点的距离和。如果通过当前节点到达相邻节点的距离比之前记录的最短距离要小,则更新最短距离。

  4. 标记已访问:标记当前节点为已访问,意味着已找到从起始节点到该节点的最短路径。

  5. 重复步骤2-4:重复执行步骤2到4,直到所有节点都被标记为已访问或者没有可访问的节点为止。这样,每个节点的最短路径就都得到了确定。

  6. 输出最短路径:最后,根据计算得到的最短路径信息,可以输出从起始节点到每个节点的具体路径

        实现也差不多,现在不方便贴代码,只能讲讲思路,一般实现是架邻接表而不是二维数组,因为二维数组不方便描绘边权


Floyd 算法

思路最简单的算法Floyd思路是:

  1. 初始化:创建一个二维数组D,用于保存节点之间的最短路径距离。初始时,如果两点之间存在边,则将其距离赋值给D;如果两点之间没有边,则将其距离设为无穷大。

  2. 迭代更新:对于每个顶点k,以顺序的方式遍历每对节点i和j,尝试通过节点k来改进节点i和节点j之间的最短路径。即,如果节点i到节点j的距离大于节点i到节点k的距离加上节点k到节点j的距离(即D[i][k] + D[k][j]),则更新节点i到节点j的距离为D[i][k] + D[k][j]。

  3. 重复迭代:继续进行迭代更新,每次都考虑一个新的中间节点k,直到所有节点都被作为中间节点考虑过一次。

  4. 输出最短路径:迭代完成后,二维数组D中保存的即为任意两点之间的最短路径距离。

但是,它的时间复杂度是难以接受的,高达O(n^3)


贪心搜索

        它在每一步选择时都采取当前看起来最好的选择,并希望通过一系列局部最优的选择来达到全局最优,且不会回头。

贪心搜索的基本思想如下:

  1. 初始化:确定问题的初始状态。

  2. 选择阶段:从当前状态开始,根据某个标准选择一个最好的操作或决策。这个选择是基于局部信息的,它不会考虑之前的选择或者未来的结果。

  3. 更新状态:根据所选择的操作或决策,更新当前状态。

  4. 终止条件:如果当前状态满足终止条件(到达终点),则结束搜索;否则返回第2步。

        具体实现依赖于一个启发函数,用于检测周围哪个点里终点更近

        贪心算法的目光是短浅的,所以得到的结果不一定正确,但是它通常执行速度较快。因此,在某些情况下,贪心搜索可能会得到次优解或者无法找到任何解。所以贪心这个算法是不合适的


最佳优先搜索

        最佳优先搜索(Best-First Search)是一种启发式搜索算法,它根据一个评估函数来选择下一个扩展的节点。评估函数用于估计当前节点到目标节点的代价或距离,算法总是选择具有最低评估值的节点进行扩展。

最佳优先搜索的基本思想如下:

  1. 初始化:确定问题的初始状态。

  2. 维护一个待扩展节点的优先队列,初始时将初始状态放入队列中。

  3. 重复执行以下步骤直到找到解决方案或队列为空:

a. 从队列中取出评估值最低的节点。

b. 检查当前节点是否为目标节点,如果是,则找到了解决方案,结束搜索。

c. 否则,根据当前节点扩展出所有可能的子节点,并计算每个子节点的评估值。

d. 将子节点按照评估值由低到高的顺序插入队列中。

        最佳优先搜索使用评估函数来选择下一个扩展的节点,根据评估值的大小进行排序。这种排序策略使得搜索算法更有可能朝着接近目标的方向前进,从而提高搜索效率。然而,最佳优先搜索并不能保证找到全局最优解,因为它只关注当前最佳的节点,并没有考虑之前的选择或未来的结果,但是最佳优先算法的比贪婪搜索更容易得到最优解,它有时会考虑回溯,但是依旧不保证最优解


A*

        A*(A-Star)是一种综合了最佳优先搜索和Dijkstra算法的启发式搜索算法。它在搜索过程中维护了两个值:一个是从起始节点到当前节点的实际代价(g值),另一个是从当前节点到目标节点的估计代价(h值)。

A*算法的基本思想如下:

  1. 初始化:确定问题的初始状态,将起始节点放入开放列表。

  2. 维护两个列表:开放列表:存储待扩展的节点,按照f值(f = g + h)进行排序。 关闭列表:存储已经扩展过的节点。

  3. 重复执行以下步骤直到找到解决方案或开放列表为空:

a. 从开放列表中选择f值最小的节点作为当前节点。

b. 检查当前节点是否为目标节点,如果是,则找到了解决方案,结束搜索。

c. 否则,将当前节点从开放列表移动到关闭列表。

d. 根据当前节点扩展出所有可能的子节点,并计算每个子节点的g值和h值。

e. 对于每个子节点,如果它已经在开放列表或关闭列表中,比较新的g值与已有的g值,选择较小的更新;否则,将子节点加入开放列表。

        A算法使用了启发式估计函数来指导搜索过程,它综合了实际代价和估计代价。g值表示从起始节点到当前节点的实际代价(通过已经扩展的路径),h值是从当前节点到目标节点的估计代价,通常使用启发式函数(如曼哈顿距离或欧几里得距离)来计算。A算法选择f值最小的节点进行扩展,f值较小的节点具有更高的优先级。

        A算法在满足一定条件下能够保证找到最短路径(最佳解决方案),即f值最小的节点是全局最优解。然而,在某些情况下,A算法可能会受到启发式函数的影响而无法找到最佳解决方案,或者搜索空间非常庞大时会消耗大量的时间和内存。


B*

        接下来对A*进行一些优化

        在A*算法中,h值是通过启发式函数进行估计的,这个估计值对搜索的效率和质量影响很大。然而,有些情况下,启发式函数可能无法提供准确的估计。例如,在某些问题中,启发式函数可能无法获得目标节点的准确估计代价,导致搜索算法受到偏差而无法找到最优解。

        B算法引入了一个新的概念——子目标(subgoal),并采用了更加灵活的估计方式。B算法中,该算法会先生成一个子目标,然后通过子目标来修正启发式函数的估计值。具体步骤如下:

  1. 初始化:确定问题的初始状态,将起始节点放入开放列表。

  2. 维护两个列表:开放列表:存储待扩展的节点,按照f值(f = g + h)进行排序。 关闭列表:存储已经扩展过的节点。

  3. 重复执行以下步骤直到找到解决方案或开放列表为空: a. 从开放列表中选择f值最小的节点作为当前节点。 b. 检查当前节点是否为目标节点,如果是,则找到了解决方案,结束搜索。 c. 否则,将当前节点从开放列表移动到关闭列表。 d. 根据当前节点扩展出所有可能的子节点,并计算每个子节点的g值和h值。 e. 对于每个子节点,根据子目标修正启发式函数的估计值,并计算新的f值。 f. 将子节点加入开放列表。

        B算法通过不断调整启发式函数的估计值来获取更准确的路径估计。它使用子目标来指导搜索过程,根据子目标的信息修正启发式函数的估计值,并根据新的估计值进行节点扩展。这个过程允许B算法在搜索过程中逐渐修正路径的估计,并更好地适应问题的特点。


D*

        D*(D-Star)是一种基于改变图搜索和路径规划的增量式算法。它用于在已知环境地图上进行路径规划,并能够在地图信息发生变化时进行快速更新。

D*算法的基本思想如下:

  1. 初始化:确定问题的初始状态,包括起始节点和目标节点,并初始化其他相关数据结构。

  2. 维护两个主要数据结构:状态图(State Graph):记录了每个节点的状态、代价、连接关系等信息。 优先级队列(Priority Queue):按照代价进行排序的队列,用于选择下一个扩展的节点。

  3. 重复执行以下步骤直到找到解决方案或无法找到路径: a. 从优先级队列中选择代价最小的节点作为当前节点。 b. 检查当前节点是否发生了变化(例如,代价更新或连接关系改变),如果是,则更新相关信息。 c. 更新与当前节点相邻的节点的代价,并计算新的代价值。 d. 如果目标节点的代价发生了变化,则重新评估路径。否则,沿最佳路径进行扩展。 e. 根据更新的信息,重新排序优先级队列。

        D算法通过不断更新节点的代价和连接关系来适应地图变化,并动态调整路径规划过程。它使用增量式的搜索和更新策略,可以在修改地图或代价信息后,快速重新规划路径。D算法重复进行节点的选择和扩展,直到达到目标节点或无法找到路径。


逆向与双向优化

        起点和终点对换一下,再执行算法就是逆向,然而,这没太大的优化作用,接下来结合正向和逆向

        的思路,将正向的搜索结果放入一个数组,逆向的放入另一个,直到两个数组出现重叠,说明找到,这样可以有效的缩减搜索范围实现优化

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

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

相关文章

【计算机网络】传输层协议 -- TCP协议

文章目录 1. TCP协议的引入2. TCP协议的特点3. TCP协议格式3.1 序号与确认序号3.2 发送缓冲区与接收缓冲区3.3 窗口大小3.4 六个标志位 4. 确认应答机制5. 超时重传机制6. 连接管理机制6.1 三次握手6.2 四次挥手 7. 流量控制8. 滑动窗口9. 拥塞控制10. 延迟应答11. 捎带应答12.…

【Spring】Spring之依赖注入源码解析

1 Spring注入方式 1.1 手动注入 xml中定义Bean&#xff0c;程序员手动给某个属性赋值。 set方式注入 <bean name"userService" class"com.firechou.service.UserService"><property name"orderService" ref"orderService"…

数据库访问中间件--springdata-jpa的基本使用

二、单表SQL操作-使用关键字拼凑方法 回顾 public interface UserRepository extends JpaRepository<User,Integer> {User findByUsernameLike(String username); }GetMapping("/user/username/{username}")public Object findUserByUsername(PathVariable S…

【CSS】视频文字特效

效果展示 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"container"&g…

三星书画联展:三位艺术家开启国风艺术之旅

7月22日&#xff0c;由广州白云区文联、白云区工商联主办的“三星书画联展”&#xff0c;在源美术馆正式开展。本次书画展展出的艺术种类丰富&#xff0c;油画、国画、彩墨画、书法等作品异彩纷呈。广东省政协原副主席、农工党省委书画院名誉院长马光瑜&#xff0c;意大利艺术研…

哈工大计算机网络课程局域网详解之:交换机概念

哈工大计算机网络课程局域网详解之&#xff1a;交换机概念 文章目录 哈工大计算机网络课程局域网详解之&#xff1a;交换机概念以太网交换机&#xff08;switch&#xff09;交换机&#xff1a;多端口间同时传输交换机转发表&#xff1a;交换表交换机&#xff1a;自学习交换机互…

iPhone 7透明屏的显示效果怎么样?

iPhone 7是苹果公司于2016年推出的一款智能手机&#xff0c;它采用了4.7英寸的Retina HD显示屏&#xff0c;分辨率为1334x750像素。 虽然iPhone 7的屏幕并不是透明的&#xff0c;但是苹果公司在设计上采用了一些技术&#xff0c;使得用户在使用iPhone 7时可以有一种透明的感觉…

Android 热修复

Android 热修复 本文链接&#xff1a;https://blog.csdn.net/feather_wch/article/details/132052856 文章目录 Android 热修复方案对比AndFixDeprecateRobust-即时生效Tinker-非及时生效 ClassLoader实战一手动打补丁包 热修复二 方案对比 AndFixDeprecate 1、AndFix为什么…

【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析

本章节主要讲解点亮LED的基本原理&#xff0c;以及GPIO框图的讲解。 如何点亮LED&#xff08;输出&#xff09; 首先我们查看原理图&#xff0c;观察电路图中LED的连接情况&#xff0c;如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC&#xf…

排序进行曲-v2.0

小程一言 这篇文章是在排序进行曲1.0之后的续讲&#xff0c; 0之后的续讲,英语在上一篇讲的排序的基本概念与分类0之后的续讲, 英语在上一篇讲的排序的基本概念与分类这片主要是对0之后的续讲,英语在上一篇讲的排序的基本概念与分类这 篇主要是对几个简单的排序进行细致的分析…

JavaData:JDK8之前传统的日期和时间

Data JDK8之前传统的日期和时间 //目标:掌握Date日期类的使用。 //1、创建一个Date的对象:代表系统当前时间信息的。 Date d new Date(); system.out.println(d);//2、拿到时间毫秒值。 long time d.getTime(); system.out.println(time);//3、把时间毫秒值转换成日期对象:2…

企业电子招投标采购系统源码之首页设计

&#xfeff;功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&…

Unity-缓存池

一、.基础缓存池实现 继承的Singleton脚本为 public class Singleton<T> where T : new() {private static T _instance;public static T GetIstance(){if (_instance null)_instance new T();return _instance;} } 1.PoolManager using System.Collections; using S…

Pytest-BDD 行为驱动开发测试

文章目录 01 BDD02 pytest-BDD03 安装pytest-BDD04 pytest-bdd的框架结构05 pytest-bdd基础使用5.1 第一步:添加需求描述/用户场景5.1.1 BDD的表达语法5.1.2 创建`.feature`文件5.2 第二步:实现用户场景5.2.1 用户场景的解析/实现5.2.2 使用`scenarios`或`@scenario`关联用户…

python 测试磁盘读写速度和内存读写速度.

import time import os # from SpeedTest import perform_default_speedtest# 测试硬盘读写速度 def test_disk_speed():filename "./testfile.bin"# 生成一个1GB大小的测试文件with open(filename, "wb") as f:f.write(os.urandom(1024*1024*1024))# 从…

C语言手撕单链表

一、链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;也就是内存存储不是像顺序表那么连续存储&#xff0c;而是以结点的形式一块一块存储在堆上的&#xff08;用动态内存开辟&#xff09;。 既然在内存上不是连续存储&#xff0c;那我们如何将这一…

Qt/C++音视频开发50-不同ffmpeg版本之间的差异处理

一、前言 ffmpeg的版本众多&#xff0c;从2010年开始计算的项目的话&#xff0c;基本上还在使用的有ffmpeg2/3/4/5/6&#xff0c;最近几年版本彪的比较厉害&#xff0c;直接4/5/6&#xff0c;大版本之间接口有一些变化&#xff0c;特别是一些废弃接口被彻底删除了&#xff0c;…

浙大数据结构第六周之Saving James Bond - Easy Version

题目详情&#xff1a; This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake f…

Django学习记录:使用ORM操作MySQL数据库并完成数据的增删改查

Django学习记录&#xff1a;使用ORM操作MySQL数据库并完成数据的增删改查 数据库操作 MySQL数据库pymysql Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。 安装第三方模块 pip install mysqlclientORM可以做的事&#xff1a; 1、创建、修改、删除数据库中的…

【腾讯云 Cloud studio 实战训练营】搭建Next框架博客——抛开电脑性能在云端编程(沉浸式体验)

文章目录 ⭐前言⭐进入cloud studio工作区指引&#x1f496; 注册coding账号&#x1f496; 选择cloud studio&#x1f496; cloud studio选择next.js&#x1f496; 安装react的ui框架&#xff08;tDesign&#xff09;&#x1f496; 安装axios&#x1f496; 代理请求跨域&#x…