搜索小车运动最短路径python代码实现

一、实验任务

场地中正方格代表障碍物,选取小车运动起点和终点。编程探究小车从起点运动到终点,总共有几种可行的路径(路径不含重叠部分),同时找出最短路径并可视化。

在这里插入图片描述

二、实验思路

把场地抽象化为6×9的平面矩阵,然后从起点出发,随机选择一个可行方向(不返回、无障碍)运动一步,直至到达终点,找到可行路径。通过蒙特卡罗思想多次进行试验,记录每条成功路径的路径长度,找出最短路径,最终使用matplotlib将场地和最短路径可视化。

三、python代码实现

import numpy as np
import matplotlib.pyplot as plt
import random# 设置中文字体
# 这里使用SimHei字体, 可以根据实际字体路径设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号无法显示的问题# 场地矩阵
map = np.array([[1, 1, 1, 0, 1, 1, 1, 1, 1],[1, 0, 1, 0, 1, 0, 1, 0, 1],[1, 0, 1, 0, 1, 0, 0, 0, 1],[1, 0, 1, 1, 1, 1, 1, 1, 1],[1, 0, 1, 0, 0, 1, 0, 0, 1],[1, 1, 1, 1, 0, 1, 1, 1, 1]
])
# 场地规模
m, n = map.shape
# 设置起点和终点(起点为2,终点为3)
start_x,start_y=0,0
end_x,end_y=1,8
map[start_x, start_y] = 2
map[end_x, end_y] = 3# 使用蒙特卡洛法搜索可行路径及最短路径
trials = 50000  # 蒙特卡罗试验次数
all_paths = []  # 存储所有路径(方向指示)
shortest_path_by_direct = []  # 最短路径(方向指示)
shortest_path_by_pos = []  # 最短路径 (坐标指示)
min_path_len = float('inf')  # 最短路径长度#寻找运动反方向的函数
def inverse_direct(x):return {1: 2, 2: 1, 3: 4, 4: 3}[x]for _ in range(trials):x, y = start_x,start_y  # 起始点坐标cur_path_by_direct = []  # 当前路径(方向指示)cur_path_by_pos = [(start_x, start_y)]  # 当前路径(坐标)len_path = 0  # 当前路径长度last_choice = 0  # 上一次选择visited = np.zeros((m, n), dtype=bool)  # 访问记录矩阵visited[x, y] = True  # 标记起点为已访问while True:direct = []# 向上if x > 0 and map[x-1, y] != 0 and not visited[x-1, y]:direct.append(1)# 向下if x < m - 1 and map[x+1, y] != 0 and not visited[x+1, y]:direct.append(2)# 向左if y > 0 and map[x, y-1] != 0 and not visited[x, y-1]:direct.append(3)# 向右if y < n - 1 and map[x, y+1] != 0 and not visited[x, y+1]:direct.append(4)if last_choice != 0:ban_opt = inverse_direct(last_choice)if ban_opt in direct:direct.remove(ban_opt)if not direct:break  # 无有效方向,跳出循环opt = random.choice(direct)last_choice = opt# 按所选方向前进if opt == 1:x -= 1cur_path_by_direct.append('上')elif opt == 2:x += 1cur_path_by_direct.append('下')elif opt == 3:y -= 1cur_path_by_direct.append('左')elif opt == 4:y += 1cur_path_by_direct.append('右')cur_path_by_pos.append((x, y))  # 更新路径坐标visited[x, y] = True  # 标记该点为已访问len_path += 1  # 路径长度加一if map[x, y] == 3:  # 遇到终点路径结束if cur_path_by_direct not in all_paths:all_paths.append(cur_path_by_direct)if len_path < min_path_len:min_path_len = len_pathshortest_path_by_direct = cur_path_by_direct.copy()shortest_path_by_pos = cur_path_by_pos.copy()breakprint(f'所有路径:')
print(all_paths)
print(f"路径数量是: {len(all_paths)}")
print("最短路径是:")
print(shortest_path_by_direct)
print(shortest_path_by_pos)
print(f"最短路径长度是: {min_path_len}")# 绘制地图
plt.figure()
for i in range(m):for j in range(n):if map[i, j] == 0:plt.plot(j, i, 'ks', markerfacecolor='k')  # 障碍物elif map[i, j] == 2:plt.plot(j, i, 'go', markerfacecolor='g')  # 起点elif map[i, j] == 3:plt.plot(j, i, 'ro', markerfacecolor='r')  # 终点else:plt.plot(j, i, 'ws')  # 可行路径# 绘制最短路径
if shortest_path_by_pos:x_coords, y_coords = zip(*shortest_path_by_pos)plt.plot(y_coords, x_coords, 'b-', linewidth=2)plt.gca().invert_yaxis()
plt.title('路径可视化')
plt.xlabel('列')
plt.ylabel('行')
plt.show()

