搜索小车运动最短路径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.xdnf.cn/news/143743.html

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

相关文章

基于Linux系统离线安装oracle数据库

注意事项&#xff1a; 在安装的时候多次涉及root用户和oracle用户的切换&#xff0c;请注意区分&#xff0c;本文已明显 一、环境准备 1、关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld2、 禁用NetworkManager服务&#xff08;非必须&#xff09; [rootlocalhost …

4 路 4-20mA 电流/0-10V 电压转光纤

型号&#xff1a;MS-F155-AM 功能概述 MS-F155-AM 是将 4-20mA 电流转为光纤信号的模块&#xff0c;分发送和接收两个设备。发送模块将电流或者电压信号转变为光信号&#xff0c;通过光纤传输&#xff0c;接收端将光信号还原为电流或者电压信号。可以延长通信距离&#xff0c;最…

从零开始讲DDR(1)——DDR简介

一、DDR简介 DDR SDRAM&#xff08;Double Data Rate Synchronous DYNAMIC RAM&#xff09;中文名是&#xff1a;双倍数据速率同步动态随机存储器。 传统的SDRAM只在时钟信号的上升沿传输数据&#xff0c;而DDR可以同时在时钟的上升沿和下降沿传输数据&#xff0c;因此在同样的…

零信任安全架构--持续验证

随着网络安全威胁的不断演变&#xff0c;传统的“信任但验证”安全模式已无法应对现代复杂的攻击。零信任安全架构&#xff08;Zero Trust Architecture, ZTA&#xff09;应运而生&#xff0c;作为一种全新的安全理念&#xff0c;它彻底改变了企业的网络安全防护方式。核心思想…

windows查找端口号被占用

在很多开发的时候&#xff0c;可能端口号有被占用的情况&#xff0c;导致项目打不开。 用下面这个命令即可&#xff1a; 比如我的3000端口被占用&#xff0c;我找找哪个进程在占用我的3000端口号

JAVA惊喜连连无限可能沉浸式盲盒商城系统小程序源码

&#x1f381;惊喜连连&#xff0c;无限可能&#xff01;沉浸式盲盒商城系统&#xff0c;等你来探索&#x1f50d; &#x1f389;【开篇&#xff1a;盲盒热潮&#xff0c;席卷而来】&#x1f389; 在这个充满未知与惊喜的时代&#xff0c;盲盒文化正以前所未有的速度席卷全球…

Vue学习记录之五(组件/生命周期)

一、组件 在每一个.vue文件可以看作是一个组件&#xff0c;组件是可以复用的&#xff0c;每个应用可以看作是一棵嵌套的组件树。 在Vue3中&#xff0c;组件导入以后即可直接使用。 二、组件的生命周期 生命周期就是从诞生(创建)到死亡(销毁) 的过程。 Vue3 组合式API中(se…

Rocky 8.7 操作系统 安装部署 MySQL 5.7.32 验证测试

一、安装部署 主从服务器都需提前安装部署MySQL 5.7.32 数据库软件&#xff0c;本次选择采用二进制安装。 配置主从&#xff0c;要注意调整主备库server_id不能保持一致。 主库修改/etc/my.cnf文件&#xff0c;添加 server-id1log-binmysql-binbinlog-do-dbmsdbbinlog-ign…

java se 快速入门

文章目录 java se 快速入门Java 简介Java的优点jdk 和 jre安装jdk配置环境变量Java 语法快速入门程序入口文件名类规范 基本语法注释变量和常量输入输出条件语句循环语句 基本数据类型Java字符串常用方法字符串拼接java字节数组和字符串相互转化java字符数组和字符串相互转换ja…

传输层协议 —— TCP协议(上篇)

目录 1.认识TCP 2.TCP协议段格式 3.可靠性保证的机制 确认应答机制 超时重传机制 连接管理机制 三次握手 四次挥手 1.认识TCP 在网络通信模型中&#xff0c;传输层有两个经典的协议&#xff0c;分别是UDP协议和TCP协议。其中TCP协议全称为传输控制协议&#xff08;Tra…

torch.embedding 报错 IndexError: index out of range in self

文章目录 1. 报错2. 原因3. 解决方法 1. 报错 torch.embedding 报错&#xff1a; IndexError: index out of range in self2. 原因 首先看下正常情况&#xff1a; import torch import torch.nn.functional as Finputs torch.tensor([[1, 2, 4, 5], [4, 3, 2, 9]]) embedd…

游戏如何检测加速外挂

在游戏面临的众多外挂风险中&#xff0c;除了常见的内存修改挂、注入挂等作弊手段&#xff0c;黑灰产还常用「加速」手段实现作弊。 游戏安全风险分布占比图 「加速」顾名思义是指改变游戏内的速度。游戏在运行中需要以帧为单位播放画面&#xff0c;而计算每帧动画播放所需时间…

代码随想录算法训练营第3天|链表理论基础、203. 移除链表元素、 707.设计链表、 206.反转链表

目录 链表理论基础203. 移除链表元素1、题目描述2、思路3、code4、复杂度分析 707. 设计链表1、题目描述2、思路3、code 206. 反转链表1、题目描述2、思路3、code4、复杂度分析 链表理论基础 ❤️链表增删的时间复杂度都是 O ( 1 ) O(1) O(1)&#xff0c;适合动态增删&#xf…

C语言进阶【4】---数据在内存中的存储【1】(你不想知道数据是怎样存储的吗?)

本章概述 整数在内存中的存储大小端字节序和字节序判断练习1练习2练习3练习4练习5练习6 彩蛋时刻&#xff01;&#xff01;&#xff01; 整数在内存中的存储 回忆知识&#xff1a;在讲操作符的那章节中&#xff0c;对于整数而言咱们讲过原码&#xff0c;反码和补码。整数分为有…

【初阶数据结构】一文讲清楚 “堆” 和 “堆排序” -- 树和二叉树(二)(内含TOP-K问题)

文章目录 前言1. 堆1.1 堆的概念1.2 堆的分类 2. 堆的实现2.1 堆的结构体设置2.2 堆的初始化2.3 堆的销毁2.4 添加数据到堆2.4.1 "向上调整"算法 2.5 从堆中删除数据2.5.1 “向下调整”算法 2.6 堆的其它各种方法接口函数 3. 堆排序3.1 堆排序的代码实现 4. TOP-K问题…

CWFED:自然灾害检测数据集(猫脸码客 第192期)

Cyclone Wildfire Flood Earthquake Database 在自然灾害频发的今天&#xff0c;准确、及时地获取并分析相关数据对于灾害预防、预警及响应至关重要。为此&#xff0c;Cyclone Wildfire Flood Earthquake Database&#xff08;以下简称CWFE Database&#xff09;应运而生&…

PostgreSQL 的log_hostname 参数测试

PostgreSQL 的log_hostname 参数测试 log_hostname 是 PostgreSQL 配置文件 (postgresql.conf) 中的一个参数&#xff0c;用于控制是否在日志条目中记录客户端主机名。默认情况下&#xff0c;PostgreSQL 只记录客户端的IP地址&#xff0c;而 log_hostname 参数允许数据库管理员…

使用FLBOOK快速制作3D电子版翻页产品册

​随着数字化时代的到来&#xff0c;传统纸质产品册已逐渐无法满足人们快节奏、便捷的生活方式。而FLBOOK&#xff0c;一款强大的3D电子版翻页产品册制作工具&#xff0c;凭借其简洁的操作界面、丰富的功能和出色的展示效果&#xff0c;已成为越来越多企业的首选。 1.要制作电子…

1:java的介绍与基础1:变量,数据类型与数学运算符

1.1Java的开始 从今天开始&#xff0c;我将更新一下关于学习Java的笔记&#xff0c;文章&#xff0c;希望大家支持。这个Java吧&#xff0c;感觉本质上逻辑始于python很类似&#xff0c;但是吧它的表达更加繁琐难懂&#xff0c;所以我还是喜欢python&#xff0c;比较简介明了。…