Python - Структура данных графика - Как реализовать поиск в ширину, чтобы правильно найти достижимые вершины

1

В Python у меня есть класс Graph, который имеет словарь объектов вершин. Каждый объект вершины имеет словарь ребер (состоящий из начального node, заканчивающегося node и веса... представьте конец стрелки, указывающий на другой node, с номером стоимости поездки, присвоенным она).

С этими классами я рисую графику - ну, график - на время, которое требуется для самолётов, летающих из города в город. Из этого графика я должен определить кратчайший путь (самый быстрый путь) между двумя узлами с использованием алгоритма Дейкстры. Я также должен определить все вершины, доступные из начальной вершины.

Я могу добавлять ребра и удалять ребра (и, следовательно, добавлять узлы) в Graph. Однако, для жизни меня, я не могу представить простой способ реализовать алгоритм Дейкстры или Поиск по ширине (для определения достижимых вершин) с использованием созданных мной структур данных.

Если кто-то может предложить, что мне нужно сделать, чтобы изменить или реализовать эти алгоритмы, чтобы они работали правильно, я был бы очень признателен за любую помощь. Это домашнее задание, над которым я работаю почти неделю, много часов в день, и я просто не могу пройти мимо этой стены. Опять же, я был бы признателен за любые советы или помощь. Я не ожидал, что кто-нибудь напишет код для меня, но псевдокод поможет (и применяет его - копирование и вставка псевдокода из Википедии не поможет мне, поскольку я уже был там).

  • 0
    Вы смотрели на простое описание в верхней части en.wikipedia.org/wiki/Dijkstra's_algorithm , верно?
  • 0
    Пожалуйста, отформатируйте код, чтобы он был более читабельным. Спасибо
Теги:
graph
breadth-first-search

1 ответ

1
Лучший ответ

Ваш код слишком сложный.

Начните с кода, который просто реализует основы и постепенно добавляет функции. Чтобы начать работу, я поставил что-то простое, но фундаментальное при обработке графиков.

from collections import deque

class fringe(object):
    def __init__(self, kind= 'stack'):
        f= deque()
        self._p= f.append if kind is 'stack' else f.appendleft
        self._f= f

    def __call__(self, item):
        self._p(item)
        return self

    def __iter__(self):
        while len(self._f):
            item= self._f.pop()
            yield item

    def __repr__(self):
        return self._f.__repr__().replace('deque', 'fringe')

def paths(G, start, terminal, F= fringe()):
    for node, path in F((start, [start])):
        for node in G[node]:
            if node is terminal:
                yield path+ [terminal]
            elif node not in path:
                F((node, path+ [node]))

и тест:

if __name__ == '__main__':
    a, b, c, d, e, f= 'A', 'B', 'C', 'D', 'E', 'F'
    G= {a: [b, c], b: [c, d], c: [d], d: [c], e: [f], f: [c]}
    print 'All paths from:', a, 'to:', d
    print 'BFS'
    for path in paths(G, a, d): print path
    print 'DFS'
    for path in paths(G, a, d, fringe('queue')): print path

run будет выдавать:

All paths from: A to: D
BFS
['A', 'C', 'D']
['A', 'B', 'D']
['A', 'B', 'C', 'D']
DFS
['A', 'B', 'D']
['A', 'C', 'D']
['A', 'B', 'C', 'D']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню