【图与网络数学模型】1.Dijkstra算法求解最短路径问题

2024-02-19 08:20

本文主要是介绍【图与网络数学模型】1.Dijkstra算法求解最短路径问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

【图与网络数学模型】1.Dijkstra算法求解最短路径问题

  • 一、图论基本概念
    • 1. 图论
    • 2. 哥尼斯堡七桥问題
    • 3. 图的一些基本概念
    • 4. 图的矩阵表示
  • 二、最短路径问题算法
    • 1. 图形的标号法
    • 2. Dijkstra法
      • (1)基本思路
      • (2)求解示例
  • 三、基于Python的Dijkstra算法
    • 1. 创建图对象
    • 2. 打印最短路径
    • 3. 查找顶点
    • 4. Dijkstra 算法实现
    • 5. 完整程序运行


一、图论基本概念

1. 图论

图论是应用非常广泛的运筹学分支,它已经广泛地应用于物理学控制论、信息论、工程技术、交通运输、经济管理、电子计算机等各项领域。对于科学研究、市场和社会生活中的许多问题,可以用图论的理论和方法来加以解决。

2. 哥尼斯堡七桥问題

关于图的第一篇论文是瑞士数学家欧拉(E. Euler)在1736年发表的解决“哥尼斯堡” 七桥难题的论文。

要如何走过每座桥恰一次,再返回出发点?

在这里插入图片描述

即能否从某一点开始不重复地一笔画出这个图形,最终回到原点。欧拉在他的论文中证明了这是不可能的,因为这个图形中每一个顶点都与奇数条边相连接,不可能将它一笔画出,这就是古典图论中的第一个著名问题。

3. 图的一些基本概念

图论中的图是由点、点与点之间的线所组成的。

涉及的一些概念如下表,在此不做赘述。

边,弧无向图
端点关联边有向图
始点,终点多重边简单图初等链/圈
度(次)多重图简单链/圈
奇点,偶点连通图基础图
悬挂点悬挂边不连通图
弧立点回路

4. 图的矩阵表示

邻接矩阵 Adjacency matrix

  • 表示图中两点之间的相互关系
  • 两点之间有弧或边的,用1表示,否则用0表示,构成一个矩阵A

在这里插入图片描述
上图可用矩阵表示如下:
在这里插入图片描述

二、最短路径问题算法

最短路径问题是图论中十分重要的最优化问题之一,它作为一个经常被用到的基本工具,可以解决生产实际中的许多问题,也可以用于解决其它的最优化问题。

如果P是D中从 v s v_s vs v i v_i vi 的最短路, v i v_i vi 是 P 中的一个点,那么从 v s v_s vs 沿 P 到 v i v_i vi 的路是从 v s v_s vs v i v_i vi 的最短路。

1. 图形的标号法

求下图从A到G的最短路:
在这里插入图片描述

解法:先标出离终点最近的一段,然后标号与该点距离最短的点,继续逆推至始点。

在这里插入图片描述

从A到G的最短路为: A - B1-C2-D1-E2-F2-G

2. Dijkstra法

(1)基本思路

v s v_s vs出发,逐步地向外探寻最短路。

执行过程中,与每个点对应,记录下一个数 (称为此点的标号)

  1. 它或者表示从 v s v_s vs到该点的最短路的权 (称为P标号)
  2. 或者是从 v s v_s vs到该点的最短路的权的上界 (称为T标号)

方法的每一步是修改T标号,并且把某一个具T标号的点改变为具P标号的点,从而使D中具P标号的点多一个,如此经过 p-1步,就可以求出从 v s v_s vs到各点的最短路。

(2)求解示例

例如求下图从1到8的最短路径:
在这里插入图片描述

  1. X={1}, w 1 w_1 w1=0
    在这里插入图片描述

  2. X={1,4}
    在这里插入图片描述

  3. X={1,2,4}
    在这里插入图片描述

  4. X={1,2,4,6}
    在这里插入图片描述

  5. X={1,2,4,6,7}
    在这里插入图片描述

  6. X={1,2,3,4,6,7}
    在这里插入图片描述

  7. X={1,2,3,4,6,7,8}
    在这里插入图片描述
    1到8的最短路径为{1,4,7,5,8},长度为10。

