简体   繁体   English

使用python生成器的图形上的DFS

[英]DFS on a graph using a python generator

I am using a generator to do a full search on a graph, the real data set is fairly large, here is a portion of the code i wrote on a small data set: 我正在使用生成器在图形上进行全面搜索,实际数据集相当大,这是我在小型数据集上编写的部分代码:



class dfs:
    def __init__(self):
        self.start_nodes = [1,2]  # not used, see below explanation
        self.end_nodes = [5,7] # not used, see below explanation
    _graph={
        1 : [4,5,6,2],
        2 : [1,3,5],
        4 : [1,5],
        3 : [5,2],
        5 : [3,1,4,6,2,7],
        6 : [1,5],
        7 : [5],
    }

    def __iter__(self):
        return self.find_path(self._graph, 2, 7)

    def find_path(self, graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            yield path
        if not graph.has_key(start):
            return
        for node in graph[start]:
            if node not in path:
                for new_path in self.find_path(graph, node, end, path):
                    if new_path:
                        yield new_path


d = dfs()
print list(d)

when run this outputs all the paths from '2' to '7' as expected: 运行时,将按预期输出从“ 2”到“ 7”的所有路径:

[[2, 1, 4, 5, 7], [2, 1, 5, 7], [2, 1, 6, 5, 7], [2, 3, 5, 7], [2, 5, 7]]

What I would like to do is modify this generator so that it does the same thing except i get the paths back for a set number of start and end points, ie self.start_nodes and self.end_nodes. 我想做的就是修改此生成器,以使其执行相同的操作,除了我将返回一定数量的起点和终点的路径,即self.start_nodes和self.end_nodes。

Since my generator is a recursive function it makes it difficult to loop on the different start and end points, been scratching my head over this any ideas? 由于我的生成器是一个递归函数,因此很难在不同的起点和终点循环,这让我无所适从吗?

Perhaps I'm misunderstanding your question, but it seems to me that you want to replace your __iter__ function with something like this: 也许我误会了您的问题,但是在我看来,您想用以下内容替换__iter__函数:

def __iter__(self):
    for start in self.start_nodes:
        for end in self.end_nodes:
            for path in self.find_path(self._graph, start, end):
                yield path

You can find more information about generators in this question . 您可以在此问题中找到有关生成器的更多信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM