当前位置: 首页 > news >正文

【附源码】Python :校园导航与最短路径算法

系列文章目录

Python 算法学习:校园导航与最短路径算法


文章目录

  • 系列文章目录
  • 前言
  • 一、代码需求
  • 二、使用步骤
    • 1.引入库
    • 2.设置图中地点与对应关系
    • 3.编写最短路径算法
    • 4.编写对应的窗口与控件
  • 三、源码展示
  • 总结


前言

这段代码是一个使用Python编写的校园导航程序,它利用tkinter库创建图形用户界面(GUI),networkx库处理图和路径查找,以及matplotlib进行图形的绘制和展示。不过要注意的是,因为笔者没有固定路径的长度,所以图像的形状为随机。


一、代码需求

编写一个python可视化的校园导航,要求可以输入起点和终点来找出最短路径


二、使用步骤

1.引入库

代码如下(示例):

import tkinter as tk
from tkinter import simpledialog
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 创建校园地图的图结构
G = nx.Graph()

2.设置图中地点与对应关系

代码如下(示例):

# 假设的校园地点
locations = ["图书馆", "教学楼A", "教学楼B", "教学楼C","食堂A", "食堂B","宿舍区A", "宿舍区B", "宿舍区C", "宿舍区D","体育馆"
]# 地点之间的连接关系
# 教学楼到图书馆和体育馆连通
edges = [("教学楼A", "图书馆"), ("教学楼A", "体育馆"),("教学楼B", "图书馆"), ("教学楼B", "体育馆"),("教学楼C", "图书馆"), ("教学楼C", "体育馆"),
]# 食堂到宿舍区连通
for canteen in ["食堂A", "食堂B"]:for dorm in ["宿舍区A", "宿舍区B", "宿舍区C", "宿舍区D"]:edges.append((canteen, dorm))# 体育馆到图书馆连通
edges.append(("体育馆", "图书馆"))# 其他可能的连接,例如图书馆到所有地点
for location in locations:if location != "图书馆":edges.append(("图书馆", location))# 添加节点和边
G.add_nodes_from(locations)
G.add_edges_from(edges)# 布局图结构
pos = nx.spring_layout(G)

3.编写最短路径算法

代码如下(示例):

# 找到最短路径的函数
def shortest_path(G, start, end):try:return nx.shortest_path(G, source=start, target=end)except nx.NetworkXNoPath:return None# 设置起点和终点的函数
def set_start():global start_pointstart_point = simpledialog.askstring("起点", "请输入起点:")def set_end():global end_pointend_point = simpledialog.askstring("终点", "请输入终点:")# 绘制最短路径
def draw_path():global axif start_point and end_point:path = shortest_path(G, start_point, end_point)if path:print(f"从 {start_point}{end_point} 的最短路径是: {path}")ax.clear()nx.draw(G, pos, ax=ax, with_labels=True)nx.draw_networkx_nodes(G, pos, nodelist=path, node_color='red')nx.draw_networkx_edges(G, pos, edgelist=[(path[i], path[i+1]) for i in range(len(path)-1)], edge_color='red')canvas.draw()else:print(f"没有从 {start_point}{end_point} 的路径。")

4.编写对应的窗口与控件

代码如下(示例):

# 创建主窗口
root = tk.Tk()
root.title("校园导航")# 设置窗口在显示时置顶
root.attributes('-topmost', 1)# 创建画布
fig, ax = plt.subplots(figsize=(10, 10))
canvas = FigureCanvasTkAgg(fig, master=root)
canvas_widget = canvas.get_tk_widget()
canvas_widget.pack(side=tk.TOP, fill=tk.BOTH, expand=True)# 初始绘制图
nx.draw(G, pos, ax=ax, with_labels=True)# 创建按钮
start_button = tk.Button(root, text="设置起点", command=set_start)
start_button.pack(side=tk.LEFT)end_button = tk.Button(root, text="设置终点", command=set_end)
end_button.pack(side=tk.LEFT)path_button = tk.Button(root, text="显示最短路径", command=draw_path)
path_button.pack(side=tk.LEFT)# 运行主循环
root.mainloop()

三、源码展示

