最短路径算法及Python实现

news/2024/5/6 8:55:56/文章来源:https://blog.csdn.net/weixin_64338372/article/details/130020852

最短路径问题

在图论中,最短路径问题是指在一个有向或无向的加权图中找到从一个起点到一个终点的最短路径。这个问题是计算机科学中的一个经典问题,也是许多实际问题的基础,例如路线规划、通信网络设计和交通流量优化等。在这个问题中,每一条边都有一个权重,表示通过这条边需要的代价,例如距离、时间或费用等。最短路径问题的目标是找到一条从起点到终点的路径,使得这条路径上经过的边的权重之和最小。

数学模型

求解最短路径可以用线性规划或整数线性规划建模。以下是一个整数线性规划的数学模型:

令 x[ij] 表示从节点 i 到节点 j 的路径是否被选择,若被选择则 x[ij] = 1 ,否则 x[ij] = 0 。

则最短路径问题可以表示为:

其中,C[ij]  表示从节点 i 到节点 j 的边的权值,s 和 t 分别表示源节点和汇节点。

第一个约束条件表示 x[ij] 只能取 0 或 1。第二个约束条件表示从任意节点  出发的边的数量必须等于从该节点进入的边的数量,除非该节点为源节点或汇节点。

这个模型的含义是,我们希望从源节点到汇节点选择一条路径,使得该路径的总权值最小。由于约束条件保证了路径的起点和终点,因此该模型可以确保求解的是从源节点到汇节点的最短路径。

算法

以下是图论中几种常见的最短路径算法:

  • Dijkstra算法:Dijkstra算法是一种单源最短路径算法,用于计算从起点到其它所有节点的最短路径。该算法的基本思想是从起点开始,依次计算每个节点到起点的最短路径,然后再依次计算每个节点到起点的最短路径,直到所有节点都被计算完毕。。

  • Bellman-Ford算法:Bellman-Ford算法是一种动态规划算法,用于找到带权重的有向图中从一个起点到所有其他节点的最短路径。该算法可以处理负边权图,并且还可以检测到负权环。

  • Floyd-Warshall算法:Floyd-Warshall算法是一种动态规划算法,用于找到带权重的有向图中任意两个节点之间的最短路径。该算法可以处理负边权图,并且可以同时计算多组最短路径。

案例(城市间机票价格问题)

问题如下:

 我们使用Python的NetworkX库对该问题进行求解。

import networkx as nx# 定义机票票价矩阵
costs = [[0, 50, 0, 40, 25, 10],[50, 0, 15, 20, 0, 25],[0, 15, 0, 10, 20, 0],[40, 20, 10, 0, 10, 25],[25, 0, 20, 10, 0, 55],[10, 25, 0, 25, 55, 0]]# 将矩阵转换成带权有向图
G = nx.DiGraph()
for i in range(len(costs)):for j in range(len(costs[0])):if costs[i][j] != 0:G.add_edge(chr(65+i), chr(65+j), weight=costs[i][j])# 计算城市A到其它城市的最短路径及票价
shortest_path = nx.shortest_path(G, source='A', weight='weight')
shortest_path_cost = nx.shortest_path_length(G, source='A', weight='weight')
for dest, cost in shortest_path_cost.items():print(f"从A到{dest}的最便宜路径为{shortest_path[dest]}, 票价为{cost}元")

 结果如下:

从A到A的最便宜路径为['A'], 票价为0元
从A到F的最便宜路径为['A', 'F'], 票价为10元
从A到E的最便宜路径为['A', 'E'], 票价为25元
从A到B的最便宜路径为['A', 'F', 'B'], 票价为35元
从A到D的最便宜路径为['A', 'F', 'D'], 票价为35元
从A到C的最便宜路径为['A', 'E', 'C'], 票价为45元

这里核心代码是nx.shortest_path函数,在Python的NetworkX库中,nx.shortest_path()是用于计算有向或无向带权图中的最短路径的函数。其语法如下:

nx.shortest_path(G, source=None, target=None, weight=None, method='dijkstra')

该函数的参数解释如下:

  • G: 要计算最短路径的图,可以是有向图或无向图。

  • source: 源节点,即起始节点,默认为None,表示计算图中所有节点的最短路径。

  • target: 目标节点,即终止节点,默认为None,表示计算源节点到图中所有节点的最短路径。

  • weight: 边的权重,默认为None,表示所有边的权重都为1。

  • method: 最短路径计算的方法,默认为dijkstra,表示使用Dijkstra算法。还可以选择其他算法,例如Bellman-Ford算法和Floyd-Warshall算法。该函数返回一个字典,其中键为目标节点,值为从源节点到该目标节点的最短路径。如果指定了目标节点,则返回从源节点到目标节点的最短路径。如果源节点和目标节点不在同一连通分量中,则返回空路径。

nx.shortest_path()只计算节点之间的最短路径,而不是路径的最短距离。如果需要计算最短距离,可以使用nx.shortest_path_length()函数。

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

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

相关文章

Downloader工具配置参数并烧录到flash中

1 Downloader工具介绍 Downloader工具可以用来烧录固件到设备中,固件格式默认为*dcf。该工具还可以用来在线调试EQ或者进行系统设置。 2 配置参数 2.1 作用 当有一个dcf文件时,配合不同的配置文件*.setting,在不进行编译的情况下&#xff…

【毕业设计】ESP32通过MQTT协议连接服务器(二)

文章目录0 前期教程1 前言2 配置SSL证书3 配置用户名和密码4 配置客户端id(client_id)5 conf文件理解6 websocket配置7 其他资料0 前期教程 【毕业设计】ESP32通过MQTT协议连接服务器(一) 1 前言 上一篇教程简单讲述了怎么在虚拟…

【调试】ftrace(三)trace-cmd和kernelshark

之前使用ftrace的时候需要一系列的配置,使用起来有点繁琐,这里推荐一个ftrace的一个前端工具,它就是trace-cmd trace-cmd安装教程 安装trace-cmd及其依赖库 git clone https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/ c…

【Ruby学习笔记】19.Ruby 连接 Mysql - MySql2

Ruby 连接 Mysql - MySql2 前面一章节我们介绍了 Ruby DBI 的使用。这章节我们技术 Ruby 连接 Mysql 更高效的驱动 mysql2,目前也推荐使用这种方式连接 MySql。 安装 mysql2 驱动: gem install mysql2你需要使用 –with-mysql-config 配置 mysql_conf…

【DevOps】GitOps 初识(下) - 让DevOps变得更好

实践GitOps的五大难题 上一篇文章中,我们介绍了GitOps能为我们带来许多的好处,然而,任何新的探索都将不会是一帆风顺的。在开始之前,如果能了解实践GitOps通常会遇到的挑战,并对此作出合适的应对,可能会使…

数据结构和算法(一):复杂度、数组、链表、栈、队列

从广义上来讲:数据结构就是一组数据的存储结构 , 算法就是操作数据的方法 数据结构是为算法服务的,算法是要作用在特定的数据结构上的。 10个最常用的数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树 10…

StorageManagerService.java中的mVold.mount

android源码:android-11.0.0_r21(网址:Search (aospxref.com)) 一、问题 2243行mVold.mount执行的是哪个mount函数? 2239 private void mount(VolumeInfo vol) { 2240 try { 2241 // TOD…

【LeetCode】-- 108. 将有序数组转换为二叉搜索树

1. 题目 108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) 给你一个整数数组 nums ,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 …

mysql在CentOS7.x环境安装

查看当前环境的yum源 ls -l /etc/yum.repos.d/ 可以看到当前环境是没有下载mysql对应的yum源的, 所以需要去官网下载对应的yum源. 找mysql的yum源并安装 http://repo.mysql.com/ 在选择对应yum源之前, 需要看一下自己系统的版本: 进入官网后, 鼠标右击进入查看页面源代码, 因为…

Leetcode.463 岛屿的周长

题目链接 Leetcode.463 岛屿的周长 easy 题目描述 给定一个 row x col的二维网格地图 grid,其中:grid[i][j] 1表示陆地, grid[i][j] 0表示水域。 网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被…

如何从功能测试转型到自动化测试:我三年的学习经历

前言 在软件测试的领域里,自动化测试已经成为了不可或缺的一部分。 与传统的手工测试相比,自动化测试具有更高的效率和精确度,能够有效地减少测试时间和成本,同时提高测试质量。作为一个从事软件测试的人员,如果你想…

Oracle JDK 和 OpenJDK 有什么区别?

可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle JDK 和 OpenJDK 之间是否存在重大差异?下面我通过收集到的一些资料,为你解答这个被很多人忽视的问题。 首先,2006 年 SUN 公司将 Java 开源,也就有…

智慧方政务云顶层设计与建设方案(ppt)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 对一网统管总体架构的理解物联网生态中的业务定位物联网产品与解决方案概览智联物联网管理平台总体方案智联物联网管理平台总体架构智联联连接平台(HLINK)应用架构智慧社区基于…

Linux--进程信号

前言 无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事情,而不是让烦恼和焦虑毁掉你不就不多的热情和定力。心可以碎,手不能停,该干什么干什么,在崩溃中继续努力前行&#xff0c…

export、export default 和import

👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录前言一、export default 和 import ?1. e…

【教学类-29-03】20230409《门牌号-黏贴版(5层*5间)灰底下划线》-(中班《我爱我家》偏数学)

作品样式: 背景需求 在门牌号黏贴版教学实践中,发现90%的幼儿都不会做 1、空格没有平均分布: 从5*630的门牌号中,随机抽取5个空格,有80%的概率出现“一行2个空、3行1个空”的情况。但幼儿第一次做,楼层都…

软考总结条款(2023-05-28系统分析师)

Raid0、 Raid1、 Raid5、 Raid10的原理、特点、性能区别 - 2023-04-07 指令集 - 2023-04-07 RISC全称Reduced Instruction Set Compute,精简指令集计算机。 CISC全称Complex Instruction Set Computers,复杂指令集计算机。 CISC既有简单指令也有复杂指…

【协议项目之 I2C】(一) 基本时序与实现

一、基本介绍 I2C协议(集成电路总线)使用两根线SDA和SCL实现数据传输,其连接如下图所示,总线上通过上拉电阻可以挂载各种低速外设,例如EEPROM 24C02,传感器等。   使用I2C,可以将多个从机(Slave&#xf…

upload-labs pass6-pass10

1.pass-6黑名单 空格绕过 直接上传肯定不可以 这个地方配置文件虽然只过滤了.htaccess,.user.ini也是不可用的,因为这里进行了重命名,通过代码审计可以发现空格没有过滤,这是利用windows的一个特性,后缀后面有空格和…

EasyCVR在公共资源交易中心监控视频汇聚项目中的场景应用方案

一、背景分析 2019年5月,国务院办公厅印发了《国务院办公厅转发国家发展改革委关于深化公共资源交易平台整合共享实施意见的通知》(国办函〔2019〕41号),明确深化公共资源平台整合共享,要求地方各级人民政府制度细化落…