Я работаю над редактором диаграмм. Диаграммы отображают 2D фигуры ( узлы ), связанные с соединителями ( ребрами ).
Я хотел бы добавить операцию, которая, учитывая выбор узлов, «распутывает» их: она перемещает их, чтобы уменьшить количество пересекающихся ребер, если это возможно (и это нормально, если ребра должны быть нарисованы с точками изгиба) ,
Поэтому мне нужен алгоритм графа, который, учитывая ( топологическое ) вложение графа и подмножество его узлов, изменяет вложение (его топологию ) только на этих узлах, чтобы минимизировать количество пересекающихся ребер.
Читая о графиках вершин и просматривая Cabello и Mohar (2013) , я полагаю, что эта проблема является NP-сложной. Поэтому я буду доволен параметризованным алгоритмом (например, по количеству пересекающихся ребер), который имеет известную полиномиальную временную сложность для любого заданного значения параметра. Это кажется возможным, но мне нелегко придумать такой алгоритм самостоятельно.
Вопросов:
- Где мне искать такой алгоритм?
- Это существует?
- В существующем программном обеспечении?
- Есть ли значительный практический опыт такой операции? (То, что хорошо выглядит в теории, может быть не очень хорошо на практике, или наоборот.)
(Я не уверен, где лучше задать этот вопрос: здесь, в StackOverflow или MathOverflow?)
источник
Ответы:
Проблема, поставленная в вопросе, на самом деле сложнее и сложнее, чем выше. Вы рассматриваете узлы графа определенного размера и формы, а также ограничивает размер (область) результата. Кроме того, еще не определено понятие эстетики. Очевидно, что для этого нам нужна эвристика, которая не использует абсолютный минимум в общем случае. Число узлов, встречающихся в таком приложении, вероятно, невелико в среднем случае. Рисование минимальной версии пересечения края графика может быть осуществимо для небольших размеров.
Ресурсы:
Вас могут заинтересовать следующие ресурсы, особенно первые:
Он имеет множество других функций, которые могут оказаться полезными. Исходный код находится на их сайте под EPL. Он также включает страницу, посвященную теории визуализации графа.
Вычисление пересекающихся чисел за квадратичное время»
сохранение отношений близости и минимизация пересечений краев в графических вложениях
Алгоритм для задачи о пересечении графов
Есть также много других ресурсов. Это должно помочь вам начать.
Дополнительные мысли и наблюдения:
Вот идея, чтобы обойти вопросы, касающиеся формы и размера узлов. Учитывая график (бесконечно малые узлы), расширяйте каждый узел, одновременно «выталкивая» или сгибая края (например, используя сплайны, применяя ограничение на близость). Вы должны сделать это с другими ребрами и узлами, которые мешают этому, что может запустить цепную реакцию. Посмотрите, как эффективно вычислять равновесия (например, молекулярные структуры). Если вы не можете получить форму узла до нужного размера, масштабируйте всю диаграмму.
Пользователь может наслаждаться результатами рандомизированного алгоритма. Они могут использовать вашу функцию несколько раз, пока не получат то, что им нравится. В этом случае избегайте избыточных вычислений (нет необходимости снова вычислять число пересечения).
источник