Dijkstra的理解和实现
生活随笔
收集整理的這篇文章主要介紹了
Dijkstra的理解和实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Dijkstra理解:
1、單點(diǎn)按照距離遞增輻射出去; 2、輻射到的點(diǎn)會(huì)被放進(jìn)優(yōu)先級(jí)隊(duì)列,距離遠(yuǎn)的點(diǎn)可能會(huì)先放到隊(duì)列里; 3、距離近的,可能會(huì)后放進(jìn)隊(duì)列,但是肯定會(huì)先出去; 4、每一個(gè)放進(jìn)優(yōu)先級(jí)隊(duì)列的點(diǎn),需要記錄:自己,自己的前繼節(jié)點(diǎn),自己到起點(diǎn)的距離,會(huì)被用到的。容易的誤解不是簡(jiǎn)單的每次走最近的點(diǎn),是逐步(按照已確定的點(diǎn)不斷傳染輻射方式,保證最近的點(diǎn)一定在候選區(qū))添加點(diǎn)到候選區(qū),選出距離起點(diǎn)最近的點(diǎn),再次輻射
優(yōu)化:
把鄰居放進(jìn)候選區(qū),沒必要把全部鄰居都放進(jìn)去,需要有2個(gè)條件:
1、鄰居不在已確定最近的點(diǎn)集合里面,也就是不在visited里面; 2、鄰居通過當(dāng)前點(diǎn)到起點(diǎn)距離要小于之前記錄的距離,也就是這個(gè)鄰居前一次進(jìn)入備選區(qū)時(shí)的距離,要不然進(jìn)去了,也會(huì)被自己比下去;代碼實(shí)現(xiàn)
import heapq import numpy as npdef dijkstra(graph,start):pqueue = []heapq.heappush(pqueue,(0.0,start))visit = set()parent = {start:None}distance = {vertex:np.Inf for vertex in graph}distance[start] = 0.0while pqueue:pair = heapq.heappop(pqueue) dist = pair[0]vertex = pair[1]visit.add(vertex)edges = graph[vertex]for v in edges:if v not in visit:if dist + graph[vertex][v] < distance[v]:heapq.heappush(pqueue,(dist + graph[vertex][v],v))distance[v] = dist + graph[vertex][v]parent[v] = vertex return parent,distance另外一種代碼實(shí)現(xiàn),這里的循環(huán)條件while count < vnum and,非常體現(xiàn)功力:
def dijkstra2(graph,start):vnum = len(graph)pqueue = []heapq.heappush(pqueue,(0.0,None,start))paths = {vertex : None for vertex in graph}count = 0while count < vnum and pqueue:pair = heapq.heappop(pqueue)distance = pair[0]parent = pair[1]vertex = pair[2]if paths[vertex]:continuepaths[vertex] = (parent,distance)edges = graph[vertex]for v in edges:if paths[v] is None:heapq.heappush(pqueue,(distance + graph[vertex][v],vertex,v))count += 1return paths運(yùn)行結(jié)果:
#%%g = {'A':{'B':1,'C':2},'B':{'A':1,'C':3,'D':4},'C':{'A':2,'B':3,'D':5,'E':6},'D':{'B':4,'C':5,'E':7,'F':8},'E':{'C':6,'D':7,'G':9},'F':{'D':8},'G':{'E':9}}i,j=dijkstra(g,'A')print iprint jt=dijkstra2(g,'A')print t{'A': None, 'C': 'A', 'B': 'A', 'E': 'C', 'D': 'B', 'G': 'E', 'F': 'D'} {'A': 0.0, 'C': 2.0, 'B': 1.0, 'E': 8.0, 'D': 5.0, 'G': 17.0, 'F': 13.0} {'A': (None, 0.0), 'C': ('A', 2.0), 'B': ('A', 1.0), 'E': ('C', 8.0), 'D': ('B', 5.0), 'G': ('E', 17.0), 'F': ('D', 13.0)}總結(jié)
以上是生活随笔為你收集整理的Dijkstra的理解和实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在AWS搭建服务器控制服务器
- 下一篇: Prim和Dijkstra居然写起来一模