0

我有一個定向加權G,其中weight是轉換的持續時間。使用加權有向圖中的DFS查找兩個節點之間的所有路徑

我使用帶修改的DFS編寫了兩個頂點之間的所有路徑搜索算法:搜索繼續進行,直到路徑的總權重(其各部分的權重之和)將少一些值。我的代碼在小圖中工作,但在大圖(| V | = 1800,| E | = 50870)中它會凍結。

def find_paths(self, start, end, weight_limit=10): 
     res = [] 

     def dfs(start, end, path=[], weight=0): 
      path = path + [start] 
      if len(path) > 1: 
       weight += self.weights[(path[-2], start)] 
      if weight > weight_limit: 
       return [] 
      if start == end: 
       res.append((path, weight)) 
       return [path] 
      if start not in self.adjacent: 
       return [] 
      paths = [] 
      for node in self.adjacent[start]: 
       if node not in path: 
        paths.extend(dfs(node, end, path, weight)) 
      return paths 

     dfs(start, end) 
     return res 
+0

可能是內存錯誤。你真的需要跟蹤所有的路徑和他們的權重? –

+0

@JaredGoguen是的,我需要跟蹤所有路徑及其權重,因爲我的目標是查找GRAPH中START和END節點之間的所有路徑。所以,如果這是內存錯誤,是否有可能解決這個問題?有任何想法嗎? – Andrei

+0

路徑總數可能隨着邊緣數量的增加而有規模地增長。甚至50!太大而無法通過枚舉來處理,不介意50000! –

回答

1

你的代碼似乎是正確的(特別是因爲它在小圖上工作)。

問題是節點之間可能有很多路徑。對於完全連通的圖,路徑的數量大約爲N!這是很多。既然你需要所有這些,你的程序會變得很慢(特別是如果你用完ram並需要將東西交換到磁盤)。

如果你像在代碼中那樣限制最大總重量,假設所有權重都是1,那麼你仍然運行在O(權重)中,我假設你設置爲一個很大的值,因爲圖形很大。

你需要弄清楚你是否真的需要所有這些路徑。

如果您正在尋找最短路徑使用Dijkstra或尋找最短路徑的東西。

+0

詳細說明「Dijkstra什麼的」http://cs.stackexchange.com/questions/2942/am-i-right-about-the-differences-between-floyd-warshall-dijkstra-and-bellman-fo – Matsmath

+0

@ Sorin不,我需要兩個節點之間的所有路徑(沒有周期)。我不需要找到最短路徑,我需要找到total_weight <確定值的路徑 – Andrei

相關問題