首页 > 编程语言 >python实现迪杰斯特拉算法

python实现迪杰斯特拉算法

时间:2023-07-13 12:22:07浏览次数:47  
标签:Network python float 迪杰 int 斯特拉 np path inf

Dijkstra算法可以计算出在有权图中从某个起点出发到其他任何一点的最短路径长度

算法思想:

迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

定义起点s,终点t,集合U表示还没有找到起点到该点的最短路径的点的集合,集合S表示已经找到最短路径的点的集合,初始情况下S集合中只有起点一个点,最短路径是0

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Wed Jul 12 17:02:54 2023
 4 
 5 @author: SunYuhui
 6 """
 7 import numpy as np
 8 
 9 def Dijkstra(Network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价
10     Network = np.array(Network)
11     NetShape = Network.shape
12     
13     start = s #起点
14     destination = d #终点
15     
16     # 对于S,第二列表示从源节点到本节点已求得的最小距离,不再变更;
17     #S = [0节点 1父节点 2距离]  ps:距离 是到起点的距离
18     S = np.array([[start,-1,0]])
19     
20     
21     # 对于U,第二列表示从源节点到本节点暂时求得的最小距离,可能会变更
22     U = np.zeros((NetShape[0],3))
23     U[:,0] = [i for i in range(NetShape[0])]
24     U[:,1] = -1
25     U[:,2] = float("inf")
26     U = np.delete(U, start, axis=0)  
27     
28     while U.shape[0] > 0:
29         #更新U #更新父节点 #更新距离
30         U_shape = U.shape
31         
32         for i in range(U_shape[0]):
33             if Network[int(S[-1,0]),int(U[i,0])] != float("inf")\
34                 and Network[int(S[-1,0]),int(U[i,0])]+S[-1,2] < U[i,2]:
35                 U[i,1] = S[-1,0] #更新父节点
36                 U[i,2] = Network[int(S[-1,0]),int(U[i,0])] + S[-1,2] #更新距离
37         
38         #选择距离最小
39         idx = np.argmin(U[:,2])
40         #更新S:添加被选择的点 进 S
41         S = np.row_stack((S, U[idx,:])) 
42         #更新U:删除掉被选择的节点
43         U = np.delete(U, idx, axis=0)  
44     
45     #回溯求最短路径
46     path = np.array([destination])
47     while True:
48         index = np.where(S[:,0] == path[path.shape[0]-1]) 
49         path = np.append(path,S[index,1])
50         if S[index,1] == start:
51             break
52     path = np.flip(path)
53         
54     #求最短距离
55     index = np.where(S[:,0] == destination) 
56     mindist = S[index,2]
57     return path,mindist
58             
59 # Network = [[float("inf"),3,float("inf"),1,2,float("inf")],
60 #            [3,float("inf"),float("inf"),float("inf"),float("inf"),2],
61 #            [float("inf"),float("inf"),float("inf"),3,1,float("inf")],
62 #            [1,float("inf"),3,float("inf"),float("inf"),2],
63 #            [2,float("inf"),1,float("inf"),float("inf"),float("inf")],
64 #            [float("inf"),2,float("inf"),2,float("inf"),float("inf")]]
65 # dic = ['a','b','c','d','u','v']
66 # s=4
67 # d=5
68 #最优路径uadv
69 #最短距离5
70 
71 Network = [[float("inf"),12,float("inf"),float("inf"),float("inf"),16,14],
72             [12,float("inf"),10,float("inf"),float("inf"),7,float("inf")],
73             [float("inf"),10,float("inf"),3,5,6,float("inf")],
74             [float("inf"),float("inf"),3,float("inf"),4,float("inf"),float("inf")],
75             [float("inf"),float("inf"),5,4,float("inf"),2,8],
76             [16,7,6,float("inf"),2,float("inf"),9],
77             [14,float("inf"),float("inf"),float("inf"),8,9,float("inf")]]
78 dic = ['A','B','C','D','E','F','G']
79 s=3
80 d=0
81 path,mindist = Dijkstra(Network,s,d)
82 #最优路径DEFA
83 #最短距离22
84 
85 
86 result = ''
87 for i in range(path.shape[0]):
88     result = result + dic[int(path[i])]
89 print("最优路径:"+result)
90 print("最短距离:"+str(int(mindist)))

参考资料:

 Matlab复现迪杰斯特拉算法 - junlin623 - 博客园 (cnblogs.com)

标签:Network,python,float,迪杰,int,斯特拉,np,path,inf
From: https://www.cnblogs.com/syhui/p/17550139.html

相关文章

  • 如何实现十六进制数转化为二进制 python的具体操作步骤
    十六进制数转化为二进制在计算机科学中,数字可以用不同的进制表示。其中,十六进制(hexadecimal)是一种非常常见的进制。在十六进制中,除了0-9的十个数字,还有A-F的六个字母,分别代表了十进制的10-15。而二进制(binary)是计算机中最常用的进制,因为计算机中的所有数据都是以二进制的形......
  • Python工具箱系列(三十八)
    二进制文件操作(下)上文介绍将类的属性值保存到二进制文件的基本操作。在实际中,还有可能保存文本信息。例如,传感器可能还会有自己所在区域的信息。此时,对于二进制文件的读写提出了挑战。如何才能够在读取时,知道所读的字节是整数、浮点数而不是字符呢?解决的方法有:◆全程避免引入字符......
  • PYTHON随笔-打印错误堆栈
    PYTHON随笔-打印错误堆栈importsysimporttracebackdefprint_traceback():'打印通常的回溯信息,且附有每帧中的局部变量的列表'tb=sys.exc_info()[2]#返回当前异常的(type,value,traceback)whiletb.tb_next:tb=tb.tb_next#栈中的下一个trac......
  • python 数据类型 字符串
    目录python数据类型字符串Python字符串定义Python字符串连接Python转义字符Python字符串运算符Python字符串格式化Unicode字符串python的字符串内置函数python数据类型字符串Python字符串定义#字符串是Python中最常用的数据类型。我们可以使用引号('或")来创建字......
  • 解决指定GPU运行和训练 python程序 、深度学习单卡、多卡 训练GPU设置【一文读懂】的
    指定GPU运行和训练Python程序,深度学习单卡、多卡训练GPU设置在进行深度学习任务时,GPU的使用是提高训练速度和效果的重要手段之一。在Python中,我们可以通过一些方法来指定GPU的运行和训练。指定GPU运行当我们使用多个GPU进行训练时,有时需要手动指定程序运行在哪个GPU上。这可以......
  • 解决支持vscode 1.62 的python插件版本的具体操作步骤
    如何实现支持VSCode1.62的Python插件版本作为一名经验丰富的开发者,我将指导你如何实现支持VSCode1.62的Python插件版本。下面是实现这个目标的步骤:步骤操作1安装VSCode最新版本2创建一个Python插件3更新插件依赖和Python版本4更新插件功能以适应VSCode1......
  • 折线图怎么设置横坐标表示年份python 来解决一个具体问题的方案
    折线图怎么设置横坐标表示年份在使用Python绘制折线图时,可以通过设置横坐标来表示年份。本文将介绍如何根据年份绘制折线图,并给出一个具体的问题来解决。问题描述假设我们有一份数据,记录了某城市从2010年到2020年每年的降水量。我们想要使用折线图来展示这些数据,横坐标表示年份,......
  • 怎么用python抢大麦网演唱会门票 这个问题怎么解决?
    使用Python抢大麦网演唱会门票引言随着互联网的发展,越来越多的人选择在线购买演唱会门票。然而,由于演唱会门票数量有限,很多时候门票在开售后仅仅几分钟内就被抢购一空,这给想要购票的人们带来了很大的困扰。本篇文章将介绍如何使用Python来抢购大麦网演唱会门票,解决这个实际问题。......
  • 怎么升级anconda的python版本 来解决一个具体问题的方案
    如何升级Anaconda的Python版本Anaconda是一个使用Python进行数据科学和机器学习的强大工具。它提供了一个简单的方式来安装和管理Python环境,包括Python解释器、各种常用的科学计算库和工具。然而,有时候我们需要升级Anaconda的Python版本,以便使用最新的功能和库。下面是一些简单的......
  • 怎么让vim执行python在conda中 来解决一个具体问题的方案
    怎么让vim执行python在conda中问题描述在使用vim编辑器进行Python编程时,我们可能会遇到使用conda环境时无法直接执行python代码的问题。这是因为vim默认使用系统的Python环境,而不是我们使用conda创建的环境。因此,我们需要找到一种方法来让vim能够在我们指定的conda环境中执行Pyth......