Algorithm DAG是否有二维布局算法,允许固定一个轴上的位置?
我有一个大约3.300个顶点的DAG,它可以通过Algorithm DAG是否有二维布局算法,允许固定一个轴上的位置?,algorithm,directed-acyclic-graphs,Algorithm,Directed Acyclic Graphs,我有一个大约3.300个顶点的DAG,它可以通过dot作为一个或多或少简单的树来非常成功地进行布局(事情变得复杂,因为顶点可以有一个以上的前级,所以交叉非常频繁)。图中的每个顶点都是在原始过程中的特定时间出现的,我希望布局中有一个轴来表示时间:像a->v,b->v这样的边关系意味着a和b是在v之前的特定时间出现的 是否有一种DAG布局算法,允许我指定一个轴上的位置(或至少距离),并在另一个轴上提出关于边缘交叉的最佳布局?您可以利用该算法对顶点进行排序,以便对每个边进行排序x->y,顶点x位于y之
dot
作为一个或多或少简单的树来非常成功地进行布局(事情变得复杂,因为顶点可以有一个以上的前级,所以交叉非常频繁)。图中的每个顶点都是在原始过程中的特定时间出现的,我希望布局中有一个轴来表示时间:像a->v,b->v
这样的边关系意味着a
和b
是在v
之前的特定时间出现的
是否有一种DAG布局算法,允许我指定一个轴上的位置(或至少距离),并在另一个轴上提出关于边缘交叉的最佳布局?您可以利用该算法对顶点进行排序,以便对每个边进行排序x->y
,顶点x
位于y
之前
因此,如果你有a->v,b->v
,你会得到类似a,b,v
或b,a,v
的东西
使用此选项,您可以轻松地表示DAG
s,如下所示:
如果我理解正确,那么您希望最小化图形布局中的交叉边数量。如果是,那么答案是“否”,因为这个问题在一般情况下被证明是NP完全问题。参见“交叉数是NP完全的,Garey,Johnson”
如果您需要一个不是最佳的但只是足够好的解决方案,那么有多篇关于此主题的文章,因为它与电路布局密切相关。也许谷歌搜索“交叉数启发法”和浏览一些论文的摘要比我盲目猜测你的要求更能解决你的任务。是的,正如@Arturo Menchaca所说,拓扑排序可能有助于减少边的重叠计数。但这可能不是最优的。目前还没有很好的边缘交叉最小化算法。交叉最小化问题是NP完全问题。启发式算法被用于解决这个问题 此StackOverflow链接可帮助您: 我想你们的问题和一种美观的图形布局方式有关。文章中介绍了一些启发式方法。可能是关于平面图或几乎平面图的信息也可以帮助您 Wiki页面中介绍了检查和绘制平面图的一些算法回顾。以StackOverflow问题为例,介绍了平面图形绘制的库和算法。本文作者使用遗传算法绘制直线网格 文章中给出了几乎平面图的良好描述
尝试使用单轴对齐的条件修改原始算法 人力资源部,我自己应该想到的。。。虽然这种方法非常简单且易于实现:是否有实际证据表明,对于任何DAG的边交叉,结果都是最优的?我已经在
networkx
中找到了如何进行拓扑排序的方法,但实际上不知道如何按拓扑排序的顺序进行绘制,就像您答案中的那样。你能给我一些提示吗?