2013-05-10 2 views
0

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

Например, у меня есть 10 экземпляров пути между узлом A и узлом H. Девять из этих десяти экземпляров пути перемещаются через узлы c, d, e, f - но один из экземпляров проходит через c, d, z , e, f - Я хочу найти этот «нечетный» экземпляр.

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

Детали на основе комментариев:

  • Пир (путь экземпляр запись) представляет собой список узлов путешествовали через с ассоциированным временем прохождения границы на край.
  • В настоящее время необработанные записи PIR находятся в формате простой строки - очевидно, я хотел бы сохранить его по-другому в зависимости от того, как я в конечном итоге решит его проанализировать.
  • Это не маршрут решение проблема - мне больше не нужно будет найти paths; Мне нужно только проанализировать принятых путей (каждый из которых является PIR).
  • Список подпапок должен быть сгенерирован из PIR.

Примером PIR будет что-то вроде: ; 300 узла А; NodeB; 600; 100; nodeC; кивал; 100; nodeF

Это приводит к пути А-> BC-> D-> F; стоимость/время каждой вершины - это число - например, стоить 300, чтобы перейти от A-> B, 600, чтобы перейти от B-> C и 100, чтобы перейти от D-> F. Стоимость/время каждого обхода будет отличаться при каждом обходе. Так, например, в одном ПИРе может стоить 100, чтобы перейти от A-> B, но в следующем он может стоить 150, чтобы перейти от A-> B.

+0

[Самая длинная общая подпоследовательность] [1] должна давать вам общие узлы между двумя путями. Не уверен, как их добыть разумным способом после этого. [1]: http://en.wikipedia.org/wiki/Longest_common_subsequence_problem – BiGYaN

+0

Я опубликовал ответ ниже, который должен работать в большинстве случаев, но «нечетные» не очень четко определены. Однако, похоже, главное, что вы ищете случаи, когда последовательность достаточно распространена, и есть один или несколько путей, которые имеют подпоследовательность, которая является небольшим расстоянием редактирования от нее. Затем задача состоит в том, чтобы точно определить, насколько это распространено, и как мала дистанция редактирования, а также какая метрика расстояния редактирования для использования. – Nuclearman

+0

Пожалуйста, отредактируйте вопрос с ответами на следующие вопросы: Имеются ли узлы, представляющие интерес (например, A и H) для каждого экземпляра проблемы, или же алгоритм должен искать все пары узлов, которые отклоняют пути? Решите его только один раз? Разрешить PIR = «запись экземпляра пути», является ли PIR только списком узлов? Являются ли PIR хранятся в произвольном порядке в файле с последовательным доступом или в БД или что? Учитывая пару имен узлов X, Y, как вы получаете список всех путей между X и Y? Как вы получаете список всех путей, проходящих через узел C, или всех путей, проходящих через один или несколько из C, D ... Z или через все C, D ... Z? –

ответ

1

Перейдите по списку путей и разбейте их на группы, основанные на начальном и конечном узлах. Так, например, все пути, начинающиеся с узла A и заканчивающиеся узлом B, находятся в одном наборе. Затем вы можете сделать то же самое с подпоследовательностями этих путей. Так, например, каждый путь с подпоследовательностью a, b, c, d и начальным узлом y и конечным узлом k находятся в одном наборе. Также обратные пути по мере необходимости, чтобы, например, у вас не было набора для путей k к y и набора для путей y к k. Затем вы можете проверить, достаточно ли подпоследовательности, за которым следует проверка того, есть ли путь (ы), который не имеет этой подпоследовательности, если есть подпоследовательность внутри этого пути, которая достаточно близка к исходной последовательности на основе edit distance. Если вас интересует только путь, вы можете просто вычислить расстояние редактирования пути и подпоследовательности, вычесть разницу в длине и проверить, является ли результат достаточно низким. Вероятно, лучше всего использовать подпоследовательность пути, чтобы он начинался и заканчивался тем же узлом, что и искомая подпоследовательность.

Для вашего примера алгоритм в конечном итоге достигнет набора путей, содержащих подпоследовательность c, d, e, f, и найдет, что их 9. Это превышает количество, необходимое для того, чтобы подпоследовательность была достаточно распространенной (и достаточно долго, возможно, нуждалась в последовательностях по меньшей мере длины k), тогда она проверила бы пути, которые не включены. В этом случае есть только один. Затем было бы прямо или косвенно отмечено, что только удаление z будет делать последовательность c, d, z, e, f в c, d, e, f.Это передает (в настоящее время неопределенные) требования для «нечетных», и поэтому путь, содержащий c, d, z, e, f, добавляется в список возвращаемых путей.

+0

звучит так, будто у вас есть хорошее представление о том, что я пытаюсь сделать - любые предложения о существующих аналитических рамках, которые могут заставить меня начать? – Loki

+0

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

+0

Я добавил подробности о PIR. – Loki

Смежные вопросы