2015-03-26 1 views
0

У меня есть ненаправленный взвешенный граф G с набором узлов и взвешенных ребер.Networkx кратчайший алгоритм дерева

Я хочу знать, если есть способ, реализованный в NetworkX найти минимального остовного дерева в графе между заданными узлами (например nx.steiner_tree (G, [ «Берлин», «Киль», «Munster» , 'Nurnberg'])) (по-видимому, их нет?)

У меня нет точек репутации для отправки изображений. Ссылка на подобным же образом может быть: Map (A3, C1, C5, E4)

Что я имею в виду:

  1. проверки dijkstras кратчайших путей между всеми узлами назначения;
  2. поместить все узлы (промежуточные и получатели) и ребра на новый граф V;
  3. вычислить mst на V (для удаления циклов путем разбиения самого длинного края);

Может быть, есть лучшие способы (corectness- and computation-wise)? Потому что этот подход довольно плох с тремя узлами назначения и становится лучше с большим количеством узлов.

P.S. Мой график плоский (его можно нарисовать на бумаге так, чтобы ребра не пересекались). Может быть, может помочь какой-то метод весны/силы (как в d3-визуализации)?

ответ

2

Насколько я понимаю ваш вопрос, вы пытаетесь найти компонент с наименьшим весом, содержащий набор узлов. Это проблема Steiner tree in graphs. Это NP полный. Вероятно, вам лучше всего взять какую-то эвристику, основанную на конкретном случае, который вы изучаете.

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

Я нашел another question для этого, у которого есть несколько достойных ответов (размещенный вопрос имел невзвешенный график, поэтому он отличается, но алгоритмы, приведенные в ответах, подходят для взвешивания). Есть некоторые хорошие, выходящие за рамки только принятого ответа.

+0

Спасибо, что указал направо. Но алгоритмы, приведенные в ответах, не совсем решают его. Ближайшей вещью к истине является б) вариация AJed, но проблема заключается в том, что результат в значительной степени зависит от того, на каком этапе вы начинаете (может быть, это не проблема для невзвешенного графика). То, что я сейчас думаю, выглядит следующим образом: 1) проверить кратчайшие пути dijkstras между всеми узлами; 2) поместить все узлы в новый граф; 3) вычислить mst (удалить циклы, разбив самый длинный край) – arvyzu

0

В networkx имеется стандартный алгоритм Крускаля, реализованный с неориентированным взвешенным графом в качестве входного. Эта функция называется «minimum_spanning_tree»

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

import nertworkx as nx 
H=G.subgraph(['Berlin','Kiel', 'Konstanz']) 
MST=nx.minimum_spanning_tree(H) 
+0

Проблема в том, что я «знать» узлы, которые мне нужны »(промежуточные узлы). Я знаю все узлы графа и их ребра с весами, и я знаю «узлы назначения» (узлы, которые необходимо подключить).Вся проблема ** - это «нужные мне узлы» (или наоборот - те, которые мне не нужны), кроме Берлина, Киля и Констанца – arvyzu

Смежные вопросы