资讯内容
如何用python实现最短路径
用python实现**短路径的方法:1、迪杰斯特拉算法:声明一个数组dis来保存源点到各个顶点的**短距离;2、弗洛伊德算法:在有向图中求解点与点之间**短路径;3、SPFA算法:用数组dis记录每个结点的**短路径估计值。ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
**短路径问题(python实现)ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
解决**短路径问题:(如下三种算法)ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
(1)迪杰斯特拉算法(Dijkstra算法)
(2)弗洛伊德算法(Floyd算法)
(3)SPFA算法ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
第一种算法:ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
Dijkstra算法ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
广度优先搜索解决赋权有向图或者无向图的单源**短路径问题.是一种贪心的策略ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
算法的思路ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
声明一个数组dis来保存源点到各个顶点的**短距离和一个保存已经找到了**短路径的顶点的集合:T,
初始时,原点s的路径权重被赋为0(dis[s]=0)。若对于顶点s存在能直接到达的边(s,m),则把dis[m]设为w(s, m),
同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。初始时,集合T只有顶点s。
然后,从dis数组选择**小值,则该值就是源点s到该值对应的顶点的**短路径,并且把该点加入到T中,OK,此时完成一个顶点,
再看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,
如果是,那么就替换这些顶点在dis中的值,然后,又从dis中找出**小值,重复上述动作,直到T中包含了图的所有顶点。
第二种算法:
ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
Floyd算法ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
原理:ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
Floyd算法(弗洛伊德算法)是一种在有向图中求**短路径的算法。它是一种求解有向图中点与点之间**短路径的算法。
用在拥有负权值的有向图中求解**短路径(不过不能包含负权回路)ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
流程:ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
有向图中的每一个节点X,对于图中过的2点A和B,
如果有Dis(AX)+ Dis(XB)< Dis(AB),那么使得Dis(AB)=Dis(AX)+Dis(XB)。
当所有的节点X遍历完后,AB的**短路径就求出来了。ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
示例一:ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
#-*- coding:utf-8 -*- #python实现Floyd算法 N = 4 _=float('inf') #无穷大 graph = [[ 0, 2, 6, 4],[ _, 0, 3, _],[ 7, _, 0, 1],[ 5, _,12, 0]] path = [[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1]] #记录路径,**后一次经过的点 def back_path(path,i,j): #递归回溯 while(-1 != path[i][j]): back_path(path,i,path[i][j]) back_path(path,path[i][j],j) print path[i][j],14 return; return; print "Graph: ",graph for k in range(N): for i in range(N): for j in range(N): if graph[i][j] > graph[i][k] + graph[k][j]: graph[i][j] = graph[i][k] + graph[k][j] path[i][j] = k print "Shortest distance: ",graph print "Path: ",path print "Points pass-by:" for i in range(N): for j in range(N): print "%d -> %d:" % (i,j), back_path(path,i,j) print " ",示例二:ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
#!usr/bin/env python#encoding:utf-8 ''' 功能:使用floyd算法求**短路径距离 ''' import random import time def random_matrix_genetor(vex_num=10): ''' 随机图顶点矩阵生成器 输入:顶点个数,即矩阵维数 ''' data_matrix=[] for i in range(vex_num): one_list=[] for j in range(vex_num): 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示例三:ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
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,' ',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,c] = A[b,a]+A[a,c] path[b][c] = path[a][c] print 'result:' print A,' ',path if __name__ == "__main__": Folyd()第三种算法:ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
SPFA算法是求解单源**短路径问题的一种算法,由理查德·贝尔曼(Richard Bellman) 和 莱斯特·福特 创立的。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。它的原理是对图进行V-1次松弛操作,得到所有可能的**短路径。ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达 O(VE)。但算法可以进行若干种优化,提高了效率。ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
思路:ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
我们用数组dis记录每个结点的**短路径估计值,用邻接表或邻接矩阵来存储图G。我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的**短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的**短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
推荐课程:聚类算法深度解析(黑马程序员)ufn少儿编程网-Scratch_Python_教程_免费儿童编程学习平台
- 上一篇
python中split是什么呢?
简介Python中split()就是将一个字符串分裂成多个字符串,并以列表的形式返回。split()方法语法:str.split(str=, num=string.count(str)).参数str--分隔符,默认为所有的空字符,包括空格、换行( )、制表符( )等
- 下一篇
怎么在anaconda中安装scrapy?
简介anaconda中安装scrapy的方法:1、在安装Anaconda的情况下,只需在cmd窗口输入:conda install scrapy按回车就可以;2、检测scrapy是否安装成功,在cmd窗口输入scrapy回车查看;步骤3:在pycharm中输入importscrapy