Este documento simula a percolação de arestas numa caixa finita de \(\mathbb Z^2\).
Para isso usaremos os pacotes igraph, que possibilita a manipulação de grafos no R, e o pacote animation para gerar animações.
#install.packages("igraph")
suppressMessages(library(igraph))
#install.packages("animation")
suppressMessages(library(animation))
O igraph possui uma lista de grafos padrões. Vamos fazer um reticulado de \(30\times 30\). Este grafo fica reconhecido no layout em grid
#Fazendo um reticulado de 30x30
g<-make_lattice(c(30, 30))
#Escolhendo o layout de grid
layou= layout_on_grid(g, width = 0.4, height = 1, dim = 2)
#Plotando
plot(g,layout=layou,vertex.label=NA,vertex.size=3,pin=c(10,5))
Vamos ver alguns elementos desse grafo
#Vértices
V(g)
## + 900/900 vertices, from 750a089:
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
## [18] 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## [35] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
## [52] 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
## [69] 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
## [86] 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
## [103] 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
## [120] 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
## [137] 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
## [154] 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
## + ... omitted several vertices
#Arestas
E(g)
## + 1740/1740 edges from 750a089:
## [1] 1-- 2 1--31 2-- 3 2--32 3-- 4 3--33 4-- 5 4--34 5-- 6 5--35
## [11] 6-- 7 6--36 7-- 8 7--37 8-- 9 8--38 9--10 9--39 10--11 10--40
## [21] 11--12 11--41 12--13 12--42 13--14 13--43 14--15 14--44 15--16 15--45
## [31] 16--17 16--46 17--18 17--47 18--19 18--48 19--20 19--49 20--21 20--50
## [41] 21--22 21--51 22--23 22--52 23--24 23--53 24--25 24--54 25--26 25--55
## [51] 26--27 26--56 27--28 27--57 28--29 28--58 29--30 29--59 30--60 31--32
## [61] 31--61 32--33 32--62 33--34 33--63 34--35 34--64 35--36 35--65 36--37
## [71] 36--66 37--38 37--67 38--39 38--68 39--40 39--69 40--41 40--70 41--42
## [81] 41--71 42--43 42--72 43--44 43--73 44--45 44--74 45--46 45--75 46--47
## [91] 46--76 47--48 47--77 48--49 48--78 49--50 49--79 50--51 50--80 51--52
## + ... omitted several edges
Vamos guardar a lista de Arestas de g
arestas<-E(g)
Para criarmos o modelo de percolação de arestas. Escolheremos uma uniforme em cada aresta.
Atribuindo uma uniforme a cada aresta:
arestaspeso<-runif(length(arestas)/2, 0, 1)
E agora para cada \(p\) removeremos as arestas com peso menor que p
#Dado p escolher as com maior que p para remover
seleciona<-function(p){
arestas[arestaspeso<p]
}
Vamos plotar duas situações. Primeiro peso 0.4. Ou seja estamos removendo com probabilidade 0.4. Observe que o tamanho das componentes conexas são grandes.
plot(g-seleciona(0.4),layout=layou,vertex.label=NA,vertex.size=2,edge.color="red")
Agora peso 0.6. Ou seja estamos removendo com probabilidade 0.6
plot(g-seleciona(0.6),layout=layou,vertex.label=NA,vertex.size=2,edge.color="red")
Vamos fazer uma animação escolhendo pesos \(p=1/10, i=0,\dots,10\)
a<-saveGIF({
for (i in 0:10) plot(g-seleciona(i/10),layout=layou,vertex.label=NA,vertex.size=2,edge.color="red")
})
## Executing:
## convert -loop 0 -delay 100 Rplot1.png Rplot2.png Rplot3.png
## Rplot4.png Rplot5.png Rplot6.png Rplot7.png Rplot8.png
## Rplot9.png Rplot10.png Rplot11.png 'animation.gif'
## Output at: animation.gif