如何解决模块依赖关系的DAG?

时间:2018-11-05 12:22:44

标签: python algorithm networkx directed-acyclic-graphs

我正在使用networkx构建一个DAG,以表示多个模块之间的依赖关系。

考虑服装“模块”之间的依赖性:

import networkx as nx
dependencies = {
    'underpants': [],
    'socks': [],
    'pants': ['underpants'],
    'shirt': [],
    'sweater': ['shirt'],
    'coat': ['shirt', 'sweater'],
    'shoes': ['socks', 'pants']
}
modules = dependencies.keys()

G = nx.DiGraph()

for mod in modules:
    G.add_node(mod)

for mod, deps in dependencies.items():
    for dep in deps:
        G.add_edge(mod, dep)

nx.draw_networkx(G)

enter image description here

这意味着如果我想穿鞋,我已经需要穿袜子,也要穿裤子。并扩展为内裤(裤子的依赖性)。

我现在想要一个带有“模块”的函数,并以我必须先运行的正确顺序返回所有其他模块。

示例:

prerequisites("pants") == ["underpants"]
prerequisites("underpants") == []
prerequisites("shoes") == ["underpants", "pants", "socks"]  # or: ["socks", "underpants", "pants"] would also work.

我确定这个问题确实存在,我只是不知道它的算法/函数名称,对吧?

我认为通过list(nx.topological_sort(G))获得的拓扑顺序几乎是我想要的。但是,在这种情况下,它将返回

['shirt', 'sweater', 'coat', 'socks', 'underpants', 'pants', 'shoes']

所以,如果我想穿袜子,这会让我先穿上衬衫,毛衣和外套(即使它们是可选的,但没有依赖性)。

2 个答案:

答案 0 :(得分:1)

查看深度优先搜索算法

答案 1 :(得分:1)

我认为DFS方法可以完成任务。算法如下:

FindDependencies( module ) {
    ans = []
    for d in dependencies[module] {
        ans = append(ans, FindDependencies(d))
    }
    ans = append(ans, module)
    return ans
}