2016-11-29 4 views
2

Я нахожу кратчайший путь с помощью BFS, я получаю это RecursionError: maximum recursion depth exceeded in comparison очень быстро, любое предложение о том, как избежать его с помощью генераторов? Или сделать его итеративным является единственным хорошим вариантом?Как избежать максимальной глубины рекурсии в python с генераторами?

код ниже:

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

def shortest_path(graph, start, goal): 
    try: 
     return next(bfs_paths(graph, start, goal)) 
    except StopIteration: 
     return None 

Пример использования:

graph = {'A': set(['B', 'C']), 
     'B': set(['A', 'D', 'E']), 
     'C': set(['A', 'F']), 
     'D': set(['B']), 
     'E': set(['B', 'F']), 
     'F': set(['C', 'E'])} 

shortest_path(graph, 'A', 'F') # ['A', 'C', 'F'] 
+0

Нет, я говорю об использовании генераторов для их обработки. И это пример. Я использую следующий генератор, и все же я достигаю максимальной глубины. –

+0

Если вы получаете эту ошибку с небольшими графами (например, ваш образец), у вас есть логическая ошибка, а не ограничение ресурсов. Если граф не имеет более тысячи узлов, это не должно быть проблемой. –

+0

Ваша точная программа работает на моей машине просто отлично – Navidad20

ответ

2

Попробуйте это. Он включает посещенный набор. Я также изменил имя переменной «next» на «node», поскольку это встроенная функция

def bfs_paths(graph, start, goal): 
    visited = set() 
    queue = [(start, [start])] 
    while queue: 
     vertex, path = queue.pop(0) 
     visited.add(vertex) 
     for node in graph[vertex]: 
      if node in visited: 
       continue 
      elif node == goal: 
       yield path + [node] 
      else: 
       queue.append((node, path + [node])) 

def shortest_path(graph, start, goal): 
    try: 
     return next(bfs_paths(graph, start, goal)) 
    except StopIteration: 
     return None 
+0

Спасибо за попытку. Тем не менее, я по-прежнему получаю ту же ошибку при достижении максимальной глубины рекурсии. –

+0

Если бы вы предоставили некоторые примеры данных, которые показывают вашу ошибку, я думаю, что это поможет вам найти решение. – Navidad20

+0

Хорошо, я создаю репозиторий github. Дайте мне 5 минут. –

 Смежные вопросы

  • Нет связанных вопросов^_^