Сохраните кратчайший путь в «структурированном файле» с помощью networkx и osmnx

У меня есть многомерный граф 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?

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю создать индуцированный подграф вашего пути, т.е.

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 для изменения идентификаторов узлов.

Изменить 2 - от @lhoupert

Мне нравится решение с 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))   

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

lhoupert 07.04.2021 13:25

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

Sparky05 07.04.2021 13:40

Спасибо. Мне нравится ваше решение с 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)) \

lhoupert 07.04.2021 16:09

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

Sparky05 07.04.2021 18:02

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