Vida digital de Barricelli

Vida digital de Barricelli preview image

1 collaborator

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by everyone
Model was written in NetLogo 7.0.0 • Viewed 23 times • Downloaded 2 times • Run 0 times
Download the 'Vida digital de Barricelli' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


WHAT IS IT?

El programa simula en NetLogo el experimento de Nils Barricelli de 1953, que buscaba demostrar que la vida puede existir como un proceso puramente numérico. El programa crea un universo unidimensional, una larga línea de 1000 casillas, que se inocula con números aleatorios. De estos números surgen organismos digitales, definidos como secuencias de dígitos que ocupan posiciones contiguas y poseen una energía vital. A lo largo de generaciones sucesivas, estos organismos interactúan según reglas aritméticas simples que determinan relaciones de cooperación, competencia o parasitismo. Cuando acumulan suficiente energía, se replican copiando su secuencia genética con posibles mutaciones, lo que puede dar origen a nuevas especies. Los organismos que agotan su energía o envejecen mueren, liberando espacio. El ciclo se repite generación tras generación, registrando la evolución de la población y la diversidad de especies, con el objetivo de observar cómo la vida digital emerge espontáneamente de reglas simples, replicando los fenómenos de especiación, simbiosis y equilibrios puntuados que Barricelli documentó en sus experimentos originales con el ordenador MANIAC.

HOW IT WORKS

El programa comienza con una fase de configuración en la que se define el escenario principal: un universo unidimensional, representado como una larga línea de 1000 posiciones, cada una de las cuales puede albergar un número. Estos números, que en los experimentos originales de Barricelli iban del 0 al 9, son la materia prima de la que surgirá la vida digital. En este espacio inicialmente vacío, donde todas las casillas contienen el valor cero, se procede a una inoculación controlada: se siembran números aleatorios en ciertas posiciones según una probabilidad definida. A partir de estas semillas numéricas, el algoritmo identifica aquellas que pueden agruparse para formar los primeros organismos. Cada organismo queda representado visualmente en la interfaz de NetLogo como un pequeño círculo de color.

Una vez que el universo ha sido poblado con estos organismos primigenios, se inicia un bucle que se repite generación tras generación. En cada ciclo, los organismos interactúan primero entre sí según las reglas que Barricelli postuló. Cuando dos organismos diferentes ocupan posiciones vecinas, sus valores numéricos se comparan y se desencadenan consecuencias: si los números son complementarios, ambos se benefician y ganan energía, emulando una relación de cooperación o simbiosis; si los números son idénticos, compiten y ambos pierden energía; y si existe una relación de divisibilidad, se establece un vínculo parasitario en el que uno de ellos se debilita, transfiriendo su vitalidad al otro.

A continuación, aquellos organismos que han acumulado suficiente energía gracias a las interacciones previas intentan replicarse. El programa examina el entorno de cada organismo en busca de espacios vacíos adyacentes y, si los encuentra, procede a crear un descendiente. La replicación implica copiar la secuencia genética del progenitor, aunque no de forma perfecta: existe una probabilidad de que durante la copia se produzcan mutaciones y dando lugar a una nueva variante o especie.

Para mantener el equilibrio y evitar una acumulación sin control, el programa ejecuta una fase de limpieza al final de cada ciclo. Se revisan todos los organismos y aquellos cuya energía ha caído a cero, o que han alcanzado una edad máxima sin lograr replicarse, son eliminados.

HOW TO USE IT

El botón setup es el encargado de la inicialización. Su tarea es preparar el universo para el experimento. Primero, limpia cualquier estado previo y reinicia el reloj de la simulación. A continuación, define los parámetros fundamentales, como el tamaño del universo (una línea de 1000 posiciones), el rango de valores numéricos que pueden existir (por ejemplo, del 0 al 9) y las probabilidades que gobernarán la aparición de vida y las mutaciones. Luego, crea la estructura de datos que representa el universo: un array unidimensional donde cada celda almacena un número, inicializado todo en cero. El paso más importante de setup es la inoculación: recorre el universo y, siguiendo una probabilidad definida, coloca números aleatorios en ciertas posiciones. A partir de esas semillas numéricas, identifica aquellas que pueden agruparse en secuencias y crea los primeros organismos, representados como "tortugas" en NetLogo. Cada organismo recibe una secuencia genética, una posición inicial, una reserva de energía y un color que lo identifica visualmente. Al finalizar setup, el universo ya no está vacío: contiene una población inicial de organismos digitales listos para comenzar su evolución.

