金狮镖局 Design By www.egabc.com
本文实例讲述了Python图算法。分享给大家供大家参考,具体如下:
#encoding=utf-8 import networkx,heapq,sys from matplotlib import pyplot from collections import defaultdict,OrderedDict from numpy import array # Data in graphdata.txt: # a b 4 # a h 8 # b c 8 # b h 11 # h i 7 # h g 1 # g i 6 # g f 2 # c f 4 # c i 2 # c d 7 # d f 14 # d e 9 # f e 10 def Edge(): return defaultdict(Edge) class Graph: def __init__(self): self.Link = Edge() self.FileName = '' self.Separator = '' def MakeLink(self,filename,separator): self.FileName = filename self.Separator = separator graphfile = open(filename,'r') for line in graphfile: items = line.split(separator) self.Link[items[0]][items[1]] = int(items[2]) self.Link[items[1]][items[0]] = int(items[2]) graphfile.close() def LocalClusteringCoefficient(self,node): neighbors = self.Link[node] if len(neighbors) <= 1: return 0 links = 0 for j in neighbors: for k in neighbors: if j in self.Link[k]: links += 0.5 return 2.0*links/(len(neighbors)*(len(neighbors)-1)) def AverageClusteringCoefficient(self): total = 0.0 for node in self.Link.keys(): total += self.LocalClusteringCoefficient(node) return total/len(self.Link.keys()) def DeepFirstSearch(self,start): visitedNodes = [] todoList = [start] while todoList: visit = todoList.pop(0) if visit not in visitedNodes: visitedNodes.append(visit) todoList = self.Link[visit].keys() + todoList return visitedNodes def BreadthFirstSearch(self,start): visitedNodes = [] todoList = [start] while todoList: visit = todoList.pop(0) if visit not in visitedNodes: visitedNodes.append(visit) todoList = todoList + self.Link[visit].keys() return visitedNodes def ListAllComponent(self): allComponent = [] visited = {} for node in self.Link.iterkeys(): if node not in visited: oneComponent = self.MakeComponent(node,visited) allComponent.append(oneComponent) return allComponent def CheckConnection(self,node1,node2): return True if node2 in self.MakeComponent(node1,{}) else False def MakeComponent(self,node,visited): visited[node] = True component = [node] for neighbor in self.Link[node]: if neighbor not in visited: component += self.MakeComponent(neighbor,visited) return component def MinimumSpanningTree_Kruskal(self,start): graphEdges = [line.strip('\n').split(self.Separator) for line in open(self.FileName,'r')] nodeSet = {} for idx,node in enumerate(self.MakeComponent(start,{})): nodeSet[node] = idx edgeNumber = 0; totalEdgeNumber = len(nodeSet)-1 for oneEdge in sorted(graphEdges,key=lambda x:int(x[2]),reverse=False): if edgeNumber == totalEdgeNumber: break nodeA,nodeB,cost = oneEdge if nodeA in nodeSet and nodeSet[nodeA] != nodeSet[nodeB]: nodeBSet = nodeSet[nodeB] for node in nodeSet.keys(): if nodeSet[node] == nodeBSet: nodeSet[node] = nodeSet[nodeA] print nodeA,nodeB,cost edgeNumber += 1 def MinimumSpanningTree_Prim(self,start): expandNode = set(self.MakeComponent(start,{})) distFromTreeSoFar = {}.fromkeys(expandNode,sys.maxint); distFromTreeSoFar[start] = 0 linkToNode = {}.fromkeys(expandNode,'');linkToNode[start] = start while expandNode: # Find the closest dist node closestNode = ''; shortestdistance = sys.maxint; for node,dist in distFromTreeSoFar.iteritems(): if node in expandNode and dist < shortestdistance: closestNode,shortestdistance = node,dist expandNode.remove(closestNode) print linkToNode[closestNode],closestNode,shortestdistance for neighbor in self.Link[closestNode].iterkeys(): recomputedist = self.Link[closestNode][neighbor] if recomputedist < distFromTreeSoFar[neighbor]: distFromTreeSoFar[neighbor] = recomputedist linkToNode[neighbor] = closestNode def ShortestPathOne2One(self,start,end): pathFromStart = {} pathFromStart[start] = [start] todoList = [start] while todoList: current = todoList.pop(0) for neighbor in self.Link[current]: if neighbor not in pathFromStart: pathFromStart[neighbor] = pathFromStart[current] + [neighbor] if neighbor == end: return pathFromStart[end] todoList.append(neighbor) return [] def Centrality(self,node): path2All = self.ShortestPathOne2All(node) # The average of the distances of all the reachable nodes return float(sum([len(path)-1 for path in path2All.itervalues()]))/len(path2All) def SingleSourceShortestPath_Dijkstra(self,start): expandNode = set(self.MakeComponent(start,{})) distFromSourceSoFar = {}.fromkeys(expandNode,sys.maxint); distFromSourceSoFar[start] = 0 while expandNode: # Find the closest dist node closestNode = ''; shortestdistance = sys.maxint; for node,dist in distFromSourceSoFar.iteritems(): if node in expandNode and dist < shortestdistance: closestNode,shortestdistance = node,dist expandNode.remove(closestNode) for neighbor in self.Link[closestNode].iterkeys(): recomputedist = distFromSourceSoFar[closestNode] + self.Link[closestNode][neighbor] if recomputedist < distFromSourceSoFar[neighbor]: distFromSourceSoFar[neighbor] = recomputedist for node in distFromSourceSoFar: print start,node,distFromSourceSoFar[node] def AllpairsShortestPaths_MatrixMultiplication(self,start): nodeIdx = {}; idxNode = {}; for idx,node in enumerate(self.MakeComponent(start,{})): nodeIdx[node] = idx; idxNode[idx] = node matrixSize = len(nodeIdx) MaxInt = 1000 nodeMatrix = array([[MaxInt]*matrixSize]*matrixSize) for node in nodeIdx.iterkeys(): nodeMatrix[nodeIdx[node]][nodeIdx[node]] = 0 for line in open(self.FileName,'r'): nodeA,nodeB,cost = line.strip('\n').split(self.Separator) if nodeA in nodeIdx: nodeMatrix[nodeIdx[nodeA]][nodeIdx[nodeB]] = int(cost) nodeMatrix[nodeIdx[nodeB]][nodeIdx[nodeA]] = int(cost) result = array([[0]*matrixSize]*matrixSize) for i in xrange(matrixSize): for j in xrange(matrixSize): result[i][j] = nodeMatrix[i][j] for itertime in xrange(2,matrixSize): for i in xrange(matrixSize): for j in xrange(matrixSize): if i==j: result[i][j] = 0 continue result[i][j] = MaxInt for k in xrange(matrixSize): result[i][j] = min(result[i][j],result[i][k]+nodeMatrix[k][j]) for i in xrange(matrixSize): for j in xrange(matrixSize): if result[i][j] != MaxInt: print idxNode[i],idxNode[j],result[i][j] def ShortestPathOne2All(self,start): pathFromStart = {} pathFromStart[start] = [start] todoList = [start] while todoList: current = todoList.pop(0) for neighbor in self.Link[current]: if neighbor not in pathFromStart: pathFromStart[neighbor] = pathFromStart[current] + [neighbor] todoList.append(neighbor) return pathFromStart def NDegreeNode(self,start,n): pathFromStart = {} pathFromStart[start] = [start] pathLenFromStart = {} pathLenFromStart[start] = 0 todoList = [start] while todoList: current = todoList.pop(0) for neighbor in self.Link[current]: if neighbor not in pathFromStart: pathFromStart[neighbor] = pathFromStart[current] + [neighbor] pathLenFromStart[neighbor] = pathLenFromStart[current] + 1 if pathLenFromStart[neighbor] <= n+1: todoList.append(neighbor) for node in pathFromStart.keys(): if len(pathFromStart[node]) != n+1: del pathFromStart[node] return pathFromStart def Draw(self): G = networkx.Graph() nodes = self.Link.keys() edges = [(node,neighbor) for node in nodes for neighbor in self.Link[node]] G.add_edges_from(edges) networkx.draw(G) pyplot.show() if __name__=='__main__': separator = '\t' filename = 'C:\\Users\\Administrator\\Desktop\\graphdata.txt' resultfilename = 'C:\\Users\\Administrator\\Desktop\\result.txt' myGraph = Graph() myGraph.MakeLink(filename,separator) print 'LocalClusteringCoefficient',myGraph.LocalClusteringCoefficient('a') print 'AverageClusteringCoefficient',myGraph.AverageClusteringCoefficient() print 'DeepFirstSearch',myGraph.DeepFirstSearch('a') print 'BreadthFirstSearch',myGraph.BreadthFirstSearch('a') print 'ShortestPathOne2One',myGraph.ShortestPathOne2One('a','d') print 'ShortestPathOne2All',myGraph.ShortestPathOne2All('a') print 'NDegreeNode',myGraph.NDegreeNode('a',3).keys() print 'ListAllComponent',myGraph.ListAllComponent() print 'CheckConnection',myGraph.CheckConnection('a','f') print 'Centrality',myGraph.Centrality('c') myGraph.MinimumSpanningTree_Kruskal('a') myGraph.AllpairsShortestPaths_MatrixMultiplication('a') myGraph.MinimumSpanningTree_Prim('a') myGraph.SingleSourceShortestPath_Dijkstra('a') # myGraph.Draw()
更多关于Python相关内容可查看本站专题:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
标签:
Python,图算法
金狮镖局 Design By www.egabc.com
金狮镖局
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
金狮镖局 Design By www.egabc.com
暂无Python图算法实例分析的评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】