поиск всех путей из заданного графа python

Мне нужно найти все пути из заданного графа. Я могу сделать это сейчас, однако мой рекурсивный код неэффективен, а мои графики очень сложны. Поэтому мне нужен лучший алгоритм. Вот мой код до сих пор,

def findLeaves(gdict):
    # takes graph and find its leaf nodes
    leaves = []
    for endNode in gdict.iterkeys():
        if not gdict[endNode]:
            leaves.append(endNode)
    return leaves

graphPaths = {}    
def findPaths(gname, gdict, leave, path):
    # finds all noncycle paths
    if not gdict:
        return []
    temp = [node for node in gdict.iterkeys() if leave in gdict[node].keys() and node not in path] 
    if temp:
        for node in temp:
            findPaths(gname, gdict, node, [node] + path) 
    else:
        graphPaths[gname].append(path)   




    # main
    leaves = findLeaves(graph['graph'])
    graphPaths['name'] = []

    seenNodes = []
    for leave in leaves:
        findPaths(graph['name'], graph['graph'], leave, [leave])

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

У меня много графиков, поэтому я держу их в словаре. Ключи — это имена графиков. Вот пример моих данных:

graph['graph']: {
0: {1: {}}, 
1: {2: {}, 3: {}}, 
2: {3: {}}, 
3: {4: {}}, 
4: {5: {}}, 
5: {6: {}}, 
6: {7: {}}, 
7: {6: {}, 5: {}}
}

graph['name'] = nameofthegraph

Эта структура взята из pygraphviz, она просто показывает исходящие ребра от любых узлов. Ключи — это узлы, а значения — исходящие ребра к узлам. Однако, когда у меня есть очень сложные графики, как показано ниже, этот код не может найти все пути.

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

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


person genclik27    schedule 01.07.2014    source источник
comment
поместите эту проблему в codereview.stackexchange.com для оптимизации и повышения эффективности.   -  person sundar nataraj    schedule 01.07.2014
comment
@sundarnatarajСундар Спасибо, я не знал об этом сайте. вопрос   -  person genclik27    schedule 01.07.2014
comment
Ничего страшного. вы получите хороший обзор о том, как оптимизировать и повысить эффективность   -  person sundar nataraj    schedule 01.07.2014
comment
Вы имеете в виду поиск всех путей в заданном графе?   -  person user2963623    schedule 01.07.2014


Ответы (1)


Зачем нужно было находить все пути из заданного графа? Какой контекст? Я задаю вам этот вопрос, потому что, поскольку теория графов сегодня очень популярна в вычислительной технике, вероятно, существует алгоритм, который точно соответствует вашим потребностям...

Например, если вам, наконец, нужно сравнить все пути, чтобы найти лучший, вас, вероятно, может заинтересовать "Проблема кратчайшего пути" и прочитать: Найти все пути между двумя узлами графа & https://en.wikipedia.org/wiki/Shortest_path_problem

Что касается темы «оптимизация», python позволяет вам использовать понимание списка, многопоточный и / или код на основе подпроцесса.

Вы также можете попробовать использовать «родную базу данных графов» (например, neo4js) для хранения вашего узла, а затем использовать некоторые встроенные методы, такие как: http://neo4j.com/docs/stable/cypherdoc-finding-paths.html, чтобы выполнить эту работу.

С наилучшими пожеланиями

person A STEFANI    schedule 09.03.2016