Кратчайший непересекающийся путь для графа, вложенного в евклидову плоскость (2D)


14

Какой алгоритм вы бы использовали, чтобы найти кратчайший путь графа, который вложен в евклидову плоскость, чтобы путь не содержал каких-либо самопересечений (во вложении)?

Например, на графике ниже вы хотите перейти от . Обычно такой алгоритм, как алгоритм Дейкстры, выдает такую ​​последовательность:(0,0)(-3,2)

[(0,0)3(0,3)2(1,2)4(3,2)]=7+2.

Полный график:

введите описание изображения здесь

Кратчайший путь:

введите описание изображения здесь

Кратчайший непересекающийся путь:

введите описание изображения здесь

Однако этот путь пересекается на евклидовой плоскости, поэтому я хочу алгоритм, который дал бы мне самую короткую непересекающуюся последовательность, в этом случае:

[(0,0)3(0,3)3(0,6)5(3,2)]=11.

Этот путь длиннее самого короткого пути, но это самый короткий непересекающийся путь.

Есть ли (эффективный) алгоритм, который может это сделать?

Источники TikZ


2
Хорошая проблема! (+1). Можете ли вы сказать что-нибудь о приложении или контексте, где возникает эта проблема? Я заинтригован. (PS На отдельном примечании: очевидный выход из этой загадки - посмотреть, можете ли вы ввести новую вершину для каждой точки пересечения, т. Е. Для каждой точки, где одно ребро может пересекать другое ребро. Однако я понимаю, что для некоторых / многих приложений это может быть невозможно.)
DW

2
@DW это я переформулирую проблему злобного осла / пони Бабибу ; приложение - его эвристический алгоритм эвристического TSP, я не совсем уверен, как он намеревается его использовать, но я предполагаю, что он хочет знать, может ли он найти путь между двумя точками, когда он уже посетил несколько других (оптимальный тур по евклидовому TSP будет быть непересекающимися). И да, если вы можете ввести новые узлы, это было бы замечательно, но вопрос в том, можете ли вы это сделать (и, конечно, вы не можете ввести новые города для евклидовой TSP).
Реал Слав

1
Позвольте мне попытаться преобразовать проблему существования пути в 3SAT. Создание способа пересечь два сигнала, не пересекая два пути, кажется самой большой проблемой.
Джон Дворак

1
Ага. Я имел в виду решение SAT через это.
Джон Дворак

2
N

Ответы:


11

Это NP-полный, чтобы даже решить, существует ли какой-либо путь.

Очевидно, что любой указанный путь является допустимым путем в данном графе. Таким образом, задача с ограниченной длиной находится в NP, как и ее подмножество, задача произвольного пути.

Теперь, чтобы доказать NP-трудность проблемы произвольного пути (и, следовательно, проблемы ограниченной длины), давайте сведем SAT-CNF к этой проблеме:


Глобальная структура - это сетка кусочков проволоки, к которой примыкает столбец кусочков предложения. Логическая формула выполнима тогда и только тогда, когда существует непересекающийся путь через граф.

Невозможно пересечь две части пути, но необходимо пересечь два логических провода. Скорее, путь прохождения строго задан: точка соединения задается двумя узлами. Последовательность точек проводов, через которые проходит путь, вызвана сокращением. Логика представлена ​​тем, какой узел выбран. Любой путь можно выбрать, если он проходит через все точки проводов.

На этой диаграмме путь представлен красной кривой, а логический поток представлен черными проводами:

сетка проводов слева, столбец кусочков пункта справа.

Теперь давайте создадим каждый компонент.


В проводке используются три элемента: пересечение, точка разветвления и вертикальный провод. Давайте начнем с самого сложного:

Основная идея, лежащая в основе пересечения, состоит в том, чтобы подготовить путь для каждой пары точек проводов и изогнуть возможные пути так, чтобы все пары, кроме тех, которые кодируют одну и ту же логику (совместимые пути), пересекались друг с другом. Конечно, мы не можем просто сказать, что два параллельных ребра пересекаются, но мы можем ввести дополнительные узлы порядка 2, чтобы два пути пересекались.

Предположим, что пути идут с севера на запад и с юга на восток, мы можем: собрать каждую линию с севера с ее совместимым путем с востока на линию (некоторые несовместимые пути будут пересекаться друг с другом); скрестите каждую пару друг с другом, изменив порядок пар; распределите пути к их южным и западным конечным точкам. Это лучше всего объяснить диаграммой. Здесь каждая пара узлов представляет точку соединения. Пути с одинаковым цветовым кодом (несущие одинаковую логику) не пересекаются, пути с другим цветовым кодом:

графическое изображение вышеперечисленного

Точка ветвления и вертикальный провод работают одинаково, но существует меньше путей для корреляции:

здесь достаточно двух пар путей.  Провод по сути является точкой ветвления с разрушенной ветвью

¬A¬В

введите описание изображения здесь

Это обобщение можно обобщить для кодирования произвольного дерева вентилей AND и OR, разветвляя провод чтения другим способом. В частности, как SAT-CNF, так и SAT-DNF могут быть сведены к проблеме непересекающихся путей способом, описанным выше.


Вау, молодец человек. Я еще не рассмотрел его, но работа, которую вы проделали, поразительна.
Реал Слав

Хорошо, я просто хочу обобщить свое понимание: используя первый гаджет, можно пересечь любые две пары буквальных путей и сохранить используемые пути. Следовательно, не нужно беспокоиться о планарности для разметки путей (как это делает гаджет xor в PlanarCircuitSat для цепей). Затем, используя последний гаджет, можно создавать произвольные логические предложения (больше не нужно беспокоиться о планарности). Это верно?
Реал Слав

Это кажется правильным, но вы должны обеспечить две вещи для общего макета: что вы можете включить все гаджеты с помощью пути NIP (это всегда должно быть возможно - если путь застревает в центре, вы можете ввести проводные гаджеты, чтобы свести одиночные концы пути вместе) и что все пути в считывающем проводе пересекаются друг с другом таким образом, что невозможно повернуть внутри провода (мне кажется, что это гарантировано, если нет истинных предложений ( не пересекается ни с одним литералом) и если все предложения находятся на внешней стороне схемы (на одной стороне начало и конец)).
Джон Дворжак

убедиться, что все пути в проводе считывания пересекаются друг с другом, легко - если вы хотите быть уверенным, просто разветвите n путей, а затем сразу же пересечь все. Я думаю, что это никогда не является необходимым, однако.
Джон Дворжак

1
Я использовал OpenOffice Draw для глобальной структуры и [yEd] (www.yworks.com/products/yed) для остальных. Должен ли я изменить это в (с <sub>)?
Джон Дворак

-1

проблема, кажется, датирована Тураном в 1944 году. Это похоже на хороший обзор теории и алгоритмов, «Пересекающееся число графов: теория и вычисления», выполненные Мутцелем. Википедия имеет некоторую информацию при пересечении количества графиков


1
Может быть, это лучше в качестве комментария?
Юхо

он с научной точки зрения отвечает на основной вопрос «какой алгоритм вы бы использовали»
vzn

1
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
Джон Дворжак

Ян ссылается на ссылку из стека обмена мета. в то время как это верная идея, роль цитирования в науке / математике отличается от сайта с советами по программированию .... [по общему признанию, ссылка для меня не доступна в настоящее время для более подробного ответа] .. в любом случае, вполне возможно, что-то вроде Конструкция Янса, хотя и полезна / полезна, уже есть в литературе и в науке, она является частью стандартного процесса / лучших практик, чтобы [попытаться] найти его ....
vzn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.