El botón go es el corazón del programa y contiene el bucle principal de la simulación. Cada vez que se ejecuta, representa el paso de una generación. Su estructura es secuencial y está dividida en fases que reflejan los procesos biológicos que Barricelli observó. Primero, los organismos interactúan entre sí: se examinan las posiciones vecinas y, según los valores numéricos que encuentren, se aplican reglas de cooperación, competencia o parasitismo, lo que modifica sus niveles de energía. A continuación, los organismos con energía suficiente intentan replicarse, buscando espacios vacíos adyacentes para crear descendencia, copiando su secuencia genética con posibles mutaciones. Luego, se aplican procesos evolutivos adicionales, como mutaciones espontáneas o eventos de parasitismo que transfieren genes entre individuos. Después, se ejecuta una fase de limpieza que elimina a los organismos muertos (aquellos sin energía o demasiado viejos) y libera las posiciones que ocupaban. Finalmente, la rutina registra el estado actual (número de organismos y especies) para su posterior análisis y avanza el contador de tiempo. El programa verifica si aún hay organismos vivos; si no los hay, la simulación se detiene. En esencia, mientras setup siembra la vida, go la pone a prueba, generación tras generación, permitiendo que la evolución digital se despliegue por sí misma.

THINGS TO NOTICE

Con la gráfica y los monitores se puede observar la evolución de la población, la cantidad de organismos, el número de generación, el número de especies y la cantidad promedio de energía de todos los organismos.

NETLOGO FEATURES

El entorno gráfico, tradicionalmente cuadrado de NetLogo, se modifica en un rectángulo para ser más fieles al modelo original de Barricelli.

CREDITS AND REFERENCES

Diego Díaz Córdova Cátedra Informática Escuela de Nutrición Universidad de Buenos Aires

Desarrollado con ayuda de DeepSeek Bibliografía:

Barricell, N. A. (1972). Numerical testing of evolution theories. Journal of Statistical Computation and Simulation, 1(2), 97-127. https://doi.org/10.1080/00949657208810008

Dyson, George. (2015). La catedral de Turing / Los Org̕enes Del Universo Digital / the Origins of the Digital Universe. Debate Editorial.

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

EXTENSIONS [array]  ; Para manejar secuencias de genes

GLOBALS [
  ; Parámetros del universo
  universo          ; Array unidimensional que contiene todos los números
  organismos        ; Lista de organismos vivos
  generacion        ; Contador de generaciones
  historia-evolutiva ; Registro para análisis posterior
  tamano-universo ;;longitud de la linea que forma el universo
  rango-numerico ;;0 a 9
  prob-mutacion ;;prob mutacion
  prob-inoculacion ;; densidad incial de organismos
]

turtles-own [
  tipo-organismo    ; Identificador del tipo (especie)
  secuencia-genetica ; Lista de números que forman el organismo
  posiciones        ; Posiciones que ocupa en el universo
  energia           ; Capacidad de replicación
  edad              ; Tiempo de vida
  padre             ; Quién lo creó
]

to setup
  clear-all
  reset-ticks
  
  ; Parámetros configurables
  set tamano-universo 1000  ; Longitud de la línea numérica
  set rango-numerico 9       ; Números del 0 al 9 (como Barricelli)
  set prob-mutacion 0.01     ; Probabilidad de mutación al replicar
  set prob-inoculacion 0.1   ; Densidad inicial de organismos
  
  ; Inicializar el universo vacío (todos ceros)
  set universo array:from-list n-values tamano-universo [0]
  
  ; Inicializar lista de organismos vacía
  set organismos []
  
  ; INOCULACIÓN INICIAL
  ; Barricelli usaba números aleatorios generados con cartas
  inocular-universo
  
  ; Registrar estado inicial
  set historia-evolutiva []
  actualizar-historia