import tkinter as tk
from tkinter import simpledialog
import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 创建校园地图的图结构
G = nx.Graph()# 假设的校园地点
locations = ["图书馆", "教学楼A", "教学楼B", "教学楼C","食堂A", "食堂B","宿舍区A", "宿舍区B", "宿舍区C", "宿舍区D","体育馆"
]# 地点之间的连接关系
# 教学楼到图书馆和体育馆连通
edges = [("教学楼A", "图书馆"), ("教学楼A", "体育馆"),("教学楼B", "图书馆"), ("教学楼B", "体育馆"),("教学楼C", "图书馆"), ("教学楼C", "体育馆"),
]# 食堂到宿舍区连通
for canteen in ["食堂A", "食堂B"]:for dorm in ["宿舍区A", "宿舍区B", "宿舍区C", "宿舍区D"]:edges.append((canteen, dorm))# 体育馆到图书馆连通
edges.append(("体育馆", "图书馆"))# 其他可能的连接,例如图书馆到所有地点
for location in locations:if location != "图书馆":edges.append(("图书馆", location))# 添加节点和边
G.add_nodes_from(locations)
G.add_edges_from(edges)# 布局图结构
pos = nx.spring_layout(G)# 找到最短路径的函数
def shortest_path(G, start, end):try:return nx.shortest_path(G, source=start, target=end)except nx.NetworkXNoPath:return None# 设置起点和终点的函数
def set_start():global start_pointstart_point = simpledialog.askstring("起点", "请输入起点:")def set_end():global end_pointend_point = simpledialog.askstring("终点", "请输入终点:")# 绘制最短路径
def draw_path():global axif start_point and end_point:path = shortest_path(G, start_point, end_point)if path:print(f"从 {start_point}{end_point} 的最短路径是: {path}")ax.clear()nx.draw(G, pos, ax=ax, with_labels=True)nx.draw_networkx_nodes(G, pos, nodelist=path, node_color='red')nx.draw_networkx_edges(G, pos, edgelist=[(path[i], path[i+1]) for i in range(len(path)-1)], edge_color='red')canvas.draw()else:print(f"没有从 {start_point}{end_point} 的路径。")# 创建主窗口
root = tk.Tk()
root.title("校园导航")# 设置窗口在显示时置顶
root.attributes('-topmost', 1)# 创建画布
fig, ax = plt.subplots(figsize=(10, 10))
canvas = FigureCanvasTkAgg(fig, master=root)
canvas_widget = canvas.get_tk_widget()
canvas_widget.pack(side=tk.TOP, fill=tk.BOTH, expand=True)# 初始绘制图
nx.draw(G, pos, ax=ax, with_labels=True)# 创建按钮
start_button = tk.Button(root, text="设置起点", command=set_start)
start_button.pack(side=tk.LEFT)end_button = tk.Button(root, text="设置终点", command=set_end)
end_button.pack(side=tk.LEFT)path_button = tk.Button(root, text="显示最短路径", command=draw_path)
path_button.pack(side=tk.LEFT)# 运行主循环
root.mainloop()

总结

整体来看,这段代码提供了一个基本的校园导航工具,用户可以通过GUI输入起点和终点,程序计算并展示最短路径。不过,代码中存在一些未使用的导入(如pylab),并且实际应用中可能需要更复杂的逻辑来处理地点之间的实际连接关系。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【数学建模】——前沿图与网络模型:新时代算法解析与应用
  • gitee的怎么上传项目
  • PowerShell 使用介绍
  • 【C++中的IO流和文件操作精讲】
  • 【RaspberryPi】树莓派系统UI优化
  • googleTest 源码主线框架性分析——TDD 01
  • 自动发卡机器人来看:生成式AI的未来,是聊天还是代理?
  • vue echarts 柱状图表,点击柱子,路由代参数(X轴坐标)跳转
  • 复杂网络的任意子节点的网络最短距离
  • AIoTedge 智能边缘物联网平台
  • 如何用手机压缩视频?手机压缩视频方法来了
  • 【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十三)
  • 【两种方法】多位数的数字和问题
  • 【C++】——初识模版
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • 收藏网友的 源程序下载网
  • 【剑指offer】让抽象问题具体化
  • Druid 在有赞的实践
  • JS变量作用域
  • JS实现简单的MVC模式开发小游戏
  • LeetCode算法系列_0891_子序列宽度之和
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端之React实战:创建跨平台的项目架构
  • 前嗅ForeSpider采集配置界面介绍
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 让你的分享飞起来——极光推出社会化分享组件
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 在Docker Swarm上部署Apache Storm:第1部分
  • HanLP分词命名实体提取详解
  • Nginx实现动静分离
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 回归生活:清理微信公众号
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Oracle)SQL优化技巧(一):分页查询
  • (python)数据结构---字典
  • (void) (_x == _y)的作用
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)Dubbo快速入门、介绍、使用
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)c++ std::pair 与 std::make