Python - 图形数据结构 - 如何实现广度优先搜索以正确查找可访问的顶点

时间:2011-05-11 07:23:21

标签: python graph breadth-first-search

在Python中,我有一个Graph类,它有一个顶点对象的字典。每个顶点对象都有一个边缘字典(由起始节点,结束节点和权重组成......想象指向另一个节点的箭头的末尾,并指定了成本 - 行程编号)。

通过这些课程,我可以绘制飞机从一个城市飞到另一个城市的时间图表 - 好吧,一个图表。从这张图中,我应该使用Dijkstra算法确定两个节点之间的最短路径(最快路径)。我也应该确定从起始顶点可以到达的所有顶点。

我能够在图表中完美地添加边缘和删除边缘(并因此添加节点)。 然而,对于我的生活,我似乎无法找到一种简单的方法来实现Dijkstra算法或广度优先搜索(以确定可到达的顶点)使用我创建的数据结构。

如果有人可以建议我需要做些什么来改变或实施这些算法以使它们正常工作,我将非常感谢任何帮助。这个一个家庭作业,我已经工作了将近一个星期,每天很多小时,我似乎无法通过这面墙。再次,我将不胜感激任何建议或帮助。我不希望任何人为我编写代码,但伪代码会有所帮助(并应用它 - 从维基百科复制和粘贴伪代码不会帮助我,因为我已经在那里)。

1 个答案:

答案 0 :(得分: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

运行会产生:

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']