Kedama: Un sistema para simulaciones multipartículas en Squeak/Etoys
Categorías: Squeak | Sistemas Multiagente |
1. Introducción
Kedama es un sistema de simulación multipartículas escrito en Squeak. Está presente desde las versiones 3.8 de Squeak, aunque algunos archivos image de Squeak no lo incluyen. Si ese es tu caso te recomendamos actualizarte a una versión más reciente del archivo image. En este documento veremos un ejemplo tradicional sobre kedama, como introducción, y enlaces a otros ejemplos que serán desarrollados más tarde.
Para mayor información se recomienda visitar:
Un wiki sobre Kedama con varios ejemplos y detallada documentación (en francés).
Microcoms "Un framework de simulación multiagente desarrollado en Squeak, [...] usado en el estudio de fenómenos emergentes en sistemas complejos." (Traducción libre de la página Web).
2. Más ejemplos
- Difusión de la cultura.
3. Introducción Al Uso
Supondremos que se han seguido correctamente las instrucciones de la página de introducción a Kedama hasta llegar a un estado como el que se muestra a continuación:
Ahora simularemos una epidemia en Kedama como un primer ejemplo clásico.
- Empezamos ubicándonos sobre la Tortuga y luego hacemos click en el visor, como se muestra en la figura:
Una vez allí, agregamos una variable a la tortuga, llamado "infectada" que sirve para determinar si la tortuga ha sido infectada o no. Para esto hacemos click en el botón de adicionar variables, al lado del nombre del objeto, tal como lo muestra esta figura:
- Ahora presionamos el menú al lado del nombre de la variable reciente agregada (véase la siguiente figura), lo cual nos permite definir varias propiedades de la variable y en general tener más control sobre ella. Establecemos que la variable es de tipo booleano.
Procedemos de modo análogo con el visor del mundo Kedama, pero en él adicionamos un contador llamado contadorInfectados.
Ubicados de nuevo en el visor de la tortuga 1 creamos un nuevo script (arrastrándolo desde la categoría scritps al mundo) y lo llamamos setup. Este script hace lo siguiente:
Limpia la variable patch (esa se arrastra desde el cuadrado negro más pequeño que representa al mundo).
- Aumenta el contador de tortugas hasta 1000, ubicándolas aleatoriamente.
- Configura un color de la tortuga por defecto (hemos escogido una especie de morado).
Coloca la variable "infectada" de la tortuga prototipo en falso.
Coloca la variable "contadorInfectados" del mundo Kedama en cero.
- Realiza una prueba sobre el contador de infectados comparándolos con cero (esta condición se cumple por los pasos anteriores).
Si la prueba es cierta cambia la variable "infectada" a verdadero, incrementa el contador de infectados del mundo en una unidad y cambia el color de la tortuga a amarillo (cualquier otro color diferente al de la tortuga por defecto funciona sin problema).
Si se presiona el signo de admiración amarillo este script se ejecuta una vez dejando el mundo configurado y listo para correr (todos los puntos morados normales y un sólo infectado amarillo).
Construimos otro script de modo similar al anterior, llamado infectar. Se verá como el siguiente:
La vista de código se puede (des)activar haciendo click en el cuadrado a la izquierda del script. Este es el código: infectar Patch clear. self doCommand: [:t1 | t1 forward: 2]. self doSequentialCommand: [:t1 | t1 getInfectada ~~ false ifTrue: [t1 setPatchValueIn: Patch to: 1]]. self doSequentialCommand: [:t1 | t1 getInfectada ~~ false ifFalse: [(t1 getPatchValueIn: Patch) > 0 ~~ false ifTrue: [t1 setInfectada: true. KedamaWorld setContadorInfectados: 1. t1 setColor: (Color r: 0.972 g: 0.972 b: 0.349)]]]- Si se hace click en el reloj el script empezará a ejecutarse y se verá como la epidemia empieza a expandirse, como se muestra acá:
- Y finalmente se tendrá algo como esto:
Analicemos más detenidamente el código del script infectar, pues esto nos permitirá entender como funciona la variable patch del mundo Kedama.
La variable patch del mundo Kedama es un lugar donde las tortugas "dejan una huella". El script infectar limpia primero dicho espacio, pero en caso de que haya una tortuga infectada, dicha tortuga deja un rastro en el patch cambiando su valor en una unidad (el código que dice turtle1's patchValueIn patch <- 1).
La segunda parte del código es una prueba sobre la variable turtle1's infectada, que es una variable boolena. Como entramos a la parte "No" de la prueba, el código se ejcutará cuando dicha variable esté en falso, es decir, cuando la tortuga no esté infectada, en ese caso se mira el rastro que las tortugas han dejado en el patch y si dicho rastro es mayor que cero (es decir, si pasó por allí una tortuga infectada) entonces la nueva tortuga que pase por allí se infectará también, incrementando el contador de infectados y cambiando el color de la tortuga, indicando que quedó contagiada.








