Bien, ahora escribiremos el procedimiento "competir por espacio". Ante todo, esto involucra un par de condicionales... Vamos a "indicarle" a las tortugas hacer esto: Si existe alguna otra tortuga... aquí (en ése espacio), debe morir. Ésta es la forma extrema de sobrepoblación. Ahora tenemos que escribir un procedimiento para una condición en la que las tortugas morirán, debido a la sobrepoblación. Necesitamos establecer un parámetro que esté relacionado con la sobrepoblación. Llamemos a ése parámetro, "espacio". Añadí un "control deslizante" aquí, llamado "espacio". Sabemos que alrededor de cada tortuga, existe una vecindad de ocho espacios: Norte, Sur, Este, Oeste, Noreste, Suroeste, etc. Para ésos 8 "espacios", hicimos un "control deslizante" que va de 1 a 8. Voy a indicar..., podemos contar fácilmente las tortugas y los vecinos. Si el conteo de vecinos de las tortugas es ocho menos el conteo de tortugas...Ésto debería darnos el número de espacios vacíos. Si los espacios vacíos son menos que la cantidad de espacios que la tortuga necesita para vivir, indicamos a la tortuga que muera. Podemos establecer el espacio, seleccionando cualquier número de espacios entre 1 y 8. Si la tortuga necesita 8 espacios para vivir, el espacio va a ser muy poco poblado. Podemos pensar en esto como un recurso que restringe el crecimiento de esta población. Voy a hacer una nota aquí, "restricción para el crecimiento de población". Debemos agregar comentarios para que otras personas puedan entender nuestro código. Así, al volver a esto más tarde, podemos comprender qué hacen las partes del código. Ahora, tenemos que escribir nuestro "procedimiento de dispersión". Ése será nuestro último procedimiento. Para dispersar, sólo hay que indicar a las tortugas, que se muevan a uno de los "espacios" que no tienen alguna tortuga. Este lenguaje no es tan obvio..... Se lee bastante bien en Inglés, pero ciertamente no es fácil de dominar cuando se está comenzando a programar. Es bueno estudiar un "código de ejemplo", éste será un pedazo de "código de ejemplo", al cual estudiar para recordar todas estas palabras especiales y saber cómo funcionan. Esencialmente lo que estamos haciendo es: Estamos hablando de un "conjunto de agentes de espacios", un subconjunto de "espacios", los cuales cumplen esta condición: "ninguna tortuga aquí". Si el "espacio" no tiene tortugas en él, nos moveremos a uno de ésos "espacios". Tenemos que hacer una cosa un poco astuta aquí. Si indicáramos a las tortugas que trataran de hacer esto, y no hubiera algún "espacio" disponible, las tortugas podrían continuar intentando encontrar un "espacio", y esta parte del código nunca terminaría. Así, necesitamos añadir condiciones, para hacer esto sólo en caso de que haya "espacios". Entonces es importante correr esto, sólo si el número de tortugas en la pantalla, es menor que o igual al número de "espacios". Podríamos tener más tortugas que "espacios", entonces esto sería inútil, porque habría tortugas que nunca encontrarían "un hogar", el código seguiría corriendo y nosotros querríamos saber qué es lo que está pasando. Hablo en base a mi experiencia en esto. Creo que debería funcionar. Veamos si todo esto puede funcionar ahora. Todavía hay algunas preguntas. Creamos una gran población inicial. Todavía tenemos estas cosas cambiando de color. Borremos lo que he añadido para hacer una "dispersión artificial". Parece que algo está pasando. No estoy seguro qué. Corramos esto para conseguir una mayor densidad. Cuando "damos un paso", deberíamos tener... Si les requerimos que necesiten mucho espacio.., vamos a ver si esto se traduce en una población menos densa, de hecho lo hace. Al requerir menos espacio, se obtiene una mayor densidad. Me parece que tenemos un modelo que funciona aproximadamente. Vamos a ver lo que ocurre aquí, cuando nos concentramos en la población. Voy a hacer un gráfico sencillo aquí. De forma predeterminada, se establece un gráfico que cuenta las tortugas. Con el fin de obtener realmente la gráfica de interés, debemos hacerle algo al modelo. Esto sucederá de forma predeterminada, cada vez que efectuemos un "tick" (paso de tiempo). Cada vez que demos un paso, veremos un "tick". Esto nos va a dar un error la primera vez. Veamos qué tipo de error nos da. Si ejecutamos "configuración" y luego "paso". Observamos que debemos de utilizar el comando "restablecer instantes" en "configuración". "Restablecer instantes".... "configuración"...., bien. No estoy seguro de que éso era exactamente lo que queríamos, pero tratemos de comenzar con una población escasa que tiene un tipo generoso... Veamos si esto funciona. Población inicial 12. ¿Estoy haciéndolo bien? Parece que nuestra función de reproducción no está funcionando. Averigüemos qué está pasando aquí. Inspeccionemos esta tortuga. 320. Generación 13. Les muestro cómo depurar esto... Comentemos esto, veamos qué pasa. La muerte no está sucediendo, ya que deberíamos tener un crecimiento exponencial al haberla desactivado. Algo está pasando aquí, cuando "damos un paso",... Quisiera saber si ésta función ("competir por el espacio") está causando los problemas. Veamos... Hay algo acerca de mi "competencia por el espacio"... No creo que éso sea el problema... Comentemos sólo esta parte, no creo que ésto cause problemas. "Desactivemos" esta segunda regla en "competir por espacio". Supongo que todavía tendremos el mismo problema. Hmmm... Supuse mal. Volvamos a mirar aquí. Ésta es la regla que causa el problema. Si cualesquiera otras tortugas mueren aquí... Oh, veo el problema. Necesitamos tener ... Esta regla aquí está matando a las crías. Necesito tener esta descendencia "dispersa", antes de "competir por el espacio". Así, "reproducimos" y después "dispersamos". Luego "competimos por el espacio". Estos programas casi nunca funcionan bien fuera de la caja. Espero que esto funcione. Lo que he hecho es: reproducir, dispersar, ... los padres de la generación anterior mueren y, ... se compite por el espacio. Ahora activo que los padres mueran. Todos están activados, sólo he cambiado la ordenación. Así, "configuramos", "damos un paso", ahora tenemos crecimiento exponencial y obtenemos una especie de "nivelación". No estoy viendo la... reorganización. Paso, paso,..., paso..... Eh, no es lo que esperaba,... Éso se parece más a lo que esperaba. Es como una especie de curva sigmoidea. Voy a competir por una gran cantidad de espacio. Así, el crecimiento es más lento, y... hay más variación. Ok, creo que el modelo,... Yo diría que este modelo está funcionando, tenemos crecimiento exponencial y, a continuación, una especie de "nivelación". Algo curioso es: ¿porqué tenemos un tipo de "configuración congelada"? Éstos son el tipo de preguntas que pueden surgir cuando se construyen modelos. Nos preguntamos: ¿Por qué esto funciona de ésa manera? Si tuviéramos un procedimiento de dispersión diferente, probablemente veríamos algo más. Una de las cosas que me gustaría cambiar en este modelo es la cuestión de la "dispersión", para que sea físicamente más realista. En lugar de sólo tener tortugas que se mueven "mágicamente" a un espacio, porqué no hacer que emigren, que se muevan hacia adelante desde su ubicación actual, hasta que encuentren un espacio vacío. Sería un poco más de código, pero... valdría la pena. Podría crear patrones interesantes usando diferentes colores para ver a las diferentes familias, su migración y su éxito con el tiempo. Éso sería un proyecto muy cuidado. Bien, por último, para cerrar la brecha aquí,... Tenemos un "botón de paso", que pasa a través de una ruta completa aquí. El botón "Ir" puede ser un "botón de paso" que tiene encendido el atributo "por siempre". Debemos llamar a éste "Ir". Éste es un punto importante a notar, el nombre del botón no tiene que ser el mismo que el del comando, pero si no se pone el nombre del botón, el nombre del comando se utiliza como nombre del botón. Tenemos un buen y pequeño modelo que tiene restricciones. En ciertas configuraciones espaciales, hace... un buen trabajo de modelación del crecimiento exponencial y un tipo de redondeo a una capacidad de carga.