Skip to content

Naicriz/Cellular-Automata-Slimemold

Repository files navigation

🧬 Cellular Automata - Slime Mold Simulator

Asignatura: Grafos y Lenguajes Formales Universidad: Universidad Tecnológica Metropolitana Autor: Naicriz (isalazarjara@gmail.com) Versión: 1.0.0 Fecha: Junio 2025


📝 Descripción del Proyecto

Este proyecto implementa un autómata celular continuo que simula el comportamiento de organismos tipo slime mold (moho mucilaginoso). El sistema está diseñado con optimizaciones extremas para manejar grillas de hasta 1,000 x 1,000 células con renderizado en tiempo real a 60 FPS.

🎯 Objetivos

  • Implementar un autómata celular para la asignatura de Grafos y Lenguajes Formales
  • Demostrar comportamientos emergentes complejos a partir de reglas simples
  • Crear una herramienta interactiva

🧮 Fundamentos Teóricos

Tipo de Autómata Celular

  • Clasificación: Autómata Celular Continuo Bidimensional
  • Dimensionalidad: 2D (grilla cuadrada de 1000×1000)
  • Topología: Toroidal (bordes conectados - modo "wrap")
  • Estados: Valores continuos en el rango [0.0, 1.0]
  • Vecindario: Moore de radio 1 (8 vecinos + célula central)
  • Temporalidad: Síncrono (actualización simultánea)

Función de Transición

El autómata utiliza una función de activación sigmoidea invertida:

f(x) = -1/(0.89 * x² + 1) + 1

Aplicada después de una convolución con kernel:

kernel = [[ 0.8, -0.85,  0.8],
          [-0.85, -0.2, -0.85],
          [ 0.8, -0.85,  0.8]]

Interpretación Biológica

  • 0.0 - 0.15: Ausencia de organismo (negro/marrón oscuro)
  • 0.15 - 0.35: Sustrato nutritivo (marrón anaranjado)
  • 0.35 - 0.55: Organismo débil (naranja medio)
  • 0.55 - 0.75: Organismo activo (amarillo anaranjado)
  • 0.75 - 0.9: Organismo muy activo (amarillo brillante)
  • 0.9 - 1.0: Núcleo incandescente (amarillo-blanco)

🚀 Instalación y Ejecución

Requisitos del Sistema

  • Python: 3.13+
  • Sistema Operativo: macOS, Linux, Windows
  • Memoria RAM: 8GB+ recomendado
  • CPU: Multi-core recomendado

Dependencias Principales

pygame>=2.6.1      # Renderizado y interfaz gráfica
numpy>=2.1.0       # Operaciones numéricas
scipy>=1.15.3      # Convolución optimizada
numba>=0.61.2      # Compilación JIT

Instalación con Poetry (Recomendado)

# 1. Clonar el repositorio
git clone [URL_DEL_REPOSITORIO]
cd Cellular-Automata-slimemold

# 2. Instalar Poetry (si no lo tienes)
curl -sSL https://install.python-poetry.org | python3 -

# 3. Instalar dependencias
poetry install

# 4. Ejecutar la simulación
poetry run python app/main.py

Instalación con pip

# 1. Crear entorno virtual
python3.13 -m venv venv
source venv/bin/activate  # En Windows: venv\Scripts\activate

# 2. Instalar dependencias
pip install -r requirements.txt

# 3. Ejecutar simulación
python app/main.py

Ejecución con Tareas de VS Code

Si usas VS Code, puedes ejecutar las tareas predefinidas:

  • Ctrl+Shift+P → "Run Task" → "Run Slime Mold Simulation"

🎮 Controles de la Simulación

Controles Básicos

Tecla Función
SPACE ⏸️/▶️ Pausar/Reanudar simulación

Controles de Visualización

Tecla Función
M 📈 Mejor calidad de renderizado (menos FPS)

📊 Características Técnicas

Optimizaciones Implementadas

Compilación JIT con Numba

  • Speedup: 10-50x en funciones críticas
  • Paralelización: Uso automático de múltiples cores
  • Cache: Evita recompilación de funciones

Procesamiento Vectorizado

  • SciPy: Convolución optimizada en C
  • NumPy: Operaciones sobre arrays completos
  • In-place: Operaciones sin allocación extra de memoria

Renderizado Optimizado

  • Surface Caching: Reutilización inteligente de superficies
  • Frame Skipping: Saltar frames para mantener FPS
  • Render Scaling: Renderizado adaptativo (1:1 hasta 1:8)
  • Double Buffering: Prevención de flickering

Métricas de Rendimiento

Hardware Moderno (8+ cores, 16GB RAM):

  • Sin efectos: 60+ FPS estables
  • Con brillo: 45-60 FPS
  • Con partículas: 30-45 FPS

Hardware Limitado (4 cores, 8GB RAM):

  • Render scale 1:2: 45+ FPS
  • Render scale 1:4: 60+ FPS
  • Frame skip 2: Mejora significativa

🔬 Análisis Científico

Comportamientos Emergentes Observados

1. Propagación Radial

  • Expansión desde puntos de alta concentración
  • Velocidad: ~1-2 células por generación
  • Mecanismo: Función de activación favorece expansión

2. Formación de Redes

  • Conexión entre múltiples focos de actividad
  • Topología similar a grafos planares
  • Optimización natural de caminos

3. Bifurcación

  • División de ramas principales en secundarias
  • Ángulos predominantes: 45° y 90°
  • Inestabilidades locales amplifican perturbaciones

4. Competencia Territorial

  • Múltiples organismos compiten por espacio
  • Fronteras definidas y territorios estables
  • Dinámica similar a diagramas de Voronoi

Métricas de Análisis

# Ejemplos de métricas implementables
def analyze_system(grid):
    density = np.mean(grid)                    # Densidad total
    activity = np.mean(grid[grid > 0.5])      # Actividad promedio
    components = count_connected_components(grid > 0.3)  # Componentes
    entropy = spatial_entropy(grid)           # Entropía espacial
    return density, activity, components, entropy

📁 Estructura del Proyecto

Cellular-Automata-slimemold/
├── app/
│   ├── __init__.py
│   └── main.py                 # Código principal del autómata
├── .vscode/
│   └── tasks.json              # Tareas de desarrollo
├── pyproject.toml              # Configuración Poetry
├── poetry.lock                 # Lock de dependencias
├── requirements.txt            # Dependencias pip
├── README.md                   # Este archivo
└── .gitignore                  # Archivos ignorados por Git

🌿 Flujo de Trabajo con Git

Configuración Inicial

  1. Configura tu información de Git (solo la primera vez):
git config --global user.name "Tu Nombre"
git config --global user.email "tu.email@ejemplo.com"

Creación de Branches

Usamos la siguiente convención para nombrar branches:

# Para nuevas funcionalidades
git checkout -b funcionalidad/nombre-de-la-funcionalidad

# Para corrección de errores
git checkout -b correccion/descripcion-del-error

# Para mejoras
git checkout -b mejora/descripcion-de-la-mejora

# Para documentación
git checkout -b docs/descripcion-de-la-documentacion

# Ejemplos:
git checkout -b funcionalidad/login-sistema
git checkout -b correccion/error-formulario-contacto
git checkout -b mejora/optimizar-rendimiento
git checkout -b docs/actualizar-readme

Flujo de Commits

1. Antes de hacer cambios

# Asegúrate de estar en la rama correcta
git checkout core
git pull origin core

# Crea tu nueva rama
git checkout -b funcionalidad/mi-nueva-funcionalidad

2. Realizar cambios y commits

# Agregar archivos específicos
git add archivo1.tsx archivo2.ts

# O agregar todos los cambios
git add .

# Commit con mensaje descriptivo
git commit -m "tipo: descripción clara de los cambios"

3. Convención de Mensajes de Commit

Usamos la siguiente estructura:

tipo: descripción breve

[descripción más detallada si es necesaria]

Tipos de commit:

  • nuevo: Nueva funcionalidad
  • corrige: Corrección de errores
  • docs: Cambios en documentación
  • estilo: Cambios de formato (espacios, comas, etc.)
  • refactor: Refactorización de código
  • test: Agregar o modificar tests
  • config: Cambios en build, dependencias, etc.

Ejemplos:

git commit -m "nueva: agregar formulario de login"
git commit -m "corrige: corregir validación de email en registro"
git commit -m "docs: actualizar README con instrucciones"
git commit -m "estilo: formatear código con prettier"
git commit -m "refactor: reorganizar componentes de usuario"
git commit -m "test: agregar pruebas para formulario"
git commit -m "config: actualizar dependencias de desarrollo"

4. Subir cambios al repositorio

