В Python у меня есть класс Graph, который имеет словарь объектов вершин. Каждый объект вершины имеет словарь ребер (состоящий из начального node, заканчивающегося node и веса... представьте конец стрелки, указывающий на другой node, с номером стоимости поездки, присвоенным она).
С этими классами я рисую графику - ну, график - на время, которое требуется для самолётов, летающих из города в город. Из этого графика я должен определить кратчайший путь (самый быстрый путь) между двумя узлами с использованием алгоритма Дейкстры. Я также должен определить все вершины, доступные из начальной вершины.
Я могу добавлять ребра и удалять ребра (и, следовательно, добавлять узлы) в Graph. Однако, для жизни меня, я не могу представить простой способ реализовать алгоритм Дейкстры или Поиск по ширине (для определения достижимых вершин) с использованием созданных мной структур данных.
Если кто-то может предложить, что мне нужно сделать, чтобы изменить или реализовать эти алгоритмы, чтобы они работали правильно, я был бы очень признателен за любую помощь. Это домашнее задание, над которым я работаю почти неделю, много часов в день, и я просто не могу пройти мимо этой стены. Опять же, я был бы признателен за любые советы или помощь. Я не ожидал, что кто-нибудь напишет код для меня, но псевдокод поможет (и применяет его - копирование и вставка псевдокода из Википедии не поможет мне, поскольку я уже был там).
Ваш код слишком сложный.
Начните с кода, который просто реализует основы и постепенно добавляет функции. Чтобы начать работу, я поставил что-то простое, но фундаментальное при обработке графиков.
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']