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.