Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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/8/lua/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 二部图中交叉数的最小化_Algorithm_Graph_Bipartite_Planar Graph - Fatal编程技术网

Algorithm 二部图中交叉数的最小化

Algorithm 二部图中交叉数的最小化,algorithm,graph,bipartite,planar-graph,Algorithm,Graph,Bipartite,Planar Graph,在为不相关的内容绘制图形时,我遇到了以下算法问题: 我们有一个二部图的平面图,不相交的集合按列排列,如图所示。我们如何重新排列每列中的节点,以使交叉边的数量最小化?我知道这个问题对于一般图()来说是NP难的,但是考虑到图是二部的,有什么技巧吗 作为后续,如果有第三列w,它只有到v的边,该怎么办?还是更进一步?这篇论文 提到Garey和 Johnson还证明了最小化边缘交叉的数量 对于二部图是NP难的。事实上,它仍然是NP难的 即使您被告知一列的最佳顺序: 给定一个二部图,2层图形由放置节点组成

在为不相关的内容绘制图形时,我遇到了以下算法问题:

我们有一个二部图的平面图,不相交的集合按列排列,如图所示。我们如何重新排列每列中的节点,以使交叉边的数量最小化?我知道这个问题对于一般图()来说是NP难的,但是考虑到图是二部的,有什么技巧吗

作为后续,如果有第三列w,它只有到v的边,该怎么办?还是更进一步?

这篇论文 提到Garey和 Johnson还证明了最小化边缘交叉的数量 对于二部图是NP难的。事实上,它仍然是NP难的 即使您被告知一列的最佳顺序:

给定一个二部图,2层图形由放置节点组成 在第一个节点集中,V位于直线L1上,并将节点放置在 平行线L2上的第二个节点集W。最小化问题 两层图形中圆弧之间的交叉数是第一个 由Harary和Schwenk介绍。单边交叉最小化 问题要求在V中查找要放置在L1 so上的节点的顺序 使弧交叉的数量最小化(同时 L2上W中的节点是给定和固定的)。问题的应用 可以在VLSI布局和层次结构图中找到

然而,双边和单边问题被证明是NP难问题 分别由Garey和Johnson以及Eades和Wormald撰写


Peter de Rivaz指出,这是NP难的,但如果你对某种近似很好,你可以使用下面的解决方案

我最初的想法是使用一些基于力的算法进行图形布局,但实现起来可能有点乏味。但是,嘿,有一个很棒的程序,可以让整个工作为你

因此,安装后,只需准备一个带有图形的文件:

graph G{
   {rank=same A B C D E}
   {rank=same F G H K I J}

    A -- F;
    A -- G;
    A -- K;
    A -- I;
    A -- H;
    A -- J;

    B -- G;

    C -- G;
    C -- J;

    D -- K;
    D -- I;
}
运行:
dot-Tpng yourgraph-o yourgraph.png

并且免费得到这样的东西:-):


您想要两列(每个子图一列)还是可以任意放置节点?您想要最佳解决方案还是近似值?(好问题顺便提一下)@arturgrzesiak节点应该仍然在两列中。我会修改这个问题,让它更清楚。两者都会有帮助。一个人类可计算的算法(即,我可以在手工绘制图形时使用的算法)会特别好。那篇论文看起来正是我想要的。谢谢