# Primera vez que subes la rama
git push -u origin funcionalidad/mi-nueva-funcionalidad

# Siguientes pushes
git push

Integración de Cambios

1. Antes de hacer Pull Request

# Actualizar main(core) local
git checkout core
git pull origin core

# Volver a tu rama y rebasear
git checkout funcionalidad/mi-nueva-funcionalidad
git rebase core

# Si hay conflictos, resolverlos y continuar
git add .
git rebase --continue

# Subir cambios actualizados
git push --force-with-lease

2. Crear Pull Request

  1. Ve al repositorio en GitHub
  2. Crea un Pull Request desde tu rama hacia core
  3. Describe los cambios realizados
  4. Solicita revisión del equipo
  5. Espera aprobación antes de hacer merge

Comandos Útiles

# Ver estado de archivos
git status

# Ver historial de commits
git log --oneline

# Ver diferencias
git diff

# Cambiar de rama
git checkout nombre-de-rama

# Ver todas las ramas
git branch -a

# Eliminar rama local (después del merge)
git branch -d funcionalidad/mi-funcionalidad

# Eliminar rama remota
git push origin --delete funcionalidad/mi-funcionalidad

👥 Colaboración en Equipo

Reglas de Colaboración

  1. Nunca hacer push directo a core
  2. Siempre crear Pull Request para revisión
  3. Escribir commits descriptivos
  4. Mantener las ramas actualizadas con core
  5. Eliminar ramas después del merge
  6. Comunicar cambios importantes al equipo

Comunicación

  • Usa mensajes de commit claros y descriptivos
  • Comenta tu código cuando sea necesario
  • Documenta funcionalidades nuevas
  • Reporta errores o problemas en GitHub Issues

🧪 Experimentos Sugeridos

Para la Asignatura

1. Análisis de Parámetros

# Modificar el kernel en app/main.py línea 79-83
# Observar cambios en comportamiento

2. Métricas de Conectividad

# Implementar análisis de grafos sobre el patrón emergente
def analyze_connectivity(grid, threshold=0.5):
    binary_grid = grid > threshold
    # Aplicar algoritmos de teoría de grafos

3. Estudio de Convergencia

# Medir tiempo hasta estabilización
def convergence_analysis(initial_state):
    # Calcular métricas de estabilidad temporal

Variables de Experimentación

  • Tamaño de grilla: 100×100, 500×500, 1000×1000
  • Kernels alternativos: Diffusion, Edge detection, Custom

📚 Referencias Académicas

Autómatas Celulares

  • Von Neumann, J. (1966). "Theory of Self-Reproducing Automata"
  • Wolfram, S. (2002). "A New Kind of Science"
  • Toffoli, T. & Margolus, N. (1987). "Cellular Automata Machines"

Slime Mold y Bio-inspiración

  • Nakagaki, T. (2000). "Intelligence: Maze-solving by an amoeboid organism"
  • Adamatzky, A. (2010). "Physarum Machines: Computers from Slime Mould"
  • Tero, A. (2010). "Rules for biologically inspired adaptive network design"

Sistemas Complejos

  • Murray, J.D. (2003). "Mathematical Biology"
  • Cross, M.C. & Hohenberg, P.C. (1993). "Pattern formation outside of equilibrium"

🏆 Resultados de Aprendizaje

Competencias Desarrolladas

Grafos y Lenguajes Formales:

  • ✅ Implementación de autómatas celulares avanzados
  • ✅ Análisis de sistemas dinámicos discretos
  • ✅ Aplicación de teoría de grafos a sistemas emergentes
  • ✅ Comprensión de lenguajes formales en contexto biológico

Programación Científica:

  • ✅ Optimización computacional avanzada
  • ✅ Programación orientada a objetos
  • ✅ Visualización de datos científicos
  • ✅ Gestión de proyectos con Git

Pensamiento Computacional:

  • ✅ Modelado de sistemas complejos
  • ✅ Análisis de emergencia y auto-organización
  • ✅ Diseño de algoritmos eficientes
  • ✅ Validación experimental de modelos

📄 Licencia

Este proyecto está bajo la Licencia MIT. Ver archivo MIT para más detalles.


Proyecto desarrollado como parte del curso de Grafos y Lenguajes Formales - Junio 2025

About

Autómata celular continuo que simula comportamiento de organismos tipo slime mold (moho mucilaginoso)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages