Entrada destacada

Distancia media de dos puntos en un cuadrado unitario

martes, 28 de enero de 2020

Frase Célebre de Jules Henri Poincaré

Las matemáticas son el arte de dar el mismo nombre a cosas distintas.
Nuestro objetivo no ha de ser encontrar parecidos y diferencias,
sino descubrir similitudes escondidas bajo discrepancias aparentes.

Jules Henri Poincaré

martes, 21 de enero de 2020

Juego de la Vida de Conway: Primera Parte



Es un autómata celular creado por el matemático británico John Horton Conway en 1970.

Se trata de un juego de cero jugadores, lo que quiere decir que su evolución está determinada por el estado inicial y no necesita ninguna entrada de datos posterior. El "tablero de juego" es una malla plana formada por cuadrados (las "células") que se extiende por el infinito en todas las direcciones. Por tanto, cada célula tiene 8 células "vecinas", que son las que están próximas a ella, incluidas las diagonales. Las células tienen dos estados: están "vivas" o "muertas" (o "encendidas" y "apagadas"). El estado de las células evoluciona a lo largo de unidades de tiempo discretas (se podría decir que por turnos). El estado de todas las células se tiene en cuenta para calcular el estado de las mismas al turno siguiente. Todas las células se actualizan simultáneamente en cada turno, siguiendo estas reglas:

Una célula muerta con exactamente 3 células vecinas vivas "nace" (es decir, al turno siguiente estará viva).
Una célula viva con 2 o 3 células vecinas vivas sigue viva, en otro caso muere (por "aislamiento" o "hacinamiento").
Patrones

Existen configuraciones iniciales que tienen comportamientos que se pueden clasificar como:
Vidas estáticas: formas que se estabilizan, son fijas.
Osciladores: formas que después de un número de evoluciones vuelven a ser ellas                              mismas.
Naves: patrones que reaparecen en otra posición.
Matusalenes: patrones que evolucionan sin estabilizarse, pero nunca se extinguen.
Cañones: patrones que lanzan continuamente naves espaciales.

En Mathematica

Primero definimos la función vecino[ , ] que cuenta la cantidad de células vivas alrededor de una célula. Aquí, la dificultad es la definición de los vecinos de una célula en el borde de la rejilla que se toma.

Clear[ca];
vecino[i_, j_] := 
 Piecewise[{{Sum[bb[[i + k, j + l]], {k, 0, 1}, {l, 0, 1}], 
     i == 1 && j == 1}, {Sum[
      bb[[i + k, j + l]], {k, -1, 0}, {l, -1, 0}], 
     i == cuadro && j == cuadro},
    {Sum[bb[[i + k, j + l]], {k, 0, 1}, {l, -1, 0}], 
     i == 1 && j == cuadro},
    {Sum[bb[[i + k, j + l]], {k, -1, 0}, {l, 0, 1}], 
     i == cuadro && j == 1}, {Sum[
      bb[[i + k, j + l]], {k, 0, 1}, {l, -1, 1}], 
     i == 1}, {Sum[bb[[i + k, j + l]], {k, -1, 0}, {l, -1, 1}], 
     i == cuadro}, {Sum[bb[[i + k, j + l]], {k, -1, 1}, {l, 0, 1}], 
     j == 1}, {Sum[bb[[i + k, j + l]], {k, -1, 1}, {l, -1, 0}], 
     j == cuadro}}, Sum[bb[[i + k, j + l]], {k, -1, 1}, {l, -1, 1}]] - bb[[i, j]]

Ahora, definimos la función ca[ , ], la cual aplica las reglas de evolución del juego.

ca[i_, j_] := 
 Module[{vec = 0}, vec = vecino[i, j]; 
  Piecewise[{{1, (bb[[i, j]] == 0 && 
        vec == 3) || (bb[[i, j]] == 1 && (vec == 2 || vec == 3))}, {0,bb[[i, j]] == 1 && (vec == 0 || vec == 1 || vec > 3)}, {0, (bb[[i, j]] == 0 && vec != 3)}}]]

Definimos cuadro como el tamaño de la rejilla cuadrada, y las formas iniciales de cada patrón.

cuadro = 40;
n = 1;
cero = Table[0, {i, cuadro}, {j, cuadro}];
bb1 = ReplacePart[
   cero, {{2, 2}, {3, 3}, {4, 1}, {4, 2}, {4, 3}, {12, 3}, {14, 3}, {15, 4}, {15, 5}, {15, 6}, {15, 7}, {14, 7}, {13, 7}, {12, 6}, {21,2}, {22, 3}, {22, 4}, {22, 5}, {22, 6}, {22, 7}, {21, 7}, {20,7}, {19, 6}, {19, 2}, {18, 4}} -> 1];
bb2 = ReplacePart[
   cero, {{3, 3}, {2, 4}, {2, 5}, {3, 6}, {4, 4}, {4, 5}, {3, 10}, {3,11}, {4, 10}, {4, 11}, {8, 11}, {9, 11}, {10, 12}, {10, 13}, {7,12}, {8, 13}, {9, 14}, {9, 3}, {8, 4}, {8, 5}, {9, 6}, {10, 3}, {10,6}, {11, 4}, {11, 5}, {18, 11}, {18, 12}, {17,11}, {16, 12}, {16, 13}, {17, 13}} -> 1];
bb3 = ReplacePart[
   cero, {{4, 4}, {4, 5}, {4, 6}, {5, 5}, {5, 6}, {5, 7}, {4, 12}, {4,13}, {4, 14}} -> 1];
bb4 = ReplacePart[
   cero, {{20, 20}, {20, 21}, {18, 21}, {19, 23}, {20, 24}, {20,25}, {20, 26}} -> 1];
bb5 = ReplacePart[
   cero, {{20, 20}, {20, 21}, {21, 21}, {21, 25}, {21, 26}, {21,27}, {19, 26}} -> 1];
bb6 = ReplacePart[
   cero, {{6, 1}, {6, 2}, {7, 1}, {7, 2}, {6, 11}, {7, 11}, {8, 11}, {5, 12}, {4, 13}, {4, 14}, {9, 12}, {9, 16}, {10, 13}, {10,14}, {5,16}, {6, 17}, {7, 17}, {8, 17}, {7, 15}, {7, 18}, {4, 21}, {5,21}, {6, 21}, {4, 22}, {5, 22}, {6, 22}, {3, 23}, {7, 23}, {2,25}, {3, 25}, {7, 25}, {8, 25}, {5, 35}, {5, 36}, {4, 35}, {4,36}} -> 1];
bb7 = Mod[Array[Binomial, {cuadro, cuadro}, 0], 2];

Generamos el Manipulate que corre el juego, podemos determinar el patrón inicial que vamos a considerar y con el botón Evolución hacer cambiar el juego a su siguiente estado, para cambiar de configuración inicial con el botón Limpiar se reinicia el juego.

gg = False;
Manipulate[If[n == 1, bb = aa]; m = Total[bb, 2]; 
 If[m == 0, gg = False]; If[gg, t = True; n++];
 If[t == True, bb = Table[ca[i, j], {i, cuadro}, {j, cuadro}]; 
  t = False;
  MatrixPlot[bb, Mesh -> False, Frame -> False], 
  MatrixPlot[bb, Mesh -> False, Frame -> False]], Text[
"Configuración Inicial"], {{aa, bb1, 
   "Motivo"}, {bb1 -> "Naves", bb2 -> "Estable", bb3 -> "Oscilador", 
   bb4 -> "Larga Vida 1", bb5 -> "Larga Vida 2", bb6 -> "Cañón", 
   bb7 -> "Sierpinski"}, ControlType -> SetterBar}, Text[""], 
 Text["Desarrollo del Juego"], 
 Button["Evolución", n++; gg = True; t = True, ImageSize -> 100], 
 Button["Parar", gg = False, 
  ImageSize -> 100], {{n, 1, "Número de Vida:"}, 
  Appearance -> Open}, {{m, 0, "Población:"}, Appearance -> Open}, 
 Button["Limpiar", n = 1; t = False; gg = False; aa = cero, 
  ImageSize -> 100]]





















Para aprender más sobre Mathematica ingrese aquí sitio de aprendizaje de Wolfram o en mi website ustamathematica.wixsite.com/basicas