2017-11-29 6 views
-1

これは、ルーマニアの都市をナビゲートするpythonの検索アルゴリズムです。未定義のエラーが発生し続けるのはなぜですか?

class GraphTree: 

    graph = { 
    'Oradea': set(['Zerind','Sibiu']), 
    'Zerind': set(['Arad','Oradea']), 
    'Sibiu': set(['Arad','Rimnicu Vilcea','Fagaras','Oradea']), 
    'Arad': set(['Timisoara','Zerind','Sibiu']), 
    'Timisoara': set(['Lugoj']), 
    'Lugoj': set(['Mehadia']), 
    'Mehadia': set(['Drobeta']), 
    'Drobeta': set(['Craiova']), 
    'Rimnicu Vilcea': set(['Craiova','Pitesti','Sibiu']), 
    'Craiova': set(['Drobeta','Rimnicu Vilcea']), 
    'Fagaras': set(['Bucharest','Sibiu']), 
    'Pitesti': set(['Bucharest','Rimnicu Vilcea']), 
    'Bucharest': set(['Giurgiu','Urziceni','Pitesti','Fagaras']), 
    'Giurgiu': set(['Bucharest']), 
    'Urziceni': set(['Hirsova','Vaslui','Bucharest']), 
    'Hirsova': set(['Eforia','Urziceni']), 
    'Eforia': set(['Hirsova']), 
    'Vaslui': set(['Iasi','Urziceni']), 
    'Iasi': set(['Neamt','Vaslui']), 
    'Neamt': set(['Iasi'])} 

def bfs(graph, start, end): 
    queue = [(start, [start])] 
    while queue: 
     (vertex, path) = queue.pop(0) 
     for next in graph[vertex] - set(path): 
      if next == end: 
       yield path + [next] 
      else: 
       queue.append((next, path + [next]))   

def dfs(graph, start, goal): 
    queue = [] 
    queue.append([start]) 
    while queue: 
     path = queue.pop(0) 
     node = path[-1] 
     if node == end: 
      return path 
     for adjacent in graph.get(node,[]): 
      new_path = list(path) 
      new_path.append(adjacent) 
      queue.append(new_path) 

print('bfs') 
bfs(graph, 'Oradea', 'Neamt') 
print('dfs') 
dfs(graph, 'Oradea', 'Neamt') 

私はアルゴリズムを実行したときに、私はこのエラーを取得しておいてください。

---> 1 class GraphTree: 
     2 
     3  graph = { 
     4   'Oradea': set(['Zerind','Sibiu']), 
     5   'Zerind': set(['Arad','Oradea']), 

でもう1: 49 BFS(グラフ、 'オラデア'、 'ネアムツ') 50プリント( 'DFS' ) - > 51のDFS(グラフ、 'オラデア'、 'ネアムツ')

そして最後:

39    path = queue.pop(0) 
40    node = path[-1] 

- > 41であればノード==終了:graph.getに隣接するため 42リターンパス 43(ノード、[]):

NameError: name 'end' is not defined

アルゴリズムが条件と宣言OKと論理的に正しいと思われます。 この検索アルゴリズムが機能しないのはなぜですか?

The algorithm should be able to navigate the map going from one city to the other and returning the path using both breadth first (bfs) and depth first (dfs) searches.

+2

は、このメソッドでは最後に定義されていますか? –

+2

完全なエラーメッセージ(コンパイラによって与えられる)、関連する行番号などを提供してください。これにより、StackOverflowユーザーがあなたを助けやすくなります。また、場合によっては、自分でその行を検査することで、すぐに問題を認識するのに役立ちます。 –

+1

'dfs()'パラメータで 'end'の代わりに' goal'という名前を使用しましたが、 'if node == end:'にしようとしました。 –

答えて

1

あなたはあなたのコードに

bfs(graph, start, end) 

dfs(graph, start, goal) 
        ^^^^ 

他のいくつかのノートを持っていた:あなたの検索の結果をプリントアウトしていない

  • が、あなたはそれをやろうと思っていたようです。
  • あなたはクラスですべてをラップしましたが、実際に必要としたコードでは何もしませんでした。念頭に置いてこのすべてで

、ここでは別のバージョンです:

graph = {                                                   
    'Oradea': set(['Zerind','Sibiu']),                                            
    'Zerind': set(['Arad','Oradea']),                                            
    'Sibiu': set(['Arad','Rimnicu Vilcea','Fagaras','Oradea']),                                      
    'Arad': set(['Timisoara','Zerind','Sibiu']),                                         
    'Timisoara': set(['Lugoj']),                                             
    'Lugoj': set(['Mehadia']),                                              
    'Mehadia': set(['Drobeta']),                                             
    'Drobeta': set(['Craiova']),                                             
    'Rimnicu Vilcea': set(['Craiova','Pitesti','Sibiu']),                                       
    'Craiova': set(['Drobeta','Rimnicu Vilcea']),                                         
    'Fagaras': set(['Bucharest','Sibiu']),                                           
    'Pitesti': set(['Bucharest','Rimnicu Vilcea']),                                         
    'Bucharest': set(['Giurgiu','Urziceni','Pitesti','Fagaras']),                                     
    'Giurgiu': set(['Bucharest']),                                             
    'Urziceni': set(['Hirsova','Vaslui','Bucharest']),                                        
    'Hirsova': set(['Eforia','Urziceni']),                                           
    'Eforia': set(['Hirsova']),                                              
    'Vaslui': set(['Iasi','Urziceni']),                                            
    'Iasi': set(['Neamt','Vaslui']),                                            
    'Neamt': set(['Iasi'])}                                               

def bfs(graph, start, end):                                               
    queue = [(start, [start])]                                              
    while queue:                                                 
     (vertex, path) = queue.pop(0)                                            
     for next in graph[vertex] - set(path):                                          
      if next == end:                                               
       yield path + [next]                                             
      else:                                                 
       queue.append((next, path + [next]))                                         

def dfs(graph, start, end):                                               
    queue = []                                                  
    queue.append([start])                                               
    while queue:                                                 
     path = queue.pop(0)                                               
     node = path[-1]                                                
     if node == end:                                                
      return path                                                
     for adjacent in graph.get(node,[]):                                           
      new_path = list(path)                                             
      new_path.append(adjacent)                                            
      queue.append(new_path)                                             

print('bfs')                                                  
print(list(bfs(graph, 'Oradea', 'Neamt')))                                           
print('dfs')                                                  
print(dfs(graph, 'Oradea', 'Neamt'))  

私はこれを実行すると、出力は次のとおりです。 `場所:`かのノード==最後に

bfs 
[['Oradea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Sibiu', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Sibiu', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Sibiu', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt']] 
dfs 
['Oradea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'] 
+0

ありがとうございます...それは動作します...すべてのノードを印刷するので、私のメソッドを編集する必要があります。 –

+1

@ThabisoMotswagole:例を実行したときに出力を追加しました。あなたの具体的な質問は何ですか? _really_がコード内で何が起こっているか把握してみてください。それをきれいにする。紙の上でそれを実行します。 –

+0

私はそれをしますありがとう –

関連する問題