6

I created a discrete Markov process using p = DiscreteMarkovProcess[{1, 0, 0}, {{0, 1/2, 1/2}, {1/2, 0, 1/2}, {1/2, 1/2, 0}}]; and simulated it 5 times to create a list of lists:

data = Table[RandomFunction[p, {0, 10}][[2]][[1]][[1]], {i, 1, 5, 1}]
(*{{1, 3, 2, 1, 3, 1, 3, 1, 2, 1, 2}, {1, 2, 1, 2, 1, 2, 3, 2, 3, 2, 
  3}, {1, 3, 2, 1, 2, 3, 1, 2, 1, 3, 2}, {1, 3, 2, 1, 2, 1, 2, 1, 3, 
  1, 3}, {1, 2, 3, 1, 3, 1, 3, 2, 1, 2, 1}}*)

I would like to convert each of these lists into a list of vertices that are directed from the first member of the list to the next and then the next:

1 \[DirectedEdge] 3, 3 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 
 1 \[DirectedEdge] 3, 3 \[DirectedEdge] 1, 1 \[DirectedEdge] 3, 
 3 \[DirectedEdge] 1, 1 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 
 1 \[DirectedEdge] 2}

How do I do that? I explored EdgeAdd but that doesn't give me the desired result:

Table[EdgeAdd[
  Graph[{data[[1]][[1]] \[DirectedEdge] data[[1]][[2]]}, 
   VertexLabels -> "Name"], 
  data[[1]][[i]] \[DirectedEdge] data[[1]][[i + 1]]],
 {i, 2, 5, 1}]

enter image description here

What function may I use to convert a list to a set of directed vertices for a Graph?

dearN
  • 5,341
  • 3
  • 35
  • 74

3 Answers3

6
data =
  {{1, 3, 2, 1, 3, 1, 3, 1, 2, 1, 2}, {1, 2, 1, 2, 1, 2, 3, 2, 3, 2, 3}, {1, 3, 2, 
    1, 2, 3, 1, 2, 1, 3, 2}, {1, 3, 2, 1, 2, 1, 2, 1, 3, 1, 3}, {1, 2, 3, 1, 3, 1, 
    3, 2, 1, 2, 1}};

DirectedEdge @@@ Partition[#, 2, 1] & /@ data
{{1 \[DirectedEdge] 3, 3 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 
  1 \[DirectedEdge] 3, 3 \[DirectedEdge] 1, 1 \[DirectedEdge] 3, 
  3 \[DirectedEdge] 1, 1 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 
  1 \[DirectedEdge] 2}, {1 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 
  1 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 1 \[DirectedEdge] 2, 
  2 \[DirectedEdge] 3, 3 \[DirectedEdge] 2, 2 \[DirectedEdge] 3, 
  3 \[DirectedEdge] 2, 2 \[DirectedEdge] 3}, {1 \[DirectedEdge] 3, 
  3 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 1 \[DirectedEdge] 2, 
  2 \[DirectedEdge] 3, 3 \[DirectedEdge] 1, 1 \[DirectedEdge] 2, 
  2 \[DirectedEdge] 1, 1 \[DirectedEdge] 3, 
  3 \[DirectedEdge] 2}, {1 \[DirectedEdge] 3, 3 \[DirectedEdge] 2, 
  2 \[DirectedEdge] 1, 1 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 
  1 \[DirectedEdge] 2, 2 \[DirectedEdge] 1, 1 \[DirectedEdge] 3, 
  3 \[DirectedEdge] 1, 1 \[DirectedEdge] 3}, {1 \[DirectedEdge] 2, 
  2 \[DirectedEdge] 3, 3 \[DirectedEdge] 1, 1 \[DirectedEdge] 3, 
  3 \[DirectedEdge] 1, 1 \[DirectedEdge] 3, 3 \[DirectedEdge] 2, 
  2 \[DirectedEdge] 1, 1 \[DirectedEdge] 2, 2 \[DirectedEdge] 1}}
Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
6

If you have a list of vertices representing such a path, you can use

Graph[DirectedEdge @@@ Partition[list, 2, 1]]

If you just want the graph fort his Markov process, use Graph[p].

Szabolcs
  • 234,956
  • 30
  • 623
  • 1,263
4

You can also use BlockMap

toEdges1 = BlockMap[Apply @ DirectedEdge, #, 2, 1] &;

or the (undocumented) 6-argument form of Partition:

toEdges2 = Partition[#, 2, 1, {1, -1}, {}, DirectedEdge] &;

Using it with data:

toEdges1 /@ data

enter image description here

Row[Graph[#, ImageSize -> 200] & /@ toEdges1 /@ data]

enter image description here

toEdges1 /@ data == 
    toEdges2 /@ data == 
     ( DirectedEdge @@@ Partition[#, 2, 1] & /@ data)
 True
kglr
  • 394,356
  • 18
  • 477
  • 896