сеть х граф и Флойд Уорсхолл - PullRequest
0 голосов
/ 23 ноября 2018

Я новичок в Python.У меня есть такая карта map , и я хочу создать кратчайшие пути от каждого узла ко всем остальным узлам, используя сеть x.Я пытался написать простой код, подобный этому:

shp = nx.read_shp("../Shapefiles/Shapefiles/Station_in_Corridors/Group_1.shp")

G = nx.DiGraph()
for data in shp.edges(data = True):
   G.add_edge(data[0],data[1],weight = data[2]["Length_Km"])

nx.floyd_warshall(G)
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos = pos, node_size=100)
nx.draw_networkx_edges(G, pos = pos)
plt.show()

Прежде чем вызывать результат floyd warshall, я хотел бы сначала увидеть график.Получается, что график возвращается так: результат .Я не думаю, что график похож на вход (или это?).

Во всяком случае, я также пытался вручную добавить точки с этим кодом:

cor1 = driver.Open(cor1Data)
cor2 = driver.Open(cor2Data)

ly1 = cor1.GetLayer()
ly2 = cor2.GetLayer()

allpoints = {}
kreuz = []
arcs = {}
for i in range(ly1.GetFeatureCount()):
  for j in range(ly2.GetFeatureCount()): #Create road
    feat1 = ly1.GetFeature(i)
    geom1 = feat1.GetGeometryRef()
    points1 = geom1.GetPoints()
    feat2 = ly2.GetFeature(j)
    geom2 = feat2.GetGeometryRef()
    points2 = geom2.GetPoints()
    arcs[i] = [(points1[0],points1[1],geom1.Length()),feat1]
    arcs[len(ly1)+j] = [(points2[0],points2[1],geom2.Length()),feat2]
    #Create OD trips
    if not points1[0] in allpoints.values():
        allpoints[i] = [points1[0],geom1.Length(),feat1]
    else:
        allpoints[i] = [points1[1],geom1.Length(),feat1]
    if not points2[0] in allpoints.values():
        allpoints[len(ly1)+j] = [points2[0],geom1.Length(),feat1]
    else:
        allpoints[len(ly1)+j] = [points2[1],geom1.Length(),feat1]
    #append kreuz
    if points1[0] == points2[0] or points1[0] == points2[1]:
        kreuz.append(points1[0])
    elif points1[1] == points2[0] or points1[1] == points2[1]:
        kreuz.append(points1[1])

G = nx.DiGraph() #Set a directed graph
for k,v in arcs.items():
  G.add_edge(v[0][0],v[0][1], weight = v[0][2])

G.add_nodes_from(allpoints.values())

nx.floyd_warshall(G)
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos = pos, node_size=100)
nx.draw_networkx_edges(G, pos = pos)
plt.show()

и результат: Результат второго кода

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

1 Ответ

0 голосов
/ 26 февраля 2019

networkx floyd_warshall вычисляет кратчайший путь для всех пар узлов в графе и возвращает словарь согласно документации .

distance (dict) - словарь,с указанием источника и цели, расстояний между кратчайшими путями между узлами.

Алгоритм никоим образом не изменяет график, поэтому без сохранения возвращенного словаря в переменной ничего не изменится.

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

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