end 

to inocular-universo
   ; Recorrer el universo y colocar semillas de vida
  let posicion 0
  repeat tamano-universo 
  [
    set posicion posicion  ; ? es el contador implícito
    if random-float 1.0 < prob-inoculacion ;oribabilidad del 50% de inocular
    [
      ; Crear un número aleatorio entre 1 y rango-numerico
      let valor (1 + random rango-numerico)
      
      ; Colocar el valor en el universo
      array:set universo posicion valor
      
      ; Determinar si este número es parte de un organismo
      ; Un organismo es una SECUENCIA de números que se replican juntos
      if (random 2 = 0) 
      [
        ; Crear un nuevo organismo
        crear-organismo-desde-semilla posicion valor
      ]
    ]
    set posicion (posicion + 1)
  ]
end 

to actualizar-historia
   ; Registrar datos para análisis
  let num-especies length remove-duplicates [tipo-organismo] of turtles
  let num-organismos count turtles
  
  set historia-evolutiva lput (list generacion num-organismos num-especies) historia-evolutiva
end   

to crear-organismo-desde-semilla [posicion valor-inicial]
  ; Un organismo comienza como una secuencia corta
  let longitud-minima 3
  let longitud-maxima 7
  
  ; Decidir la longitud de este organismo
  let longitud-genoma longitud-minima + random (longitud-maxima - longitud-minima + 1)
  
  ; Generar la secuencia genética
  let nueva-secuencia []
  repeat longitud-genoma [
    ; Si es la primera posición, usar valor-inicial
    ; Si no, generar un número relacionado (herencia con mutación)
    let nuevo-valor 0
    ifelse (length nueva-secuencia = 0) [
      set nuevo-valor valor-inicial
    ] [
      ; El valor se hereda del anterior con posible mutación
      let valor-anterior last nueva-secuencia
      ifelse random-float 1.0 < prob-mutacion [
        set nuevo-valor 1 + random rango-numerico
      ] [
        ; Regla de herencia: variaciones del anterior
        set nuevo-valor ((valor-anterior + (random 3) - 1) mod (rango-numerico + 1))
        if nuevo-valor = 0 [set nuevo-valor 1]  ; Evitar ceros
      ]
    ]
    set nueva-secuencia lput nuevo-valor nueva-secuencia
  ]
  
  ; Crear la tortuga (organismo)
  create-turtles 1 [
    set tipo-organismo random 1000  ; Identificador único
    set secuencia-genetica nueva-secuencia
    set posiciones (list posicion)
    set energia length nueva-secuencia * 10
    set edad 0
    set padre -1  ; Organismo primordial
    
    ; Colocar los genes en posiciones consecutivas
    let offset 0
    foreach nueva-secuencia [
      let gen-pos posicion + offset
      if gen-pos < tamano-universo [
        array:set universo gen-pos posicion
        set posiciones lput gen-pos posiciones
      ]
      set offset offset + 1
    ]
    
    ; Añadir a la lista global
    set organismos lput self organismos
    
    ; Visualizar en NetLogo (opcional)
  
    setxy posicion 0
    ;;setxy (posicion mod 50) (floor (posicion / 50))
    set shape "circle"
    set color tipo-organismo mod 140 + 5
    ;set color scale-color (item (random 3) [red blue green]) tipo-organismo 0 1000
    ; set color scale-color blue energy 0 100 
    set size 0.8
    ;if color = red
    ;  [set shape "circle"]
    ;if color = blue
    ;  [set shape "triangle"]
    ;if color = green
    ;  [set shape "square"]
  ]
end 

to go
  ; Cada tick representa una generación
  set generacion generacion + 1
  
  ; FASE 1: INTERACCIÓN Y SELECCIÓN
  ; Los organismos interactúan según sus valores
  interaccion-organismos
  
  ; FASE 2: REPLICACIÓN
  ; Los organismos intentan replicarse
  replicacion-organismos
  
  ; FASE 3: MUTACIÓN Y PARASITISMO
  ; Mutaciones espontáneas y relaciones parasitarias
  procesos-evolutivos
  
  ; FASE 4: LIMPIEZA
  ; Eliminar organismos muertos o inviables
  limpieza-universo
  
  ; FASE 5: REGISTRO
  actualizar-historia
  
  tick
  
  ; Detener si no hay organismos
  if length organismos = 0 [stop]
