Ok, ahora vamos a escribir
el procedimiento completo de
competición por espacios.
Primero diremos si existe... tendremos
que pedirles a estas
tortugas que lo hagan. No pueden existir
dos tortugas en un mismo lugar.
Si eres una tortuga y compartes el espacio
con otra, mueres. Esa es una forma extrema
de sobre población.
Ahora necesitamos escribir una
condición para que las tortugas mueran
debido a la sobre población.
Necesitamos un parámetro
relacionado a la sobrepoblación.
Llamemos a ese parámetro: "Espacio".
Añadí aquí un deslizador llamado Espacio.
Sabemos que alrededor de cada tortuga
hay un entorno de ocho espacios,
Norte, Sur, Este, Oeste,
Noreste, Noroeste, etc.
Hicimos un deslizador que va de 1 a 8.
Voy a preguntar:
Podemos fácilmente contar las tortugas y
sus vecinos. Si el número de tortugas
sobre vecinos es ocho menos el número de
tortugas, eso debería dar el número de
espacios vacíos. Si estos son menos que
los que necesita para vivir,
entonces la tortuga tiene que morir.
Podemos configurar el espacio total con
un número de 1 a 8 espacios. Si la tortuga
necesita ocho espacios para vivir, va a
tener que estar muy poco poblado.
Puedes pensar en eso como un recurso que
restringe el crecimiento de esa población.
Voy a poner una nota aquí:
"Restricción al crecimiento de población".
Debemos añadir comentarios para que otros
puedan entender nuestro código.
Si regresamos luego, entenderemos
qué hace cada parte del código.
Ahora, tenemos que escribir
nuestro procedimiento "Dispersar".
Ese será nuestro último procedimiento.
Dispersar sólo pide a las tortugas que se
muevan a uno de los parches sin tortugas
aquí. Este lenguaje no
es muy obvio. Parece inglés cuando se lee,
pero ciertamente no es fácil
llegar a él cuando uno empieza a
programar. Este es uno de los ejemplos
que sirven para aprender a codificar.
Estamos hablando de parches, un
subconjunto de parches que cumplan esta
condición, sin tortugas aquí.
Si aquí hay un parche sin tortuga,
nos moveremos a uno de aquellos parches.
Sólo tenemos que hacer esto, un pequeño
truco aquí. Si les preguntasemos a
las tortugas que intenten hacer esto,
sin que hubiese ninguno de estos parches
disponibles, las tortugas pueden continuar
mirando, y este código nunca terminaría,
así que tenemos que añadir condiciones, y
sólo hacemos esto si hay parches.
Sólo hacemos esto si el número de tortugas
en la pantalla es menor o igual al
número de parches.
Podemos tener más tortugas que parches,
entonces no habría esperanza. El código
simplemente seguiría corriendo. No
sabríamos qué está pasando. Lo digo por
experiencia.
Creo que esto debería funcionar.
Ahora veremos si esta cosa funciona.
Todavía quedan algunas preguntas.
Establecimos una población grande.
Todavía tenemos estas cosas cambiando
de color. Borremos lo que añadí para
crear una dispersión artificial.
Parece que algo está ocurriendo.
No estoy seguro qué.
Obtengamos una densidad mayor.
Cuando damos en "Step", deberíamos tener,
si requerimos que necesiten mucho espacio,
veamos si resulta en una población
más chica, de hecho lo hace.
Con menor espacio, tenemos mayor densidad.
Me parece a mí que tenemos un modelo
que está funcionando bastante bien.
Veamos que ocurre aquí,
cuando miramos a la población.
Voy a hacer un gráfico simple.
Por defecto, se establece un gráfico
que cuenta las tortugas. Para obtener uno
que de hecho grafique algo, tenemos que
hacerle algo al modelo.
Esto ocurre por defecto cada
vez que tenemos un tic. Cada vez que
damos "step" veremos uno.
Esto nos dará un error sólo
la primera vez. Veamos que tipo de error
nos da si damos a "setup",
y luego damos "step".
Tenemos que usar este comando
"reestablecer tics" en el "Setup".
Reestablecer tics.
Así, "Setup", "Ok".
No estoy seguro de que eso es lo que
buscábamos. Intentemos con una
población menor y con mucho...
Veamos como funciona.
Población inicial 12.
¿Estoy haciendo esto correctamente?
Parece que la función de reproducción
no está funcionando.
Vamos a ver qué está pasando.
Inspeccionemos a esta tortuga.
320. Generación 13.
Les mostraré como depurar esto.
Vamos a comentar esto (apagamos "muerto"),
y veamos que pasa por un segundo. La
muerte no está ocurriendo dado que la
quitamos, deberíamos tener un crecimiento
exponencial. Hay algo con mi "competencia
por espacios". Comenten eso.
Supongo que todavía tenemos
el mismo problema.
Mmm... supuse mal.
Regresemos y veamos qué pasa aquí.
Esta es la regla que causa el problema.
Si hay cualquier otra tortuga aquí, muere.
Ok.. oh... ya veo el problema.
Deberíamos tener... esta regla aquí está
matando a la descendencia.
Necesito que la descendencia se disperse.
Así que, reproducimos y luego dispersamos.
Después competimos por el espacio.
Estos programas casi nunca funcionan
a la primera. Supongo que esto funciona.
Lo que hice es,
después de que te reproduces, dispérsate,
los padres de generación anterior mueren,
y luego la competencia por el espacio.
"Setup", "Step", crecimiento exponencial
y luego tenemos una estabilización.
No la estoy viendo..., "Step", "Step"...
Oh, no es lo que esperaba.
Eso es más como lo que esperaba.
Es como una curva sigmoidal.
Voy a competir por mucho espacio.
Crecimiento más lento y más variación.
Ok, creo que el modelo,
yo diría que este modelo está funcionando,
tenemos crecimiento exponencial, y luego
un tipo de estabilización. Me pregunto por
qué tenemos un tipo de configuración
congelada. Esas son la clase de preguntas
que pueden aparecer.
¿Por qué funciona de esa forma? Con
un procedimiento distinto
probablemente veríamos algo diferente.
Una de las cosas que me gustaría
cambiar es la dispersión, para hacerla más
realista. Hacerlos migrar de su ubicación
actual hasta que encuentren una nueva.
Eso sería un poco más de código, pero...
Creen nuevos colores
para ver diferentes familias en el tiempo.
Me parece un proyecto interesante.
Ok, finalmente, para cerrar el hueco.
Tenemos un botón "step", que pasa a través
de la ruta completa.
El botón "Go" puede ser un botón "Step"
con el atributo "para siempre" encendido.
Llamaremos esto, esto es importante
notarlo,
la visualización no tiene que ser
la misma que el comando, pero si no pones
el nombre de visualización, el comando es
usado como nombre de la visualización.
Tenemos un buen modelo con restricciones.
Bajo ciertos ajustes de espacio, hace un
buen trabajo modelando el crecimiento
exponencial y cierto tipo de redondeo a
una capacidad de carga.