Что не так с моей функцией? Нахождение кратчайшего пути с использованием numpy и networkx - PullRequest
1 голос
/ 18 марта 2020

, поэтому я создаю код для расчета кратчайшего пути с использованием networkx. Я создал трехмерный массив, используя numpy, а затем рассчитал кратчайший путь, например:

import numpy as np
import networkx as nx

arr = np.random.randint(1, 100, size = (2, 5, 5)) #3D array

for i in arr:
    graph = nx.from_numpy_array(i, create_using = nx.DiGraph)
    path = nx.shortest_path(graph, 0, 3, weight = 'weight')
    print(path)

Поскольку я использую две матрицы, я получил следующий вывод:

[0, 1, 3] #path1
[0, 3]    #path2

После этого я решил создать функцию, которая будет выполнять ту же функцию, например:

import numpy as np
import networkx as nx

arr = np.random.randint(1, 100, size = (2, 5, 5)) #3D array


def shortest(prices):

    for i in arr:
        graph = nx.from_numpy_array(i, create_using = nx.DiGraph)
        path = nx.shortest_path(graph, 0, 3, weight = 'weight')
        return path

print(shortest(arr))

, и я получу следующий вывод:

[0, 1, 3] #same as path 1

И если я, если изменить позицию «обратного пути», подобного этому:

def shortest(precios):

    for i in arr:
        graph = nx.from_numpy_array(i, create_using = nx.DiGraph)
        path = nx.shortest_path(graph, 0, 3, weight = 'weight')
    return path

print(shortest(arr))

Я получил следующий вывод:

[0, 3] #same as path 2

Я не могу получить два пути в одном и том же выводе, используя мою функцию. Есть идеи, что здесь происходит? Я практиковался в использовании функций в python, так как я немного новичок в топи c, поэтому я надеялся, что вы поможете мне увидеть, что не так? Спасибо!

1 Ответ

2 голосов
/ 18 марта 2020

Это не имеет ничего общего с networkx или numpy; это простой поток управления. Ваш «кратчайший путь» l oop просматривает предоставленные графики и находит кратчайший путь для каждого.

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

Этот код возвращается, как только он находит первое решение:

for i in arr:
    graph = nx.from_numpy_array(i, create_using = nx.DiGraph)
    path = nx.shortest_path(graph, 0, 3, weight = 'weight')
    return path   # The function ends as soon as it gets here: you get only the first solution.

Этот код находит все решения, но вы выбрасываете каждое, как только найдете следующее:

for i in arr:
    graph = nx.from_numpy_array(i, create_using = nx.DiGraph)
    path = nx.shortest_path(graph, 0, 3, weight = 'weight')
    # You just deleted the previous solution, and replaced it with another.

return path

Возвращает только последнее решение, поскольку это единственное, которое вы не перезаписали. Вы должны каким-то образом накапливать решения и возвращать их вместе или изменять использование вашей функции. Например:

all_path = []
for i in arr:
    graph = nx.from_numpy_array(i, create_using = nx.DiGraph)
    all_path.append( nx.shortest_path(graph, 0, 3, weight = 'weight') )

return all_path
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...