Хобрук: Ваш путь к мастерству в программировании

networkx. диграф. ходьба от начальных до конечных узлов

Имея networkx DiGraph со следующей структурой:  введите описание изображения здесь Я пытаюсь найти способ пройти по ориентированному графу из крайних левых узлов (без каких-либо входящих ребер), представляя data sources из промежуточных узлов (имеющих входящие и исходящие края), представляющие operators преобразование данных в крайние правые края (имеющие только входящие края), представляющие data destinations. Я могу разделить исходный граф на набор изолированных подграфов (в красных рамках):

subgraphs = weakly_connected_components(g)

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

Например. для subgraph 1 мне нужно передать узлы в следующей последовательности: 1.1, 1.2, 1.3 или 1.1, 1.3, 1.2. Точная последовательность не важна. Единственное строгое условие - не переходить к узлу 4.7 до перехода к 4.1 и 4.5 в подграфе 4, но, как упоминалось выше, мне нужно начать переход от узлов без каких-либо входящих ребер. Может ли кто-нибудь предложить какой-либо уже существующий алгоритм, уже реализованный в networkx, который делает возможной такую ​​ходьбу? Нулевая вероятность столкновения с петлей на графике.

Пример кода для построения графика на скриншоте:

import networkx as nx
from networkx.algorithms.components import weakly_connected_components

g = nx.DiGraph()
for i in range(0, 23):
    g.add_node(i)

g.add_edge(13,12)
g.add_edge(9, 8)
g.add_edge(3, 10)
g.add_edge(5, 13)
g.add_edge(7, 11)
g.add_edge(9, 14)
g.add_edge(7, 15)
g.add_edge(7, 16)
g.add_edge(17, 18)
g.add_edge(18, 19)
g.add_edge(3, 20)
g.add_edge(3, 22)
g.add_edge(18, 22)
g.add_edge(22, 21)

# removing unused nodes (without edges)
g.remove_node(0)
g.remove_node(1)
g.remove_node(2)
g.remove_node(4)
g.remove_node(6)

# get subgraphs
subgraphs = weakly_connected_components(g)

for subgraph in subgraphs:
    # here I need to iterate nodes in each subgraph 
    # in following sequence - passing dependent node can't
    # be passed before passing it's dependency nodes. For 
    # example, 4.7 can't be passed before 4.1 and 4.5, 4.5
    # can't be passed before 4.4. But no matter which of 4.1
    # and 4.5 will be passed first.

Спасибо.

11.03.2021

  • Был бы очень полезен минимальный рабочий пример ваших данных 11.03.2021
  • @RiccardoBucco, добавил 11.03.2021
  • Это называется топологической сортировкой, которая доступна в разделе networkx.algorithms.dag.topological_sort. 11.03.2021
  • Именно то, что мне нужно, @RiccardoBucco. Большое спасибо! Не могли бы вы указать свой комментарий как ответ, чтобы я мог проголосовать за него, пожалуйста? 11.03.2021

Ответы:


1

Как предлагается в комментариях, вам необходимо использовать networkx.topological_sort. топологический порядок ориентированного графа - это такой линейный порядок его вершин, что для каждого направленного ребра uv из вершины u в вершину v в этом порядке u стоит перед v. Топологическое упорядочение возможно тогда и только тогда, когда граф не имеет ориентированных циклов, то есть если это ориентированный ациклический граф (DAG).

11.03.2021
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..