论文《基于现实迷宫地形的电脑鼠设计》深度分析(四)——现实迷宫算法

论文概述     

        《基于现实迷宫地形的电脑鼠设计 》是由吴润强、庹忠曜、刘文杰、项璟晨、孙科学等人于2023年发表的一篇优秀期刊论文。其针对现阶段电脑鼠计算量庞大且不适用于现实迷宫地形的问题,特基于超声波测距与传统迷宫算法原理,设计出一款可在现实迷宫地形下自动寻找出口的电脑鼠。该电脑鼠适用于岔路数量与道路宽度不定、多死路弯道并且相对较大的迷宫地形,具有适应性强、计算量小、兼容性和可塑性强等优点,对于现实迷宫地形下的自动应用具有一定研究价值。

        关键词  电脑鼠;超声波测距;迷宫算法;自动应用

        该论文内容相对较多,特对其进行拆开分析,本文特围绕现实迷宫算法进行展开分析。

一、随机算法

        在现实环境的下的寻路过程与目前电脑鼠所研究的迷宫遍历大致相同,但在实际生活中知晓迷宫地形的大致分布与全地形探索迷宫不太现实,故而向心算法等常用的算法不具备太多的普适性。

        但是在所能前进的方向里随机选择一个方向前行的随机算法对于现实生活中的绝大多数迷宫地形任然适用。假设当电脑鼠从入口进入迷宫地形之后将入口摆上障碍物,使得电脑鼠无法从入口出来,那么从理论上而言电脑鼠终将在不断的尝试中从到达迷宫终点。

        优点:普适性强,几乎适应一切迷宫地形

        缺点:时间耗费较大且有可能从入口驶出

        出于以上优缺点的考虑,该算法比较适用于地下溶洞、动物洞穴等未知地形的迷宫环境,在不偏重其进出迷宫的时间间隔的前提下,携带附加设备对迷宫内环境进行研究。

二、偏好算法

        此算法是基于优先向前法则、左手法则和右手法则的基础上进行总结与修改:当电脑鼠前进道路中出现多方向,优先向前法,优先选择直行,然后考虑向左或向右行驶;而左(右)手法则中优先选择向左(右)转,其次是向前行驶,最后向右(左)行驶。

        原三种算法仅针对于当前道路中最多只存在三个可行的方向,并且其左右路口的方向又过于理想。在现实中的路口可能呈非理想状态的树状分布,见图13,此时的原有算法便存在一定的局限性。

        96dd0d14ce1543e6b1de1fa710c56dc3.png

图13 树状分布道路

       故根据现实情况改善优先向前法则为直行偏好算法,改善左手法则与右手法则为两端偏好算法。

2.1 直行偏好算法

        基于该算法理论,当小车前进方向无障碍物时,则不考虑其如今行驶道路两边的可行路口,一直保证直行状态;当l0并非极大值时,则分别对小车左右两边的障碍物进行超声波测距:       0f2101b483d0420088ecfe72c1cc1d83.png 

        出于之间对于实际应用情况的假设,我们无需进行迷宫地形的遍历,同时对已经行走的路程并无记忆储存,在执行该算法时会不可避免地重复之前的路程而陷入的“T”型死锁之中,见图14。

118f0127a7bf42f9a8c46aa72cdf193a.png

图14 “T”型死锁图        

        当电脑鼠沿直线到达点A时,前方的障碍物阻碍电脑鼠的继续前进,故根据左右两边的探测距离前往距离较远的B点。到达B点后因为死路情况而进行掉头,经过A点到达C点,同理因为C点的死锁情况进行掉头,之后使得电脑鼠在B点与C点进行往复运动,造成死锁情况。

        优点:算法简便,时间耗费较小;

        缺点:存在“T”型死锁;

        而迷宫有较大的可能存在该“T”型结构,故而直行偏好算法的适用度较低,仅可用于无“T”型结构的迷宫地形。