end 

to interaccion-organismos
  ; En el modelo de Barricelli, los números interactúan
  ; cuando están cerca en el universo
  
  foreach organismos [ org ->
    ask org [
      ; Examinar vecinos cercanos en el universo
      let mi-posiciones [posiciones] of org
      
      foreach mi-posiciones [ pos ->
        ; Revisar posiciones adyacentes
        foreach (list (pos - 1) (pos + 1)) [ vecino-pos ->
          if vecino-pos >= 0 and vecino-pos < tamano-universo [
            let valor-vecino array:item universo vecino-pos
            let valor-local array:item universo pos
            
            if valor-vecino > 0 and valor-vecino != valor-local [
              ; Hay interacción! (organismos diferentes)
              
              ; REGLA 1: Cooperación
              ; Si los valores son complementarios, ganan energía
              if (valor-local + valor-vecino = rango-numerico + 1) [
                set energia energia + 2
                ; El vecino también gana energía (difícil en NetLogo sin ask)
                ; En implementación real habría que manejar esto
              ]
              
              ; REGLA 2: Competencia
              ; Si los valores son iguales, compiten
              if valor-local = valor-vecino [
                set energia energia - 1
              ]
              
              ; REGLA 3: Parasitismo
              ; Si un valor es múltiplo del otro
              if (valor-local mod valor-vecino = 0) and valor-vecino > 1 [
                set energia energia - 2
                ; El parásito gana (se implementa en procesos-evolutivos)
              ]
            ]
          ]
        ]
      ]
      
      ; La energía no puede ser negativa
      if energia < 0 [set energia 0]
    ]
  ]
end 

to replicacion-organismos
  ; Los organismos intentan copiarse en espacios vacíos
  
  foreach organismos [ org ->
    ask org [
      ; Solo replicarse si hay suficiente energía
      if energia > 20 [
        ; Encontrar espacios vacíos cerca
        let espacios-libres []
        foreach [posiciones] of org [ pos ->
          foreach (list (pos - 1) (pos + 1)) [ offset ->
            let candidato pos + offset
            if candidato >= 0 and candidato < tamano-universo [
              if array:item universo candidato = 0 [
                set espacios-libres lput candidato espacios-libres
              ]
            ]
          ]
        ]
        
        ; Si hay espacio, replicarse
        if not empty? espacios-libres [
          let espacio-nuevo one-of espacios-libres
          
          ; Reproducción: copiar secuencia genética
          let nueva-secuencia []
          foreach secuencia-genetica [ gen ->
            let gen-hijo gen
            ; Mutación durante la copia
            if random-float 1.0 < prob-mutacion [
              set gen-hijo 1 + random rango-numerico
            ]
            set nueva-secuencia lput gen-hijo nueva-secuencia
          ]
          
          ; Crear organismo hijo
          hatch 1 [
            set tipo-organismo [tipo-organismo] of org  ; Misma especie
            set secuencia-genetica nueva-secuencia
            set posiciones []
            set energia 10
            set edad 0
            set padre [who] of org
            
            ; Colocar el nuevo organismo
            let offset 0
            foreach nueva-secuencia [
              let gen-pos espacio-nuevo + offset
              if gen-pos < tamano-universo [
                array:set universo gen-pos offset
                set posiciones lput gen-pos posiciones
              ]
              set offset offset + 1
            ]
            
            ; Registrar
            set organismos lput self organismos
            
            ; Visualizar
            ;;setxy (espacio-nuevo mod 50) (floor (espacio-nuevo / 50))
            setxy espacio-nuevo 0
            ;set shape "circle"
            set color [color] of org  ; Mismo color que padre
            set size 0.8
            ;if color = red
            ;   [set shape "circle"]
            ;if color = blue
            ;   [set shape "triangle"]
            ;if color = green
            ;   [set shape "square"]
          ]
          
          ; El padre gasta energía
          set energia energia - 15
        ]
      ]
    ]
  ]
end 

to procesos-evolutivos
  ; Mutaciones espontáneas y parasitismo
  
  ; MUTACIONES: Cambios aleatorios en genes
  
  
  
   foreach organismos [ org ->
    ask org [
      if random 100 < 5 [  ; 5% de probabilidad
        ; Verificar que las listas no estén vacías
        if not empty? secuencia-genetica and not empty? posiciones [
          
          ; Verificar que ambas listas tengan el mismo tamaño
          if length secuencia-genetica = length posiciones [
            
            let indice-mutar random length secuencia-genetica
            
            ; Verificar que el índice existe en ambas listas
            if indice-mutar < length secuencia-genetica and indice-mutar < length posiciones [
              
              let viejo item indice-mutar secuencia-genetica
              let nuevo 1 + random rango-numerico
              
              ; Actualizar secuencia genética
              set secuencia-genetica replace-item indice-mutar secuencia-genetica nuevo
              
              ; Obtener y verificar la posición a mutar
              let posicion-mutar item indice-mutar posiciones
              if posicion-mutar >= 0 and posicion-mutar < tamano-universo [
                array:set universo posicion-mutar nuevo
                
                ; Si hubo cambio, posible nueva especie
                if viejo != nuevo [
                  set tipo-organismo tipo-organismo + random 100
                ]
              ]
            ]
          ]
        ]
      ]
    ]
  ]
  
  ; PARASITISMO: Organismos que copian genes de otros
  foreach organismos [ org ->
    ask org [
      if random 100 < 3 [  ; 3% de prob
        ; Buscar organismos cercanos
        let candidatos []
        foreach [posiciones] of org [ pos ->
          foreach (list (pos - 2) (pos + 2)) [ offset ->
            let vecino-pos pos + offset
            if vecino-pos >= 0 and vecino-pos < tamano-universo [
              let valor-vecino array:item universo vecino-pos
              if valor-vecino > 0 [
                ; Encontrar a qué organismo pertenece
                foreach organismos [ posible-host ->
                  if member? vecino-pos [posiciones] of posible-host [
                    set candidatos lput posible-host candidatos
                  ]
                ]
              ]
            ]
          ]
        ]
        
        if not empty? candidatos [
          let host one-of candidatos
          ; El parásito copia un gen del host
          let gen-prestado one-of [secuencia-genetica] of host
          let indice-local random length secuencia-genetica
          
          ; Reemplazar gen local con gen del host
          set secuencia-genetica replace-item indice-local secuencia-genetica gen-prestado
          
          ; Actualizar universo
          let pos-local item indice-local posiciones
          array:set universo pos-local gen-prestado
          
          ; Energía transferida
          set energia energia + 5
          ; Al host le bajamos energía (simplificado)
          ; En NetLogo real habría que manejar esto con cuidado
        ]
      ]
    ]
  ]
end 

to limpieza-universo
  ; Eliminar organismos muertos (energía cero o muy viejo)
  let muertos []
  
  foreach organismos [ org ->
    ask org [
      set edad edad + 1
      
      ; Condiciones de muerte
      if energia <= 0 or edad > 50 [
        set muertos lput self muertos
      ]
    ]
  ]
  
  ; Eliminar los muertos del universo
  foreach muertos [ cada-muerto ->
    ; Limpiar sus posiciones en el universo
    ask cada-muerto [
      foreach posiciones [ p ->
        if p < tamano-universo [
          array:set universo p 0
        ]
      ]
    ]
    
    ; Eliminar la tortuga
    ask cada-muerto [ die ]
    
    ; Quitar de la lista de organismos
    set organismos filter [ o -> o != cada-muerto ] organismos
  ]
end 



There is only one version of this model, created 13 days ago by Diego Díaz Córdova.

Attached files

File Type Description Last updated
Vida digital de Barricelli.png preview Preview for 'Vida digital de Barricelli' 13 days ago, by Diego Díaz Córdova Download

This model does not have any ancestors.

This model does not have any descendants.