Минимизация числа пересечений в двудольном графе

следующая проблема алгоритма возникла у меня во время рисования графика для чего-то несвязанного:

enter image description here

У нас есть плоский рисунок двудольного графа с непересекающимися множествами, расположенными в Столбцах, как показано. Как мы можем переставить узлы внутри каждого столбца так, чтобы число пересечений ребер было сведено к минимуму? Я знаю, что эта проблема NP-трудна для общих графов (ссылке), но есть ли какой-то трюк, учитывая, что график двудольный?

в качестве продолжения, что делать, если есть третий столбец w, который имеет только края v? Или дальше?

2 ответов


в статье об односторонней минимизации пересечения в двудольном графе с большой степенью Хироси Nagamochi упоминает, что оригинальный документ о номере пересечения Гареем и Джонсон также доказал, что минимизация числа краевых пересечений является NP-трудным для двудольных графов. На самом деле, это все еще NP-трудной даже если вам скажут оптимальный порядок для одного столбца:

учитывая двудольный граф, двухслойный чертеж состоит из размещения узлов в первый узел устанавливает V на прямую линию L1 и размещает узлы в второй узел установлен W на параллельной линии L2. Проблема минимизации количество пересечений между дугами в двухслойном чертеже было первым представлен Харари и Швенком. Односторонняя минимизация пересечения задача просит найти упорядочение узлов в V для размещения на L1 так что количество дуговых пересечений сведено к минимуму (при упорядочении узлы в W на L2 даны и фиксированы). Применение проблемы можно найти в макетах VLSI и иерархических чертежах.

однако показано, что двусторонние и односторонние проблемы являются NP-жесткими на Гэри и Джонсон и Eades и Wormald , соответственно.


Питер де Ривас указал, что это NP-трудно, но все же, если вы в порядке с некоторым приближением, вы можете пойти со следующим решением.

моя первоначальная мысль заключалась в использовании некоторого алгоритма на основе силы для компоновки графов, но это может быть немного утомительно реализовать. Но эй, есть эта замечательная программа 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

и сделать что-то подобное для свободный : -):

enter image description here