2.2 两端偏好算法

        首先确定一个偏好方向(左或右,本文以左进行举例),根据超声波探测判断前方可前行道路的数量。

        若探测到的数据均为合理值,则前方无可前行的道路,此时执行掉头功能;

        若探测的数据仅存在一个极大值,则前方仅有一个可前行的道路,向该方向进行转弯功能;

        若探测的数据存在多个极大值,则前方道路树状分布多个可前行的道路,此时其测量的数据编号,选择最靠近左边的道路进行转弯前行。

        根据此算法可在大部分现实迷宫地形中较为快速的到达终点,但对于的特殊迷宫,其出口位于迷宫中央,则电脑鼠便有可能从入口驶出和始终找不到出口,见图15。

        首先确定一个偏好方向(左或右,本文以左进行举例),根据超声波探测判断前方可前行道路的数量。

        若探测到的数据均为合理值,则前方无可前行的道路,此时执行掉头功能;

        若探测的数据仅存在一个极大值,则前方仅有一个可前行的道路,向该方向进行转弯功能;

        若探测的数据存在多个极大值,则前方道路树状分布多个可前行的道路,此时其测量的数据编号,选择最靠近左边的道路进行转弯前行。

        根据此算法可在大部分现实迷宫地形中较为快速的到达终点,但对于的特殊迷宫,其出口位于迷宫中央,则电脑鼠便有可能从入口驶出和始终找不到出口,见图15。

511e8aba23f2453ea38e050adc6384aa.png

图15 特殊迷宫地图

        电脑鼠从入口A处进入,根据偏好方向向左前行到B点,再根据仅存的前进方向前进到C点,同理电脑鼠向DE方向前进,路过出口D点时由于出口方向相对在右,不符合偏好方向而继续前往E点。

        之后电脑鼠经过F点再次到达入口A点,根据偏好向左的算法其会从A点驶出。若假设当电脑鼠进入迷宫后将入口堵住,则电脑鼠会在BCEF四点进行反复循环,而不会从D点离开迷宫。

        优点:适用性于大部分迷宫地形,逻辑清晰且时间耗费较少;

        缺点:对于出口位于迷宫中间的特殊迷宫地形不太适用;

        该算法适用于现实生活中出口不位于迷宫中间的迷宫地形,可用于现实中树状分布乃至与网状分布的迷宫地形进行出口寻找。

三、沿壁算法

        该算法是在两端偏好的算法上进行的进一步修改,同两端偏好算法确定偏好方向,根据超声波探测与中线对齐原理,始终与左侧的障碍物保持一定的距离。此时我们可以将电脑鼠视为沿着左侧的障碍物进行行驶,根据左手法则可同两端偏好算法般从出口驶出。

        沿壁算法与两端偏好算法相比有优缺点如下,

        优点:只需考虑沿壁一侧的距离把控,减少了舵机旋转测距与多路口判断等工作量;

        缺点:无法保证车辆居中行驶,车辆可能会因距离的把控不当而与另一侧的障碍物相互碰撞。

        在迷宫地形各分叉道路宽度相差不大时,可使用沿壁算法缩短车辆的行驶时间;而当迷宫中存在个别较为狭窄的道路时,可选择两端偏好算法,保证车辆的安全行驶。

四、开源代码讲解

        智能车的迷宫算法通常涉及路径规划和导航。我们可以使用一些经典的算法来解决迷宫问题,比如深度优先搜索(DFS)、广度优先搜索(BFS)和A*算法。下面我将以深度优先搜索(DFS)为例,给出一个简单的迷宫求解代码示例,并进行讲解。

