在为不相关的内容绘制图表时,我遇到了以下算法问题:
我们有一个二分图的平面绘图,其中不相交的集合排列在列中,如图所示。我们如何重新排列每列中的节点,以便最小化边缘交叉的数量?我知道这个问题对于一般图形来说是NP难的(link),但考虑到图是二分的,是否有一些技巧?
作为后续行动,如果有第三列 w ,只有 v 的边缘怎么办?还是进一步?
答案 0 :(得分:8)
论文On the one-sided crossing minimization in a bipartite graph with large degrees by Hiroshi Nagamochi 提到Garey和。的交叉号码的原始论文 约翰逊还证明了最小化边缘交叉的数量 二分图是NP难的。事实上,它仍然是NP难的 即使您被告知一列的最佳订单:
给出二分图,2层图包括放置节点 在第一个节点中,在直线L1上设置V并将节点放置在 第二节点在平行线L2上设置W.最小化的问题 首先是2层图纸中弧线之间的交叉数量 由Harary和Schwenk介绍。单边交叉最小化 问题要求找到V中节点的排序,以便放置在L1上 电弧交叉的数量最小化(而顺序为 给出并固定了L2上W中的节点。问题的应用 可以在VLSI布局和分层图纸中找到。
然而,双面和单侧问题显示为NP难 分别是Garey和Johnson以及Eades和Wormald。
答案 1 :(得分:4)
Peter de Rivaz指出它是NP-Hard,但如果你对某些近似值很好,你可以选择以下解决方案。
我最初的想法是使用一些基于力的算法进行图形布局,但实现起来可能有点繁琐。但是,嘿,有这个精彩的节目graphviz.org,可以让整个工作为你服务。
安装完成后,只需用图表准备一个文件:
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
并为免费获取类似内容: - ):