日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分支限界法:单源最短路径--dijkstra算法

發布時間:2024/9/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分支限界法:单源最短路径--dijkstra算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單源最短路徑–dijkstra算法

前面已經多次介紹過dijkstra算法是貪心算法,是動態規劃,實際上可以從分支限界的角度來理解;

分支限界法

分支限界法,實際上就是回溯法,一般意義的回溯法是基于深度優先搜索,也可以配合限界函數剪枝,通常分支限界法基于寬度優先搜索,通過隊列或者優先級隊列實現。
剪枝的策略:不相鄰的邊剪掉,二是結點控制關系的路徑剪掉,兩條路徑到達同一個頂點,在解空間樹上是屬于兩條不同的路徑,把路徑長的節點后面的分支剪掉

代碼實現如下:

import numpy as np import heapq class dijkstra:def __init__(self,graph,start):# 鄰接表self.graph = graph# 頂點個數self.num = len(graph)#源點self.start = start# 已知最短路徑,又叫當前最優值,并初始化self.dist = {vertex:np.Inf for vertex in graph} self.dist[start] = 0.0# 初始化優先級隊列self.queue = []heapq.heappush(self.queue,(0.0,start))#追蹤解self.parent = {start:None}def shortest_Path(self):while self.queue:#取出根節點enode = heapq.heappop(self.queue)distance = enode[0]vertex = enode[1]# 取鄰接的邊,實際上過濾了不相鄰的邊# 這里可以寫成 for j in range(self.num),# 看成完全n叉樹,也可以看成隨機叉樹的處理for j in self.graph[vertex].keys():# 他們都叫這個為控制約束,兩條到某同一點的路徑,長的那一條后面就被剪掉了# 也就是貪心法里面的貪心策略if distance + self.graph[vertex][j] < self.dist[j] :self.dist[j] = distance + self.graph[vertex][j]self.parent[j] = vertexheapq.heappush(self.queue,(self.dist[j],j))def print_Result(self):print(self.parent)print(self.dist)

對比基于貪心策略優先級隊列實現方式,就多了一步:if v not in visit,也就是標記那些點已經達到了最短距離,就沒有必要再算了,做了進一步剪枝:

def dijkstra_test(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 print(parent)print(distance)

對比測試結果:

#%% 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,'F':9},'F':{'D':8,'E':9,'G':10},'G':{'F':10}}dij = dijkstra(g,'D') dij.shortest_Path() dij.print_Result()dijkstra_test(g,'D'){'D': None, 'B': 'D', 'C': 'D', 'E': 'D', 'F': 'D', 'A': 'B', 'G': 'F'} {'A': 5.0, 'B': 4.0, 'C': 5.0, 'D': 0.0, 'E': 7.0, 'F': 8.0, 'G': 18.0} {'D': None, 'B': 'D', 'C': 'D', 'E': 'D', 'F': 'D', 'A': 'B', 'G': 'F'} {'A': 5.0, 'B': 4.0, 'C': 5.0, 'D': 0.0, 'E': 7.0, 'F': 8.0, 'G': 18.0} 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的分支限界法:单源最短路径--dijkstra算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。