def is_safe(maze, x, y):# 检查当前位置是否在迷宫内并且是可通行的return 0 <= x < len(maze) and 0 <= y < len(maze[0]) and maze[x][y] == 1def solve_maze(maze):# 定义迷宫的起点和终点start = (0, 0)end = (len(maze) - 1, len(maze[0]) - 1)# 创建一个路径列表path = []# 开始深度优先搜索if dfs(maze, start[0], start[1], end[0], end[1], path):return pathelse:return "No path found"def dfs(maze, x, y, end_x, end_y, path):# 如果到达终点,返回Trueif (x, y) == (end_x, end_y):path.append((x, y))return True# 检查当前位置是否安全if is_safe(maze, x, y):# 将当前位置加入路径path.append((x, y))# 尝试向四个方向移动# 向下if dfs(maze, x + 1, y, end_x, end_y, path):return True# 向右if dfs(maze, x, y + 1, end_x, end_y, path):return True# 向上if dfs(maze, x - 1, y, end_x, end_y, path):return True# 向左if dfs(maze, x, y - 1, end_x, end_y, path):return True# 如果四个方向都无法前进,回溯path.pop()return False# 示例迷宫(1表示可通行,0表示不可通行)
maze = [[1, 0, 1, 1],[1, 1, 0, 1],[0, 1, 1, 0],[1, 1, 1, 1]
]# 解决迷宫并打印路径
path = solve_maze(maze)
print(path)

        运行这段代码后,输出的路径将是从起点到终点的坐标列表,表示智能车在迷宫中找到的路径。这种算法适合小型迷宫,对于较大的迷宫或复杂的路径规划问题,建议使用更高效的算法,如A*算法。

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

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

相关文章

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…

Iview DatePicker 仅允许选择当前月份及以后的月份

iview DatePicker之前月份禁用且下月可用 html代码 <DatePicker type"month" :options"options4" :value"dialogForm.estimatedStartTimeWithCreate" on-change"monthTime($event, loadDateStart)" placeholder"请选择时间&q…

Redis 内存管理

参考&#xff1a;面试官&#xff1a;为什么 Redis 不立刻删除已经过期的数据&#xff1f; 目录 1.Redis 给缓存数据设置过期时间有什么用&#xff1f; 2.Redis 是如何判断数据是否过期的呢&#xff1f; 3.Redis 过期 key 删除策略了解么&#xff1f; 4.大量 key 集中过期怎…

【IC每日一题:SVA简介】

IC每日一题&#xff1a;SVA简介 1 断言概念1.1 断言优势&#xff1b;1.2 断言类型1.2.1 立即断言1.2.2 并行断言1.2.3 并发断言Demo 2 SVA语法2.1 蕴含操作符&#xff1a;|-> 和 ->2.1.1 蕴含操作符 |>2.1.2 蕴含操作符|-> 2.2 延时操作符2.2.1 ##n 操作符 2.3 重复…

深度学习之One Stage目标检测算法2

我们将对单次目标检测器&#xff08;包括SSD系列和YOLO系列等算法&#xff09;进行综述。我们将分析FPN以理解多尺度特征图如何提高准确率&#xff0c;特别是小目标的检测&#xff0c;其在单次检测器中的检测效果通常很差。然后我们将分析Focal loss和RetinaNet&#xff0c;看看…

【MySQL】优化方向+表连接

目录 数据库表连接 表的关系与外键 数据库设计 规范化 反规范化 事务一致性 表优化 索引优化 表结构优化 查询优化 数据库表连接 表的关系与外键 表之间的关系 常见表关系总结 一对一关系&#xff1a;每一条记录在表A中对应表B的唯一一条记录&#xff0c;反之也是&a…

SHELL笔记(概念+变量)

shell 概念 Shell 是一个命令行解释器&#xff0c;它充当用户与操作系统内核之间的桥梁。用户在 Shell 环境下输入各种命令&#xff0c;Shell 负责接收并分析这些命令&#xff0c;然后将其转换为内核能够理解和执行的系统调用。通过这种方式&#xff0c;用户可以便捷地操作计算…

统信UOS开发环境支持Golang

UOS为Golang开发者提供了各种编辑器和工具链的支持,助力开发者实现高质量应用的开发。 文章目录 一、环境部署Golang开发环境安装二、代码示例Golang开发案例三、常见问题1. 包导入错误2. 系统资源限制一、环境部署 Golang开发环境安装 golang开发环境安装步骤如下: 1)安装…

web前端开发--盒子属性

1、设置背景图像固定 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>设置背景图像固定</title><style type"text/css">/*p{background-attachment: scroll;/*fixed固定*//*随元素滚动还是固定*/}&…

Python数据分析NumPy和pandas(三十五、时间序列数据基础)

时间序列数据是许多不同领域的结构化数据的重要形式&#xff0c;例如金融、经济、生态学、神经科学和物理学。在许多时间点重复记录的任何内容都会形成一个时间序列。许多时间序列是固定频率的&#xff0c;也就是说&#xff0c;数据点根据某些规则定期出现&#xff0c;例如每 1…

前端开发之打印功的使用和实例(vue-print-nb)

通过插件来进行实现 前言效果图1、安装插件vue2vue32、 引入Vue项目2、 使用2.1、在项目中创建按钮并且使用v-print绑定绑定打印事件2.2、编写要打印的内容,给内容附加唯一的id2.3、绑定的时间的方法和参数3、整体代码(此代码是通过vue3来进行实现的但是逻辑都是一样的)前言…

使用Web Animations API实现复杂的网页动画效果

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂…

分享一个mysql-sql优化经验 in (xxx)的优化【 in(集合)改成not in(反集合) 】

一、优化前 如下sql&#xff0c;直接执行时间需要18.341秒 二、优化后 将 in(集合) 改成 not in(反集合)&#xff0c;如下图&#xff0c;执行性能提升至少4倍&#xff0c;需要4.643秒&#xff0c;并且查询结果不变 三、原因分析 为什么速度会变快那么多&#xff1f; in (集…

传感器页面、屏幕刷新任务学习

一、user_SensorPageTask 传感器页任务 ​ /* Private includes -----------------------------------------------------------*/ //includes #include "user_TasksInit.h" #include "user_ScrRenewTask.h" #include "user_SensorPageTask.h" …

BigQuery中jobUser和dataViewer的角色有什么不同

真题实战 Scenario: Your company utilizes BigQuery as the enterprise data warehouse, with data spread across multiple Google Cloud projects. Queries on BigQuery must be billed to a specific project, separate from where the data resides. Users should have q…

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦&#xff0c;主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以&#xff0c;我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉&#xff0c;也不熟悉 Cocoa 框架&#xff0c;在 ChatGPT…

fiddler抓包24_App流量统计

​课程大纲 使用Fiddler可以实现“APP流量统计”功能。具体操作如下&#xff1a; ① 选中app所有请求&#xff0c;点击右侧菜单标签“Statistics”。 ② 查看请求统计数据&#xff0c;即APP流量统计&#xff1a;“Bytes Sent”&#xff08;发送的字节数&#xff09;、“Bytes R…

小白投资理财 - 解读 CCI

小白投资理财 - 解读 CCI 什么是 CCICCI 计算方法CCI 指标的使用首先超买和超卖接下来是背离 CCI 缺点总结 顺着河流能够渡河&#xff0c;逆向河流只会挂彩&#xff0c;今天就来了解一下 CCI&#xff08;Commodity Channel lndex&#xff09;中文称之为顺势指标 什么是 CCI 它…

2024 RISC-V中国峰会 安全相关议题汇总

安全之安全(security)博客目录导读 第四届 RISC-V 中国峰会&#xff08;RISC-V Summit China 2024&#xff09;于8月21日至23日在杭州成功举办。此次峰会汇聚了 RISC-V 国际基金会、百余家重点企业及研究机构&#xff0c;约3000人线下参与&#xff0c;并在19日至25日间举办了超…

Linux守护Pythom脚本运行——Supervisor学习总结

Supervisor能做什么&#xff1f; 在工作中有时会遇到在Linux服务器上编写各种脚本来实现日志的推送、数据的传输、流量的监控等&#xff0c;这些脚本在整个系统运行中也需要和其他服务端应用程序一样持续且稳定运行&#xff0c;为了达到这种目的就需要使用进程守护工具来对正在…