输出结果

所有路径:
[['右', '右', '下', '下', '下', '右', '右', '右', '下', '下', '右', '右', '右', '上', '上', '上', '上'], ['右', '右', '下', '下', '下', '右', '右', '上', '上', '上', '右', '右', '右', '右', '下'], ['下', '下', '下', '下', '下', '右', '右', '上', '上', '右', '右', '右', '右', '右', '右', '上', '上'], ['下', '下', '下', '下', '下', '右', '右', '上', '上', '右', '右', '上', '上', '上', '右', '右', '右', '右', '下'], ['下', '下', '下', '下', '下', '右', '右', '上', '上', '右', '右', '右', '下', '下', '右', '右', '右', '上', '上', '上', '上'], ['右', '右', '下', '下', '下', '右', '右', '右', '右', '右', '右', '上', '上']]
路径数量是: 6
最短路径是:
['右', '右', '下', '下', '下', '右', '右', '右', '右', '右', '右', '上', '上']
[(0, 0), (0, 1), (0, 2), (1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (2, 8), (1, 8)]
最短路径长度是: 13

在这里插入图片描述

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

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

相关文章

五种嵌入式中常见网络协议栈

一.LWIP 1.介绍 LwIP&#xff08;Lightweight IP&#xff09;是一个由瑞典计算机科学院&#xff08;Swedish Institute of Computer Science&#xff09;开发的轻量级TCP/IP协议栈&#xff0c;专为资源有限的嵌入式系统而设计。它以其小巧且功能完善的特性&#xff0c;在物联…

Deep Learning-Based Object Pose Estimation:A Comprehensive Survey

论文&#xff1a;https://arxiv.org/pdf/2405.07801v3 项目&#xff1a;https://github.com/CNJianLiu/Awesome-Object-Pose-Estimation 年份&#xff1a;2024 方向&#xff1a;姿态估计 1. 目标姿态估计定义 估计图像中目标相对于相机的姿态&#xff0c; 目标姿态估计是增…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet&#xff0c;其核心思想是将特征图的部分通道进行分割和并行处理&#xff0c;目的是减少冗余梯度信息&#xff0c;同时保持较高的网络表达能力。C3 结构与传统的残差结构类似&#xff0c;但…

yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9/10模型在VOC数据集上的应用【代码数据集python环境GUI系统】 1.背景意义 VOC数据集被广泛应用于计算机视觉领域的研究和实验中&#xff0c;特别是目标检测和图像识别任务。许多知名的目标检测算法都使用VOC数据集进行训练和测试。VOC挑战赛&#xff08;VOC Challeng…

neo4j安装启动教程+对应的jdk配置

参考这位博主的视频教程&#xff1a;neo4j社区windows版下载 一、官网下载neo4j的安装包 &#xff08;1&#xff09;官网下载页面 &#xff08;2&#xff09;上一步 【download】之后&#xff0c;会自动下载&#xff0c;如果没有&#xff0c;点击【here】 这里可以看到一行字…

模型训练时CPU和GPU大幅度波动——可能是数据的读入拖后腿

模型训练时CPU和GPU大幅度波动——可能是数据的加载拖后腿 问题 在进行猫狗大战分类任务时&#xff0c;发现模型训练时CPU和GPU大幅度波动&#xff0c;且模型训练速度很慢。 原因 ​ 初步分析可能是数据加载&#xff08;包括数据的transform&#xff0c;我用了Resize&#…

深度学习——基础知识

深度学习的重点在于优化&#xff0c;其中很重要的步骤在于如何调参&#xff0c;会涉及到一些微积分等数学知识。不同于以往接触到的数值运算&#xff0c;深度&#xff08;机器&#xff09;学习都是关于张量Tensor&#xff08;向量&#xff09;的计算&#xff0c;Python中最常用…

【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)

目录 一、插入排序 算法思想 二、插入排序 算法步骤 四、复杂度分析 时间复杂度&#xff1a;O(n^2) 空间复杂度&#xff1a;O(1) 稳定性&#xff1a;稳定算法 五、应用场景 &#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;探索数据结构…

uni-app 应用名称 跟随系统语言 改变

官方已确认BUG:&#xff1a;https://ask.dcloud.net.cn/question/164804 { "name" : "%app.name%",//这里随便写&#xff0c;配置了 locales,name 就不生效了 "appid" : "", "description" : "", "versi…

git命令行基础常用指令

git命令行基础常用指令 git status git status //用来查询当前仓库的状态&#xff0c;包括位于哪个分支、工作区有哪些文件被修改以及哪些文件被添加、暂存区有哪些文件暂存。git diff 用来查看当前工作区的文件的修改内容 git diff //修改内容不会全部显示&#xff0c;…

【JAVA开源】基于Vue和SpringBoot的购物商城网站

本文项目编号 T 032 &#xff0c;文末自助获取源码 \color{red}{T032&#xff0c;文末自助获取源码} T032&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【Java面试】第九天

&#x1f31f;个人主页&#xff1a;时间会证明一切. 目录 Spring中如何开启事务&#xff1f;编程式事务声明式事务声明式事务的优点声明式事务的粒度问题声明式事务用不对容易失效 Spring的事务传播机制有哪些&#xff1f;Spring事务失效可能是哪些原因&#xff1f;代理失效的情…

红黑树的插入(NGINX源码)

下载并查看NGINX源码 访问NGINX下载页面&#xff0c;找到所需版本 https://nginx.org/en/download.html 使用wget下载源码包&#xff0c;替换版本号为所需版本 wget http://nginx.org/download/nginx-1.24.0.tar.gz解压源码包 tar -xzvf nginx-1.24.0.tar.gz进入解压后的目…

用nginx-rtmp-win32-master及ffmpeg模拟rtmp视频流

效果 使用nginx-rtmp-win32-master搭建RTMP服务 双击exe就可以了。切记整个目录不能有中文 README.md ,启用后本地的RTM路径: rtmp://192.168.1.186/live/xxx ffmpeg将地本地视频推RMTP F:\rtsp\ffmpeg-7.0.2-essentials_build\bin>ffmpeg -re -i F:\rtsp\123.mp4 -c c…

苹果为什么不做折叠屏手机?

苹果为什么不做折叠屏手机&#xff1f;折叠屏手机在最近这些年里边&#xff0c;可以说是市场的一个主要在手机上的增长点。你像华W最近推出这个三折叠手机&#xff0c;引起了整个市场的轰动。 可是&#xff0c;为什么苹果到今天为止不为所动&#xff0c;还在那不停地在现在的这…

ARM64基础 -- x29 和 x30 寄存器详解

ARM64 架构中的 x29 和 x30 寄存器详解 在 ARM64 架构中&#xff0c;x29 和 x30 是两个通用寄存器&#xff0c;但它们有特殊的惯例用途&#xff0c;特别是在函数调用和栈帧管理中。以下是对这两个寄存器的详细讲解。 1. x29 寄存器 别名&#xff1a;FP&#xff08;Frame Poi…

【PyTorch】深入浅出PyTorch

为什么要学习PyTorch Why learn PyTorch PyTorch日益增长的发展速度与深度学习时代的迫切需求 PyTorch实验模型训练 数据 模型 损失函数 优化器 迭代训练 模型应用 如何学习和掌握PyTorch 勤动手 成体系 构建知识体系 熟悉知识分布 对应查缺补漏 多总结

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a;…

在 Spring Boot 中使用 Spring Security + JWT + MySQL 实现基于 Token 的身份认证

文章目录 在 Spring Boot 中使用 Spring Security JWT MySQL 实现基于 Token 的身份认证一、引言二、环境搭建1、第一步&#xff1a;引入依赖2、第二步&#xff1a;配置MySQL数据库 三、实现身份认证三、实现身份认证1、定义实体和数据访问层1.1、实体类定义1.2、数据访问层 …

华为OD机试 - 端口合并(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…