Список всех возможных кратчайших путей

У меня комбинаторная проблема, которую можно рассматривать как проблему поиска в сети. Чтобы визуализировать и использовать уже реализованные функции, я решил использовать пакет networkx (на самом деле у меня нет времени на то, чтобы реализовать его другим способом).

Моя проблема, к сожалению, довольно сложная. Но я постараюсь облегчить понимание, объясняя даже самые простые вещи. В общем, мне нужно найти комбинации, чтобы добраться до узлов, на которых заканчивается дерево.

На рисунке ниже показан тривиальный пример:

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


В этом случае B, D, F, H являются конечными узлами, тогда как начальная точка обозначается O. Итак, комбинация путей может быть:

OAB
OCD
OED
OEF
OH
OGH

Однако на самом деле я ищу «самые короткие» или «наиболее подходящие» пути для достижения конечных узлов. Диаграмма (или края) не дает никакой информации о «стоимости» пути. Оценка стоимости будет произведена по результатам найденных комбинаций. Оценка «фактических» затрат на найденные комбинации требует больших вычислительных затрат. Хотя диаграмма не дает много информации, ясно одно: для достижения H, OH в любое время лучше, чем OGH. Таким образом, комбинацию OGH можно исключить из списка возможных комбинаций. По сути, это похоже на метрику расстояния.

Еще одна точка, на самом деле D и F соответствуют эквивалентным точкам (они являются разными узлами, но имеют то же значение для моего приложения). Однако такая информация может быть получена только в том случае, если два узла

- see each other
- see exactly the same nodes

Если внимательно посмотреть на рисунок, можно также понять, что C и E являются эквивалентными узлами. Итак, чтобы сформулировать это более конкретно: комбинации OCD и OED на самом деле одинаковы. После того, как OCD добавлен в список комбинаций, нет необходимости добавлять OED. Это также видно из рисунка, поскольку D и F одинаковы, после добавления OCD в список нет необходимости добавлять OCF.

Подводя итог, решение в этом случае было бы:

OAB
anyone of OCD, OED, OCF, OEF
OH

Чтобы набросать эту биграмму, я следовал руководствам networkx, а затем создал код ниже:

import networkx as nx
import matplotlib.pyplot as plt

graph = [('O', 'A'), ('O', 'C'),  ('O', 'E'),  ('O', 'G'),  ('O', 'H'),  
         ('A', 'B'), ('A', 'O'),
         ('B', 'A'),
         ('C', 'D'), ('C', 'E'), ('C', 'F'), ('C', 'O'),
         ('D', 'E'), ('D', 'C'), ('D', 'F'),  
         ('E', 'C'), ('E', 'D'), ('E', 'F'), ('E', 'O'),
         ('F', 'C'), ('F', 'D'), ('F', 'E'),
         ('G', 'H'), ('G', 'O'), 
         ('H', 'G'), ('H', 'O')]

G=nx.DiGraph()
for edge in graph:
    G.add_edge(edge[0], edge[1])

pos=nx.graphviz_layout(G,prog='dot')
nx.draw(G, pos)
plt.show()

Итак, мой вопрос - перечислить такие последовательности с помощью любого набора инструментов, но желательно networkx. Вероятно, первым делом необходимо упростить (или уменьшить) график перед созданием объекта Graph. После получения упрощенного графика с помощью команды nx.all_simple_path можно перечислить все альтернативные пути. Мне нужна ваша помощь в сокращении такого графика.

Мои графики неглубокие, они обычно примерно того же размера, что и в примере.


person T-800    schedule 21.07.2014    source источник
comment
en.wikipedia.org/wiki/Dijkstra's_algorithm   -  person JohnB    schedule 21.07.2014
comment
Пробовал BFS и DFS. Но я могу получить только один результат. Не все возможные комбинации.   -  person T-800    schedule 21.07.2014
comment
Вы пишете: чтобы достичь H, OH в любое время является лучшим выбором, чем OGH. Почему?   -  person JohnB    schedule 21.07.2014
comment
@JohnB Я предполагаю, потому что OGH - это надмножество OH, но это предполагает, что все граничные затраты равны. В противном случае невозможно «уменьшить избыточность» без фактического расчета затрат.   -  person aruisdante    schedule 21.07.2014
comment
@JohnB использует длину пути в качестве метрики, это один переход от OH по сравнению с двумя переходами для OGH (если я правильно понял OP)   -  person Cory Kramer    schedule 21.07.2014
comment
Да, но если я знаю метрику, почему тогда просто не искать кратчайший путь? Поиск только одного (кратчайшего) пути, вероятно, будет намного быстрее (O (n ^ 2)), чем поиск всех из них и последующее удаление некоторого (экспоненциального времени, в худшем случае, я думаю).   -  person JohnB    schedule 21.07.2014
comment
Фактическое изображение проблемы не показано.   -  person Frerich Raabe    schedule 21.07.2014
comment
Я только что починил. Я просто читаю ваши комментарии ...   -  person T-800    schedule 21.07.2014
comment
@JohnB - это евклидова метрика расстояния. Следовательно...   -  person T-800    schedule 21.07.2014
comment
Не могли бы вы еще раз объяснить, почему вы просто не ищете кратчайший путь?   -  person JohnB    schedule 21.07.2014
comment
Для реальной проблемы также возможно решение OG (альтернатива OH), верно? Учитывая, что H и G эквивалентны по вашему определению.   -  person Frerich Raabe    schedule 21.07.2014
comment
Всегда ли начальная точка обозначается буквой O?   -  person Frerich Raabe    schedule 21.07.2014
comment
@FrerichRaabe G не конечный узел. Если бы это было так, то это было бы вашим решением.   -  person T-800    schedule 21.07.2014
comment
@FrerichRaabe, да, O всегда является отправной точкой   -  person T-800    schedule 21.07.2014
comment
Почему H конечный узел, а не G (заметьте, в вашем втором примере)?   -  person Frerich Raabe    schedule 21.07.2014
comment
@JohnB, потому что моя стоимость - не совсем расстояние. Есть и другие параметры, определяющие мою стоимость. Поэтому я оцениваю это внутри другого и очень сложного сценария.   -  person T-800    schedule 21.07.2014
comment
@FrerichRaabe, конечные узлы всегда одинаковые. Они не меняются. Они находятся отдельно. Возможно, я нарисовал фигуру не в соответствии с порядком (или рангом) узлов ...   -  person T-800    schedule 21.07.2014
comment
Извините, я правда не понимаю. Подход: найдите эквивалентные узлы в вашем графике и уменьшите граф до более простого, удалив узлы или ребра, чтобы учесть тот факт, что вы считаете некоторые узлы эквивалентными друг другу. Затем выполните поиск в ширину, чтобы найти все маршруты без велосипедных дорожек. Но вы не найдете алгоритм, учитывающий, что узлы эквивалентны, без указания, какие это узлы.   -  person JohnB    schedule 21.07.2014
comment
@JohnB, наверное, ты прав. Лучше всего сделать упрощение перед созданием такого графика. После создания упрощенного графика с помощью nx.all_simple_paths можно получить все возможные решения ...   -  person T-800    schedule 21.07.2014
comment
@JohnB Я буду редактировать свои вопросы и искать ответ, который упрощает график для второго типа постановки задачи. Спасибо за ваше предложение!   -  person T-800    schedule 21.07.2014


Ответы (1)


Я прочитал полное руководство по модулю и пробовал разные алгоритмы поиска, но не смог найти существующую реализацию или какое-либо обходное решение для такого конкретного случая.

Итак, следуя совету, полученному из комментариев, я написал свой собственный упрощитель и удалил все «избыточные» узлы перед созданием графа. Я сделал это, просто преобразовав списки в наборы, а затем сравнив, идентичны ли они. После этого я создал график и перечислил все решения с помощью команды nx.all_simple_paths. Как только я получил пути, на этот раз я искал, есть ли какие-нибудь пути (например, OGH), когда чья буква перед последней, то есть индекс [-2], удаляется, получившийся путь (OH) также находится в списке nx.all_simple_paths. Если да, то я удалил это решение.

Сценарий, который я написал, довольно неорганизован и не требует специальных приемов. Поэтому я решил написать методологию решения.

person T-800    schedule 21.07.2014