Получить все возможные простые пути между двумя узлами (теория графов)

В контексте теории графов я пытаюсь найти все возможные простые пути между двумя узлами.

Я записываю сеть, используя матрицу смежности, хранящуюся в кадре данных pandas, таким образом, что сеть [x][y] хранит значение стрелки, которое идет от x до y.

Чтобы получить пути между двумя узлами, я делаю так:

Я получаю все возможные перестановки со всеми узлами (используя it.permutations -поскольку путь прост, повторений нет). Затем я использую специальную функцию: рядом (которая дает мне соседей узла), чтобы проверить, какие из всех возможных путей являются истинными.

Это занимает слишком много времени, и это не эффективно. Вы знаете, как я могу улучшить код? Может быть с рекурсивной функцией??

По несущественной причине я не хочу использовать Networkx

def get_simple_paths(self, node, node_objective):

    # Gives you all simple path between two nodes

    #We get all possibilities and then we will filter it
    nodes = self.nodes #The list of all nodes
    possible_paths = [] #Store all possible paths
    simple_paths = [] #Store the truly paths
    l = 2        
    while l <= len(nodes):
        for x in it.permutations(nodes, l): #They are neighbourgs
            if x[0] == node and x[-1] == node_objective:
                possible_paths.append(x)
        l += 1

    # Now check which of those paths exists
    for x_pos, x in enumerate(possible_paths):
        for i_pos, i in enumerate(x): 
#We use it to check among all the path, 
#if two of the nodes are not neighbours, the loop brokes 
            if i in self.adjacencies(x[i_pos+1]):
                if i_pos+2 == len(x):
                    simple_paths.append(x)
                    break
                else:
                    continue
            else:
                break
    #Return simple paths    
    return(simple_paths)

0 ответов

Другие вопросы по тегам