我正在使用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)
这意味着如果我想穿鞋,我已经需要穿袜子,也要穿裤子。并扩展为内裤(裤子的依赖性)。
我现在想要一个带有“模块”的函数,并以我必须先运行的正确顺序返回所有其他模块。
示例:
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']
所以,如果我想穿袜子,这会让我先穿上衬衫,毛衣和外套(即使它们是可选的,但没有依赖性)。
答案 0 :(得分:1)
查看深度优先搜索算法
答案 1 :(得分:1)
我认为DFS方法可以完成任务。算法如下:
FindDependencies( module ) {
ans = []
for d in dependencies[module] {
ans = append(ans, FindDependencies(d))
}
ans = append(ans, module)
return ans
}