Вы нарушили основное свойство графа: данная метка однозначно идентифицирует узел.Вы сказали networkx
вернуться "к c: 3", и он сделал именно то, что сказал.
Во-первых, поймите природу графа: все эти ребра существуют одновременно.При рисовании графика линейная последовательность на рисунке отсутствует.Здесь нет «назад», просто ребро со стрелкой на одном конце.
Ваше основное противоречие теории графов здесь:
we send traffic from c:3 to d:4 as STM-16
and it comes back groomed down to STM-4
back to c:3 where it is sent on to e:5
Вы дали двум разным узлам одну и ту же метку,В терминах графа это означает, что они являются одним и тем же состоянием, но из вашего описания ясно, что вы ожидаете различных действий.Короче, решайся.Если они требуют разных действий, то это разные состояния, и вы должны описать их как таковые в спецификации вашего графа.Если у вас есть фабрика, которая помещает эти два шага в одно и то же физическое местоположение, то это ваша проблема при построении фабрики, а не забота этой графической утилиты.: -)
Я вижу две основные альтернативы:
(1) Описать ваши шаги описательно.Возвращение к месту c
на самом деле является шагом 5, а не возвращением к шагу 3.
G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), ('c:5'), {'link':'four'}),
(('c:5'), ('e:6'), {'link':'five'})
])
(2) Дайте networkx
метку, которая описывает вещи в ваших терминах,но используя декорации, которые не отображают:
G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), (' c:3 '), {'link':'four'}),
((' c:3 '), ('e:5'), {'link':'five'})
])
Я не уверен, что это, в частности, обманет networkx
, но попробуйте.Если это не сработает, попробуйте подчеркивание или точку.В худшем случае, возможно, «c: 3.1» и «c: 3.2» удовлетворят ваши потребности.