Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm DAG是否有二维布局算法,允许固定一个轴上的位置?_Algorithm_Directed Acyclic Graphs - Fatal编程技术网

Algorithm 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之

我有一个大约3.300个顶点的DAG,它可以通过
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
中找到了如何进行拓扑排序的方法,但实际上不知道如何按拓扑排序的顺序进行绘制,就像您答案中的那样。你能给我一些提示吗?