2016-03-28 23 views
0

İki taraflı ağırlıklı bir grafiğim var (tam olarak bir atama problemi) ve en ucuz yol/seçimi bulmak istiyorum. Yolu başarmak için DFS veya Greedy BFS'yi nasıl uygulayacağımı biliyor musunuz?İki taraflı ağırlıklı bir grafikte en ucuz yol DFS/Açgözlü BFS

Bir adiacency listesi olarak temsil grafiği var (ya da ben en iyisi olacağını düşünüyorum) ne istiyorum mümkün mü bu ve DFS algoritması

adjlist = {"A": ["W", "X"], 
      "B": ["W", "X", "Y", "Z"], 
      "C": ["Y", "Z"], 
      "D": ["W", "X", "Y", "Z"], 
      "W": ["A", "B", "D"], 
      "X": ["A", "B", "D"], 
      "Y": ["B", "C", "D"], 
      "Z": ["B", "C", "D"] } 

def dfser(graph, root): 
    visited =[] 
    stack = [root, ] 

    while stack: 
     node = stack.pop() 
     if node not in visited: 
      visited.append(node) 
      stack.extend([x for x in graph[node] if x not in visited]) 
    return visited 

gibi? Sonuç şöyle olmalıdır: AWBXCYDZ veya en ucuz toplamı olan bir şey.

Ya da tüm olası geçişleri kökünden alabilir miyim? Bu DFS sadece bana bir tane verir ama ben tüm olası tranversalları istiyorum istiyorum

+0

Bu ödev mi:

networkx modül bipartite graphs ve ilgili algoritmalar uygular? Eğer değilse, bu algoritmaların çoğunu uygulayan 'networkx' modülüne bakabilirsiniz. Ne denediğinizi ve özellikle neler yaptığınızı gösterirseniz daha fazla yardım alırsınız. – AChampion

cevap

0

BFS veya DFS özellikle ağırlıklı grafikte en kısa yol arama için tasarlanmamıştır.

En ucuz yolu bulmak dijkstra veya A* algoritmaları ile gerçekleştirilebilir. Networkx, bu görev için bir full API sağlar.

Dicti = {"A": {"W": 2, "X": 2}, 
    "B": {"W": 4, "X": 3, "Y": 2, "Z": 5}, 
    "C": {"Y": 2, "Z": 2}, 
    "D": {"W": 5, "X": 5, "Y": 4, "Z": 3}, 
    "W": {"A": 2, "B": 4, "D": 5}, 
    "X": {"A": 2, "B": 3, "D": 5}, 
    "Y": {"B": 2, "C": 2, "D": 4}, 
    "Z": {"B": 5, "C": 2, "D": 3} 
} 

graph = nx.Graph() 
for node, succs in Dicti.items(): 
    for succ, weight in succs: 
     graph.add_edge(node, succ, weight=weight) 

print(nx.dijkstra_path(graph, 'A', 'Z')) # here is Dijkstra 
+0

Yea ancak DFS veya açgözlü BFS ile çözülmesinin mümkün olup olmadığını bilmek istedim? Dijkstra ve A * bana gerçekten yardımcı olamaz – Mocktheduck

+0

[En İyi İlk Arama] (https://en.wikipedia.org/wiki/Best-first_search) sorunu çözebilir, ancak bir sezgisel, sonuç potansiyel olarak olabilir optimal değil. – aluriak

+0

A * algoritmasının, * en iyi * düğümün daha yakın olduğu En İyi İlk Arama özel bir durumu olduğunu unutmayın. – aluriak