LINUX.ORG.RU

алгоритм на связи вершин в графах


0

3

попутно своей разработки алгоритма решил задать вопрос ЛОРу, а потом сравнить.

Предположим, есть 2 графа. В каждом графе есть вершины и связи.

Вершина - [a,b,c...], является идентификатором вершины.
Связь - Вершина(i,...) --- Вешины(j,...), описывает связь 2х вершин через коннекторы i,j.

Сравниваем 2 графа, в которых есть точное соответствие между вершинами. Необходимо выбрать наиболее подходящие связи между этими вершинами.

вот пример, где a~a, b~b, c~c

a-(1)---(2)-b
 \
 (2)---(1)-c

  (2)---
 /      \
a-(3)---(1)-b
 \
 (2)---(1)-c
  
Результат:
a --- b через a(3)---(1)b
a --- c через a(2)---(1)c

★★★

Последнее исправление: pseudo-cat (всего исправлений: 2)
Ответ на: комментарий от pseudo-cat

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

anonymous
()
Ответ на: комментарий от pseudo-cat

одновременно от каждой известной вершины? Мне вот что-то в голову лучше пока тоже ничего не приходит.

anonymous
()
Ответ на: комментарий от anonymous

в моей задаче не известно заранее соответствие некоторых вершин, и одна вершина может соответствовать нескольким. Поэтому приходится сначала искать все возможные соответствия вида вершина-вершина, затем из каждого такого соответствия идти поиском в ширину(соответственно в 2х графах).

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

Также есть понятие коннекторов, их тоже приходится анализировать.

полезнее бы было

т.ч. у меня это уже решённая подзадача.

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Мда, и откуда у тебя поиск в ширину взялся, непонятно, из формулировки задачи он никак не следует. Изоморфизм подграфу тоже непонятно к чему.
Короче, выдам инфу которую знаю и завершим на этом.

0. Задача в твоей постановке не представляет никакой сложности. Если тривиальный алгоритм медленно работает (сотни коннекторов при вершине?), то его можно ускорить, но ты похоже это и так сделал уже в своём алгоритме, и тебя всё устраивает.

1. Если тебе нужно искать вложение одного графа в другой, это называется «subgraph isomorphism». Алгоритм Ульмана, который тебе посоветовали, старый и медленный. Если понадобится нормальный алгоритм, гугли работу Cordella «A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs», через google scholar можно найти ссылку на PDF.

2. Если ты ищещь максимальный общий подграф двух графов, это называется maximum common subgraph. Алгоритмы его нахождения как правило сводятся к нахождению клики (clique) в т.н. product graph, составленном из изначальных двух графов. Два алгоритма изложены здесь. В англоязычной литературе они назыаются 2DOM и алгоритм Хансера. Тот, который 2DOM, является вероятностным, и немного напоминает твои попытки «склеивания» ответа из локально оптимизированных кусков.

3. Если ты говоришь о «близких по топологии» графах, то имей в виду, что критериев там может быть очень много разных, и нет какого-то универсального соглашения по поводу того, что является «близкой» топологией, а что нет. Гугли по словам graph similarity, выбирай.

4. Если ты ищешь подграф (или MCS), который как бы не совпадает с исходным графом (графами), то тебе надо искать что-то типа approximate graph matching, graph editing distance. Тут я не знаю что подсказать, т.к. в теме не разбираюсь.

5. В порядке общей рекомендации: если ты комбинаторно оптимизируешь что-либо, прочитай про alpha-beta pruning в википедии.

ringill
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.