搜索小车运动最短路径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,一经查实,立即删除!

相关文章

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】 这里可以看到一行字…

深度学习——基础知识

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

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

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

【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;还在那不停地在现在的这…

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;…

华为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;…

Web后端服务平台解析漏洞与修复、文件包含漏洞详解

免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国…

mysql怎样优化count(*) from 表名 where …… or ……这种慢sql

一 问题描述 线上发现一条类似这样的慢sql&#xff08;查询时长8s&#xff09;&#xff1a; select id,name,(select count(*) from t14 where t14.idt15.id or t14.id2t15.id) as cnt from t15 ; t14的id和id2字段上都有索引&#xff0c;但是因为条件里有or&#xff0c;导致…

电路设计学习(一)

FUSB302BUCX 可编程 USB Type-C 控制器&#xff0c;带 PD&#xff08;默认 SNK&#xff09; FUSB302BUCX 是一款由 ON Semiconductor 生产的 USB Type-C 控制器&#xff0c;用于实现 USB Type-C 和 USB Power Delivery (PD) 协议。它主要负责 USB Type-C 端口的检测、CC 引脚…

GESP C++二级样题卷

一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 1.目前主流的计算机储存数据最终都是转换成&#xff08; &#xff09;数据进行储存。 ​ A&#xff0e;二进制 ​ B&#xff0e;十进制 ​ C&#xff0e; 八进制 ​ D&#xff0e;十六进制 2.已知大写字…

结构开发笔记(八):solidworks软件(七):装配图中让摄像头绕轴旋转起来

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142176639 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

量化交易backtrader实践(二)_基础加强篇(3)_策略类实践进阶

通过前面几节的实践&#xff0c;我们已经对股票数据的获取&#xff0c;pandasData数据的格式处理&#xff0c;到bactrader的DATAS结构以及里面的data的数据结构&#xff0c;以及在init和next函数中如何读取和计算都有了比较清晰的认知。我们通过一个最简的回测系统&#xff0c;…

C# 结合 Javascript 测试获取天气信息

目录 测试效果 范例运行环境 关键代码 C#获取网页数据 前端代码 JavaScript 实现 总结 测试效果 获取一些简单的天气信息&#xff0c;可以丰富我们的应用系统&#xff0c;比如开发一个小桌面&#xff0c;小组件&#xff0c;增加一些实用性的系统功能&#xff0c;本文将…