三、基于Python的Dijkstra算法

1. 创建图对象

创建一个图对象:接受一个参数 vertices,表示图中顶点的数量。

在初始化过程中,将顶点数量存储在 self.V 中,并创建一个二维数组 self.graph 作为邻接矩阵,初始值为0。

	def __init__(self, vertices):self.V = verticesself.graph = [[0 for column in range(vertices)]for row in range(vertices)]

2. 打印最短路径

printSolution(self, dist):接受一个参数 dist,该参数是一个包含各个顶点距离源点的最短距离的列表。

遍历所有顶点,打印每个顶点及其距离源点的最短距离。

	def printSolution(self, dist):print("Vertex \t Distance from Source")for node in range(self.V):print(node, "\t\t", dist[node])

3. 查找顶点

查找未包含在最短路径树中的距离源点最近的顶点。

minDistance(self, dist, sptSet):接受两个参数 dist 和 sptSet,分别表示从源点到各个顶点的当前最短距离和是否已经包含在最短路径树中。

遍历所有顶点,找到距离源点最近且未包含在最短路径树中的顶点,并返回其索引。

	def minDistance(self, dist, sptSet):min = 1e7for v in range(self.V):if dist[v] < min and sptSet[v] == False:min = dist[v]min_index = vreturn min_index

4. Dijkstra 算法实现

参数 src:表示源点的索引。

初始化距离源点的距离列表 dist 和最短路径树标记列表 sptSet。

在循环中,选择距离源点最近且未包含在最短路径树中的顶点作为当前顶点 u,将其标记为已经包含在最短路径树中。

更新与当前顶点相邻且未包含在最短路径树中的顶点的距离,如果新的距离小于之前记录的距离,则更新距离值。

最后调用 printSolution 方法打印结果。

	def dijkstra(self, src):dist = [1e7] * self.Vdist[src] = 0sptSet = [False] * self.Vfor cout in range(self.V):u = self.minDistance(dist, sptSet)sptSet[u] = Truefor v in range(self.V):if (self.graph[u][v] > 0 andsptSet[v] == False anddist[v] > dist[u] + self.graph[u][v]):dist[v] = dist[u] + self.graph[u][v]self.printSolution(dist)

5. 完整程序运行

求下图从1到8的最短路径:
在这里插入图片描述

class Graph():def __init__(self, vertices):self.V = verticesself.graph = [[0 for column in range(vertices)]for row in range(vertices)]def printSolution(self, dist):print("Vertex \t Distance from Source")for node in range(self.V):print(node, "\t\t", dist[node])def minDistance(self, dist, sptSet):min = 1e7for v in range(self.V):if dist[v] < min and sptSet[v] == False:min = dist[v]min_index = vreturn min_indexdef dijkstra(self, src):dist = [1e7] * self.Vdist[src] = 0sptSet = [False] * self.Vfor cout in range(self.V):u = self.minDistance(dist, sptSet)sptSet[u] = Truefor v in range(self.V):if (self.graph[u][v] > 0 andsptSet[v] == False anddist[v] > dist[u] + self.graph[u][v]):dist[v] = dist[u] + self.graph[u][v]self.printSolution(dist)g = Graph(8)
g.graph = [[0, 2, 0, 1, 0, 3, 0, 0],[0, 0, 6, 0, 5, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 6],[0, 10, 0, 0, 0, 0, 2, 0],[0, 0, 9, 0, 0, 0, 0, 4],[0, 0, 0, 5, 0, 0, 4, 0],[0, 7, 0, 0, 3, 0, 0, 8],[0, 0, 0, 0, 0, 0, 0, 0]]g.dijkstra(0)

输出结果如下:

Vertex 	 Distance from Source
0 		 0
1 		 2
2 		 8
3 		 1
4 		 6
5 		 3
6 		 3
7 		 10

1-8最短路径的长度为10.

这篇关于【图与网络数学模型】1.Dijkstra算法求解最短路径问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/724095

相关文章

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu