Создайте граф Mathematica / Combinatorica с ребрами с именованными вершинами. - PullRequest
3 голосов
/ 06 августа 2010

Как сделать граф Mathematica из ребер с именованными вершинами? EG:

http://pastebin.com/Se1Nhe3M

Я пробовал выше и несколько вариантов, но Combinatorica никогда вполне принимает это правильно. Очевидно, что Graph [] хочет координаты позиции, которые я хочу, чтобы Combinatorica выяснил сам.

AddVertex to EmptyGraph [0] (или что-то еще) также завершается ошибкой.

GraphUtilities не вариант, так как я хочу сделать довольно сложный анализ на моих графиках.

Это похоже на простую проблему. Graphviz легко создает графики из ребра с именованными вершинами, так что я уверен, что Mathematica тоже может?

Я прочитал:

ShowGraph [{{e1, e2}, {e1, e3}}, {e1, e2, e3}]; // в чем здесь проблема?

но, похоже, это не поможет в моем конкретном случае.

Ответы [ 5 ]

2 голосов
/ 06 августа 2010

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

nodes = DeleteDuplicates@Flatten[graph /. Rule -> List]

{"Conga", "Egypt", "Sarah Desert", "Europe", "Arabia", "UK", "Iceland", 
 "Greenland", "Germany", "Russia", "Irakistan", "Austr(al)ia", "China", "Canada",
 "More Russia", "USA", "Andy's Mountains", "Brazil"}

Теперь у вас есть список узлов. Затем выполните сопоставление с целыми числами:

each[{i_, s_}, Transpose[{Range@Length@nodes, nodes}],
  numify[s] = i;
  namify[i] = s]

Теперь вы можете легко преобразовывать узлы в целые числа и из них:

numify["Europe"]

4

namify[4]

"Europe"

Конвертировать весь график так:

graph /. s_String -> numify[s]

Обратите внимание, что each - это следующая служебная функция, обсуждаемая здесь: Цикл ForEach в Mathematica

SetAttributes[each, HoldAll];               (* each[pattern, list, body]      *)
each[pat_, lst_, bod_] := ReleaseHold[      (*  converts pattern to body for  *)
  Hold[Cases[Evaluate@lst, pat:>bod];]];    (*   each element of list.        *)
2 голосов
/ 06 августа 2010

Если у вас есть Mathematica 7, попробуйте встроенный GraphPlot:

GraphPlot[{"Conga" -> "Egypt", "Egypt" -> "Conga", 
  "Conga" -> "Sarah Desert", "Sarah Desert" -> "Conga", 
  "Egypt" -> "Europe", "Europe" -> "Egypt", "Egypt" -> "Arabia", 
  "Arabia" -> "Egypt", "Egypt" -> "Sarah Desert", 
  "Sarah Desert" -> "Egypt", "UK" -> "Europe", "Europe" -> "UK", 
  "UK" -> "Iceland", "Iceland" -> "UK", "UK" -> "Greenland", 
  "Greenland" -> "UK", "Europe" -> "Arabia", "Arabia" -> "Europe", 
  "Europe" -> "Germany", "Germany" -> "Europe", "Europe" -> "Iceland",
   "Iceland" -> "Europe", "Europe" -> "Sarah Desert", 
  "Sarah Desert" -> "Europe", "Germany" -> "Russia", 
  "Russia" -> "Germany", "Germany" -> "Arabia", "Arabia" -> "Germany",
   "Germany" -> "Iceland", "Iceland" -> "Germany", 
  "Germany" -> "Irakistan", "Irakistan" -> "Germany", 
  "Austr(al)ia" -> "China", "China" -> "Austr(al)ia", 
  "Arabia" -> "Irakistan", "Irakistan" -> "Arabia", 
  "Canada" -> "More Russia", "More Russia" -> "Canada", 
  "Canada" -> "USA", "USA" -> "Canada", 
  "Canada" -> "Andy's Mountains", "Andy's Mountains" -> "Canada", 
  "More Russia" -> "Russia", "Russia" -> "More Russia", 
  "More Russia" -> "China", "China" -> "More Russia", 
  "More Russia" -> "Irakistan", "Irakistan" -> "More Russia", 
  "China" -> "Irakistan", "Irakistan" -> "China", 
  "USA" -> "Greenland", "Greenland" -> "USA", 
  "USA" -> "Andy's Mountains", "Andy's Mountains" -> "USA", 
  "Brazil" -> "Sarah Desert", "Sarah Desert" -> "Brazil", 
  "Brazil" -> "Andy's Mountains", "Andy's Mountains" -> "Brazil", 
  "Russia" -> "Irakistan", "Irakistan" -> "Russia"}, 
 DirectedEdges -> True]

Это даст вам следующее, например:

альтернативный текст http://img638.imageshack.us/img638/7803/plotm.png

Существует множество вариантов макета, маркировки вершин и ребер, стиля и т. Д.

1 голос
/ 07 августа 2010

Поскольку вы специально спрашивали о Combinatorica, и поскольку я всегда не решаюсь начать копаться во внутренних деталях пакета, возможно, это поможет вам:

Загрузите Combinatorica, используя << или Требуется, если ваша версия нуждается в этом. Затем, используя ваши данные: </p>

dge = {{"Conga" -> "Египет"}, {"Egypt" -> "Conga"}, {"Conga" -> "Пустыня Сары"}, {"Пустыня Сары" -> "Конга"}, {"Египет" -> "Европа"}, {"Европа" -> "Египет"}, {"Египет" -> "Аравия"}, {"Аравия" -> "Египет"}, {"Египет" -> "Пустыня Сары"}, {"Пустыня Сары" -> "Египет"}, {"Великобритания" -> "Европа"}, {"Европа" -> "Великобритания"}, {"UK" -> "Исландия"}, {"Iceland" -> "UK"}, {"UK" -> "Гренландия"}, {"Гренландия" -> "Великобритания"}, {"Европа" -> "Аравия"}, {"Аравия" -> "Европа"}, {"Европа" -> "Германия"}, {"Германия" -> "Европа"}, {"Европа" -> "Исландия"}, {"Исландия" -> "Европа"}, {"Европа" -> "Пустыня Сары"}, {"Пустыня Сары" -> "Европа"}, {"Германия" -> "Россия"}, {"Россия" -> "Германия"}, {"Германия" -> "Аравия"}, {"Аравия" -> "Германия"}, {"Германия" -> "Исландия"}, {"Исландия" -> "Германия"}, {"Германия" -> "Иракстан"}, {"Иракстан" -> "Германия"}, {"Austr (al) ia" -> "Китай"}, {"China" -> "Austr (al) ia"}, {"Arabia" -> "Иракстан"}, {"Irakistan" -> "Аравия"}, {"Canada" -> "More Russia"}, {"More Russia" -> "Canada"}, {"Канада" -> "США"}, {"США" -> "Канада"}, {"Канада" -> "Горы Энди"}, {"Горы Энди" -> "Канада"}, {"Большая Россия" -> "Россия"}, {"Russia" -> "More Russia"}, {"More Russia" -> "China"}, {"China" -> "More Russia"}, {"Большая Россия" -> "Иракстан"}, {"Иракстан" -> "Большая Россия"}, {"Китай" -> "Иракстан"}, {"Иракстан" -> "Китай"}, {"США" -> "Гренландия"}, {"Гренландия" -> "США"}, {"США" -> "Горы Энди"}, {"Горы Энди" -> "США"}, {"Бразилия" -> "Пустыня Сары"}, {"Пустыня Сары" -> "Бразилия"}, {"Бразилия" -> "Горы Энди"}, {"Горы Энди" -> "Бразилия"}, {"Россия" -> "Иракстан"}, {"Иракстан" -> "Россия"}} /. Правило [от_, до _] -> {от, до};

label = {"Канада", "США", "Гренландия", "Бразилия", "Горы Энди", "Великобритания", "Исландия", "Германия", "Европа", "Россия", "Больше России" "," Иракстан "," Аравия "," Китай "," Австрия (Аль) "," Египет "," Пустыня Сара "," Конга "};

numberededges = Подсистема [сплющить [ребро / .Thread [Правило [этикетка, диапазон [длина [этикетка]]]]], 2];

ShowGraph [AddEdges [EmptyGraph [длина [этикетки]], numberededges], VertexLabel-> этикетки, PlotRange-> Все]

Теперь, если автоформатирование не разрушило это, я думаю, что вы, возможно, готовы.

Я не сделал края, направленные в этом, и я предполагаю, что вы могли бы сделать это. Надеюсь, этого достаточно, чтобы вы начали.

Все это основано на том, что Пеммараю и Шиена в течение нескольких минут пейджируют взад-вперед в вычислительной дискретной математике: комбинаторике и теории графов с Mathematica. Я считаю, что любой, кто пытается использовать Combinatorica, не имея этого перед собой, просто чокнутый. Мне бы хотелось, чтобы мы смогли убедить их выпустить новую редакцию, исправить некоторые опечатки и сделать так, чтобы кому-то, кто не знает всего о Combinatorica, было немного проще использовать его для начала работы.

0 голосов
/ 17 сентября 2010

С объектом Combinatorica Graph [] нелегко иметь дело.Вы пробовали www.sagenb.org?Графический объект Sage действительно классный.

0 голосов
/ 13 августа 2010

Вы можете преобразовать свои ребра в матрицу смежности, а затем использовать функцию FromAdjacencyMatrix Combinatorica.

...