首页 > 编程知识 正文

python有向图最短路径(python求最短路径)

时间:2023-05-06 19:55:46 阅读:66783 作者:514

% E7 % 94 % A8 python % E5 % AE % 9e7% B0 % E6 % E6 % E7 % 9c % E7 % 9f % E8 % B7 % af % E8 % E7 % 9a % 84 % 20 % E6 % 86 4 % b8 % aa % e9 % a1 % B6 % E7 % 82 % B9 % E7 % a9 % E6 % a9c % E7 % 9f % ad % E8 % B7 % B7 % E7 % a6 % BD % 20ef % BC % ef % BC %9B3 % E3 % 80 % 81 spfa % E7 % AE % 97 % E6 % B3 % ef % BC % 9a % E7 % 94 % A8 % E6 % B0 % E7 % bb % 84 % 2080 % E7 % % 207 % 8e % B0 % 29 % 0a % 20 % E8 % a7 % E5 % 86 % B3 % E6 % 9c % 80 % E7 % E8 % B7 % af % E5 % be84 % e9 % 99 9 % 97 % E6 % 20 % 8a % E5 % be % B7 % E7 % AE % 97 % E6 % B3 % E7 % E6 % B3 % 29 % 0a % 20 % 283 % 29 spfa % BC % 98 % E5 % 85 % ee8 % 25 % 205 % 9b % be % E6 % 88 % 96 % E8 % 85 % E6 % 97 % A0 % E5 % 91 % E5 % 9b % be7 % 9a % 84 % ee % E7 % AE % 97 % E6 % B3 % 20 % 95 % B0 % E7 % bb % 84 dis % E6 % a5 % E4 % BF % 9d % E5 % ad % 98 % E6 % ba % 90 % E7 % 82 % bb 2 % E7 % bb % 8f % E6 % 89 % be % ee % 202 % B9 % E7 % 9a % 84 % e9 % 9b % 86 % E5 % 98 % ef % BC % 9at % ef % 8c % 0a % 0 % 29 % E3 % 80 % 82 % E8 % 8b % a5 % af % 25 % 20 a5 % E5 % 88 % B0 % E8 % be % E7 % 9a % 84 % E8 % be % B9 % 28s % 2cm % ef E8 % 83 % BD % E7 % B4 % E6 % 86 % 25 % 20e % 84 % e9 % 95 % BF % E5 % ba % a6 % be4 % ba % E6 % A0 % E7 % B7 % E5 % %8edis % E6 % 95 % 209 % E8 % af % E5 % 80 % BC % E5 % B0 % B1 % E6 % 98 % af % E6 % ba % 90 % E7 % 82 % b9s % E5 % 88 % % E8 % af % a5 % E7 % 82 % B9 % 20 % E5 % AE % 8c % E6 % 88 % 90 % E4 % b8 % aa % e9 % a1 % B6 % E7 % 82 % B9 % 5 % 85 % B6 % E4 % bb % 96 % e9 % aa % 205 % e9 % a1 % B6 % E7 % 82 % B9 % E5 % 88 % b8 % be5 % B6 % E4 % bb % 96 % E7 % 25 % 2099 % E4 % ba % 9b % e9 % a1 % B6 % E7 % 82 % B9 % E5 % a8dis % E4 % b8 % ad % E7 % 84 % E5 % 80 % BC % ef % BC % 88 0 % E5 % 20a % 86 % E5 % 9b % be7 % 9a % 84 % E6 % 89 % E6 % 9c % e9 % a1 % B6 % E7 % 82 % 82 % 82 % 20 % E7 % 20 B3 99 % 20 % 8d % E5 % 9c % A8 % E6 % 9c % 89 % E5 % 91 % E5 % 9b % be4 % b8 % a6 % B1 % 82 % E6 % 9c % 80 % E7 % 9f % ad % 25 % % 9a % 84 % E7 % AE % 97 % E6 % B3 % 95 % E3 % 80 % 82 % 0a % 20 % E7 % 94 % A8 % E5 % E6 % 8b % a5 % E6 % 9c % 89

one_list.append(random.randint(1, 100))

data_matrix.append(one_list)

return data_matrixdef floyd(data_matrix):

'''

输入:原数据矩阵,即:一个二维数组

输出:顶点间距离    '''

dist_matrix=[]

path_matrix=[]

vex_num=len(data_matrix)

for h in range(vex_num):

one_list=['N']*vex_num

path_matrix.append(one_list)

dist_matrix.append(one_list)

for i in range(vex_num):

for j in range(vex_num):

dist_matrix=data_matrix

path_matrix[i][j]=j

for k in range(vex_num):

for i in range(vex_num):

for j in range(vex_num):

if dist_matrix[i][k]=='N' or dist_matrix[k][j]=='N':

temp='N'

else:

temp=dist_matrix[i][k] dist_matrix[k][j]

if dist_matrix[i][j]>temp:

dist_matrix[i][j]=temp

path_matrix[i][j]=path_matrix[i][k]

return dist_matrix, path_matrixdef main_test_func(vex_num=10):

'''

主测试函数

'''

data_matrix=random_matrix_genetor(vex_num)

dist_matrix, path_matrix=floyd(data_matrix)

for i in range(vex_num):

for j in range(vex_num):

print '顶点' str(i) '----->' '顶点' str(j) '最小距离为:', dist_matrix[i][j]

if __name__ == '__main__':

data_matrix=[['N',1,'N',4],[1,'N',2,'N'],['N',2,'N',3],[4,'N',3,'N']]

dist_matrix, path_matrix=floyd(data_matrix)

print dist_matrix

print path_matrix

time_list=[]

print '------------------------------节点数为10测试情况------------------------------------'

start_time0=time.time()

main_test_func(10)

end_time0=time.time()

t1=end_time0-start_time0

time_list.append(t1)

print '节点数为10时耗时为:', t1

print '------------------------------节点数为100测试情况------------------------------------'

start_time1=time.time()

main_test_func(100)

end_time1=time.time()

t2=end_time1-start_time1

time_list.append(t2)

print '节点数为100时耗时为:', t2

print '------------------------------节点数为1000测试情况------------------------------------'

start_time1=time.time()

main_test_func(1000)

end_time1=time.time()

t3=end_time1-start_time1

time_list.append(t3)

print '节点数为100时耗时为:', t3

print '--------------------------------------时间消耗情况为:--------------------------------'

for one_time in time_list:

print one_time

示例三:import numpy as np

Max     = 100

v_len   = 4

edge    = np.mat([[0,1,Max,4],[Max,0,9,2],[3,5,0,8],[Max,Max,6,0]])

A       = edge[:]

path    = np.zeros((v_len,v_len))

def Folyd():

for i in range(v_len):

for j in range(v_len):

if(edge[i,j] != Max and edge[i,j] != 0):

path[i][j] = i

print 'init:'

print A,'n',path

for a in range(v_len):

for b in range(v_len):

for c in range(v_len):

if(A[b,a] A[a,c]

A[b,c] = A[b,a] A[a,c]

path[b][c] = path[a][c]

print 'result:'

print A,'n',path

if __name__ == "__main__":

Folyd()

第三种算法:

SPFA算法是求解单源最短路径问题的一种算法,由痴情的大地(Richard Bellman) 和 cqdxmt 创立的。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。它的原理是对图进行V-1次松弛操作,得到所有可能的最短路径。

其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达 O(VE)。但算法可以进行若干种优化,提高了效率。

思路:

我们用数组dis记录每个结点的最短路径估计值,用邻接表或邻接矩阵来存储图G。我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。