如果你看这个DAG(有向无环图):
我想创建一个dict,该dict将从最低节点到所有其他节点的距离映射到渲染图中每个节点距离底部的x位置(高度)。 对于给定的图形,它将是:
distance_nodes_map: {
0: {'base-zero', 'base-one'},
1: {'low-b', 'low-a', 'low-c'},
3: {'high-x', 'high-z', 'high-y'},
2: {'mid-r', 'mid-q', 'mid-p'},
4: {'super'}
}
我写了一个算法,对上面的图有效,但后来我测试了另一个图,它不再有效了。我尝试了一些算法和函数,比如最短路径或距离的子体,但我认为它们对计算距离没有帮助
我的算法不适用于此图:
https://gist.github.com/timaschew/3b08a07243fa6f43773014ef5e705c96
以下是要点,包括:
您正在寻找一种绘制分层图的算法。有许多不同的算法,您应该选择最适合您需要的算法(例如,看看下面的论文A Technique for Drawing Directed Graphs,作者是Gansner等人。)
其中许多算法已经在Graphviz(一个非常著名和强大的图形可视化软件)中实现。一旦安装了它,就可以非常简单地计算您要查找的结果(
G
是使用networkx.DiGraph
构建的有向无环图):下面是几个使用您提供的数据的示例:
未经测试的伪代码,因为我的午休时间快结束了:
您有一个多根树,其中有一个选定的主根
对于每个根,创建一个子图,其中包含该根的所有可访问节点
从主根(根a)开始,计算对应子图a中所有节点到根的距离/最短路径长度
查找与主子图至少共享一个节点的所有子图,并选择与主根距离最小的节点(节点x)所在的子图(子图B)
计算子图b中所有节点到根b的距离。添加距离d(节点x,根a)。减去距离d(节点x,根b)
创建子图A和B的并集。重复步骤3-5,直到没有根为止
减去最大距离&;反转符号,使主根具有最大的距离/顺序值
编辑:
我的伪代码有效(*)。我责备用户的错误。;-)
收益率:
(*)“减去距离d(节点x,根b)”自然意味着节点x和根b之间的最长路径长度。很明显
相关问题 更多 >
编程相关推荐