У меня есть многомерный граф G и список best_path, рассчитанный методом nx.shortest_path.
Благодаря этому stackexchange post я экспортирую координаты x и y моего маршрута в простой файл ascii с помощью json.dumps:
parts = []
for i in best_path:
node = G.nodes[i]
parts.append([float(node["y"]), float(node["x"])])
json_route = json.dumps(parts)
with open(current_dir + "test_best_path.json", "w", encoding = "utf-8") as f:
f.write(json.dumps(parts, ensure_ascii=False))
Теперь я ищу решение, в котором я мог бы сохранить этот лучший маршрут в более «структурированном» файле, где я мог бы также добавить дополнительные атрибуты узла (например, yaml или graphml). Что-то уже есть в networkx или osmnx?
Спасибо





Я предлагаю создать индуцированный подграф вашего пути, т.е.
shortest_path_graph = G.subgraph(best_path) #.copy()
и может создать копию, если вы хотите внести изменения, которые не должны отражаться в исходном графике.
Затем вы можете применить любые изменения и добавить любые изменения в shortest_path_graph, например, добавить атрибуты узла или удалить существующую ненужную информацию. Впоследствии вы можете сохранить свой результат, используя любой из networkxметоды сохранения, например, GraphML или YAML, чтобы следить за вашими предложениями. Я настоятельно рекомендую избегать рассола, если вы хотите поделиться файлом между разными компьютерами.
Поскольку вышеупомянутый процесс потеряет информацию о порядке узлов в пути или, другими словами, я ожидаю, что вышеупомянутая процедура вернет строку, то есть в направленном случае один узел без степени 1 и со степенью 0, другой узел с в степени 1 и вне степени 0, а все остальные узлы в степени = 1 = вне степени.
Чтобы сохранить порядок узлов в пути, вы можете создать новый атрибут
for i, node in enumerate(best_path):
shortest_path_graph.nodes[node]["path counter"] = i
или используйте nx.relabel_nodes для изменения идентификаторов узлов.
Мне нравится решение с nx.relabel_nodes, которое не создает новый атрибут. Пример реализации можно увидеть ниже:
# Relabel nodes id to sort them according to the path orientation
mapping_dict = {num: x for x,num in enumerate(best_path)}
H = nx.relabel_nodes(G_shortest_path, mapping_dict)
# Sort the graph nodes and edges according to new ID
H2 = nx.Graph() # or nx.MultiDiGraph()
H2.add_nodes_from(sorted(H.nodes(data=True)))
H2.add_edges_from(H.edges(data=True))
Порядок, вероятно, будет сохраняться неявно только степенью узлов. Если вы явно хотите сохранить его, вам необходимо добавить эту информацию. Я расширил свой ответ, чтобы охватить это.
Спасибо. Мне нравится ваше решение с nx.relabel_nodes, которое не создает новый атрибут. Мою реализацию можно увидеть ниже: python # Relabel nodes id to sort them according to the path orientation \ mapping_dict = {num: x for x,num in enumerate(best_path)} \ H = nx.relabel_nodes(G_shortest_path, mapping_dict) \ \ # Sort the graph nodes and edges according to new ID \ H2 = nx.Graph() \ H2.add_nodes_from(sorted(H.nodes(data=True))) \ H2.add_edges_from(H.edges(data=True)) \
Вы можете отредактировать мой ответ и включить свой код, который, вероятно, будет легче читать, чем в комментарии :)
Спасибо за быстрый ответ. Он работал хорошо, я не знал о методе
.subgraph()... Знаете ли вы, если при экспорте файла узел и каждый из них перечислены в порядке, соответствующем кратчайшему пути (от начальной точки до конечной точки)?