创建节点为集的Graph对象

时间:2012-03-01 00:23:13

标签: wolfram-mathematica

当节点是集合而不是数字或规范符号时,这个问题涉及Mathematica 8中的图形对象。

问题

我尝试做的只是以下几点。我有一套套装。请考虑以下事项:

S = {{1}, {2}, {1,2}, {2,3}} (* Set of vertices *)
E = {{{1}, {2}}, {{2}, {1,2}}, {{{1,2}, {2,3}}, {{2,3}, {1}}} (* Edges *)

不幸的是,当我执行以下操作时:

Graph[S, E]

Mathematica不会创建图形对象,也无法理解我打算创建一个具有节点集的图形。

问题

我能做些什么才能达到这个效果?我想了一些替换只是为了让Mathematica了解如何创建连接,使用反转我可以在创建图形后标记顶点。但不知道如何得到这个。

试验

我尝试使用替换规则和运算符,但主要的难点是操作替换任意长度的数组。我会解释自己。

考虑拥有像S这样的列表的通用列表。用{1,2,3} -> "123"{2,3} -> "23"等字符串替换它没有问题。

问题是替换运算符/.没有提供以我想要的方式指定列表的语法。

三江源

3 个答案:

答案 0 :(得分:3)

你永远不想为变量名使用大写字母,尤其是E是邪恶的,因为它是欧拉数。另外,我认为您在E的大括号中输入了内容。

如果我理解这是正确的,那么您唯一要做的就是从DirectedEdge列表中提出E

s = {{1}, {2}, {1, 2}, {2, 3}} (*Set of vertices*)
e = {{{1}, {2}}, {{2}, {1, 2}}, {{1, 2}, {2, 3}}, {{2, 3}, {1}}} (*Edges*)
Graph[s, DirectedEdge @@@ e, VertexLabels -> "Name", ImagePadding -> 10]

enter image description here

答案 1 :(得分:2)

这可以说是@ halirutan方法的更具可读性的版本:

a = {1}; b = {2}; c = {1, 2}; d = {2, 3}

Graph[{a -> b, b -> c, c -> d, d -> a}, VertexLabels -> "Name", 
      ImagePadding -> 10]

因为它是一个连通图,所以你不需要在Graph中包含顶点列表;边列表就足够了。

答案 2 :(得分:1)

让我解释一下:

  

考虑拥有像S这样的列表的通用列表。我没有   用{1,2,3}之类的字符串代替它的问题 - > “123”或   {2,3} - > “23”。

     

问题是更换操作员/。不提供语法   以我想要的方式指定列表。

从:

开始
lists = {{{2}, {1, 2}}, {{1, 2}, {2, 3}}, {{1, 2, 3}, {1}}};

以下是几个选项:

lists /. x : {__Integer} :> StringJoin@Riffle[ToString /@ x, "-"]
{{"2", "1-2"}, {"1-2", "2-3"}, {"1-2-3", "1"}}
lists /. x : {__Integer} :> ToString@x
{{"{2}", "{1, 2}"}, {"{1, 2}", "{2, 3}"}, {"{1, 2, 3}", "{1}"}}
Map[StringJoin[ToString /@ #] &, lists, {-2}]
{{"2", "12"}, {"12", "23"}, {"123", "1"}}