Está en la página 1de 281

jhon.sn@live.

com 14 Jun 2017

Juan Carlos García Vázquez


Fernando Sancho Caparrini

NetLogo
Una herramienta de modelado
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

Este trabajo ha sido posible gracias al apoyo del Social Sciences and Humanities Research Council de
Canadá a través de una Major Collaborative Research Initiative de título "The Hispanic Baroque: Complexity
in the First Atlantic Culture" liderada por el Laboratorio CulturePlex, de la Universidad de Western Ontario
(London, Canadá).
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

A mí
El Observador

A los patches y los links, por ser nuestro soporte y romper nuestro aislamiento
Las Tortugas

A las tortugas, por alegrar nuestra parálisis con sus andanzas


Los Patches

A las tortugas, por ser nuestro principio y nuestro fin


Los Enlaces

A la tortuga que todos hemos tenido de niños


jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

Prólogo

Cuando hace un tiempo nos planteamos usar NetLogo para comple-


tar el desarrollo académico de nuestros alumnos lo hicimos sin duda
debido a los buenos resultados que a nosotros, en nuestra faceta de
investigadores, nos estaba proporcionando.
Nuestra experiencia de uso de este software ha sido tan diversa co-
mo el propio NetLogo permite: lo estamos usando desde hace años
en el proyecto ESTALMAT1 para fomentar en los niños una forma 1
Este proyecto, que recibe el nombre del
de afrontar problemas fundamentada en las soluciones algorítmicas acrónimo de EStimulación del TALento
MATemático, trata de detectar niños con
que un lenguaje de programación flexible puede ofrecer; en distin- capacidades para las matemáticas (que
tos cursos universitarios para introducir conceptos que cubren áreas se corresponden normalmente con capa-
cidades científicas en general) y estimu-
tan aparentemente dispares como son los sistemas complejos, inteli- larlos para que vayan aprendiendo los
gencia artificial, modelado biológico, modelado cultural, experimen- métodos, técnicas y estrategias matemá-
tación matemática y física, etc. y tanto en niveles de pregrado como ticas. Se puede encontrar más informa-
ción en http://thales.cica.es/estalmat/
de máster; en el proceso de modelar comportamientos complejos en
un ambiente de producción científica; para desarrollar herramientas
de análisis y representación de información compleja en proyectos de
humanidades digitales2 ; como prototipado de algoritmos para anali- 2
Todas estas aplicaciones se han dado
zar y predecir comportamientos socioeconómicos, etc. Y en todas estas dentro del proyecto Hispanic Baroque
(http://www.hispanicbaroque.ca/), financia-
experiencias, los resultados han sido absolutamente satisfactorios. do por el SSHRC de Canadá, y dirigido
El público que hemos tenido como alumnos en los diferentes cursos por Juan Luis Suárez, profesor de la Uni-
versidad de Western Ontario y director
y como colaboradores en los trabajos de investigación cubre áreas de del laboratorio CulturePlex, un centro de
conocimiento supuestamente dispersas e incompatibles: desde huma- estudios sobre complejidad cultural que
nistas que están interesados en el análisis de textos literarios, o mate- hace uso de un enfoque que se encua-
dra dentro de las Humanidades Digita-
máticos absortos en sus modelos abstractos, hasta ecólogos y biólogos les (http://cultureplex.ca/).
que se interesan por la evolución de una determinada población de
especies u organismos, o informáticos interesados en implementar un
algoritmo distribuido para comprobar su validez. Y en todos ellos he-
mos podido constatar que, tras un momento inicial de excepticismo
por el aspecto de "herramienta de juguete"que presenta, NetLogo les
permitía entablar una conversación directa con su problema, mitigan-
do en gran medida la dura realidad de que entre sus ideas y la pro-
yección de éstas en el ordenador debe haber un aparato artificial que
les obliga a formalizar su conocimiento de una forma completamente
nueva y ajena a ellos.
jhon.sn@live.com 14 Jun 2017

ii juan carlos garcía vázquez fernando sancho caparrini

Es quizás lo mejor que se puede decir de una herramienta de este


tipo: NetLogo se convierte en una fina capa, casi transparente, entre
el individuo y su materia de trabajo, y en poco tiempo puede pasar a
formar parte de sus herramientas habituales de forma natural.
Nuestro punto de vista queda confirmado por la gran variedad de
experiencias similares que encontramos en otros docentes e investiga-
dores. Netlogo es una de las pocas plataformas de desarrollo con un
rango tan amplio de usuarios, tanto por los niveles académicos que
cubren como por los fines que persiguen.
A nivel educativo, gracias a su proximidad al lenguaje natural, se
usó originalmente para enseñar conceptos básicos de programación a
niños y jóvenes de edades muy variadas; aunque este uso se sigue dan-
do en la actualidad podemos encontrar cada vez más cursos universi-
tarios y módulos de formación de nivel superior en los que se hace uso
de esta herramienta para introducir conceptos generales de modelado
y resolución de problemas en diversas áreas del conocimiento.
En el contexto de la investigación académica, lo encontramos en el
proceso de generar y verificar resultados de proyectos científicos, sien-
do cada vez más habitual encontrar referencias a su uso en artículos
académicos especializados.
A un nivel más profesional, existen multitud de casos en los que
NetLogo se ha usado como herramienta para validar experimentos
sobre proyectos reales, muchos de ellos en el área del modelado ecoló-
gico y de dinámica de grupos.
Sin duda, esta diversidad de usos nos da una idea de su versati-
lidad y potencia, a la vez que de su sencillez y adecuada curva de
aprendizaje.
A pesar de sus limitaciones frente a otros lenguajes más potentes
y de más bajo nivel, el programador que use Netlogo como sistema
de experimentación encontrará muchas ventajas durante el desarrollo
y mantenimiento de las soluciones que prepare en la plataforma. Pre-
3
Lutz Prechelt. Two Comparisons of chelt3 mostró que el número de líneas de código que un programador
Programming Languages. Andy Oram puede escribir por unidad de tiempo es independiente del lenguaje uti-
and Greg Wilson, editors, Making Softwa-
re: What Really Works, and Why We Believe lizado. En consecuencia, puesto que los lenguajes de bajo nivel, más
It. O’Reilly, 2010. rápidos y potentes, requieren mayor número de líneas para realizar la
misma tarea, la programación científica y orientada al descubrimiento
debería hacer uso de lenguajes del más alto nivel posible que sean ca-
paces de cubrir sus necesidades, y trasladarse a lenguajes más eficien-
tes, pero de desarrollo más costoso (como C++ o Fortran), únicamente
cuando exista la seguridad de que es imprescindible una mejora en el
rendimiento, traduciendo el modelo de un lenguaje a otro. Esta elec-
ción inicial permite escribir más código, y comprobarlo, en la misma
cantidad de tiempo, e incluso sabiendo que será necesario un lenguaje
de bajo nivel para la obtención de resultados finales, el prototipado
jhon.sn@live.com 14 Jun 2017

netlogo iii

rápido en un lenguaje de alto nivel como NetLogo puede ayudar a los


modeladores a evaluar decisiones de diseño más rápidamente, redu-
ciendo el tiempo total de desarrollo y mejorando el conocimiento del
problema. Así pues, la elección de NetLogo como herramienta de tra-
bajo y exploración para estudiantes e investigadores parece adecuada
y sólidamente justificada.
Sin embargo, cuando decidimos escribir nuestras experiencias con
NetLogo en forma de libro para ayudar a otros a introducirse en su
uso, nos dimos cuenta de que no bastaba con proyectarlas como una
sucesión de problemas y soluciones haciendo uso del lenguaje; apo-
yándonos en la experiencia que habíamos tenido en los años ante-
riores, decidimos que era necesario comenzar dando un paso atrás y
endrentarnos a la creación de una guía de programación para usua-
rios que, en muchos casos, no tenían experiencia en otros lenguajes de
programación4 . 4
A pesar de que el tutorial que ofrecen
De esta forma, hemos intentado escribir un ambicioso libro que pre- los creadores de NetLogo en su web es
muy completo y una ayuda imprescindi-
tende cubrir las necesidades del que se aproxima por primera vez a ble para todo usuario, nuestros alumnos
NetLogo, quizás sin ningún conocimiento previo de programación, y colaboradores demandaban un proce-
so más estructurado de aprendizaje.
quizás sin ningún conocimiento previo de modelado, y que a la vez
sea capaz de profundizar en detalles menos evidentes para aquellos
que ya han tenido contacto con esta herramienta. Esperamos haber
cumplido con nuestro propósito y no defraudar a ninguno de ellos.

Cómo está distribuido el libro

El libro dedica los primeros capítulos, aproximadamente del capí-


tulo 1 al 6, a una presentación introductoria de la herramienta, de los
conceptos en los que se basa y de los fundamentos de programación
necesarios para poder comenzar a desarrollar soluciones en ella.
Posteriormente, entre los capítulos 7 y 12, se introducen usos cada
vez más elaborados de sus capacidades, cubriendo todo el espectro de
funcionalidades que pueda requerir un proyecto de modelado habi-
tual.
La tercera parte del libro, entre los capítulos 13 y 15, se dedica a
detallar algunas características avanzadas de la herramienta, algunas
de ellas que serán de utilidad únicamente en casos concretos, pero que
es aconsejable conocer para expandir los límites de nuestra experiencia
con la herramienta.
Por último, cerramos el libro con un capítulo en el que se propo-
nen 8 proyectos completos que pueden ser desarrollados con NetLo-
go, similares a los que podemos encontrar en proyectos profesionales
y académicos, y que pueden ser ampliados por distintas vías.
A lo largo de cada capítulo el lector encontrará insertadas una serie
de actividades que tienen como objetivo ayudar a afianzar los concep-
jhon.sn@live.com 14 Jun 2017

iv juan carlos garcía vázquez fernando sancho caparrini

tos y métodos explicados hasta el momento y facilitar la comprensión


de los siguientes pasos del libro. Junto a estas actividades, en cada ca-
pítulo se propone un conjunto de ejercicios que pueden ser resueltos
haciendo uso de los recursos explicados en él (hasta un total de más
de 120 ejercicios).

Agradecimientos

Debemos iniciar los agradecimientos nombrando a Elena Varela, si


hay algo en este libro que merezca la pena ser leído se debe a su me-
ticuloso trabajo de revisar nuestra redacción. Todos los errores que se
puedan encontrar se deben sin duda a nuestra incapacidad para ex-
presar las ideas siguiendo sus consejos; su labor ha mejorado sin duda
el libro que tienes entre las manos, pero también nos ha enseñado lo
difícil y hermoso que puede llegar a ser escribir un texto en el que
la claridad de las ideas se fundamente en el buen uso del lenguaje.
Sin duda, este libro tendría una forma completamente distinta sin su
inestimable ayuda.
Por supuesto, queremos agradecer a Juan Luis Suárez (y los pro-
yectos que él dirige) por varias razones complementarias, porque es
un amigo que siempre nos apoya y motiva con problemas que merece
la pena abordar, y porque desde hace tiempo nos animaba a escribir
algo parecido a lo que finalmente ha sido este libro. No olvidamos que
quedamos en deuda con él (una deuda antigua que ahora crece) y le
recordamos desde estas páginas que tenemos pendiente el proyecto,
quizás continuación de éste, de mostrar las aplicaciones del modelado
con NetLogo al análisis de la cultura.
Queremos agradecer la participación de Judy Kerry en la traducción
inglesa del libro y las erratas (muchas) que ha ido encontrando en la
versión española en el proceso de traducción. Su paciencia a la hora
de enfrentarse al código fuente del libro (en LaTeX), a los textos en
español y a nuestra forma de trabajar parece no tener límites.
No podemos olvidar a los distintos lectores que han ido revisando
el libro en sus versiones preliminares, incluso cuando no era más que
unas páginas mal redactadas y sin un objetivo bien definido. De entre
ellos, aunque no olvidamos ninguno, queremos destacar los acertados
comentarios y los apoyos de Antonio Pérez, de la Universidad de Se-
villa, y de Marta Ginovart, de la Universidad Politécnica de Barcelona.
jhon.sn@live.com 14 Jun 2017

Índice de Contenidos

1 Un paseo por NetLogo. Antecedentes y entorno 1


Modelado y resolución de problemas 1
¿Qué es NetLogo? 5
Del Logo al NetLogo 6
Instalación y ejecución de NetLogo 8
Una visión rápida del entorno de trabajo 9
La Biblioteca de modelos 13
Recursos en la web 14
Ejercicios 15

2 Familiarizándonos con NetLogo 19


El mundo de NetLogo 19
Centro de Comandos 24
Contextos de ejecución 31
Ejercicios 34

3 Usando NetLogo como un Logo clásico. El caso de una sola tortuga. 37


La pestaña de código 37
Ampliando el lenguaje. Definición de procedimientos 38
La geometría de la tortuga frente a la geometría de coordenadas 43
Alguna estructuras básicas de programación 45
Ejercicios 52
jhon.sn@live.com 14 Jun 2017

4 Los protagonistas de NetLogo. Trabajando con múltiples agentes. 57


Actuando nada más nacer 57
Pidiendo a los agentes que realicen una acción 58
Eligiendo con precisión los agentes 60
El tiempo 63
Ejercicios 64

5 Agentes, procedimientos y modelos 69


Enriqueciendo las familias de agentes 69
Definiendo nuevas familias de agentes 71
Variables globales 73
Más sobre procedimientos 74
La estructura habitual de un modelo 78
Ejercicios 80

6 Creando el interfaz de uso. Controles, gráficas y documentación 83


Añadiendo elementos a la interfaz 83
Representando gráficas con el control Plot 89
Documentando el modelo 94
Ejemplos completos 96
Ejercicios 99

7 Descubriendo la potencia de NetLogo: Los Conjuntos de Agentes 103


Inspeccionando conjuntos de agentes 104
Reportes que devuelven agentes al azar 104
Conjuntos de patches 105
Conjuntos de tortugas 107
Mutabilidad e inmutabilidad de conjuntos de agentes 108
La conciencia en los agentes 109
Creando y destruyendo agentes según necesidad 111
Ejemplos completos 112
Ejercicios 120
jhon.sn@live.com 14 Jun 2017

8 Uso avanzado de listas 125


Recursión en listas 125
Filtrado de listas 127
Sistemas de ordenación en listas 128
Iteraciones sobre listas 129
Conjuntos de agentes y listas 130
Listas de propiedades de agentes 132
Obteniendo información de agentes 132
Creando nuevas estructuras de datos 134
Ejercicios 135

9 Interacción con el usuario. Manejo del ratón y sistemas de mensajes 139


Ventanas de diálogo 139
Conversiones y evaluaciones 141
Interacción con el ratón en el mundo 142
Ejercicios 146

10 Entrada y salida. Grabando el mundo, imágenes, videos y ficheros 149


Salida impresa 149
Importación y exportación 151
Grabación de películas 154
Lectura y escritura de ficheros 155
Ejercicios 158

11 Grafos/redes en NetLogo 161


¿Para qué puede servir un grafo? 161
Introducción a Teoría de Grafos 162
Representación de grafos en NetLogo 164
Cómo crear enlaces entre agentes 165
Representación visual de los grafos 169
Ejemplos completos 173
Ejercicios 176
jhon.sn@live.com 14 Jun 2017

12 Mezclando agentes móviles y redes 179


Teselaciones hexagonales 179
Usando grafos como soportes 182
Ejecución concurrente 184
Ejercicios 186

13 Saltando a la 3ª dimensión: NetLogo 3D 189


El entorno de trabajo de NetLogo 3D 189
El observador 190
Localización, orientación y navegación de las tortugas 191
Comandos 3D 192
Las formas de las tortugas 192
Geometría esférica 193
Geometría fractal 3D 194
Ejercicios 195

14 Herramientas adicionales: Applets, BehaviorSpace y HubNet 197


Applets 197
BehaviorSpace 198
Ejecución no gráfica 202
HubNet 202
Otras herramientas 203
Ejercicios 204

15 Extendiendo el lenguaje: Profiler, Sonido, SIG, Arrays y Tablas,... 207


Algunas extensiones desarrolladas por el equipo de NetLogo 208
Algunas extensiones desarrolladas por terceros 230
Un mundo de extensiones 240
jhon.sn@live.com 14 Jun 2017

16 Propuesta de proyectos 241


Procesos de evolución sobre redes 241
Sistemas de Lindenmayer (o sistemas-L) 243
Juego de la serpiente 245
Autómatas celulares 246
Modelo diseminación cultural 248
La regla de la mayoría y otras reglas de decisión 249
Problemas de tráfico 251
El dilema del prisionero 253

17 Epílogo 257

18 Índice de Términos 261


jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

1
Un paseo por NetLogo. Antecedentes
y entorno

Debemos iniciar este libro con una breve revisión de qué significa
modelar, del papel que juega en el proceso de experimentación y re-
presentación de fenómenos, y de la diferencia que puede suponer el
disponer de una herramienta adecuada para facilitar la transición del
mundo real en el que encontramos el problema al mundo formal en el
que podemos comprenderlo y, en el mejor de los escenarios, resolverlo.

Modelado y resolución de problemas

El conocimiento humano se basa principalmente en la observación


y el análisis de fenómenos del mundo real en su sentido más amplio:
desde las experiencias sensoriales del mundo natural, que abordan
las áreas aplicadas, hasta las conceptualizaciones más abstractas, ob-
jeto de las áreas teóricas. Sorprende que aun cuando la distancia que
separa algunos de los fenómenos es aparentemente insalvable, las me-
todologías empleadas para entender y predecir su comportamiento se
asemejen. A raíz de tal constatación se formaliza durante el siglo XVII
lo que conocemos como método científico; sus ventajas: asegura la ro-
bustez de las conclusiones obtenidas, puede ser aplicado a todas las
áreas de conocimiento (sobre todo a las ciencias) y es independiente
del tamaño del fenómeno observado. Aunque con variaciones según
el momento histórico y los objetivos, el método científico se desarrolla
en cuatro etapas:

observación: etapa en la que se examinan atentamente los hechos


jhon.sn@live.com 14 Jun 2017

2 netlogo

y fenómenos que tienen lugar en el mundo real y que pueden ser


percibidos por los sentidos y medidos;

formulación de hipótesis: en la que se elabora una explicación pro-


visional de los fenómenos observados y de sus posibles causas;

experimentación: en la que se reproduce y observa repetidas veces


el fenómeno objeto de estudio, modificando las circunstancias que
se consideren necesarias y confirmar así cuáles son las que provocan
su aparición;

tesis o generación de una teoría científica: en la que se interpretan


los fenómenos observados de acuerdo con los datos experimentales.

Si la hipótesis se descubre falsa, deberá refutarse tras aportar los


datos que la invalidan. Aumenta la probabilidad de éxito en buena
medida cuanto mayor es el número de ejemplos o casos que permiten
ilustrar el fenómeno estudiado. En muchas ocasiones, la experiencia se
alimenta mediante la observación y manipulación del fenómeno real;
en muchas otras, tal opción resulta físicamente imposible o desacon-
sejable, bien porque el fenómeno es inabarcable desde el punto de
vista temporal o espacial, bien porque se basa en conceptos no mani-
pulables, bien por razones éticas. Son precisamente los casos en que
la manipulación de la realidad para reconstruir y probar hipótesis es-
tá vetada, los que han obligado al investigador a valerse de réplicas o
modelos. Emplearemos en este libro la siguiente definición de modelo:

Un modelo constituye una representación abstracta de cierto aspecto de la reali-


dad, formada esencialmente por los elementos que caracterizan dicho aspecto de
la realidad y por las relaciones que mantienen esos elementos.

De entre todas las opciones para crear modelos, destaca una por su
eficacia: el modelado matemático. Se presenta bajo formas tan dispares
como las teorías matemáticas (basadas en sistemas de axiomas y de-
mostraciones, etc.), los modelos numéricos (basados en ecuaciones li-
neales, ecuaciones diferenciales, cálculo estocástico, etc.) o los modelos
computacionales (basados en sistemas de agentes y sus interacciones,
sistemas de partículas, algoritmos evolutivos, etc.) que se han desa-
rrollado espectacularmente en los últimos años debido a la capacidad
tecnológica emergente.
Bajo todas sus posibles formas, algunas de las ventajas que presenta
la construcción de los modelos matemáticos son:

1. el proceso de construcción de modelos revela con frecuencia rela-


ciones no evidentes a primera vista: el hecho de modelar suele ir
acompañado de una mejor comprensión del fenómeno que se está
representando;
jhon.sn@live.com 14 Jun 2017

un paseo por netlogo. antecedentes y entorno 3

2. una vez construido, es posible extraer propiedades y características


de las relaciones entre los elementos del modelo que de otra forma
permanecerían ocultas;

3. es posible simular situaciones complejas que no son representables


en otros tipos de modelos;

4. a menudo proporcionan una resolución del problema, aunque no


sea una solución analítica sino numérica, realizada por ordenador.

Los modelos se clasifican de muchas maneras en razón de la carac-


terística que se quiera destacar:

según la forma en que se representan los elementos del modelo,


podemos hablar de modelos icónicos, analógicos, simbólicos, etc.

según su función, de modelos predictivos, evaluativos, de optimi-


zación1 , etc.; 1
Los modelos predictivos informan del
comportamiento de sus parámetros en
un futuro. Los evaluativos intentan me-
según el tipo de realidad que quieren modelar, podemos hablar de
dir las diferentes alternativas, para po-
modelos deterministas frente a modelos estocásticos2 ; der comparar sus resultados. Y los mo-
delos de optimización tratan de identifi-
según el modo en que se representa el tiempo, distinguimos entre car un óptimo del problema, es decir, la
mejor de las alternativas posibles.
modelos estáticos y modelos dinámicos3 .
2
En los modelos deterministas la evo-
lución futura del modelo está comple-
En general, un buen modelo es aquel que se ajusta al fenómeno real tamente determinada por el estado ac-
de forma que nos permite comprender mejor sus propiedades y am- tual del mismo, mientras que en los esto-
cásticos esta evolución puede depender
pliar el conocimiento que tenemos de él. A lo largo de la experiencia de comportamientos aleatorios medibles
acumulada en diversas disciplinas que hacen uso del modelado como por medios estadísticos.
herramienta esencial, se han destacado las siguientes fases para cons- 3
No hay evolución temporal en los mo-
truir un buen modelo: delos estáticos y sí en los dinámicos.

1. A partir del fenómeno real, tras una fase de interpretación de las


observaciones pasamos a otra de formalización (haciendo uso de
algún lenguaje formal).
jhon.sn@live.com 14 Jun 2017

4 netlogo

2. Si el modelo que queremos conseguir tiene propiedades dinámi-


cas o admite un proceso de simulación que ayude a comprender
la realidad, procedemos a implementar dicha formalización en un
sistema que permita considerar este dinamismo.

3. Por último, y tras haber ejecutado simulaciones en el modelo, eva-


luamos los resultados obtenidos confrontándolos con los que se
pueden observar en el mundo real.

Debe tenerse en cuenta que lo normal no es realizar estos pasos


siguiendo un proceso lineal y directo, sino que se forma un ciclo de
vida en el que, por aproximaciones sucesivas, obtenemos una colección
de modelos cada vez más fieles (al menos, en las características que son
el foco de nuestra hipótesis) al fenómeno real.
Por su importancia como herramienta de investigación y teniendo
en cuenta las fases necesarias para conseguir un modelo correcto, no
cabe duda de que modelar es una actividad que se sitúa en el centro
del proceso de generación y obtención de conocimiento, tanto a nivel
4
Algo que no debe sorprender, ya que el educativo como a nivel de investigación4 : ser capaz de modelar un
proceso de investigación no es más que problema es una muestra de haberlo comprendido correctamente, a la
una continuación de un proceso educati-
vo, basado en el descubrimiento, y en el vez que la demostración de que se poseen las herramientas técnicas
que muchas veces la figura de maestro y necesarias para su representación en un sistema formal.
discípulo recaen en la misma persona.
El objetivo de este libro es proporcionar las bases necesarias para
disfrutar de la autonomía que permite generar modelos que ayuden
a plantear y verificar hipótesis plausibles. Veremos cómo Netlogo nos
brinda la gran ventaja de ofrecer en un solo bloque una herramien-
ta capaz de abordar prácticamente todo el proceso de modelado que
hemos expuesto.

Al tratarse de un lenguaje de programación, el proceso de imple-


mentación es natural en NetLogo; aunque, gracias al tipo de elementos
con los que trabaja, influirá también en el proceso de conceptualización
y formalización del fenómeno real. Las características de la plataforma
jhon.sn@live.com 14 Jun 2017

un paseo por netlogo. antecedentes y entorno 5

hacen que la primera parte del proceso se simplifique considerable-


mente; pero va más allá y nos permite evaluar los resultados de su
ejecución para poder compararlos con el mundo real por medio de la
generación automática de experimentos y su ejecución.

¿Qué es NetLogo?

La mejor definición de lo que puede ser esta herramienta la apor-


tan sus propios creadores5 que, como dicen en el manual online de 5
Fue creado en 1999 por Uri Wilensky y
NetLogo: ha estado en desarrollo ininterrumpido
desde entonces en el Center for Connected
Learning and Computer-Based Modeling, de
es un entorno de programación para la simulación de fenómenos la Universidad de Northwestern, Evans-
naturales y sociales. ton, Illinois.

es suficientemente simple para estudiantes y profesores, y suficien-


temente avanzado para que sirva de herramienta potente a investi-
gadores de muchas áreas.

permite a los usuarios cargar simulaciones y jugar con ellas, explo-


rando sus comportamientos bajo condiciones cambiantes. Y también
proporciona un entorno de desarrollo que permite a estudiantes,
profesores y creadores de currículos crear sus propios modelos.

es especialmente adecuado para el modelado de sistemas complejos


que evolucionan en el tiempo. El programador puede dar instruc-
ciones a cientos o miles de agentes6 que actúan independientemente, 6
Por ahora es suficiente con pensar en
lo que hace posible explorar las conexiones entre el comportamien- un agente como un individuo que es ca-
paz de trabajar de forma autónoma y
to de los individuos a nivel local (nivel micro) y los patrones que que interactúa con su entorno y otros
emergen de sus interacciones a nivel global (nivel macro). agentes.

representa a la siguiente generación de lenguajes de modelado mul-


tiagente7 , que incluyen, entre otros, a StarLogo y StarLogo TNG. 7
Multiagente significa que no trabaja con
un solo individuo, sino con un grupo de
tiene una extensa documentación y numerosos tutoriales. También ellos.

viene con la Biblioteca de Modelos, una gran colección de simu-


laciones predefinidas que pueden ser usadas y modificadas. Estas
simulaciones abordan contenido de áreas de las ciencias naturales
y sociales, incluyendo biología, medicina, física, química, matemáti-
cas, computación, economía y psicología social. Muchos currículos
basados en modelos desarrollados con esta herramienta están dis-
ponibles en la biblioteca, y hay más en desarrollo.
8
A través de una red de ordenadores
o haciendo uso de dispositivos móviles.
también puede ayudar a crear simulaciones participativas en clase
Actualmente únicamente soporta las cal-
con una herramienta llamada HubNet8 que trae incorporada, de culadoras gráficas de Texas Instruments
forma que cada estudiante puede controlar uno de los agentes en como ejemplo de dispositivo móvil, pero
está en marcha su adaptación a tabletas
una simulación. y smartphones.
jhon.sn@live.com 14 Jun 2017

6 netlogo

se ejecuta en una máquina virtual Java (JVM), por tanto, funciona


en todas las plataformas principales (Mac, Windows, Linux, y otras).
Se puede ejecutar como una aplicación independiente, pero los mo-
delos diseñados en él también pueden ejecutarse como applets de
Java en un navegador web. También permite trabajar por medio de
la línea de comandos y por manipulación directa desde otros len-
guajes de programación y/o herramientas, ya que proporciona una
interfaz de comunicación para su manejo a bajo nivel.

Además, se debe añadir que en la actualidad NetLogo es un pro-


yecto de software libre que está siendo mantenido por una comunidad
creciente, liderada por Seth Tisue, con un proceso de evolución conti-
nuo y en el que hay un gran trabajo colaborativo a todos los niveles
(desde la creación de modelos para el resto de la comunidad hasta
la creación de extensiones o actualizaciones del núcleo de la aplica-
ción). En el momento de la creación de este libro su código y planes
9
https://github.com/NetLogo de trabajo se pueden encontrar en un repositorio de Github9 .

Del Logo al NetLogo

Logo es un lenguaje de programación de alto nivel que nació en los


años 60, basado en Lisp, y de muy fácil aprendizaje, por lo que ha
sido usado durante mucho tiempo como primera aproximación para
mostrar los principios de programación a niños y jóvenes (figura 1.1).
Sin embargo, a pesar de estas intenciones didácticas, no debemos
Figura 1.1: Implementación hardware de creer que es un lenguaje pobre, ya que dispone de todas las caracterís-
una tortuga para dibujar. ticas necesarias para poder practicar e implementar todos los concep-
10
Como son: recursión, estructuras avan- tos usuales de programación funcional avanzada10 .
zadas de datos, funciones de orden su- Sin duda, una de las características más reconocibles de Logo es su
perior (es decir, funciones que operan so-
bre funciones), etc. capacidad para manejar unos pequeños objetos gráficos que permiten la
realización de figuras geométricas por medio de instrucciones básicas,
y que, como podemos ver en la figura 1.1, incluso a veces han tomado
forma física.

Aunque realmente hablamos de Logo como un lenguaje, se corres-


ponde con una familia de lenguajes similares entre sí y no hay una
definición estándar del mismo. NetLogo comparte suficientes caracte-
rísticas con esta familia de lenguajes como para ser considerado uno
jhon.sn@live.com 14 Jun 2017

un paseo por netlogo. antecedentes y entorno 7

más de ellos, aunque con algunas diferencias importantes que detalla-


mos en los siguientes puntos11 : 11
Si no has sido usuario de Logo en al-
guna de sus versiones puedes saltar di-
La precedencia de los operadores matemáticos es diferente. Los ope- rectamente a la sección siguiente, y es-
perar a más adelante, cuando sepas algo
radores infijos (aquellos que se escriben entre los operandos, como de NetLogo, para volver aquí.
+, *, etc.) tienen menor precedencia que las funciones con nombre.
Por ejemplo, sin x + 1 = (sin x) + 1. 12
Con el operador or, en cuanto se en-
cuentra un argumento cierto, no evalúa
Las funciones and y or son funciones especiales que cortocircuitan
los demás porque el resultado global es
el cálculo, lo que quiere decir que evalúan el segundo argumento cierto. Con el operador and, en cuan-
únicamente si es necesario12 . Esta característica hace que la evalua- to se encuentra con un argumento falso,
no evalúa los demás porque el resultado
ción de cadenas de condicionales sea más eficiente. global es falso.

Solo se pueden definir procedimientos en la pestaña de Código, y


no de forma interactiva en el Centro de Comandos. En los siguien-
tes capítulos profundizaremos en estos dos elementos.

Las funciones que devuelven valores deben ser definidas con la pa-
labra clave to-report, y en estos casos, el comando para devolver
un valor ha de ser report.

Al definir un procedimiento que admite parámetros de entrada, és-


tos deben estar encerrados entre corchetes.

Los nombres de las variables siempre deben ser elegidos comen-


zando sin signos de puntuación, por lo que no son válidos los usos
:var o "var tan comunes en otros Logos.

Las variables locales y las entradas de los procedimientos se veri-


fican léxicamente, no dinámicamente (es decir, si hay un error, se
marca antes de la ejecución). 13
Por ejemplo, lo que en Logo sería [una
frase] (una lista de palabras), debería
NetLogo no tiene el tipo de dato word (también llamados símbolos),
ser en NetLogo “una frase” (una cade-
pero tiene el tipo string (cadena)13 . na) o bien [“una” “frase”] (una lista de
cadenas).
Las Tasks (o funciones lambda14 ) proporcionan una característica 14
Una función lambda es una función
novedosa que ya es habitual en los lenguajes Lisp modernos, pero anónima, a la que no se le pone nombre,
y que puede ser tratada como cualquier
no en los Logos clásicos. otro dato del programa.

Las estructuras de control, como if o while, son formas especiales,


y no funciones ordinarias. Las formas especiales no se pueden defi- 15
Parte de esta funcionalidad se puede
conseguir por medio de las tasks, como
nir, por lo que no se pueden crear nuevas estructuras de control15 .
veremos más adelante.
El comando run de NetLogo actúa sobre tasks y cadenas, pero no
sobre listas, y no permite la definición ni redefinición de procedi-
mientos.

Y, desde luego, NetLogo nos ofrece una capacidad fundamental que


no se encuentra en la mayoría de los otros lenguajes de la familia Lo-
go: trabaja directamente con agentes y es capaz de diferenciar familias
jhon.sn@live.com 14 Jun 2017

8 netlogo

de agentes para diseñar comportamientos individualizados para cada


familia.

Instalación y ejecución de NetLogo

Gracias a que NetLogo se ejecuta en la máquina virtual de Java, y


que admite la posibilidad de grabar los modelos como applets de Java
(obsoleto), hay dos formas de ejecutarlos:
1. Tener el programa instalado y abrir el modelo desde la aplicación.

16
Además de las propias restricciones 2. Por medio de un navegador web accediendo (en local o en un ser-
impuestas por medidas de seguridad en
vidor en internet) al fichero asociado al applet. Esta modalidad pre-
la ejecución de applets, algunas extensio-
nes pueden no funcionar en modo ap- senta algunas limitaciones si se quiere hacer uso de funcionalidades
plet. especiales16 , pero admite la casi totalidad de ejemplos habituales.

A pesar de que ambas son válidas para la ejecución interactiva de


los modelos y su uso del interfaz, hay notables diferencias entre ellas.
jhon.sn@live.com 14 Jun 2017

un paseo por netlogo. antecedentes y entorno 9

La más llamativa es que, mientras que en la ejecución del applet solo


se puede acceder a la vista del interfaz del modelo (y, por tanto, no se
pueden introducir modificaciones), en la ejecución desde el programa
completo no sólo se accede a esta vista interactiva, sino que se puede
acceder a la pestaña de código (que permite modificar el modelo) y
a las herramientas adicionales que se proporcionan en la aplicación y
que veremos brevemente en este mismo capítulo.
En realidad, existe una tercera forma de ejecutar los modelos de
NetLogo, o incluso de operar con él, que es lo que se conoce como
ejecución headless, que no carga el interfaz gráfico de NetLogo pe-
ro sí permite una ejecución completa de toda su funcionalidad como
lenguaje de programación y motor de ejecución. Incluso, teniendo en
cuenta que se ejecuta completamente en Java, se puede utilizar como
librería para el desarrollo de aplicaciones que, cuando sea necesario,
hagan uso del motor de NetLogo por medio de su API17 de progra- 17
API (del inglés Application Program-
mación. ming Interface) o Interfaz de Programa-
ción de Aplicaciones, es el conjunto de
Para la mayor parte del contenido de este libro haremos uso de la funciones y procedimientos que ofrecen
aplicación completa, por lo que es aconsejable instalarla siguiendo los algunas librerías para poder ser utiliza-
das por otro software.
pasos que se especifican en la página oficial de NetLogo.

Una visión rápida del entorno de trabajo

Tras el proceso de instalación, podremos encontrar varias aplicacio-


nes en su carpeta junto a NetLogo x.x.x18 , que son NetLogo 3D, una Los números dependen de la versión.
18

versión que permite trabajar con modelos en mundos 3D, y Hubnet, La 5.2.0 es la versión estable en el mo-
mento de crear este documento.
que explicaremos brevemente al final de este capítulo y más extensa-
mente en el capítulo 14.
Al abrir la aplicación lo primero que debe llamar nuestra atención
es la existencia de 3 pestañas que contienen las secciones principales
sobre las que definiremos nuestros modelos:
jhon.sn@live.com 14 Jun 2017

10 netlogo

1. Pestaña de interfaz (Interface): en la que se representa el mundo


en el que se ejecutan las simulaciones, y donde podemos definir el
interfaz que permite al usuario interactuar con el modelo.

2. Pestaña de Información (Info): en la que podemos añadir infor-


19
El editor que proporciona es muy sen- mación relacionada con nuestro modelo para aclarar conceptos de
cillo pero, usando un formato parecido
programación, explicar su funcionamiento, el modelo real que si-
al de las wikis, podemos conseguir resul-
tados similares a los de cualquier página mula, etc.19
HTML.

3. Pestaña de código (Code): donde se escriben los procedimientos y


20
Proporciona las herramientas mínimas declaraciones que definen el comportamiento del modelo20 .
imprescindibles para una correcta edi-
ción del código.

Como es habitual en todos los programas que trabajan con ventanas,


en el menú superior encontraremos, además de las habituales opciones
de Ficheros, Edición y Ayuda, el menú Tools (Herramientas) con el
jhon.sn@live.com 14 Jun 2017

un paseo por netlogo. antecedentes y entorno 11

que accederemos a las herramientas adicionales que complementan la


experiencia con NetLogo.
Algunas de las más importantes son:

Color Swatches: Permite navegar por el sistema de colores que usa


NetLogo21 . Además, cuando se accede a él desde algunas seccio- 21
Más adelante veremos las peculiarida-
nes del programa, puede usarse para seleccionar colores de forma des de este sistema.

interactiva.

Actividad: Abre esta he-


rramienta y acostúmbrate al
sistema de colores de NetLo-
go. Cambia la resolución del
muestreo por medio del con-
trol Increment y observa el
contraste del color elegido
sobre fondos negro y blanco.

Turtle Shapes Editor: Permite editar el aspecto22 que muestran las 22


Este aspecto se define por medio de
tortugas en pantalla de forma que su representación facilite el reco- formas vectoriales, de manera que pue-
dan ser escalables sin perder resolución.
nocimiento del tipo de tortuga que es (y con él, su posible funcio-
namiento y comportamiento). Estas formas se almacenan en cada
modelo, y además el sistema permite importar formas de otros mo-
delos ya creados y de una librería que se precarga con el programa.

Actividad: Carga algunas


formas en el editor para ver
cómo están hechas y crea las
tuyas propias. Fíjate en las
distintas formas simples que
se pueden utilizar y el uso de
la paleta básica de colores.

Link Shapes Editor: Permite editar el aspecto de los enlaces que


pueden conectar las tortugas entre sí, con parámetros para controlar
su curvatura y las características visuales de las líneas e indicadores.
jhon.sn@live.com 14 Jun 2017

12 netlogo

23
Además, si disponemos de un ordena- BehaviorSpace: Permite definir y lanzar conjuntos de experimen-
dor con multiprocesador, permite hacer
tos sobre el modelo y grabar automáticamente todos sus resultados
paralelismo real en su ejecución, lanzan-
do experimentos independientes en cada para ser analizados posteriormente con herramientas externas23 .
uno de ellos.

System Dynamics Modeler: Abre una funcionalidad de NetLogo


que permite diseñar un modelo de NetLogo por medio de técnicas
24
En la actualidad tiene muy poco uso, habituales y estandarizadas de sistemas dinámicos24 .
aunque es una funcionalidad que para
ciertos tipos de problemas puede resul-
tar muy cómoda.

HubNet Client Editor: Abre el editor de interfaces de clientes para


los experimentos colaborativos que se pueden ejecutar por medio
de HubNet.
jhon.sn@live.com 14 Jun 2017

un paseo por netlogo. antecedentes y entorno 13

La Biblioteca de modelos

Como hemos comentado anteriormente, uno de las características


más interesantes que tiene NetLogo es la cantidad de ejemplos com-
pletos que vienen por defecto en su instalación (todos ellos listos para
ser ejecutados y modificados), y que recorren prácticamente cualquier
área de conocimiento en el que el modelado de experimentos pueda
tener sentido.
Por medio del menú de Ficheros (figura 1.2) podemos acceder al
navegador de modelos (Models Library), que nos muestra un árbol
de carpetas con los modelos agrupados según un criterio muy claro:

Figura 1.2: Menú de Ficheros.

Sample Models: Contiene los modelos clasificados según el área de


conocimiento al que pertenecen (Arte, Biología, Química y Física,
Computación, etc.)
jhon.sn@live.com 14 Jun 2017

14 netlogo

Curricular Models: Agrupa aquellos modelos que se pueden en-


cuadrar en un proyecto curricular determinado. Estos proyectos cu-
25
Algunos de los modelos que aparecen rriculares no tienen por qué englobarse dentro de un área de cono-
bajo esta clasificación pueden aparecer
cimiento concreta, sino que suelen ser transdisciplinares, y normal-
también en la clasificación anterior bajo
alguna de las áreas de conocimiento. mente atienden a proyectos concretos que se están desarrollando
en el Center for Connected Learning and Computer-Based Modeling (el
mismo centro en el que se mantiene NetLogo)25 .

Code Samples: presenta algunos modelos que tienen como objetivo


destacar, y practicar, algunas de las características del lenguaje de
programación, por lo que pueden ser usados como pequeñas mues-
tras para profundizar en algunos conceptos clave del lenguaje.

HubNet Activities: muestra algunos modelos que están preparados


para ser usados como actividades colaborativas por medio de la
herramienta HubNet de NetLogo.

Recomendamos que se empiece directamente por una exploración


extensiva de los modelos que vienen en la carpeta Sample Models,
tanto para ver la diversidad de posibles campos de aplicación como
para hacerse una idea de la potencia que puede llegar a desarrollar
este pequeño lenguaje de programación sin un esfuerzo excesivo.

Actividad: Para ello, abre el modelo, lanza las simulaciones e


interactúa con los controles que se han dispuesto en su interfaz,
acude después a la pestaña de información para saber más acerca de
cuál es el objetivo del modelo, conocer un poco acerca de cómo se
ha programado y explorar las posibles extensiones que se proponen
para profundizar, tanto en el modelo real que intenta explicar,
como en las técnicas de programación que pueden ser útiles para
abordarlo, pasa después a la pestaña de código para ver cómo se ha
programado. Aunque todavía no sepas nada acerca del lenguaje de
programación, intenta leerlo y sorpréndete con lo comprensible que
resulta el código escrito en NetLogo.

Recursos en la web

Como hemos comentado, una de las grandes cualidades de NetLo-


go es su comunidad de usuarios (lo que ha llevado, tras un esfuerzo
considerable de trabajo, a reprogramar completamente la herramienta
para convertirla en una aplicación de código abierto), y que se traduce
en la existencia de una gran cantidad de recursos disponibles en la
web.
A continuación enumeramos solo aquellos que muestran más activi-
dad, que se actualizan con más frecuencia, o que ofrecen un contenido
jhon.sn@live.com 14 Jun 2017

un paseo por netlogo. antecedentes y entorno 15


26
Debe tenerse en cuenta que casi todo
el material disponible en la actualidad se
encuentra en inglés.
más cuidado26 :

El primer recurso fundamental es la propia página oficial de NetLo-


go27 , desde donde se puede acceder a una gran colección de recur- 27
http://ccl.northwestern.edu/netlogo/
sos externos (algunos de los cuales enumeraremos aquí).

Dentro de la página oficial destaca el manual web28 que propor- 28


http://ccl.northwestern.edu/netlogo/docs/
cionan (que también se instala localmente junto con la aplicación
y al que se puede acceder por el menú de Ayuda) y que contiene
un completo manual de referencia del lenguaje, introducción a la
aplicación y algunos tutoriales básicos para adentrarse en su uso.

Existe también un Grupo de Usuarios de NetLogo (alojado en Yahoo


Grupos29 ) donde se pueden compartir dudas e ideas con otros usua- 29
http://groups.yahoo.com/group/netlogo-
rios de la comunidad, así como un Grupo de usuarios de NetLogo users/

en el ámbito educativo30 . 30
http://groups.yahoo.com/group/netlogo-
educators/
La página oficial también sirve de repositorio de modelos genera-
dos por la comunidad, de forma que se puedan descargar o ejecutar
como applets en la misma página (aquellos para los que sea posi-
ble). Recientemente, se ha inaugurado un sitio en el que se pueden
compartir modelos de NetLogo de forma colaborativa, su nombre
es NetLogo Modeling Commons 31 31
http://modelingcommons.org. Desde la
versión 5.0.4, NetLogo añade una opción
en el menú de Ficheros para facilitar la
En Yutzu32 se puede encontrar un paquete que contiene informa-
subida directa de modelos a este reposi-
ción variada sobre la herramienta, así como un conjunto de videos torio.
(en inglés) que fueron diseñados a modo de tutorial por Carl Boet- 32
http://www.yutzu.com/
tiger33 . 33
Fueron diseñados para la versión 4 de
NetLogo, pero siguen siendo válidos en
un prcentaje muy amplio para la versión
Como ya dijimos, en GitHub se encuentra el repositorio asociado al
actual.
código fuente de la aplicación34 (sólo para usuarios avanzados con 34
https://github.com/NetLogo
conocimientos en Java y/o Scala).

James Steiner, uno de los mejores programadores de NetLogo, tiene


una interesante biblioteca propia de modelos de NetLogo llamada
TurtleZero35 , junto con una wiki que profundiza en algunas carac- 35
http://www.turtlezero.com
terísticas del lenguaje que no se abordan en el manual oficial.

INSISOC (Centro de Ingeniería de Sistemas Sociales) ofrece un pe-


queño manual/curso acerca de los fundamentos de NetLogo36 . 36
http://www.insisoc.org. Es uno de los po-
cos recursos en español que se pueden
encontrar.
Ejercicios

1. Abre la herramienta de creación de formas de tortugas y crea algu-


na que puedas usar posteriormente en los modelos que haremos a
lo largo del libro.
jhon.sn@live.com 14 Jun 2017

16 netlogo

2. Visita el repositorio de NetLogo en GitHub y busca información


acerca del proyecto y su comunidad de desarrolladores.

3. Biblioteca de modelos:

a) Diffusion Graphics (figura 1.3):


1) Localiza el modelo Diffusion Graphics que viene bajo la cla-
sificación Art y cárgalo en NetLogo.
2) Ejecuta varios experimentos cambiando el número de tortugas
iniciales, el coeficiente de difusión y la velocidad de las tortugas.
3) Abre la pestaña de información y lee las explicaciones y co-
Figura 1.3: Diffusion Graphics. mentarios del modelo.
4) Abre la pestaña de Código y échale un vistazo a los procedi-
mientos y las instrucciones que aparecen en ellos.
b) Termites (figura 1.4):
1) Localiza el modelo Termites en el apartado Biology y cárgalo
en NetLogo.
2) Lee el apartado de información para hacerte una idea de lo
que pretende el modelo y el papel que juegan los parámetros.
3) Cuando una termita recoge madera ¿de qué color se muestra?
Busca en la pestaña de código el lugar donde se asigna este
color y haz que cambie a verde (green).
Figura 1.4: Termites.
c) Flocking (figura 1.5):
1) Localiza el modelo Flocking en el apartado Biology y cárgalo
en NetLogo.
2) Lee el apartado de información para hacerte una idea de lo
que pretende el modelo.
3) ¿Cuál es el papel de cada uno de los seis parámetros?
4) Comprueba que los valores de los parámetros cargados por
defecto producen un comportamiento de organización en las
tortugas y en un periodo de tiempo relativamente corto todas
se orientan en la misma dirección.
Figura 1.5: Flocking. 5) ¿Cómo varía el tiempo que tarda el grupo en ordenarse com-
pletamente respecto de los parámetros visión (vision) y separa-
ción mínima (minimum-separation)? ¿y respecto del número de
tortugas?
6) Una vez consensuada la orientación del vuelo, ¿qué ocurre si
variamos el valor de los parámetros anteriores?
d) Traffic grid (figura 1.6):
1) Localiza el modelo Traffic grid que viene bajo la clasificación
Social Science y cárgalo en NetLogo.

Figura 1.6: Traffic grid.


jhon.sn@live.com 14 Jun 2017

un paseo por netlogo. antecedentes y entorno 17

2) Inspecciona la pestaña de información para saber lo que hace


el modelo y el significado de sus parámetros, así como del pa-
pel que juegan los diversos controles de su interfaz (botones,
sliders y switches).
3) Observa las diferencias en la simulación dependiendo de si
los semáforos están encendidos o no.
e) Fire (figura 1.7):
1) Localiza el modelo Fire en el apartado Earth Science y cár-
galo. Este modelo simula la propagación de un fuego por un
bosque.
2) Ejecuta el modelo para diferentes valores del slider density
y observa la proporción del bosque que es quemado en cada
caso.
3) Comprueba que existe un valor de densidad crítica (alrededor
del 60 %) de modo que para densidades superiores a éste el
incendio se propaga casi por todo el bosque, mientras que si la
densidad permanece por debajo de él la proporción de bosque Figura 1.7: Fire.
quemado es relativamente pequeña.

4. Apúntate al grupo de usuarios de NetLogo y revisa las dudas y


soluciones que se han producido en las últimas fechas.
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

2
Familiarizándonos con NetLogo

El mundo de NetLogo

Si en Logo el elemento principal con el que se podía trabajar era


la tortuga, en NetLogo esta interacción se extiende para poder operar
con lo que se denominan genéricamente agentes1 . 1
Llamamos agente a un individuo artifi-
NetLogo proporciona tres tipos de agentes: cial, autónomo y dotado de reglas o ca-
racterísticas que gobiernan su comporta-
miento y su capacidad de tomar decisio-
nes. Los agentes interaccionan entre sí y
1. Los patches (parcelas) forman el terreno que define el mundo. Se con el medio ambiente obedeciendo un
distribuyen como una cuadrícula rellenando el mundo y son inmó- conjunto de reglas. Son flexibles y tie-
viles. nen capacidad de aprender y adaptar su
comportamiento basándose en la expe-
riencia. Esta capacidad requiere alguna
forma de memoria. Los agentes incluso
pueden tener reglas para modificar sus
reglas de comportamiento.

2. Las turtles (o tortugas) son una extensión de la tortuga de Logo y


pueden desplazarse por el mundo e interactuar con los patches del
terreno y entre sí.

3. Los links (enlaces) definen relaciones entre agentes móviles (tortu-


gas) a modo de aristas de un grafo. No son móviles, en el sentido
de que no podemos desplazarlos individualmente por el mundo,
ya que su posición depende exclusivamente de la posición de los
agentes que relacionan.
jhon.sn@live.com 14 Jun 2017

20 netlogo

Por el momento nos centraremos en los patches y las tortugas, en


un capítulo posterior profundizaremos en el uso de los links.

El mundo de los patches


Aunque hay instrucciones del lenguaje que permiten modificar las
características del mundo (su tamaño y forma, en número de patches),
por ahora vamos a acceder a sus propiedades por medio de la herra-
mienta visual que proporciona el entorno.
Para ello basta pulsar sobre el botón Settings..., que se encuentra en
la barra de herramientas de la pestaña Interface, o bien pulsar en el
mundo con el botón derecho y seleccionar Edit.... Aquí podemos defi-
nir las dimensiones del mundo, la posición del origen de coordenadas,
el tamaño visual del mundo (indicando cuántos pixels ocupará cada
patch en la pantalla), la topología del mundo, el tamaño de letra de las
etiquetas que usarán los agentes y algunas otras opciones en las que
no entraremos por ahora (figura 2.1).
Respecto a la topología del mundo hemos de tener en cuenta lo si-
guiente: los mundos que se pueden definir en NetLogo son siempre finitos, es
decir, tienen un tamaño finito y un número finito de patches en su composi-
ción, pero no por ello tienen por qué ser limitados. Es decir, podemos dar
una configuración topológica al mundo de forma que no haya fronte-
ras. Esto se consigue por medio de la identificación de sus extremos
Figura 2.1: Ventana de edición de las ca-
racterísticas del mundo.
laterales: si identificamos los extremos izquierdo y derecho, obtenemos
un cilindro vertical; si identificamos los extremos superior e inferior,
obtenemos un cilindro horizontal; y si identificamos simultáneamente
izquierdo con derecho y superior con inferior, obtenemos una figura
que matemáticamente se conoce como un toro.

Una vez establecida alguna de estas identificaciones en los extre-


mos, los agentes móviles que se desplacen más allá de alguno de ellos,
jhon.sn@live.com 14 Jun 2017

familiarizándonos con netlogo 21

aparecerán por el lado opuesto, y los patches de cualquiera de los


extremos tendrán como vecinos los patches del otro extremo identifi-
cado.
En las figuras siguientes se muestra una representación 3D de un to-
ro, así como la conexión entre sus extremos en el mundo 2D. Se puede
observar cómo la tortuga roja atraviesa el lado derecho y aparece por
el izquierdo (identificación en el eje horizontal), mientras que la azul
atraviesa el extremo superior y aparece por el inferior (identificación
en el eje vertical).

Cada patch del mundo (como cualquier otro agente) tiene un con-
junto de propiedades básicas. Para acceder a ellas por medio del inter-
faz, basta hacer click con el botón derecho sobre el patch que se desea
inspeccionar, y seleccionar Inspect patch... (figura 2.2).
La ventana emergente nos muestra una visión local y ampliada del
patch seleccionado y sus propiedades básicas: coordenadas en el mun-
do (pxcor, pycor), color (pcolor), etiqueta que muestra (plabel) y el
color que utiliza esta etiqueta (plabel-color)2 . Usando esta misma
ventana podemos modificar algunas de las propiedades de los pat-
ches, aunque al ser agentes estáticos, no nos permitirá modificar sus Figura 2.2: Ventana de inspección de pat-
coordenadas. De hecho, debido a que las coordenadas del patch son ches.
únicas (no hay otro patch en el mundo con las mismas coordenadas
que él), éstas sirven para identificarlo y hacer referencia a él.
2
Más adelante veremos cómo definir
nuevas propiedades, por ahora tenemos
Cuando se crea el mundo, los patches son de color negro (aunque suficientes con las que el sistema trae por
en algunas de las representaciones que usaremos en este libro serán de defecto.
color blanco); si queremos modificar su color basta asignarle un valor
adecuado a la propiedad pcolor del patch.
Aunque NetLogo es capaz de trabajar con la representación RGB
de los colores3 , por defecto usa un sistema que es más simple y so- 3
RGB es una representación habitual
para colores cuando se trabaja con sis-
lo precisa de un número para identificarlos. Este sistema, aunque más
temas digitales, e indica la proporción
limitado que RGB, ofrece algunas ventajas porque agrupa, cada 10 uni- de cada color primario por medio de
dades, gamas del mismo color. La tabla siguiente muestra los valores tres números: Red-Rojo, Green-Verde
y Blue-Azul, normalmente con valores
de cada uno de los colores asociados (se muestran solo los valores en- entre 0 y 255. Así, una tonalidad de
teros, pero admite decimales para colores intermedios). Además, para amarillo es (255, 255, 0), el blanco es
(255, 255, 255) y el negro (0, 0, 0).
jhon.sn@live.com 14 Jun 2017

22 netlogo

los 14 colores básicos, NetLogo tiene constantes definidas para poder


nombrarlos. Por ejemplo, a todos los efectos decir orange y 25 es lo
4
Si queremos obtener un color de la ga- mismo4 :
ma del verde más clara, basta escribir al-
go del tipo (green + 2), un rojo oscuro
puede ser (red - 2). Se trata de un mé-
todo directo para trabajar con colores al
que le sacaremos mucho provecho.

Presentando a las tortugas

Pasemos ahora a conocer un poco mejor a las tortugas. A diferencia


de los patches, que son automáticamente creados al iniciarse el mundo,
las tortugas hay que crearlas manualmente para que aparezcan en el
mundo, y se pueden crear en cualquier momento. Antes de ver cómo
se crean y se manipulan, vamos a suponer que tenemos una tortuga
en el mundo y analicemos sus características por defecto (figura 2.3).
Al hacer click con el botón derecho sobre la tortuga accedemos al
menú contextual que nos muestra las tortugas que hay bajo el ratón
Figura 2.3: Tortuga recién creada en el (también aparecerá el patch sobre el que está la tortuga) para que se-
centro del mundo. leccionemos la tortuga que corresponda.
jhon.sn@live.com 14 Jun 2017

familiarizándonos con netlogo 23

Como queremos acceder a las propiedades de la tortuga, pulsamos


sobre “inspect turtle x” (más adelante veremos para qué sirven las
demás opciones), que abre una ventana similar a la que vimos para
mostrar las propiedades del patch (figura 2.4).
Las propiedades que por defecto tiene una tortuga (algunas más
que las que tienen los patches) son:

who: a diferencia de los patches, que se identifican por su posición,


las tortugas no tienen ninguna propiedad que las diferencie a priori
de las demás. Por tanto, NetLogo proporciona para cada tortuga del
mundo un identificador único por medio de este número, que se
incrementa secuencialmente y sin repetición. Por tanto, la primera
tortuga tendrá como identificador 0, la siguiente que se cree tendrá
1, y así sucesivamente.

color: el color de la tortuga según el código de colores que sigue


NetLogo. Similar al color visto para los patches.

heading: la orientación de la tortuga en el plano. Se mide en grados,


Figura 2.4: Ventana de inspección de tor-
y se debe tener en cuenta que no sigue los mismos criterios que tugas.
la trigonometría habitual, sino que comienza a contar desde el eje
positivo de la Y y crece en sentido horario (figura 2.5).

xcor, ycor: coordenadas de la posición que ocupa en el espacio.


Se mide en unidades de patches pero, a diferencia de estos, puede
tomar valores decimales, que representan todos los valores inter-
medios entre las coordenadas de dos patches consecutivos (figura
2.6).

shape: forma de la tortuga. Por defecto es la que se muestra en las Figura 2.5: Sistema de orientación de
imágenes, pero los modelos vienen con diversas formas que pueden NetLogo.
utilizarse y con un editor de formas para crearlas.

Figura 2.6: Coordenadas de la tortuga.

label: etiqueta que la tortuga mostrará en pantalla (si no es vacía)5 . 5


En la figura 2.6 se muestran las coor-
denadas de la tortuga por medio de su
label-color: color de la etiqueta. etiqueta.
jhon.sn@live.com 14 Jun 2017

24 netlogo

breed: familia de tortugas a la que pertenece. Esta característica de


NetLogo es uno de sus puntos fuertes, pues nos permite definir
familias de agentes que pueden tener distintos conjuntos de propie-
dades y comportamientos. Lo veremos en un capítulo posterior.

hidden?: indica si la tortuga está oculta o visible. Por defecto las


tortugas son visibles, pero pueden ocultarse individualmente en la
representación del mundo.

size: determina el tamaño de la tortuga (en patches). Su valor por


defecto es 1.

pen-mode: como en otras versiones de Logo, las tortugas pueden


dejar un rastro en el suelo mientras se mueven. Los posibles valores
de este parámetro controlan esta opción: up (valor por defecto), el
lápiz de dibujo de la tortuga está en alto y no deja rastro; down, el
lápiz de dibujo de la tortuga está bajado y sí deja rastro; erase, la
tortuga baja la goma de borrar y elimina, en su camino, los posibles
rastros que pueda cruzarse.

pen-size: Este parámetro determina la anchura, en pixels, del lápiz


que se usa para dibujar el rastro. Su valor por defecto es 1 (figura
2.7).

Al igual que en el caso de los patches, podemos cambiar los valores


Figura 2.7: Una figura realizada con va-
riaciones de tamaño de lápiz. de sus propiedades por medio de esta ventana, aunque lo normal será
que lo hagamos por medio de instrucciones del lenguaje de progra-
mación. Como una tortuga es un agente móvil, podremos cambiar sus
coordenadas espaciales (lo que provocará que la tortuga aparezca ins-
tantáneamente en la nueva posición), pero la propiedad who no admite
modificación ya que es su identificador.

Centro de Comandos

En esta sección vamos a interactuar con NetLogo por medio del


Centro de Comandos, lo que nos permitirá ir adentrándonos en el
Figura 2.8: El centro de comandos ocupa, lenguaje de programación de una forma interactiva, sin necesidad de
por defecto, la zona horizontal inferior escribir procedimientos completos ni conocer demasiados secretos del
de la pestaña de Interfaz, aunque pode-
lenguaje (figura 2.8).
mos cambiarla a la zona vertical derecha.
Su tamaño se puede cambiar arrastran- Por medio de este centro podemos comunicarnos con NetLogo es-
do la barra que lo separa del interfaz, y cribiendo instrucciones que se ejecutarán al pulsar la tecla de retorno
su contenido se puede borrar por medio
del botón Clear que proporciona. de carro. Comenzaremos con unos ejemplos sencillos, usándolos para
mostrar el tipo de datos que es capaz de manejar NetLogo, es decir, a
modo de calculadora extendida:
jhon.sn@live.com 14 Jun 2017

familiarizándonos con netlogo 25

El Centro de Comandos se compone de una barra inferior, donde se


introducen los comandos, y un área donde se muestran los resultados
de aquellas instrucciones que producen alguna devolución. A todos
los efectos se comporta como una consola de texto similar a las de
otros sistemas.
Como muestra la linea inferior, el sistema colorea automáticamente
las instrucciones en función de si reconoce el texto como una instruc- 6
Veremos que las instrucciones de
NetLogo se dividen en dos grandes gru-
ción válida, como una constante, etc. Además, aunque no es necesario
pos: las acciones, que no devuelven na-
añadir el comando show, que hace que se muestre el resultado, el in- da pero producen cambios en el mundo,
térprete lo añade automáticamente a nuestra petición en caso de que y las funciones, (reportes) que devuel-
ven valores.
de la instrucción devuelva un resultado y no sea una acción6 .

Trabajando con números. Números aleatorios


Aprovecharemos algunas funciones matemáticas de NetLogo que
serán útiles más adelante para practicar la sintaxis del lenguaje en el
intérprete. Importante: Todos los operadores en
NetLogo no diferencia internamente entre números enteros y deci- NetLogo deben ir separados con espa-
cios. Lo que quiere decir que sin(x+1)
males, sino que todos ellos se almacenan internamente como números debe escribirse: sin (x + 1).
de coma flotante de doble precisión7 . Muchas veces, si una función es-
pera como dato de entrada un entero y le damos un número con parte 7
En consecuencia, un número entero pa-
decimal, simplemente ignorará la parte decimal. ra NetLogo es, simplemente, un núme-
ro que no tiene parte decimal, de forma
El rango de números con los que puede trabajar es, aproximada- que 1 y 1.0 se consideran iguales, algo
mente, de −253 a 253 , es decir, +/-9007199254740992. Si un cálculo que no es así en otros muchos lenguajes.
Lo que sí ocurre es que NetLogo ocul-
excede esta cantidad no devuelve un error, pero el resultado puede no ta las terminaciones .0 para facilitar la
ser preciso. Por ejemplo: identificación de los enteros.
 
observer > 2 ^ 52 + 1 = 2 ^ 52
observer : false
observer > 2 ^ 53 + 1 = 2 ^ 53
observer : true
 
También puede haber problemas de precisión con cantidades fraccio-
narias8 . Por ejemplo: 8
Este es un problema general en todas
  las herramientas basadas en Java.
observer > 1/6 + 1/6 + 1/6 + 1/6 + 1/6 + 1/6
observer : 0.9999999999999999
 
jhon.sn@live.com 14 Jun 2017

26 netlogo

Y, como es habitual en casi todos los lenguajes de programación,


9
Los números pseudo-aleatorios, aun- una división por 0 devuelve un error de ejecución.
que parecen aleatorios, se generan por
Respecto a los números aleatorios, y al igual que el resto de lengua-
medio de una función determinista que
devuelve números dentro de un rango jes de programación, NetLogo trabaja con números pseudo-aleatorios9 .
con probabilidad uniforme. La forma de conseguir que no siempre se obtengan los mismos valores
es hacer depender esta función generadora de un valor inicial (semilla,
seed), lo que significa que si se empieza siempre con la misma semilla,
10
Aunque esta característica pueda pa- se obtiene siempre el mismo número10 . Para resolver este problema
recer contraproducente, cuando estamos normalmente se oculta al usuario la necesidad de dar una semilla ha-
realizando modelado científico se con-
vierte en una cualidad que podemos ciendo uso, por ejemplo, de la hora del ordenador (que es una cantidad
aprovechar, ya que hace que todos los que cambia continuamente). La secuencia de instrucciones siguiente
experimentos sean reproducibles alma-
cenando las semillas con las que se han puede servir para entender este fenómeno:
 
realizado.
observer > random 100 => 9
observer > random 100 => 1
observer > random 100 => 44
En lo que sigue, y con el fin de dar una
representación más compacta de las in- observer > random−seed 1
teracciones, usaremos la notación => pa- observer > random 100 => 81
ra mostrar las salidas del Centro de Co- observer > random−seed 1
mandos. observer > random 100 => 81
 
Como se puede deducir de las líneas anteriores, la función random
recibe como dato de entrada un número, n, y devuelve un número en-
11
Es decir, uno de: 0,1,2,...,n-1. tero pseudo-aleatorio en [0,n)11 (o en (n,0] si n < 0) siguiendo una
probabilidad uniformemente distribuida. Existe una versión no entera
(de coma flotante), llamada random-float, que opera sobre números
decimales. La función random-seed permite fijar la semilla del genera-
dor de números pseudo-aleatorios.
Debido a que el último valor no se devuelve nunca, la instrucción
que devuelve un número entero al azar entre 1 y 10 sería (1 + random
10). La fórmula general para obtener un número entero al azar entre
a y b sería:
a + random (b - a + 1)
Por ejemplo, para generar un número entero entre -5 y 5 la instruc-
ción sería: (random 11) - 5
¿Y qué ocurre si queremos que el número devuelto sea decimal?
Por ejemplo, si queremos obtener al azar un número decimal entre 1
y 10, la instrucción sería: 1 + random-float 9. Y la fórmula general
12
¿Puedes explicar la razón por la que para devolver un número decimal al azar entre a y b sería12 :
las expresiones son distintas dependien-
a + random-float (b - a)
do de si quieres decimales o no?
Por lo que la generación de un número decimal al azar entre -5 y 5
quedaría: (random-float 10) - 5.
Además de la distribución uniforme que proporcionan las funciones
anteriores, NetLogo ofrece generadores de números pseudo-aleatorios
13
Algunas de estas funciones son: que siguen otras distribuciones habituales13 . Pero no son las únicas
random-poisson, random-exponential,
que hacen uso de números pseudo-aleatorios, ya veremos a lo largo
random-normal y random-gamma.
jhon.sn@live.com 14 Jun 2017

familiarizándonos con netlogo 27

de este libro funciones que realizan una selección al azar de entre un


conjunto de objetos, y todas ellas usan internamente el mismo genera-
dor de números aleatorios a partir de una semilla, por lo que su efecto
también puede ser reproducible.

Actividad: Utiliza el Centro de Comandos como calculadora


para realizar algunas operaciones numéricas y acostumbrarte a las
peculiaridades de la sintaxis de NetLogo.

Trabajando con cadenas de texto


El segundo gran tipo de dato con el que puede trabajar NetLogo son 14
Desde la versión 5.0, NetLogo puede
trabajar con caracteres Unicode.
las cadenas de texto. Una cadena (string) es simplemente un conjunto
de caracteres encerrados entre comillas14 . Por ejemplo “esto es una 15
NetLogo no diferencia entre cadenas,
palabras o caracteres. Únicamente la lon-
cadena”15 . Para representar la cadena vacía se usa “”16 .
gitud de la cadena y la existencia o no de
A continuación mostramos algunas de las funciones más habituales espacios hace que nosotros lo interprete-
para trabajar con cadenas: mos de una forma u otra.
  16
La cadena vacía ya la hemos encontra-
observer > l e n g t h " Perro chino " => 11 do en las etiquetas de patches y tortugas
para generar etiquetas vacías (o lo que
observer > f i r s t " Perro chino " => "P"
sería equivalente, no usarlas.
observer > but− f i r s t " Perro chino " => " e r r o chino "
observer > l a s t " Perro chino " => "o"
observer > but− l a s t " Perro chino " => " Perro chin "
observer > item 4 " Perro chino " => "o"
observer > item 0 " Perro chino " => "P"
observer > s u b s t r i n g " Perro chino " 3 5 => " ro "
observer > member? " i " " Perro chino " => true
observer > member? " mi " " Perro chino " => false
observer > p o s i t i o n " e " " Perro chino " => 1
observer > remove " " " Perro chino " => " Perrochino "
observer > remove " s " " Perro chino " => " Perro chino "
observer > r e p l a c e −item 5 " Perro chino " " − "=> " Perro −chino "
observer > r e v e r s e " Perro chino " => " onihc orreP "
observer > word " Perro " " chino " => " Perrochino "
 
Algunas cosas que conviene resaltar:

1. La primera posición de los caracteres en las cadenas es 0.

2. Cuando se trabaja con cadenas y caracteres, se diferencia entre ma- Si necesitas insertar algún carácter espe-
yúsculas y minúsculas. cial (tabulación, salto de línea, etc.) en
una cadena haz uso de una secuencia de
escape:
3. La forma de concatenar cadenas es por medio de la instrucción
1. \n = salto de línea
word.
2. \t = tabulación
3. \" = comillas dobles
Actividad: Toma una frase cualquiera, exprésala como una cadena
4. \\ = backslash
de texto, y ejecuta las instrucciones necesarias para poder separarla
por palabras.
jhon.sn@live.com 14 Jun 2017

28 netlogo

Trabajando con listas. Datos compuestos


Cuando trabajemos con bloques de datos sencillos puede ser sufi-
ciente el uso de números y cadenas, pero muchas veces será necesario
almacenar o manipular muchos valores simples de una vez. En este
caso la mejor solución es trabajar con listas.
Una lista es una estructura ordenada que almacena muchas unida-
17
En otros lenguajes de programación se des de información. Por ejemplo, [0 2 4 6 8]17 es la lista de los pares
usan los paréntesis para delimitar las lis- menores que 10. Una característica interesante de las listas es que no
tas. NetLogo usa corchetes.
tienen que ser homogéneas, sino que pueden contener distintos tipos
de datos dentro, incluso otras listas. Por ejemplo:
[0 2 “cara” 6 [1 3 5] “col”]
Veremos que las listas se convierten en aliados muy eficientes para
18
También veremos que son el forma- trabajar de manera muy cómoda con información estructurada 18 .
to natural para manipular la informa- Las listas constantes (aquellas que no varían) se consiguen escri-
ción proveniente de agentes o grupos de
agentes. biéndolas directamente entre corchetes19 :
 
19
Observa que la última de ellas es la lis-
observer > [ 0 2 4 6 8 ]
ta que no tiene elementos, que se llama
lista vacía. observer > [ 0 2 " c a r a " 6 [ 1 3 5 ] " c o l " ]
observer > [ ]
 
Pero si quieres formar una lista usando en alguno de sus térmi-
nos el resultado de una función, o un valor no constante, necesitamos
un constructor para poder formarla. En NetLogo este constructor es
20
Observa que si quieres formar una lis- list20 :
ta con más de dos datos (o solo con uno)  
debes incluir la instrucción completa en- observer > l i s t ( random 1 0 ) ( random− f l o a t 1 0 )
tre paréntesis. Veremos que hay algu- observer : [2 2.04452253035499]
nas otras instrucciones de NetLogo que observer > ( l i s t ( random 1 0 ) ( random− f l o a t 1 0 ) 5 )
admiten una cantidad indeterminada de
observer : [8 0.27387597179620027 5]
entradas, en todas ellas será necesario
incluir la instrucción completa entre pa- observer > ( l i s t ( random 1 0 ) )
réntesis en caso de que el número de en- observer : [4]
tradas sea distinto de 2.  
Una forma muy útil de construir listas es por medio de la función
n-values, que permite generar una lista de una determinada longitud
por medio de una función. Por ejemplo:
 
observer > n−v a l u e s 10 [ 2 * ? ]
o b s e r v e r : [ 0 2 4 6 8 10 12 14 16 1 8 ]
 
21
Observa el uso de la variable especial, construye una lista de tamaño 10 y para rellenarla usa la función 2x21 .
?, como variable de la función que se
El formato general es:
usa.
n-values k [ f(?) ]
que genera la lista [f(0) f(1) ... f(k-1)].
Algunos ejemplos de su uso son:
 
observer > n−v a l u e s 5 [0]
observer : [0 0 0 0 0]
observer > n−v a l u e s 5 [?]
observer : [0 1 2 3 4]
jhon.sn@live.com 14 Jun 2017

familiarizándonos con netlogo 29

observer > n−v a l u e s 3 [ s i n ( ? * 360 / 3 ) ]


o b s e r v e r : [ 0 0 . 8 6 6 0 2 5 4 0 3 7 8 4 4 3 8 7 − 0.8660254037844385]
 
La mayoría de las instrucciones que vimos para manipular cadenas
funcionan con listas:
 
observer > length [0 1 2 3 4 5] => 6
observer > f i r s t [0 1 2 3 4 5] => 0
observer > but− f i r s t [ 0 1 2 3 4 5 ] => [1 2 3 4 5]
observer > l a s t [0 1 2 3 4 5] => 5
observer > but− l a s t [ 0 1 2 3 4 5 ] => [0 1 2 3 4]
observer > item 4 [ 0 1 2 3 4 5 ] => 4 Las posiciones de las listas también co-
observer > s u b l i s t [0 1 2 3 4] 2 4 => [2 3] mienzan con 0.
observer > member? 1 [ 0 1 2 3 4 5 ] => true
observer > position 1 [0 1 2 3 4 5] => 1
observer > remove 1 [ 0 1 2 3 4 5 ] => [0 2 3 4 5]
observer > r e p l a c e −item 1 [ 0 1 2 3 4 ] " a " => [0 " a " 2 3 4]
observer > reverse [0 1 2 3 4 5] => [5 4 3 2 1 0]
 
Pero, además, tenemos un conjunto de funciones más amplio que
se pueden aplicar, por ejemplo, a listas numéricas:
 
observer > max [ 1 2 3 4 5 4 3 2 1 ] => 5
observer > min [ 1 2 3 4 5 4 3 2 1 ] => 1
observer > sum [ 1 2 3 4 5 4 3 2 1 ] => 25
observer > variance [1 2 3 4 5 4 3 2 1] => 1.94444444444446
observer > mean [ 1 2 3 4 5 4 3 2 1 ] => 2.77777777777777
observer > modes [ 1 2 3 4 5 4 3 2 1 ] => [1 2 3 4]
observer > sum [ 1 2 3 4 5 4 3 2 1 " a " ] => 25
 
Según el último ejemplo, las funciones que esperan listas numéricas
ignoran los elementos que no sean números.

Actividad: Prueba los siguientes ejemplos y razona por qué cada


uno funciona de forma distinta.
 
observer > sum [ " a " " b " ]
observer > max [ " a " " b " ]
 
Además, podemos ampliar las listas añadiendo elementos a cual-
quiera de sus dos extremos22 : 22
Estas primitivas serán muy importan-
  tes, pues junto con first, but-first,
observer > l p u t " a " [ 1 2 3 ] => [ 1 2 3 " a " ] last y but-last nos permiten construir
observer > f p u t " a " [ 1 2 3 ] => [ " a " 1 2 3 ] y deconstruir listas de forma sistemática.
 
La forma de concatenar listas es haciendo uso de la instrucción
sentence.

Actividad: Deduce a partir de los siguientes ejemplos cómo


funciona y en qué se diferencia de list.
jhon.sn@live.com 14 Jun 2017

30 netlogo

 
observer > l i s t [1 2 3] [4 5] => [[ 1 2 3] [4 5]]
observer > sentence [1 2 3] [4 5 6] => [1 2 3 4 5 6]
observer > l i s t 1 [4 5 6] => [1 [4 5 6] ]
observer > sentence 1 [4 5 6] => [1 4 5 6]
observer > ( sentence 1 [4 5 6] 7) => [1 4 5 6 7]
observer > ( sentence [1 2 3] [4 5 6] 7) => [1 2 3 4 5 6 7]
observer > ( sentence [1 2] [4 [ 5 ] 6] 7) => [1 2 4 [5] 6 7]
 
Veremos en un capítulo posterior cómo sacarle potencia a las listas
por medio de programación, viendo cómo podemos diseñar procedi-
23
Algunos de los cuales podrán ser escri- mientos recursivos para resolver problemas complejos23 .
tos de forma muy concisa gracias a algu-
nas instrucciones adicionales que NetLo-
go proporciona.
Trabajando con lógica. Tipo Booleano

Al igual que el resto de lenguajes de programación, NetLogo tam-


bién está preparado para trabajar con los valores booleanos true/false
que se obtienen por operaciones condicionales, como son las compa-
24
También se pueden realizar compara- raciones24 :
ciones entre cadenas, donde automática-  
mente se aplica el orden lexicográfico ca- observer > 3 > 2 => true
rácter a carácter. observer > "a" > "b" => false
observer > "a" < "b" => true
observer > n−v a l u e s 4 [ ? < 3 ] => [ true true true f a l s e ]
 

Actividad: Escribe la instrucción que sea capaz de decidir qué


términos de la lista [0 1 2 3 4 5 6] son pares y cuáles no.

Reconociendo el tipo de dato

Para poder saber si un dato es de un tipo u otro de forma automáti-


ca, NetLogo proporciona algunas funciones booleanas que reconocen
25
Veremos que este tipo de reconocedo- el tipo25 :
res existirán incluso para poder saber si  
un objeto es un agente de tipo tortuga, observer > i s −number? 3 => true
un patch, un link, etc. observer > i s −number? " a " => false
observer > i s −s t r i n g ? " a " => true
observer > i s −s t r i n g ? 3 => false
observer > is−l i s t ? 3 => false
observer > is−l i s t ? [ 3 ] => true
observer > i s −boolean ? 3 => false
observer > i s −boolean ? 0 => false
observer > i s −boolean ? t r u e => true
 

Actividad: Comprueba de qué tipo son los siguientes datos: [true


false], [[1]], 1 < 2.
jhon.sn@live.com 14 Jun 2017

familiarizándonos con netlogo 31

Contextos de ejecución

Actividad: Si hasta ahora no te lo has preguntado, es hora de


hacerlo, ¿qué función tiene la aparición de observer> junto a la
barra de introducción de comandos? Si pulsamos sobre él nos
resultará más fácil entender su significado (figura 2.9).

Fijémonos que de las cuatro opciones que aparecen, tres de ellas


son los diversos tipos de agentes que tiene NetLogo, mientras que el
Figura 2.9: Contextos del Centro de Co-
cuarto es observer. mandos.
En NetLogo la ejecución está orientada a los agentes, es decir, las
diferentes instrucciones del lenguaje, así como los procedimientos que
nosotros vayamos definiendo, las pueden ejecutar cualquiera de los
agentes... o podemos ejecutarlas nosotros. El papel del observador, que
solo hay uno, es el que jugamos nosotros, externos al mundo artificial
que se ejecuta pero con la capacidad de controlarlos a todos.
Lógicamente, no todos los tipos de agentes pueden ejecutar todas 26
Aunque ya mostraremos las formas
que existen de que un agente/observa-
las instrucciones del lenguaje ya que puede depender, por ejemplo, de dor le pida a otros agentes realicen ope-
si la ejecución afecta a propiedades que no le corresponden. Por ejem- raciones.
plo, si ejecutamos set color blue, que establece el color a azul, esta
instrucción sólo tiene sentido en el contexto de los agentes móviles,
puesto que son ellos los que tienen esta propiedad, pero ni los patches
ni el observador podrán ejecutarla26 .
La figura 2.10 puede aclarar la diferencia. ¿Qué ha ocurrido al eje-
cutar “1 + 1” en el contexto de los patches? Si lo hubiéramos hecho
en el contexto observer el sistema hubiera respondido simplemente
observer: 2, pero al haberlo ejecutado en el contexto de los patches
lo que realmente se ha hecho es que cada patch ha ejecutado la opera-
ción y ha devuelto el resultado.

Actividad: Vamos a aprovechar esta característica para hacer


algunas pruebas sobre patches. Para ello, ejecuta las siguientes
instrucciones y justifica los resultados obtenidos (aunque todavía no
Figura 2.10: Ejecución de un comando
hayamos visto algunas de las instrucciones usadas, es fácil suponer por los patches. En la ventana se mues-
qué hacen por su significado en inglés). tran los últimos patches en su devolu-
ción, por ejemplo, el patch que está si-
tuado en las coordenadas (4, 2) de-
  vuelve: (patch 4 2): 2, al igual que el
patches > set pcolor blue patch de coordenadas (1,2). No te preo-
patches > set pcolor one−o f base − c o l o r s cupes si al ejecutarlo has obtenido otro
patches > set plabel ( word " ( " pxcor " , " pycor " ) " ) orden en la lista de patches, más adelan-
te sabremos porqué.
patches > set pcolor [ p c o l o r ] o f one−o f neighbors
patches > set plabel pxcor + world−width * pycor
  27
Ten la precaución de cambiar el con-
texto del intérprete a observer, ya que
A continuación vamos a crear una tortuga para jugar un poco con ella
las instrucciones siguientes no las pue-
en el mundo27 : den ejecutar los agentes
jhon.sn@live.com 14 Jun 2017

32 netlogo

observer> clear-all: Comenzamos borrando todo para partir de


28
Aprovechamos este momento para ex- un mundo limpio28 .
plicar que muchas de las instrucciones
de NetLogo (sobre todo las más habitua-
observer> crt 1: Después creamos una tortuga (create-turtles)
les) admiten una versión resumida, por
ejemplo, clear-all y ca tienen el mismo donde le indicamos el número de tortugas a crear. El efecto de esta
efecto. instrucción es la creación de una tortuga que, por defecto, se sitúa
en el origen de coordenadas pero con orientación (heading) inicial
y color aleatorios.

Como ya existe una tortuga en el mundo, podemos pasar al contexto


turtles para manejar la tortuga por medio de las instrucciones básicas
de movimiento (que son similares a las existentes en otros lenguajes
Logo). La figura siguiente muestra una ejecución interactiva en la que
cada línea se ha introducido en orden (cambiando adecuadamente en-
tre contextos tal y como se ha indicado).
El significado de las instrucciones desconocidas es:

1. fd n : (forward) hace que la tortuga avance n unidades (en patches).

2. rt n : (right) hace que la tortuga gire a la derecha (su derecha) n


grados.

3. pd : (pen-down) baja el lápiz de la tortuga para que deje rastro en su


movimiento.

4. pu : (pen-up) sube el lápiz de la tortuga para que no deje rastro en


su movimiento.
jhon.sn@live.com 14 Jun 2017

familiarizándonos con netlogo 33

Observa que al ejecutar heading la tortuga ejecuta realmente la ins-


trucción show heading que da como resultado que muestre en la ven-
tana el valor de su propiedad heading.
Es importante hacer notar que los dibujos que puedan realizar las
tortugas cuando tienen el lápiz bajado se almacenan en una capa dis-
tinta, la capa de dibujo, con la que no pueden interactuar los agentes29 . 29
Esta capa puede borrarse por medio de
clear-drawing, o cd en su versión abre-
viada.

A diferencia de otros Logos, en NetLogo no existen instrucciones


de rellenado (fill) de áreas, y la forma de fijar un color de fondo es por
medio del coloreado de los patches.
Otras instrucciones que pueden ser útiles para el manejo de la tor-
tuga son:

1. bk n : (back) hace que la tortuga retroceda (camine hacia atrás) n


patches.

2. ht : (hide-turtle) oculta la tortuga (pero si se mueve y tiene el


lápiz bajado, sigue dejando un rastro).

3. home : lleva la tortuga al origen de coordenadas, manteniendo su


orientación y dejando rastro en caso de que tuviera el lápiz bajado.

4. lt n : (left) gira n grados hacia su izquierda.

5. pe : (pen-erase) baja la goma de borrar de la tortuga, por lo que su


movimiento borrará los rastros dejados con los que se cruce.

6. st : (show-turtle) muestra la tortuga (útil si antes ha sido oculta-


da).

7. stamp : hace que la tortuga deje una marca en el mundo con su for-
ma. Esa marca es únicamente un dibujo en el suelo, no una tortuga
real.

8. move-to patch x y : hace que la tortuga se desplace al patch con


coordenadas (x,y)30 . 30
Hay usos más generales del comando
move-to para situar a la tortuga en la po-
9. die : elimina a la tortuga del mundo. sición que ocupa cualquier otro agente,
por ejemplo: move-to one-of patches.
jhon.sn@live.com 14 Jun 2017

34 netlogo

10. hatch n : hace n copias exactas de la tortuga (todas ellas con exac-
tamente los mismos valores en todas las propiedades).

31
Si nunca has trabajado con tortugas, la
mejor forma de familiarizarte con su for-
Ejercicios
ma de trabajo es interactuando con ellas
y viendo cómo responden a las distintas A pesar de que hasta ahora solo hemos acariciado la superficie de
órdenes en tiempo real. las capacidades de NetLogo ya podemos hacer algunas cosas intere-
santes31 :
32
La Topología es la rama de las matemá- 1. Diferentes topologías32 :
ticas dedicada al estudio de las propie-
dades de los cuerpos geométricos que a) Crea una tortuga y deselecciona en la configuración del mundo
permanecen inalteradas por transforma-
ciones continuas. Es decir, aquellas que
la opciones mundo sin límite horizontal y mundo sin límite
siguen siendo ciertas aunque el mundo vertical.
lo estires y deformes, siempre y cuando
no lo rompas ni pegues dos partes sepa- b) Establece los valores max-pxcor y max-pycor para que el mundo
radas, por eso a veces se le conoce como tenga tamaño 21 × 21.
Geometría de la lámina elástica.
c) Orienta la tortuga hacia al norte, y desplázala en esa dirección.
¿Qué ocurre con la tortuga cuando la desplazamos una cantidad
mayor que el tamaño del mundo?
d) Devuelve la tortuga al origen de coordenadas, oriéntala hacia el
este y comprueba que ocurre lo mismo que en el caso anterior.
e) Haz lo mismo pero marcando esta vez las opciones mundo sin
33
Hazlo con todas las posibles combina- límite horizontal y/o mundo sin límite vertical33 .
ciones.
f ) Teniendo en cuenta las tres topologías que proporciona NetLogo
(plano euclídeo, cilindro y toro), intenta prever cuál sería el camino
más corto entre dos puntos en cualquiera de las topologías.
g) Para dimensiones fijas del mundo, si supones un toro, ¿eres ca-
34
La geometría intrínseca de la tortu-
paz de deducir alguna regla que te permita que una tortuga que
ga, algo en lo que profundizaremos más
adelante, hace que su manipulación per- se mueve en línea recta vuelva alguna vez al punto de origen?
mita entender las figuras geométricas in-
dependientemente de un sistema de re-
h) Después de haber dibujado algunas figuras sobre el cilindro o el
ferencia rígido, por lo que su uso, deci- toro, ¿puedes imaginar el aspecto que tendrían sobre la represen-
diendo el mejor sistema de referencia pa- tación 3D de la superficie?
ra cada figura que queramos hacer, pue-
de simplificar el proceso de generación
de las mismas.
2. Dibujo de un polígono34 :

35
Recuerda que si quieres saber las for- a) Crea un tortuga desde el centro de comandos.
mas disponibles en tu modelo, puedes
b) Usa el inspector de tortugas para cambiar el color, tamaño y
abrir la herramienta que NetLogo trae
para trabajar con formas. Intenta impor- forma de la tortuga35 .
tar una nueva forma de la biblioteca.
c) Dibuja con la tortuga un pentágono de lado 4, de color azul,
y anchura de trazo igual a 2 pixels. Es posible que tengas que
ampliar el tamaño del mundo.
d) Calcula el ángulo de giro para dibujar un polígono regular de n
lados cualquiera.
jhon.sn@live.com 14 Jun 2017

familiarizándonos con netlogo 35

3. Caminos aleatorios36 : 36
Matemáticamente, los caminos aleato-
rios son cualquier proceso aleatorio don-
a) Crea una tortuga, activa el rastro y elige un color y un ancho de de la posición del objeto en cierto instan-
te depende sólo de su posición en el ins-
trazo. tante anterior y de una variable aleatoria
b) Utiliza el comando random para orientar a la tortuga con un án- que determina su dirección y longitud
de avance en cada momento.
gulo aleatorio entre −90 y 90 grados, y desplázala un paso hacia
delante.
c) Repite la acción varias veces y observa el camino aleatorio des-
crito.
d) Haz lo mismo pero restringiendo el ángulo de giro de otro mo-
do y avanzando una longitud aleatoria, pongamos entre 0 y 10
unidades.

4. Contexto patches:

a) Selecciona el contexto patches en el centro de comandos.


b) Consigue diferentes patrones de colores en los patches usando
las coordenadas de los mismos y la instrucción set. Prueba con
diferentes fórmulas37 . 37
Por ejemplo: set pcolor pxcor, set
pcolor pxcor + pycor, set pcolor
c) Utiliza random para asignar colores aleatorios a los patches en la pxcor - pycor, set pcolor pxcor *
gama de los verdes. pycor, etc.

d) Utiliza la operación x mod 2, que devuelve el resto de x entre 2,


para dibujar un damero de dos colores asignando a cada patch
un color según el valor de (pxcor + pycor) mod 2. Investiga los
efectos si cambiamos 2 por otro número natural.

5. Creando listas: escribe instrucciones para crear las siguientes listas:

a) La lista de los 100 primeros números naturales.


b) La lista de los 100 primeros números pares.
c) La lista de los 100 primeros números impares.
d) La lista de las potencias de 2 hasta donde permita Netlogo.
e) A partir de una palabra fija, genera una lista de letras elegidas al
azar de entre las que forman esa palabra.
f ) Genera una lista de listas con todas las posibles permutaciones
de la lista [0 1 2].

6. Números aleatorios:

a) Genera un boleto al azar de la Lotería Primitiva 38 . 38


Recuerda que, en su versión simple, la
Lotería Primitiva consta de seis números
b) Genera una lista de 1000 números naturales aleatorios elegidos elegidos entre el 1 y el 49.
entre 0 y 1000. Calcula la media, la varianza y la desviación es-
tandard de la lista, así como el máximo y el mínimo valor de la
lista.
jhon.sn@live.com 14 Jun 2017

36 netlogo

c) Genera una lista de 10.000 números binarios al azar (0’s y 1’s).


Calcula la media, la varianza y la desviación estandard de la lista.

7. Ángulos y polígonos regulares:

a) Calcula la lista de los ángulos acumulados al recorrer un polí-


39
En el caso de un cuadrado la lista re- gono regular en función del número de lados del polígono39 .
sultante debería ser [0 90 180 270].
b) Genera la misma lista del apartado anterior, pero esta vez mi-
40
NetLogo tiene la constante pi para re- diendo el ángulo en radianes40 .
presentar el número π.
c) Genera la lista de los cosenos y senos de los ángulos de la lista
del primer apartado.

8. Números cuadrados:

a) Calcula la lista de los cuadrados de los primeros 1000 números


naturales.
41
Puedes hacer uso del comando b) ¿Es 516 un cuadrado perfecto? ¿y 2025?41
member? para responder a esta pregunta.
c) Comprueba que la fórmula

n(n + 1)(2n + 1)
12 + 22 + · · · + n2 =
6
es válida para n = 10, 100 y 1000.
42
En matemáticas, el logaritmo de un 9. Logaritmos42 :
número, en una base determinada, es el
exponente al cual hay que elevar la base a) Genera la lista de los logaritmos en base 10 de los primeros 100
para obtener dicho número. Por ejemplo,
el logaritmo de 1000 en base 10 es 3, por- números naturales.
que 1000 = 103 = 10 × 10 × 10. b) ¿Cuál es el primer número natural cuyo logaritmo en base 10 es
mayor que 0,5?
c) Genera la lista de los logaritmos de 100 en base k, con k =
2, . . . 100.
d) Calcula la suma de los logaritmos en base 2 de los primeros 10
números naturales no nulos y comprueba que es igual al logarit-
mo en base 2 del producto de todos ellos.
jhon.sn@live.com 14 Jun 2017

3
Usando NetLogo como un Logo clásico.
El caso de una sola tortuga.

En este capítulo vamos a centrarnos en el uso de una sola tortuga,


incluso sin considerar los patches, de forma similar a como se hace en
los Logos clásicos. Así, nos introduciremos en la programación de pe-
queños procedimientos desde la pestaña de código a la vez que practi-
camos algunas estructuras de programación y nos familiarizamos con
la forma de trabajar con estos agentes móviles, que serán la base de la
mayoría de los modelos que diseñemos.

La pestaña de código

Hasta ahora hemos visto parcialmente la pestaña de interfaz, que


nos proporciona una representación visual del mundo y una consola
interactiva para relacionarnos con los elementos que lo integran1 . 1
En un capítulo posterior aprenderemos
Sin embargo, la interacción que permite el Centro de Comandos es a sacar todo el jugo posible a la interfaz
añadiendo controles con los que podrá
limitada. Su principal limitación radica en la imposibilidad de defi- interactuar el usuario.
nir nuevas instrucciones que puedan ser usada más adelante como se
hace con las instrucciones primitivas que vienen definidas en el len-
guaje. Para ello hemos de hacer uso de la pestaña de código, que es la
zona preparada para definir nuevas instrucciones por medio de proce-
dimientos2 . Es realmente en ella donde podremos extraer la máxima 2
Piensa en un procedimiento como en
potencia a la plataforma, que después habrá de ser complementada una ampliación hecha por ti del lenguaje
de NetLogo.
con la creación de una interfaz cómoda para el usuario y con la in-
formación necesaria para que nuestro modelo constituya una unidad
completa y útil para otros.
Cuando pulsamos sobre la pestaña de código (Code) lo que en-
contramos es un papel en blanco donde definir los procedimientos que 3
Algunas de estas acciones se pueden
conseguir por medio del menú Edit,
queremos añadir para nuestro mundo. En esencia es un editor de texto
otras son automáticas, y otras se puede
simple que tiene ciertas peculiaridades que facilitan la tarea de progra- acceder por medio de un conjunto de te-
mar en NetLogo3 : clas de acción asociadas.
jhon.sn@live.com 14 Jun 2017

38 netlogo

Permite las acciones habituales de cortar/copiar/pegar.

Tiene un pequeño buscador, que será muy útil cuando la cantidad


de procedimientos definidos crezca.

Tiene resaltado de texto por medio del coloreado selectivo de las


instrucciones, constantes y palabras clave del lenguaje, lo que facili-
ta la tarea de leer código y reduce el número de errores de escritura.

Tiene indentación automática del código para resaltar los bloques


internos.

Facilita la tarea de comentar y descomentar bloques de código.

Incluye un comprobador de sintaxis para evitar errores posteriores


en tiempo de ejecución.

Dispone de un menú desplegable que permite acceder por orden


alfabético a los procedimientos definidos en el código.

La imagen anterior muestra el trozo relevante del editor en el que


hemos definido un procedimiento, iniciar-mundo, que limpia el mun-
4
Es decir, elimina todos los agentes an- do4 y crea una tortuga en él (ambas instrucciones las conocíamos del
teriores que hubiera, sitúa los patches en capítulo anterior).
sus condiciones iniciales y borra la capa
de dibujo.

Ampliando el lenguaje. Definición de procedimientos

En NetLogo existen dos métodos de comunicación con los agentes:


los comandos y los reportes. Un comando es una acción que el agente
debe llevar a cabo; un reporte permite calcular un valor y devolverlo,
y no necesariamente tiene que ser ejecutado por un agente.
Los programadores de NetLogo suelen diferenciar ambos métodos
empleando distintos tipos de palabras: habitualmente los comandos,
como accciones que son, se enuncian con verbos (create, die, jump,
5
Todos los ejemplos citados son instruc- inspect, clear, etc.); mientras que los reportes se ordenan mediante
ciones que existen en NetLogo, algunas
nombres o frases que informan acerca del valor que se desea obtener
de las cuales ya han sido usadas en el
capítulo anterior. (distance, sum, max, etc.)5 .
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 39

Los comandos y reportes de que dispone NetLogo se llaman pri-


mitivas; los que crea el usuario para un modelo concreto se suelen
denominar con el término genérico de procedimientos. Cada proce-
dimiento se define por un nombre precedido de la palabra clave to y
acaba con la palabra clave end6 . 6
Cuando en un lenguaje de programa-
Tanto los comandos como los reportes pueden recibir datos de en- ción decimos que una palabra es una pa-
labra clave estamos indicando que es-
trada que usan para llevar a cabo su objetivo. tá reservada por el lenguaje (es decir,
Al igual que ocurría con los contextos del Centro de Comandos, no podemos reutilizarla para nuestros fi-
nes) como complemento o palabra auxi-
en NetLogo es importante saber qué tipo de agentes puede ejecutar liar, pero sin una acción o reporte asocia-
cada comando. Como vimos, hay comandos (como ca y crt) que sólo dos.
pueden ser ejecutados por el observador, otros (como fd) sólo por las
tortugas, y otros (como set, que lo veremos más adelante formalmente,
aunque ya ha aparecido antes) que pueden se ejecutados por todos los
tipos de agentes (incluyendo el observador, que podemos considerar
como un agente especial).
Pero volvamos al procedimiento iniciar-mundo que acabamos de
definir. Si tras haberlo escrito queremos saber si hemos cometido algún
error sintáctico en su definición, basta pulsar en el botón Check de
la barra de herramientas de esta pestaña. Si la sintaxis es correcta,
7
Pero no te preocupes, si te olvidas de
pulsar el botón Check e intentas ir direc-
no habrá ningún mensaje por parte del sistema y el botón cambia a tamente a la pestaña de interfaz para eje-
deshabilitado (se pone de una tonalidad grisácea); en caso contrario, cutar los procedimientos definidos, se-
rá NetLogo quien haga la comprobación
el sistema salta a la línea en la que encuentra el error y destaca lo
por ti de forma automática y te indique
que no entiende con un mensaje (en inglés) explicando el problema. Si el error, si lo hubiera. Por ello, si el có-
hay algún error, el sistema no podrá interpretar ni ejecutar los nuevos digo es especialmente largo, podremos
notar una cierta latencia entre la pulsa-
procedimientos definidos, pero tendrá conocimiento de cómo estaban ción sobre la pestaña de interfaz y el pa-
las definiciones hasta la última vez que se hizo una evaluación correcta. so efectivo a ella).
En cuanto hagamos alguna modificación en el código, el botón Check
volverá a habilitarse, indicando que ha habido cambios que no han
sido comprobados7 .

Una vez comprobado el código, ya podemos ejecutar el procedi-


miento desde la consola interactiva como si se tratase de una instruc-
ción más incluida en NetLogo.
Recordemos que, por defecto, cuando se crea una tortuga nueva,
ésta se sitúa en el origen de coordenadas del mundo, pero con una
orientación y color aleatorios.
Vamos a comenzar definiendo un sencillo procedimiento que reali-
ce un cuadrado de lado 4 (figura 3.1). Para poder ejecutar el procedi-
miento tenemos que cambiar el contexto del Centro de Comandos a
turtles>, ya que las instrucciones que en él se ejecutan sólo pueden
Figura 3.1: Procedimiento cuadrado defi-
ser llevadas a cabo por las tortugas. Observemos, además, que la geo- nido en la pestaña de código.
metría que utiliza la tortuga es su geometría intrínseca, lo que quiere
jhon.sn@live.com 14 Jun 2017

40 netlogo

decir que la figura resultante dependerá de la posición que ocupa la


tortuga en el momento de ejecutar el procedimiento, pero siempre será
un cuadrado.
Evidentemente, y ajustando de forma adecuada los ángulos, pode-
mos hacer que la tortuga dibuje cualquier polígono de manera similar.
Aunque sería muy tedioso, si queremos realizar un polígono de 50
lados, repetir 50 veces el par de instrucciones avanza + gira. Para po-
der repetir un bloque de acciones un número determinado de veces,
NetLogo incluye la instrucción repeat, que tiene la estructura:
repeat n [ acciones ]
y que realiza esa repetición por nosotros.
Apliquémosla para redefinir el procedimiento anterior de una for-
ma más sencilla:
 
t o cuadrado
pd
repeat 4 [
fd 4
r t 90 ]
pu
end
 
El comportamiento de ambas versiones es el mismo; señalemos las
diferencias formales:

En la nueva versión hacemos un giro rt 90 adicional que antes no


hacíamos y que no es estrictamente necesario para obtener el cua-
drado.

Hemos añadido un comando pu (pen-up) al final del procedimiento


8
Tomemos como norma general que, al (y fuera de la acción de repeat). Si al principio la tortuga tenía el
diseñar una acción para un agente, el es-
lápiz levantado y lo bajamos para dibujar el cuadrado, al acabar lo
tado final del agente tras realizar la ac-
ción ha de ser, en la medida de lo po- volvemos a subir para que el estado de la tortuga sea exactamente
sible, el mismo que tenía antes de reali- el mismo. De esta forma, podremos seguir moviendo la tortuga sin
zar dicha acción. Como toda norma, ve-
remos que a veces, intencionadamente, miedo a que dibuje zonas no deseadas8 .
no la cumplimos.
Es importante hacer notar una característica que se repetirá a lo
largo de todo el trabajo con NetLogo: siempre que consideremos un
bloque de instrucciones bajo la acción de una estructura superior, éstas
9
La única excepción a esta regla la pro- irán entre corchetes9 .
porcionan las definiciones de nuevos Para que la tortuga dibuje un triángulo equilátero de lado 4, el pro-
procedimientos por medio de to...end.
cedimiento en versión abreviada será:
 
to triangulo
pd
repeat 3 [
fd 4
r t 120 ]
pu
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 41

end
 

Actividad: Si a partir de estos dos nuevos procedimientos quere-


mos dibujar una casa, podemos crear un tercer procedimiento que
haga uso de los dos anteriores. ¿Sería el procedimiento que sigue el
que estamos buscando? Si no lo es, introduce los cambios necesarios
para obtener el resultado deseado.
 
to casa
cuadrado
triangulo
end
 

Actividad: ¿Cuál sería el procedimiento para que la tortuga dibuje


un pentágono?, ¿y un hexágono? ¿Podemos sacar una regla general
para dibujar un polígono de n lados?

Además de los cambios en el cálculo del ángulo de giro, necesario


para que el resultado sea el que buscamos, es conveniente tener alguna
forma de crear procedimientos más generales que puedan depender de
parámetros para comportarse de formas distintas. Así, podríamos de-
finir un procedimiento, llamado poligono, que fuese capaz de generar
un polígono regular a partir del número de lados que debe tener.
Para crear un procedimiento en NetLogo que acepte datos de entra-
da basta incluir una lista con los nombres de los datos que se usarán
tras el nombre del procedimiento. Por ejemplo:
 
t o poligono [num−l a d o s l o n g i t u d ]
pd
r e p e a t num−l a d o s [
fd l o n g i t u d
r t ( 3 6 0 / num−l a d o s ) ]
pu
end
 
Hemos aprovechado para añadir no únicamente el número de lados 10
Observa que los datos de entrada se
expresan en la definición del procedi-
como dato de entrada, sino también la longitud del lado, de forma
miento como una lista de NetLogo.
que tengamos un procedimiento lo más general posible10 . Una vez
definido en el código, podremos utilizarlo como el resto de primitivas, 11
Es importante tener en cuenta que el
orden de los datos de entrada es fijo:
pero con la precaución de proporcionarle estos datos necesarios para
una vez definido el procedimiento siem-
su ejecución cada vez que la usemos11 . pre han de proporcionarse en el orden
En la figura ?? se muestra cómo se ha usado en el Centro de Co- en que se han puesto en su definición.

mandos (en el contexto tortuga, por supuesto). Aunque la definición


del procedimiento necesita los corchetes para explicitarle a NetLogo
cuáles son los parámetros de entrada y cuál es el bloque de instruccio-
nes que conforman su cuerpo, en el momento de ejecutarlo no se hace
jhon.sn@live.com 14 Jun 2017

42 netlogo

uso de los corchetes, sino que los parámetros de entrada se escriben


12
En esta ejecución: num-lados=7, directamente a continuación del nombre del procedimiento12 :
longitud=4.
turtles> poligono 7 4
Pero sigamos haciendo avanzar a la tortuga. Una de sus limitaciones
es que no puede realizar curvas, sino sólo moverse en línea recta y gi-
rar una vez parada. ¿Cómo podremos entonces dibujar circunferencias
y arcos de circunferencia? La idea nos la da la figura siguiente: ¿qué
ocurriría si en la secuencia anterior vamos incrementando el número
de lados?

13
Aprovechando que de todas formas las
pantallas de ordenador tienen una pre-
cisión limitada que viene dada por los
pixels, podemos estar seguros de que
no habría diferencia apreciable entre una
circunferencia dibujada sobre los pixels
y un polígono de suficientes lados y de
tamaño de lado suficientemente peque-
ño.
Vista globalmente, la figura obtenida se parecería cada vez más a
una circunferencia, aunque demasiado grande para sernos útil. Si a
la vez que vamos aumentando el número de lados, disminuimos el
tamaño de éste, lo que obtenemos es una buena aproximación de la
14
Puedes obtener una valiosa informa- circunferencia13 .
ción sabiendo que la longitud de la cir-
cunferencia de radio r es: L = 2πr.
Pero lo normal es dibujar una circunferencia conociendo su radio, y
no decidiendo el número y tamaño de los lados de un polígono que la
aproxime. Si fijamos el número de lados, por ejemplo en 360 (igual que
el número de grados que tiene una circunferencia) podemos fácilmente
crear un procedimiento que, recibiendo el radio de la circunferencia,
haga que la tortuga la dibuje (figura 3.2)14 .
 
t o c i r c u n f e r e n c i a [ Radio ]
poligono 360 ( 2 * p i * Radio / 3 6 0 )
end
 
Partiendo de la idea del polígono y de su uso en la circunferencia,
Figura 3.2: Ejemplo de uso del procedi-
miento circunferencia.
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 43

podemos construir dos procedimientos para dibujar arcos a partir del


radio y del número de grados que debe cubrir:
 
t o arco − i [ Radio Grados ]
pd
r e p e a t Grados [
fd ( 2 * p i * Radio / 3 6 0 )
lt 1 ]
pu
end

t o arco −d [ Radio Grados ]


pd
r e p e a t Grados [
fd ( 2 * p i * Radio / 3 6 0 )
rt 1 ]
pu
end
 
Una demostración de lo que se puede conseguir ya con los procedi-
mientos que hemos creado hasta el momento y un poco de imagina-
ción podría ser (figura 3.3):
 
t o Rayo [ Radio ]
repeat 2 [
arco − i Radio 90
arco −d Radio 90 ]
end

t o s o l [Tam]
repeat 9 [
Rayo Tam
r t 160 ]
end Figura 3.3: Ejemplos de uso de los pro-
  cedimientos arco-i y arco-d.

La geometría de la tortuga frente a la geometría de coordenadas


Esta sección, y algunos de los ejemplos
La forma de trabajar con las tortugas que hemos visto hasta ahora que veremos a lo largo de este capítulo,
nos proporciona una herramienta para describir figuras, no sólo para se basan, fundamentalmente, en el mag-
nífico libro de H. Abelson y A. diSessa:
dibujarlas, que podríamos denominar geometría de la tortuga. Geometría de la Tortuga. El Ordenador como
Si la comparamos con la forma en que se podrían definir dichas medio de exploración de las Matemáticas.
figuras haciendo uso de la geometría cartesiana (por medio de las
coordenadas de sus puntos) observamos que, a pesar de obtener las
mismas figuras, los métodos de descripción son radicalmente distin-
tos. Veremos que por medio de la tortuga podremos razonar con la
geometría de forma alternativa, primando las ideas y las relaciones
internas de las figuras, y no su disposición concreta en el espacio.
Una primera diferencia entre la geometría de la tortuga y la geome-
tría cartesiana se encuentra en la noción de las propiedades intrínsecas
jhon.sn@live.com 14 Jun 2017

44 netlogo

de las figuras geométricas, es decir, las que no dependen de su relación


con un sistema de referencia, sino únicamente de la figura en cuestión.
Por ejemplo, un polígono que se obtiene ejecutando el procedimiento
que hemos definido anteriormente tiene unas características esencia-
les que le hacen llamarse polígono independientemente de dónde esté
situado, de su tamaño o de su orientación. Sin embargo, poder decir
que el polígono representado tiene un lado horizontal depende de un
sistema de referencia exterior a la figura y, por tanto, ajeno a ella. Las
primeras son propiedades intrínsecas mientras que las segundas son
propiedades extrínsecas.

Figura 3.4: Cuadrados realizados por la


misma tortuga.

Una segunda diferencia se basa en la descripción que se obtiene


de la figura. Por ejemplo, la descripción de una circunferencia por
medio de su ecuación algebraica depende del sistema de referencia,
y de hecho, no es un problema trivial el reconocer una circunferencia
situada en el plano por medio de la ecuación implícita que la define.
Sin embargo, la descripción teórica de la misma circunferencia desde
el punto de vista de la tortuga es mucho más simple, y si sabemos que
estamos repitiendo de forma continua el mismo par de instrucciones
avanza y gira, sabemos que lo que obtenemos es una circunferencia.
De esta forma, conceptos de difícil definición en la geometría carte-
siana se convierten en conceptos naturales en la geometría de la tor-
tuga; por ejemplo, la curvatura de la curva que dibuja una tortuga es
la relación que existe entre el ángulo girado y la distancia recorrida;
a mayor ángulo girado por unidad de distancia recorrida, mayor es la
curvatura.
Incluso podríamos hablar de la complejidad descriptiva de las fi-
guras: a mayor complejidad del procedimiento que dirige la tortuga
para dibujarla, mayor complejidad de la figura. Por ejemplo, a pesar
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 45

de que las ecuaciones de una elipse y una circunferencia son muy pa-
recidas, y por tanto su complejidad descriptiva usando el álgebra es
semejante, el número de instrucciones que han de darse a las tortu-
gas es mayor para generar elipses que para generar circunferencias,
con lo que la complejidad descriptiva de ambas figuras es diferente.
Otro ejemplo de divergencia: mientras que la ecuación algebraica de
una circunferencia centrada en el origen es más sencilla que la de una
circunferencia centrada en otro punto del plano, los procedimientos
seguidos para generarlas por medio de la geometría de la tortuga son
casi idénticos (bastaría desplazar a la tortuga con el lápiz levantado an-
tes de dibujar la circunferencia), por lo que su complejidad descriptiva
es equivalente.
Fijándonos de nuevo en el caso de la circunferencia descubrimos
una diferencia más entre ambas geometrías: la descripción de la tor-
tuga es local, en el sentido de que está relacionada con la geometría
de un trozo pequeño del espacio, aquel en el que está la tortuga en
el momento de ejecutar las instrucciones, y puede ignorar cómo debe
comportarse en otros lugares del espacio15 ; sin embargo, la ecuación 15
Esta característica nos permitirá, cuan-
algebraica de la circunferencia establece una relación global entre pun- do analicemos NetLogo 3D en uno de
los últimos capítulos del libro, reutili-
tos distantes del plano. zar los mismos procedimientos que te-
nemos aquí definidos para trabajar con
figuras sobre superficies curvas en el es-
Alguna estructuras básicas de programación pacio 3D.

Vamos a continuar trabajando con figuras dibujadas por las tortu-


gas a partir de modificaciones del procedimiento poligono que vimos
anteriormente.
 
t o poligono [num−l a d o s l o n g i t u d ]
pd
r e p e a t num−l a d o s [
fd l o n g i t u d
r t ( 3 6 0 / num−l a d o s ) ]
pu
end
 
Al analizar cómo funciona, nos damos cuenta de que, gracias a que
sabemos el número de veces que queremos repetir la acción de avanza
+ gira, podemos usar una estructura repeat para conseguir la figu-
ra deseada. Vamos a verlo al revés: ¿qué ocurriría si supiéramos los
grados que queremos que gire la tortuga en cada repetición?, ¿cuántas
veces tendríamos que repetir la acción para obtener una figura?
En un procedimiento como el que sigue, si no sabemos cuántas re-
peticiones son necesarias, podemos usar un dato de entrada más para
poder hacer experimentos iniciales:
jhon.sn@live.com 14 Jun 2017

46 netlogo

 
t o p o l i −con−rep [ l o n g i t u d angulo r e p e t i c i o n e s ]
pd
repeat repeticiones [
fd l o n g i t u d
r t angulo ]
pu
end
 
Figura 3.5: poli-con-rep 10 144 10

Actividad: ¿En qué casos el procedimiento anterior genera figuras


cerradas? Experimenta con algunos ejemplos.

Observemos que, dando valores adecuados a angulo y repeticio-


nes, podemos conseguir los mismos resultados que con la función
poligono, pero ésta es más versátil y podemos producir muchas más
Figura 3.6: poli-con-rep 10 150 10 figuras (figuras 3.5, 3.6 y 3.7).
A continuación mostramos cómo conseguir variantes geométricas
realizando una pequeña modificación al procedimiento anterior (figu-
ra 3.8):

 
t o p o l i 2 −con−rep [ l o n g i t u d angulo r e p e t i c i o n e s ]
pd
repeat repeticiones [
Figura 3.7: poli-con-rep 6 72 10 fd l o n g i t u d
r t angulo
fd l o n g i t u d
r t 2 * angulo ]
pu
end
 

Actividad: Se pueden plantear variantes muy interesantes si se


combinan los procedimientos anteriores con formas más elaboradas
Figura 3.8: poli2-con-rep 10 144 10 para reemplazar las llamadas a fd y rt. Por ejemplo, ¿qué ocurriría
si, cada vez que en el procedimiento anterior aparece fd, lo susti-
tuimos por algún otro procedimiento que, además de desplazar la
tortuga, realice alguna otra figura en su recorrido?

Vamos a enriquecer la capacidad creativa de nuestros procedimien-


tos introduciendo nuevas estructuras de repetición que añadan nuevas
16
En general, las estructuras de repeti- opciones a la que ya tenemos con repeat16 . Pero antes de usarlas es
ción se denominan en la mayoría de los aconsejable conocer las estructuras condicionales, que permitirá al pro-
lenguajes de programación bucles.
cedimiento tomar decisiones mientras se ejecuta para poder controlar
las repeticiones.
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 47

Estructuras condicionales
NetLogo dispone de varias versiones de estructuras condicionales,
pequeñas modificaciones unas de otras que responden todas a la si-
guiente estructura general:

ifelse condicion
[ acciones-SI ]
[ acciones-NO ]

Lo que hace NetLogo al encontrar la estructura anterior es evaluar la


condición: si el resultado es afirmativo, ejecuta el bloque acciones-SI;
en caso contrario, ejecuta el bloque acciones-NO.
Veamos un ejemplo de uso haciendo una pequeña modificación so-
bre uno de los procedimientos vistos:
 
t o p o l i −con−d e c i s i o n [ l o n g i t u d angulo r e p e t i c i o n e s ]
pd
repeat repeticiones [
fd l o n g i t u d
i f e l s e ( random 2 = 0 ) [ pd ] [ pu ]
r t angulo ]
pu
end
 

Actividad: ¿Qué diferencia produce la introducción del condicio-


nal en este procedimiento? Intenta responder a la pregunta antes de
probarlo con NetLogo. ¿Cómo de frecuente es este cambio?, ¿se te
ocurre alguna forma de hacer que sea más, o menos, frecuente?

En caso de que solo queramos realizar acciones cuando la condición


se verifica y continuar con el resto del procedimiento en caso contrario,
podemos usar una expresión más simple:
if condicion [ acciones caso afirmativo ]

Repeticiones sin parada


La segunda estructura de repetición que veremos es una simple,
aunque no inocente, extensión de repeat que introduce la novedad de
ejecutarse indefinidamente. Su forma general es:
loop [ acciones ]
Usando esta estructura, podríamos reescribir los procedimientos an-
teriores de la siguiente forma:
 
t o p o l i −s i n − f i n [ l o n g i t u d angulo ]
pd
loop [
fd l o n g i t u d
jhon.sn@live.com 14 Jun 2017

48 netlogo

r t angulo ]
pu
end
 
Al usar esta estructura se debe tener una precaución: solo se puede
parar por medio de programación haciendo uso de la instrucción stop,
normalmente combinada con un condicional. Esta instrucción (stop)
se puede usar con cualquier bloque de instrucciones, y su ejecución
detiene la ejecución de dicho bloque, continuando con la ejecución
del procedimiento que lo llamó, o al bloque superior en el que está
17
Alternativamente, si queremos dete- inmerso17 .
ner todos los procedimientos que haya  
en ejecución, podemos hacer uso de la t o p o l i −s in −f i n −c o n t r o l a d o [ l o n g i t u d angulo ]
opción Halt que encontraremos bajo la pd
categoría Tools del menú principal de loop [
NetLogo.
fd l o n g i t u d
r t angulo
i f ( angulo > 180 ) [ s to p ] ]
pu
end
 
La estructura loop tiene un uso muy limitado debido a que habi-
tualmente sólo se obtiene una utilidad real de ella si se proporciona
un procedimiento para controlar su ejecución; veremos otras estructu-
ras y opciones de NetLogo que ofrecen la misma funcionalidad pero
proporcionan mayor control sobre el proceso.

Llamadas recursivas
Aprovechando que los procedimientos pueden provocar la ejecu-
ción de otros procedimientos, conseguimos un tipo de estructuras es-
pecialmente interesantes haciendo uso de una idea muy sencilla: ¿qué
18
Para este tipo de estructuras no hay ocurriría si un procedimiento se llamase a sí mismo?18 . A los proce-
que introducir ninguna instrucción nue- dimientos que hacen uso de esta reflexión se les llama recursivos y al
va en NetLogo.
método abstracto de generarlos, recursión. Un ejemplo de recursión,
aplicado a las ideas geométricas que venimos desarrollando, podría
ser:
 
t o p o l i −r e c u r s i v o [ l o n g i t u d angulo ]
pd
fd l o n g i t u d
r t angulo
p o l i −r e c u r s i v o l o n g i t u d angulo
pu
end
 
Así definido, no presenta diferencias apreciables en su comporta-
miento respecto al procedimiento poli-sin-fin definido anteriormen-
te (salvo que en cada iteración se baja y se sube el lápiz), pero ¿qué
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 49

pasaría si en las llamadas a la propia función fuésemos modificando


ligeramente los valores de longitud o angulo usados?
 
t o p o l i −r e c u r s i v o −c o n t r o l a d o [ l o n g i t u d angulo ]
i f ( l o n g i t u d > 3 ) [ s to p ]
pd
fd l o n g i t u d
r t angulo
p o l i −r e c u r s i v o −c o n t r o l a d o ( l o n g i t u d + 0 . 1 ) angulo
pu
end
 
Es importante destacar que hemos introducido un control condicio-
nal que permite parar el procedimiento y que éste debe situarse antes
que la llamada a la propia función porque, si no, el procedimiento
nunca pararía. También se puede evitar dicho problema especificando
cuándo se desea hacer la llamada recursiva, como muestra la siguiente
variante:
 
t o p o l i −r c [ l o n g i t u d angulo ]
pd
fd l o n g i t u d
r t angulo
i f l o n g i t u d < 3 [ p o l i −r c ( l o n g i t u d + 0 . 1 ) angulo ]
pu
end
 

Actividad: ¿Qué figura geométrica hace genera procedimiento?


Pruébalo con distintas entradas y haz variantes de forma que la
llamada produzca distintas formas, pero ten cuidado de controlar
que el procedimiento se detenga en algún momento o tendrás que
hacer uso de Halt tal y como se indica en el texto.

A continuación mostramos dos procedimientos que generalizan los


procedimientos anteriores, pero en un caso modificamos la longitud
de avance y en otro el ángulo de giro19 : 19
En ambos casos hemos introducido un
  parámetro más para que el usuario con-
t o p o l i e s p i [ l o n g i t u d l i m i t e angulo i n c ] trole las llamadas recursivas.
pd
fd l o n g i t u d
r t angulo
i f ( longitud < l i m i t e )
[ p o l i e s p i ( l o n g i t u d + i n c ) l i m i t e angulo i n c ]
pu
end

t o e s p i i n t [ l o n g i t u d angulo l i m i t e i n c ]
pd
fd l o n g i t u d
r t angulo
jhon.sn@live.com 14 Jun 2017

50 netlogo

i f ( angulo < l i m i t e )
[ e s p i i n t l o n g i t u d ( angulo + i n c ) l i m i t e i n c ]
pu
end
 

Repeticiones condicionales
Una estructura mucho más manejable y concisa para ejecutar repeti-
ciones de forma controlada es el bucle while. Su significado es sencillo:
realizar un bloque de acciones mientras se verifique una condición,
que habitualmente podrá verificarse o no en función de las acciones
ejecutadas dentro del bucle. De esta forma, conseguimos un sistema
20
Pero no tan rígida como la que ofrece para repetir acciones de una forma controlada20 . Su estructura general
repeat, que exige saber a priori cuántas
es:
repeticiones se deben hacer.
while [ condicion ] [ acciones ]
Esencialmente, un bucle while nos va a permitir hacer de una for-
ma más elegante lo que ya sabíamos hacer por medio de un loop +
21
Y es aconsejable acostumbrarse a usar condicional21 :
esta opción y reducir el uso de los bucles  
loop. t o p o l i −s in −f i n −con−while [ l o n g i t u d angulo ]
pd
while [ angulo < 180 ]
[ fd l o n g i t u d
r t angulo ]
pu
end
 

Uso de variables para mantener información dentro de los procedimien-


tos
A veces, durante la ejecución de un procedimiento es necesario rea-
lizar algún cálculo intermedio que conviene almacenar temporalmen-
te. Para poder trabajar con esta información temporal existe lo que se
llaman las variables locales.
En general, una variable es un espacio de memoria al que se le
asigna un nombre para poder referirse a ella y que permite almacenar
un dato, que podrá ser leído y modificado en cualquier momento.
El apelativo local se debe a que la variable sólo existirá mientras se
está ejecutando el procedimiento al que pertenece y se borra si dicho
22
Realmente, ya nos hemos encontrado procedimiento ha terminado 22 .
con variables locales: cuando hemos de-
Las variables locales son muy recomendables por varias causas:
finido los datos de entrada de los pro-
cedimientos lo que realmente hacíamos
era definir variables locales para poder Permiten ahorrar memoria porque, una vez ejecutado un procedi-
almacenar los datos de entrada y usarlos miento, toda la memoria usada por él es liberada automáticamente
en la ejecución del procedimiento.
(de esta limpieza se encarga NetLogo, claro).
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 51

Al existir únicamente en el interior del bloque en el que se declaran,


no hay posible confusión entre variables con el mismo nombre en
distintos bloques23 . 23
Tal y como lo demuestra el hecho de
que muchos de los procedimientos que
En NetLogo, si un procedimiento quiere hacer uso de una variable hemos visto hasta ahora usaban los mis-
mos nombres de variables para manipu-
local que no se vaya a utilizar para almacenar un dato de entrada tiene lar los datos de entrada.
que declararla la primera vez que la use por medio de la instrucción
let, y además es obligatorio asignarle un valor inicial (una variable no
puede estar vacía). La forma de hacerlo sería:
let nombre-variable valor
Respecto a las restricciones que se aplican a los nombres de las
variables hay que señalar que se puede usar cualquier palabra que: 24
Por ejemplo, no podemos definir crt
como variable local, puesto que existe
No sea el nombre de una primitiva o procedimiento definido en
una instrucción llamada así.
NetLogo24 .
25
Es decir, debe ser una sola palabra;
si se quieren usar varias palabras (por
No contenga espacios25 .
ejemplo mi variable) hay varios trucos
posibles: separarlas por un guion bajo
No empiece por un número, aunque sí puede contener números (mi_variable), usar mayúsculas en ca-
dentro26 . da palabra (MiVariable), usar puntos
(mi.variable), u otros similares.
No empiece por ?27 . 26
Por ejemplo, cont12 es válida, pero
12cont no.
En general, es una norma de buen uso dar a la variable un nom-
27
Porque, como veremos, es un símbolo
reservado para ciertas variables especia-
bre que identifique su funcionalidad dentro del procedimiento, de esa les. De hecho, ya vimos que para el caso
forma el código será mucho más comprensible. de n-values se usaba ? como valor que
recorría los valores de 0 a n.
Let solo sirve para declarar la variable la primera vez, pero si más
adelante queremos modificar su valor, hemos de hacer uso de la ins-
trucción set:
set nombre-variable nuevo-valor
Para recuperar el valor de la variable basta con usarla por medio de
su nombre. Por ejemplo:
 
let a 1
let b 2
set b ( a + 10)
 
Define dos variables locales, a y b, de valores 1 y 2 respectivamente,
y después copia en b el valor de a + 10, por lo que valdrán a = 1 y
b = 11. Observa que en la última instrucción el valor de a se recupera
directamente.
Veamos un ejemplo de cómo usar variables locales para definir un
procedimiento que dibuja estructuras más complejas (llamada espirola-
terales simples) a partir de las espirales anteriores (figura 3.9):
 
t o e s p i r o [ l o n g i t u d angulo maxx r e p e t i c i o n e s ]
pd
repeat repeticiones [
s u b e s p i r o l o n g i t u d angulo maxx ] Figura 3.9: espiro 1 144 8 6
jhon.sn@live.com 14 Jun 2017

52 netlogo

pu
end

t o s u b e s p i r o [ l o n g i t u d angulo maxx ]
l e t c on t 1
r e p e a t maxx [
fd l o n g i t u d * co nt
r t angulo
s e t co nt co nt + 1 ]
end
 

Actividad: ¿Cuál es la labor de la variable cont en el procedimiento


subespiro?

Otro ejemplo (figura 3.10):


 
to p ol ia rc [ longitud i n f e r i o r superior r e p e t i c i o n e s ]
pd
repeat repeticiones [
esp l o n g i t u d i n f e r i o r s u p e r i o r 1
Figura 3.10: poliarc 1 0 30 10
esp l o n g i t u d s u p e r i o r i n f e r i o r −1 ]
pu
end

t o esp [ l o n g i t u d contador f i n a l i n c ]
while [ contador ! = f i n a l ] [
fd l o n g i t u d
l t contador
s e t contador contador + i n c ]
end
 

Ejercicios
28
Recuerda que para mostrar informa- 1. Haz un procedimiento que reciba como entrada un ángulo y de-
ción por la consola tenemos la instruc-
vuelva su valor en radianes así como sus razones trigonometricas28
ción show). Te recomendamos que hagas
uso de la instrucción word para que la y dibuje dos segmentos concurrentes que formen el ángulo indica-
salida sea más fácil de leer. do.

2. Usando el procedimiento circunferencia introducido en este ca-


pítulo, haz un procedimiento que dibuje una versión de los aros
olímpicos.
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 53

3. Haz un procedimiento que dibuje el símbolo del Yin y Yang (figura


3.11).
Figura 3.11: Simbolo del Yin y Yang.
4. Escribe un procedimiento, llamado rosquilla, que dependa de dos
parámetros R (radio) y G (ángulo de giro) y dibuje círculos conse-
cutivos obteniendo la figura 3.12. Utiliza para ello el procedimiento
circunferencia en un bloque de la forma repeat 360/G [...], que
genera 360/G circunferencias, que pasan todas ellas por el origen y
que están giradas cada una respecto de la siguiente en un ángulo
de G grados. Haz lo mismo pero con otras figuras distintas.

5. Haz un procedimiento que dependa de tres parámetros: r (radio


menor), R (radio mayor) y N (número de circunferencias), que dibuje
una colección de N circunferencias concéntricas de centro el origen,
uniformemente distribuidas, comenzando por una de radio r y ter-
Figura 3.12: Ejemplo de una rosquilla.
minando por una de radio R. Haz lo mismo con polígonos en vez
de con circunferencias.

6. Halla un procedimiento que dependa de tres parámetros longinc


(longitud inicial), inc (incremento) y N (número de lados) que dibuje
una espiral cuadrada (figura 3.13).

7. Haz un procedimiento que dibuje un polígono regular de N lados


inscrito en una circunferencia de radio R. Figura 3.13: Ejemplo de una espiral cua-
drada.
8. Vamos a analizar un procedimiento recursivo que genera la curva
de Koch:

a) Analiza el siguiente procedimiento de tortugas que depende de


dos parámetros:
 
t o koch [ a d ]
pd
i f e l s e (d = 1)
[ fd a
l t 60
fd a
r t 120
jhon.sn@live.com 14 Jun 2017

54 netlogo

fd a
l t 60
fd a ]
[ koch ( a / 3) (d − 1)
l t 60
koch ( a / 3) (d − 1)
r t 120
koch ( a / 3) (d − 1)
l t 60
koch ( a / 3) (d − 1)]
end
 

29
El teorema del coseno dice que si un b) ¿Cuál es el papel de los parámetros a y d?
triángulo tiene por lados a, b y c, y por c) Crea una tortuga y ejecuta el procedimiento con diferentes valo-
ángulos opuestos a cada lado α, β y γ,
entonces: a2 = b2 + c2 − 2bc cos(α), b2 = res de a y d.
a2 + c2 − 2ac cos( β), c2 = a2 + b2 −
2ab cos(γ).
d) Si Cd es la curva dibujada por el procedimiento koch a d, la
curva de Koch es el límite de las curvas cuando d tiende a infinito.
¿Puedes calcular la longitud de la curva límite? (es el límite de
las longitudes de las curvas Cd ).
e) Usa el procedimiento koch para crear polígonos cuyos lados sean
curvas de Koch (es lo que se conocen como copos de nieve).

9. Utiliza el teorema del coseno29 para hacer un procedimiento que di-


buje un triángulo conocidas las longitudes a, b y c de los tres lados.

10. Vamos a analizar un procedimiento para dibujar la figura 3.14:

a) Elige el valor de los parámetros para los que el siguiente proce-


dimiento genera la figura 3.14:
 
t o aspa [ l d n ]
pd
i f e l s e (d = 1)
[ raya l n ]
[ repeat n [
Figura 3.14: Ejecución del procedimiento fd l aspa ( l / 3 ) ( d − 1 ) n
aspa.
bk l
r t (360 / n ) ] ]
end

t o raya [ l n ]
repeat n [
fd l
bk l
r t (360 / n ) ]
end
 
b) Introduce un nuevo parámetro que controle la proporción en la
que disminuye el lado a cada paso.
jhon.sn@live.com 14 Jun 2017

usando netlogo como un logo clásico. el caso de una sola tortuga. 55

c) Sustituye los segmentos por otros objetos.

11. Haz un procedimiento que genere la figura 3.15.

Figura 3.15: Patrón de círculos.


jhon.sn@live.com 14 Jun 2017

56 netlogo

12. Escribe un procedimiento que devuelva el término n-ésimo de la


30
Esta sucesión fue descrita por Leonar- sucesión de Fibonacci30 :
do de Pisa, matemático italiano del si-
glo XIII también conocido como Fibo- f ib(0) = f ib(1) = 1
nacci. Tiene numerosas aplicaciones en
ciencias de la computación, matemáti-
cas y teoría de juegos, y también aparece f ib(n + 2) = f ib(n) + f ib(n + 1)
en configuraciones biológicas, como por
ejemplo en las ramas de los árboles, en 13. Árboles fractales:
la disposición de las hojas en el tallo, la
distribución de pétalos de algunas flores
(como la alcachofa), distribución de los a) Haz un procedimiento que replique el árbol fractal de la figura
compartimentos de las semilla de las pi- 3.16, donde el ángulo entre dos ramas del mismo nivel es 60
ñas, etc. grados y la longitud l es un parámetro del procedimiento.
b) Determina el valor de l máximo para el cual no se cortan las
ramas.
c) Haz un procedimiento más general con un parámetro para el
ángulo entre las ramas y otro para el número de ramas.

Figura 3.16: Un árbol fractal.


jhon.sn@live.com 14 Jun 2017

4
Los protagonistas de NetLogo. Trabajando
con múltiples agentes.

Ya hemos visto en los capítulos anteriores que NetLogo permite


trabajar con tres tipos de agentes: patches, tortugas y links1 . Hemos 1
Aunque estos últimos serán formal-
aprendido cómo modificar propiedades de las tortugas y los patches mente presentados más adelante.

haciendo uso de sus ventanas de inspección y cómo mandarles órdenes


utilizando el Centro de Comandos y por medio de procedimientos
sencillos definidos en la pestaña de código.
En este capítulo nos adentraremos un poco más en la ejecución de
órdenes para dirigir el comportamiento de un grupo de agentes, no de
uno sólo, e incluso aprenderemos a hacer que uno de los agentes les
pida a otros que realicen algunas acciones. Es precisamente aquí, en
la ejecución simultánea de acciones, en donde reside una de las poten-
cialidades que diferencia NetLogo de otros Logos y de otros muchos
lenguajes de programación.
Y no sólo veremos que es potente, sino que además es sencillo.

Actuando nada más nacer

Ya sabemos que para crear una tortuga disponemos de la instruc-


ción create-turtles 1 (crt 1). Es fácil suponer que si en vez de es-
cribir 1, escribimos crt 10 se crearán 10 tortugas (cada una con su
identificador who distinto), y podemos comprobar que todas ellas na-
cerán en el origen de coordenadas, pero con una orientación y color
distintos (aleatorios) (figura 4.1).
Figura 4.1: Efecto de la creación de 10
El comando create-turtles tiene una estructura un poco más com- tortugas en el mundo.
pleja y potente (hasta ahora hemos usado una versión simplificada):
create-turtles n [acciones]
que permite que cada tortuga, al nacer, realice por separado el conjun-
to de acciones que se le indican2 . 2
Estas acciones pueden servir para crear
Por ejemplo, el siguiente código crea 10 tortugas y, tras la creación tortugas que verifiquen ciertas propieda-
des iniciales que pueden ser necesarias
de cada una, las cambia a color azul, las sitúa aleatoriamente en el en nuestro modelo.
jhon.sn@live.com 14 Jun 2017

58 netlogo

3
Las instrucciones random-pxcor y mundo y las orienta hacia el norte3 (figura 4.2).
random-pycor devuelven un valor  
aleatorio entero que puede ser usado t o setup
como coordenadas x e y válidas en el ca
mundo; la combinación de ellas coincide c r t 10 [
con la posición de un patch, por lo
que dependen de las dimensiones que
s e t c o l o r blue
se le haya dado al mundo. También s e t xcor random−pxcor
existen las versiones random-xcor y s e t ycor random−pycor
random-ycor para devolver valores no s e t heading 0 ]
enteros. end
 
El proceso parece ser paralelo, es decir, que lo realizan todas las
tortugas simultáneamente, pero se trata de un efecto óptico debido a
la velocidad de NetLogo. Vamos a realizar un pequeño experimento
para ver cómo lo ejecuta el sistema:

1. Copia el procedimiento anterior en la pestaña de código.

2. En la pestaña de interfaz, baja la velocidad de reproducción del


sistema, que por defecto está en normal, por medio del deslizador
de velocidad que hay en la barra de botones.

Figura 4.2: Resultado de la ejecución de


setup.

3. Desde el Centro de Comandos, en el contexto observer, ejecuta


setup.

Puedes observar que el sistema genera en un primer paso todas


las tortugas en el origen y, posteriormente, va ejecutando las acciones
anteriores una a una en cada una de ellas.
Actividad: Supongamos que tenemos definido el procedimiento
poligono del capítulo anterior, ¿qué resultado tendría el código
siguiente?

 
t o setup+poligono
ca
c r t 10 [ poligono 5 2 ]
end
 

Pidiendo a los agentes que realicen una acción

Sin lugar a dudas, la instrucción más potente de NetLogo y, por


ello, la que más vamos a utilizar, es ask, con la que podemos pedir
a los agentes que realicen acciones en cualquier momento, no necesa-
riamente en el momento de su creación ni por medio del Centro de
Comandos. Su formato es:
jhon.sn@live.com 14 Jun 2017

los protagonistas de netlogo. trabajando con múltiples agentes. 59

ask Conjunto-Agentes [ acciones ]


Podemos comprender mejor su funcionamiento si vemos un ejem-
plo de uso que sea ejecutable:
 
t o setup
ca
ask p a t c h e s [ s e t p c o l o r random 145 ]
c r t 10 [ s e t x y random−pxcor random−pycor ]
end
t o avanza
ask t u r t l e s [ fd 1 ]
end
 
El procedimiento setup tiene una acción similar al anterior, aunque
hemos introducido algunas variantes para ir conociendo poco a poco Figura 4.3: Resultado de la ejecución de
setup.
más instrucciones de lenguaje (figura 4.3): 4
Aunque las tortugas están inicialmente
situadas sobre los centros de los patches,
Tras limpiar el mundo, les pedimos a los patches que elijan un color al tener orientaciones aleatorias, con mu-
cha probabilidad, tras varias ejecucio-
aleatorio. Cada patch realiza la acción de manera independiente, nes de avanza, algunas de ellas acabarán
por lo que cada uno genera su propio número al azar y el resultado ocupando zonas intermedias, porque se
mueven en un mundo continuo (hasta la
es que cada uno tiene un color distinto (salvo que al azar hayan
precisión que permite el ordenador); pe-
salido colores repetidos). ro no confundamos la zona que ocupa la
tortuga con su posición: su tamaño pue-
Creamos 10 tortugas y las situamos al azar en el mundo. En este de hacer que quede sobre varios patches
distintos pero, en cada momento, su po-
caso hemos usado setxy en vez de setx y sety, que realiza las dos sición es un punto del plano que se sitúa
acciones simultáneamente, por lo que recibe dos datos de entrada. dentro de un solo patch.

Además, hemos creado un nuevo comando, avanza, que le pide a las


tortugas que avancen una unidad, lo que cada una hará en la dirección
que marque su orientación original4 (figura 4.4).

Actividad: Modifica el procedimiento anterior para hacer que


las tortugas al nacer tengan orientación horizontal o vertical, y
comprueba que en este caso al hacerlas avanzar 1 unidad todas se
sitúan sobre el centro de otro patch.

Es importante tener en cuenta que, cuando en una acción pedida a


un conjunto de agentes se utiliza una de las propiedades de los agen-
tes, cada agente accede al valor que tiene él en esa propiedad, pero no
Figura 4.4: Resultado de la ejecución de
a la de los demás. Más adelante veremos de qué forma podemos hacer avanza.
que, en algunos casos, un agente acceda a la propiedad de otro.
En el capítulo mencionamos que el hecho de que algunas instruccio-
nes solamente puedan sere ejecutadas por un grupo de agentes, pero
no por todos5 , obliga a tener presente el contexto necesario para ejecu-
tar cada procedimiento en el Centro de Comandos. Ahora, por medio 5
Por ejemplo, fd no puede ser ejecutado
de la instrucción ask, al menos el observador puede ejecutar proce- por los patches.

dimientos que mezclan instrucciones para distintos tipos de agentes,


jhon.sn@live.com 14 Jun 2017

60 netlogo

siempre y cuando haga uso de bloques de tipo ask independientes


para cada tipo de agente.
Una característica más de ask es que puede pedirle a un solo agente
que haga algo, no necesariamente al conjunto entero del tipo al que
pertenece. Para ello hemos de recordar algo señalamos en el capítulo
2, cuando presentamos los agentes; y es que todos tienen identifica-
dores que los individualizan: los patches, su posición en el plano; las
tortugas, un identificador numérico que se les asigna en el momento
de nacer y que almacenan en la propiedad who; y los links, los identi-
ficadores de los dos extremos que unen.
Las figuras 4.5 y 4.6 muestran el resultado de los siguientes pro-
cedimientos,que combinan el uso de los identificadores de patches y
tortugas con la instrucción ask:
 
ask patch 2 2 [ s e t p c o l o r blue ]
 
 
t o UnaTortuga
Figura 4.5: Acción de ask sobre un patch. ca
c r t 3 [ s e t x y random−pxcor random−pycor ]
ask t u r t l e 1 [ s e t s i z e 3 ]
end
 

Eligiendo con precisión los agentes

Hasta ahora sabemos diferenciar los conjuntos de agentes por su


tipo (patches, turtles, links), pero a menudo nos encontraremos con
la necesidad de lanzar un bloque de acciones sobre un grupo deter-
Figura 4.6: Acción de ask sobre una tor-
tuga. minado de agentes que no necesariamente es la totalidad de su tipo.
Por ejemplo, podemos crear cierto número de tortugas, pero pedir-
les solo a algunas de ellas que realicen una acción concreta. Para esta
6
En este procedimiento aprovechamos selección adicional de agentes según determinadas características adi-
que por defecto los patches tienen el co- cionales que puedan cumplir, NetLogo introduce una instrucción que
lor negro. La función n mod m devuelve
el resto de la división de n por m. permite aplicar filtros sobre las familias de agentes:
agentes with [ condición ]
que devuelve aquellos agentes que verifiquen la condición requerida.
Por ejemplo:
 
t u r t l e s with [ heading < 180 ]
 
Vamos a aprovechar esta instrucción para generar un damero6 (figura
4.7:
 
t o crea −damero
ask p a t c h e s with [ ( pxcor + pycor ) mod 2 = 0 ] [
s e t p c o l o r white ]
Figura 4.7: Resultado de la ejecución de end
damero.  
jhon.sn@live.com 14 Jun 2017

los protagonistas de netlogo. trabajando con múltiples agentes. 61

Obsérvese que siempre podemos conseguir los mismos resultados


por medio de un condicional dentro del ask:
ask a g e n t e s [ i f ( c o n d i c i o n ) [ a c c i o n e s ] ]

Sin embargo, la instrucción with hace más comprensible el código


y puede resultar más eficiente.
Las figuras 4.8, 4.9, 4.10 y 4.11 son una pequeña muestra de lo que
podemos conseguir jugando con las propiedades básicas de los pat-
ches:
 
t o crea −damero2
Figura 4.8: Resultado de la ejecución de
ask p a t c h e s with [ ( pxcor * pycor ) >= 0 ] [
crea-damero2.
s e t p c o l o r red ]
end

t o patron1
ask p a t c h e s with [ pxcor mod 2 = 0 ] [ s e t p c o l o r red ]
end

t o patron2
ask p a t c h e s with [ pxcor > 0 ] [ s e t p c o l o r red ]
ask p a t c h e s with [ pxcor < 0 ] [ s e t p c o l o r blue ]
end Figura 4.9: Resultado de la ejecución de
patron1.
t o patron3
ask p a t c h e s with [ pxcor > 0 ] [ s e t p c o l o r pxcor ]
ask p a t c h e s with [ pxcor < 0 ] [ s e t p c o l o r 10 + pxcor ]
end
 

Actividad: Haz un procedimiento que genere 10 tortugas de dos


posibles colores y después cambie sus tamaños de forma que las
de un color sean más grandes cuanto más lejos estén del origen de
coordenadas, y las del otro color al revés.
Figura 4.10: Resultado de la ejecución de
patron2.

Algunas notas sobre ask


Debido a que mucho del peso de una simulación cae en la ejecu-
ción de ask, es importante conocer exactamente cómo funciona este
comando para no incurrir en errores.
El primer detalle que se debe tener en cuenta es que ask no es una
instrucción paralela, es decir, no hace que todos los agentes realicen
sus acciones simultáneamente, sino que simula el paralelismo por un
procedimiento muy simple:
Figura 4.11: Resultado de la ejecución de
1. Toma el conjunto de agentes que deben realizar el bloque de accio- patron3.

nes y los ordena aleatoriamente.

2. Va tomando por el orden establecido en el paso anterior los agentes,


jhon.sn@live.com 14 Jun 2017

62 netlogo

uno a uno y para cada uno de ellos ejecuta secuencialmente todas


las instrucciones del bloque de acciones7 .
7
Es decir, el primer agente ejecuta to-
Eso implica que el comportamiento será distinto si ejecutamos los
do el bloque; cuando acaba, el segundo
agente de ese orden ejecuta todo el blo- dos siguientes casos, que podrían parecer similares:
 
que, y así sucesivamente hasta llegar al
último agente. Cada agente debe acabar ask t u r t l e s
su ejecución para que el siguiente pueda [ fd 1
comenzar la suya. s e t c o l o r red ]
 
 
ask t u r t l e s [ fd 1 ]
ask t u r t l e s [ s e t c o l o r red ]
 
En el segundo caso, todas las tortugas avanzarán un paso y, solo
después de que todas hayan avanzado, empezarán a cambiar su color
al rojo. En el primero, sin embargo, cada tortuga, siguiendo el orden
aleatorio que establezca ask, avanzará un paso y a continuación cam-
biará su color a rojo

Actividad: Para asegurarte de que comprendes la diferencia,


escribe los dos códigos en un modelo y ejecútalos a velocidad
reducida.

Además, cada vez que se ejecuta un bloque ask, el orden dado a


los agentes será distinto, para que no haya preferencias de un agente
sobre otro.
La decisión de no aplicar paralelamente las acciones de los agentes
no es una decisión menor:
1. Aunque parezca que el concepto de paralelismo es intuitivamente
claro, hasta el momento no hay consenso acerca de qué significa eje-
cución paralela y cómo implementarlo, ya que se pueden dar casos
(y con mucha frecuencia cuando hablamos de modelos con multi-
agentes) en los que aparezcan conflictos sin una solución claramente
8
Por ejemplo, imagina que dos agentes objetiva que los resuelva8 .
buscan comida y ambos llegan a la mis-
ma fuente en el mismo instante. ¿En- 2. En muchísimos casos el comportamiento asintótico es el mismo; es
cuentras alguna solución objetiva para
decir, si un proceso depende de una repetición en paralelo de ac-
decidir cuál de los dos debe quedársela?
Si la decisión es aleatoria, es exactamen- ciones por parte de un grupo de agentes, el resultado después de
te la solución que propone NetLogo; y muchos pasos es equivalente a la repetición del paralelismo simu-
si depende de otros factores, habría que
programarlos a priori, no pueden depen- lado (como el que se ha explicado antes) por el mismo grupo de
der del protocolo de ejecución, y por tan- agentes.
to también lo puedes expresar en el mo-
delo. 3. Además, en muchísimos casos habituales de simulaciones por me-
dio de sistemas multiagente, en el modelado y ejecución intervienen
tantos parámetros que no se conocen y se dejan aleatorios que, po-
siblemente, la ordenación aleatoria y cambiante de los agentes para
la ejecución secuencial es un factor más que afecta poco al resultado
final.
jhon.sn@live.com 14 Jun 2017

los protagonistas de netlogo. trabajando con múltiples agentes. 63

Actividad: Utiliza el modelo Ask Ordering Example que puedes


encontrar en la carpeta Code Samples para entender mejor el
comportamiento de la instrucción ask.

El tiempo

A diferencia de otros lenguajes de programación, en NetLogo el


tiempo es importante. Si queremos realizar un cálculo por medio de
un procedimiento o para generar una situación estática (por ejemplo,
determinada ordenación de objetos, como un grafo) generalmente no
nos importará cómo se han distribuido los hechos en el tiempo. Pero
habitualmente usaremos NetLogo para generar un sistema que evolu-
ciona; es más, en muchas ocasiones no nos importará tanto la situación
final como el proceso, la evolución, del sistema9 . En estos casos, poder 9
De hecho, muchas veces haremos mo-
controlar el tiempo, y decidir cuándo y cómo pasa será una prioridad. delos que no tienen una situación final,
sino exclusivamente una evolución.
Hasta ahora, en los modelos que hemos hecho el tiempo ha corrido
como ha querido, o mejor dicho, como ha podido. En realidad, hemos
usado una de las dos modalidades de tiempo que el sistema propor-
ciona: la del tiempo continuo, que significa, simplemente, que cada
vez que se produce un cambio en el mundo, el sistema lo representa.
Observemos que es el modo por defecto que se muestra en la pes-
taña de interfaz:

¿Qué implicaciones tiene esta continuidad? Depende del modelo que


estemos buscando o del problema que queramos resolver pero; por
ejemplo, si estamos intentando modelar un comportamiento paralelo
(y sabemos que NetLogo solo simula el paralelismo, porque la ejecu-
ción real es secuencial), las actualizaciones del mundo mostrarán que
realmente se está produciendo un orden en la ejecución de las accio-
nes10 y la simulación sería fallida. 10
De nuevo basta que disminuyas la ve-
En otros muchos modelos de NetLogo, sin embargo, el tiempo pasa locidad de cualquiera de los ejemplos
anteriores para ver que ha sido así.
en pasos discretos, llamados ticks. NetLogo incluye un contador de
ticks interno, con las instrucciones necesarias para poder manejar su
paso.

Podemos cambiar el modo temporal por medio del desplegable de


la pestaña de interfaz, pero además habrá que usar las instrucciones
adecuadas para hacer avanzar el reloj y reiniciarlo cuando sea necesa-
rio11 . Si está activo el modo de tiempo por ticks (on ticks) se mostrará 11
Esto último, normalmente, en el proce-
dimiento de inicio del modelo.
jhon.sn@live.com 14 Jun 2017

64 netlogo

en la parte superior del mundo.


Las instrucciones relacionadas con el control del tiempo son:
ticks: reporte que devuelve el tiempo actual.
12
Es obligatorio usarlo al principio de
una simulación para que el sistema ha- tick: comando que incrementa el contador de ticks en 1 unidad.
ga uso del contador. Si no se usa y se
intenta incrementar o leer el contador de reset-ticks: reinicia el contador de ticks12 .
ticks, el sistema devuelve un error. El
comando clear-all también limpia el Si un modelo hace uso del modo temporal por pasos, no actualizará
contador de ticks junto con los demás la representación del mundo cada vez que se produzca un cambio en
estados del mundo.
él, sino cada vez que se produzca un cambio en el contador de ticks13 .
Un ejemplo sencillo de uso del tiempo por pasos sería el siguiente:
Existen dos comandos, display y  
13

no-display, que permiten forzar que se


actualice el mundo o no.
t o setup
c l e a r −a l l
c r e a t e − t u r t l e s 10
r e s e t −t i c k s
end

t o go
ask t u r t l e s [ fd 1 ]
tick
end
 
De esta forma, el comportamiento del paralelismo simulado sería
equivalente al del paralelismo real, ya que el sistema actualizaría su
representación únicamente cuando todos los agentes hubieran realiza-
14
Aunque habrá que tener precaución do la acción que se les ha pedido14 .
con las interacciones entre ellos para si- En la mayoría de los modelos, el contador de ticks comenzará en
mular correctamente el paralelismo.
0 y avanzará de una en una unidad. Sin embargo, también es posible
hacer avanzar los modelos en una cantidad de tiempo distinta (incluso
fraccionaria). Para ello, se usa el comando tick-advance, que recibe
como dato la cantidad de tiempo que se quiere avanzar. Un uso ha-
bitual de pasos de tiempo no enteros ni homogéneos se tiene en la
simulación de procesos físicos y químicos como los que vienen en la
biblioteca de modelos del sistema.
Actividad: Investiga por medio de los modelos que están bajo la
clasificación GasLab la utilidad de poder manipular el tiempo para
la simulación de procesos naturales.

Ejercicios

1. Usando multiagentes:

a) Haz un procedimiento que dibuje las circunferencias giradas


del capítulo anterior (procedimiento rosquilla) utilizando va-
rias tortugas que realicen el procedimiento circunferencia simul-
táneamente.
jhon.sn@live.com 14 Jun 2017

los protagonistas de netlogo. trabajando con múltiples agentes. 65

b) Haz un procedimiento que dibuje circunferencias concéntricas


como en el capítulo anterior usando para ello varias tortugas que
dibujen simultáneamente. Lo mismo con polígonos concéntricos.

2. Coordenadas polares:

a) Haz un procedimiento que cree N tortugas (haz que N sea sufi-


cientemente grande) y oriéntalas con una distribución uniforme
entre 0 y 360 grados (con ángulos 360k/N ), con k = 0, . . . , N − 1).
Asígnales la forma dot.
b) Haz que se dispongan sobre una circunferencia de radio R.
c) Haz que la tortuga orientada con ángulo 360k/N se coloque a
distancia k del origen. ¿Qué figura puntean?
d) Haz que la tortuga orientada con ángulo 360k/N se disponga a Figura 4.12: Cardioide.
distancia 5(1 − cos(360k/N )). Esta figura se llama cardioide (figu-
ra 4.12).
e) Haz que la tortuga orientada con ángulo 360k/N se disponga a
distancia 5(| sin(4 × 360k/N |). Esta figura se llama rosa de 8 péta-
los (figura 4.13). Haz las modificaciones necesarias para conseguir
distinto tamaño y número de pétalos.
f ) Prueba con otras dependencias de la distancia al centro en fun-
ción del ángulo de cada tortuga.
Figura 4.13: Rosa de 8 pétalos.
3. Genera distintos patrones en la composición de los patches del
mundo cambiando sus colores15 . 15
Intenta, por ejemplo, crear patrones
que te permitan generar con facilidad
4. Genera dos grupos de tortugas diferenciadas, por ejemplo, por su distribuciones parecidas a banderas.
color. Asigna a cada grupo una forma distinta y haz que cada grupo
se desplace con una regla de movimiento distinta por el mundo16 . 16
Haz que la evolución del mundo sea
en un tiempo por pasos, no continuo.
5. Cambios de colores por regiones:

a) Haz un procedimiento que asigne un color diferente a cada cua-


drante del plano (los que se obtienen teniendo en cuenta las po-
sibles combinaciones de los signos de las coordenadas de los pat-
ches).
b) Crea unas cuantas tortugas y haz que se muevan avanzando una
cierta cantidad fija y orientándose al azar. Hazlo de forma que el
tiempo sea por pasos discretos.
c) Haz que las tortugas adquieran un color similar al color del cua-
drante en el que están17 . 17
Un poco más oscuro, para que se dis-
tingan sobre el fondo.
jhon.sn@live.com 14 Jun 2017

66 netlogo

6. Enumerando patches:

a) A partir de las coordenadas de los patches genera un procedi-


miento que los etiquete de la forma que aparece en la figura de
la izquierda.
18
Ayuda: Ten en cuenta que ask
patches ordenará aleatoriamente el con- b) Hazlo ahora de manera que el orden sea de arriba a abajo y de
junto de patches para llevar a cabo la
acción. Añade un contador que, partien-
izquierda a derecha.
do de 0, se incremente cada vez que un c) Haz un procedimiento que enumere los patches de forma alea-
patch sea etiquetado.
toria18 .

7. Persecuciones:

a) Lanza una tortuga, la presa, cuyo movimiento, sin dejar rastro,


puede venir definido por una curva concreta (una recta, una pa-
rábola, una circunferencia, etc.) o por un movimiento aleatorio;
y lanza también una o varias tortugas perseguidoras, situadas y
orientadas inicialmente al azar, que tratan de seguir a la presa, y
de las que sí podemos ver el rastro19 .
b) Cambia la velocidad de las perseguidoras haciendo que dependa
de alguna forma de la distancia a la presa20 .
c) ¿Y si hay dos presas? Haz que cada perseguidora calcule cuál de
las dos presas está más cerca en cada paso y la persiga a ella.
Figura 4.14: Perseguidoras en acción.
19
Utiliza para ello la instrucción face d) Tiempo de reacción: introduce un tiempo de respuesta en las
agente1, que ejecutada por una tortuga perseguidoras ante los cambios de dirección de la presa.
hace que se oriente hacia donde está el
agente1. e) Carga el modelo Pursuit de la Biblioteca de Modelos y ejecuta
20
Utiliza para ello el reporte distance experimentos con diferentes opciones (figura 4.14).
agente1, que ejecutado por una tortu-
ga obtiene la distancia que le separa del f ) Visita la página http://www.mi.sanu.ac.rs/vismath/liao/, lee
agente1.
el texto Geometric patterns design with recursive pursuit relative mo-
tion, que puedes encontrar en esa dirección, e intenta repetir al-
gunos de los comportamientos que aparecen en él.

21
Este ejercicio es una modificación del 8. Representación decimal21 :
modelo Color Fractions de la Biblioteca
de Modelos. Echarle un vistazo te puede a) Cambia la configuración inicial del mundo para que tenga di-
ayudar.
mensiones 10 × 10.
jhon.sn@live.com 14 Jun 2017

los protagonistas de netlogo. trabajando con múltiples agentes. 67

b) Enumera los patches de arriba a abajo y de izquierda a derecha


como hicimos en un ejercicio anterior.
c) Genera un procedimiento que reciba como dato de entrada dos
números naturales, m y n, y represente los decimales de la di-
visión m/n por medio de los colores de los patches de forma
ordenada (figura 4.15).
d) Puedes mostrar también el decimal asociado por medio de la
etiqueta del patch.
e) Cambia las dimensiones del mundo para observar diferentes pa-
trones. Figura 4.15: Representación decimal.

9. Genera un procedimiento que haga que una tortuga se mueva por


todos los patches sin repetir y que vaya dejando el rastro para ver
el recorrido que ha formado. Hazlo para diferentes tolopogías.

10. Haz un procedimiento que trabaje con dos grupos de tortugas


diferenciadas por su color de modo que hagan sus movimientos
de forma simétrica: a) respecto del origen; b) respecto del eje x; c)
respecto del eje y.

11. La hormiga de Langton22 : 22


La hormiga fue bautizada con el ape-
llido de su primer descubridor, Chris
a) Crea un procedimiento (setup) según los siguientes pasos: lim- Langton (uno de los padres del área de
Vida Artificial), quien estaba buscando
piar todo; pedirle a los patches que adquieran el color blanco; modelos simples con comportamientos
crear una tortuga, orientarla aleatoriamente al norte, sur, este u complejos, y la presentó (junto a otros
oeste, establecer su color en rojo y su tamaño en 0.6. sistemas) en un artículo en 1986. Esta-
ba interesado en las propiedades funda-
b) Crea un procedimiento (go) que repita un cierto número de veces mentales de los sistemas biológicos. Pos-
teriormente, procesos similares aparece-
(o sin fin) el siguiente proceso: primero hace que la tortuga avan- rían también en campos como la compu-
ce una unidad, luego ejecuta el siguiente procedimiento llamado tación o la dinámica de fluidos.
turn y por último avanza el reloj una unidad.
 
t o turn
i f e l s e p c o l o r = white
[ s e t pcolor black
r t 90]
[ s e t p c o l o r white
l t 90]
end
 
c) Ejecuta el modelo para un mundo de tamaño 100 × 100 y observa
los patrones generados: son una especie de ciudades y carreteras
por las que desplazarse con rapidez (figura 4.16).
d) Observa cómo en el procedimiento turn la tortuga ejecuta una
acción sobre el patch sobre el que está situada.
Figura 4.16: Hormiga de Langton.
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

5
Agentes, procedimientos y modelos

En los capítulos anteriores se han introducido algunas característi-


cas básicas de NetLogo, que reflejan partes de su metodología y que
lo diferencian de otros lenguajes de programación, que muestran el
entorno de trabajo, o acerca de los modos que proporciona para co-
municarse con los elementos que conformarán el mundo virtual que
estamos modelando. En este capítulo mostramos una visión más es-
pecífica del lenguaje de programación, no desde el punto de vista de
las instrucciones que nos proporcionan para expresar los algoritmos,
sino desde un punto de vista más estructural, centrándonos en las for-
mas que tenemos para adaptar los agentes al problema específico que
queremos modelar, afinando la definición y uso de los procedimientos
y, finalmente, dando una estructura coherente al código para que sea
más fácil modificarlo en aproximacones sucesivas al modelo deseado.

Enriqueciendo las familias de agentes

Sin duda, uno de los puntos fuertes de NetLogo está en sus agentes
y lo fácil y natural que resulta ordenales tareas. Algo que no sólo lo
diferencia de los lenguajes de programación habituales, sino incluso
de aquellos que también están orientados al trabajo con sistemas de
agentes, donde suele ser engorroso definirlos y manipularlos.
Pero incluso en estas condiciones favorables nos encontraremos an-
te situaciones en las que será deseable poder personalizar aún más los
agentes. En este epígrafe vamos a presentar dos formas de personali-
zación que acercan, desde un punto de vista de teoría de la programa-
ción, NetLogo a los lenguajes de programación orientada a objetos: la
ampliación de propiedades de los agentes, y la definición de nuevas
subclases de agentes.
jhon.sn@live.com 14 Jun 2017

70 netlogo

Añadiendo propiedades a los agentes


Como hemos comentado, hay tres tipos de agentes que pueden in-
teractuar en el mundo: patches (suelo), tortugas (móviles) y links (en-
laces que conectan pares de tortugas entre sí). Pero hemos visto que
desde el punto de vista de programación hay un protagonista más al
que hay que considerar: el observador, que tiene la capacidad de pe-
dirles a los demás agentes que realicen acciones que de otra forma
1
Puede considerarse como el papel que sería imposible1 .
juega el creador del modelo, que duran- Cada uno de estos tipos de agentes (salvo el observador), dispone
te la ejecución supervisa la actuación del
mundo. de unas propiedades básicas que definen sus características en el mun-
2
Veremos que en el caso de NetLogo3D do, tales como sus coordenadas, color, etiqueta, etc.2 Dependiendo del
el observador también tiene propiedades tipo de agente, algunas de estas propiedades serán modificables por el
de localización y orientación, con el fin
de fijar la proyección del mundo 3D. observador (de lectura y escritura) y otras no (sólo de lectura). Además,
algunas de ellas podrán ser accesibles (en lectura y/o escritura) por
otros agentes.
Una de las ventajas que tenemos al trabajar con NetLogo por medio
de programación consiste precisamente en la capacidad de extender el
conjunto de propiedades que tiene cada tipo de agente. Por ejemplo,
podemos añadir una variable altura a cada patch, de manera que nos
indique la altura del terreno que representa. Para ello, basta escribir la
siguiente línea:
patches-own [altura]
3
La cabecera del código es la sección en la cabecera3 del código (figura 5.1).
que se encuentra antes de la definición
del primer procedimiento. Actividad: Para verificar que realmente se ha añadido esta pro-
piedad, ve a la pestaña de interfaz e inspecciona alguno de los
patches; observarás que entre las propiedades del patch (de todos
los patches, no sólo del que estás inspeccionando) aparece una
nueva llamada altura (figura 5.2).

Debe tenerse en cuenta que, por defecto, cada propiedad nueva se


Figura 5.1: Definición de propiedades añade con el valor 0 en todos los agentes, independientemente de que
para los patches. después vaya a almacenar un valor numérico o no.
En general, la forma de añadir propiedades nuevas a algún tipo de
agente es por medio del sufijo -own y la lista de nuevas propiedades
entre corchetes:
tipo-de-agente-own [ prop1 prop2 prop3 ...]
Por ejemplo, la manera de añadir a las tortugas una propiedad lla-
Figura 5.2: Definición de propiedades
para los patches. mada edad, y otra llamada sexo sería:
 
t u r t l e s −own [ edad sexo ]
 
y cada tortuga podrá acceder a ellas para almacenar un valor indivi-
dualizado tal y como hace con el resto de sus propiedades.
El siguiente código muestra cómo se definen y usan las propieda-
jhon.sn@live.com 14 Jun 2017

agentes, procedimientos y modelos 71

des adicionales en un modelo. Además, se hace uso de estructuras de


programación vistas en los capítulos anteriores (while o if), de varia-
bles locales y de algunas otras funciones (como min-pxcor, max-pxcor)
cuyo significado se puede deducir fácilmente4 : 4
Para ver cómo funciona, cópialo en
  la pestaña de código, y ejecuta suce-
t u r t l e s −own [ v e l o c i d a d ] sivamente setup y carrera. Analiza el
papel que juega la variable temporal
t o setup
deben-seguir? que se ha usado en el úl-
c l e a r −a l l timo procedimiento.
ask p a t c h e s [ s e t p c o l o r green ]
ask p a t c h e s with [ pycor >= 0 and pycor < 1 0 ]
[ s e t p c o l o r grey − 2 ]
c r e a t e − t u r t l e s 10 [
s e t x y min−pxcor who
s e t heading 90
s e t shape " c a r "
s e t v e l o c i d a d ( random− f l o a t 1 ) / 10 ^ 4 ]
end
to carrera
l e t deben−s e g u i r ? t r u e
while [ deben−s e g u i r ? ] [
ask t u r t l e s [
fd v e l o c i d a d
i f x cor >= max−pxcor [ s e t deben−s e g u i r ? f a l s e ] ] ]
end
 

Definiendo nuevas familias de agentes

NetLogo permite definir diferentes tipos de tortugas y enlaces5 por 5


Pero no de patches, los cuales tampoco
medio de lo que se llaman razas (breeds). Por ahora nos ocuparemos pueden crearse ni destruirse durante la
ejecución del modelo.
de la definición de razas de tortugas, más adelante veremos las de los
enlaces.
Gracias a las razas se puede diversificar el comportamiento de un
mismo tipo de agente: actuarán de determinada forma según la raza
a la que pertenezcan. Por ejemplo, en el modelo anterior podríamos
haber definido una raza para los coches y otra para introducir peatones
que se moviesen por el mundo, de forma que los coches solo pudiesen
moverse en línea recta por la pista de carreras y los peatones por todas 6
Como en el caso de las propiedades
añadidas, debe situarse en la cabece-
las áreas verdes.
ra del código, antes de ningún procedi-
Para definir estas razas se usa el comando breed 6 . Su formato es7 : miento.
breed [Grupo-nueva-raza Individuo-nueva-raza]
Por ejemplo: 7
Para que después la lectura de las ins-
  trucciones sea más sencilla y resulte más
cercana al lenguaje natural (sobre to-
breed [ coches coche ]
do en inglés), NetLogo permite asignar
breed [ peatones peaton ] nombres distintos para referirnos al con-
  junto total de agentes de la nueva raza o
a uno de sus individuos.
Es aconsejable que el código se estructure de la siguiente forma:
jhon.sn@live.com 14 Jun 2017

72 netlogo

Una vez definida, una raza nueva se comporta como un nuevo ti-
po de agente desde todos los puntos de vista: se pueden crear nuevos
agentes de dicha raza (create-coches), pedir a un grupo que haga
algo (ask coches [ ... ]), añadir propiedades específicas en la cabe-
8
Es importante el orden en que se de- cera (coches-own), etc8 . En general, todas las instrucciones que hacen
finen las nuevas razas, porque aquellas uso de turtles tienen su equivalente para las razas definidas por el
definidas primero ocuparán las capas
más bajas de representación, y podrán usuario, por lo que, al igual que existe una función booleana (un pre-
quedar ocultas por otras. Es decir, según dicado) que indica si un objeto es una tortuga, is-turtle?, al definir
el ejemplo anterior, si en un mismo patch
hay agentes de tipo coche y peaton, los una raza cualquiera se crea automáticamente un predicado similar :
de raza peaton se situarán sobre los de is-raza?. Cuando se crea un agente de una raza concreta, en su pro-
raza coche. piedad breed se almacena la raza a la que pertenece9 .
9
Por lo que si creamos un coche
con create-coches, éste tendrá breed = Esto hace que podamos hacer preguntas del tipo10 :
coches. Observa que coches va sin comi- if breed = coches [...]
llas dobles porque no es una cadena de
texto.
Debemos tener en cuenta que: el identificador (who) de cada agente
se asigna independientemente de la raza a la que pertenezca, por lo
10
Podemos modificar el valor de esta que son todos números consecutivos; los agentes móviles, con inde-
propiedad para cambiar la raza de un pendencia de su raza, siguen siendo turtles: responderán afirmativa-
agente.
11
En este sentido, las razas funcionan co- mente a la pregunta is-turtle?; y si se ejecuta ask turtles [...],
mo las clases con herencia de los lengua-
realizarán las acciones11 .
jes orientados a objetos.
En el siguiente ejemplo (que es una modificación ampliada del an-
12
La función set-default-shape puede terior) se puede ver una demostración del uso de razas12 :
ayudarnos a dar formas distintas a ca-
da raza, para que podamos diferenciar-
 
las visualmente. breed [ coches coche ]
breed [ peatones peaton ]

coches −own [ v e l o c i d a d ]

t o setup
c l e a r −a l l
ask p a t c h e s [ s e t p c o l o r green ]
ask p a t c h e s with [ pycor >= 0 and pycor < 1 0 ]
[ s e t p c o l o r grey − 2 ]
s e t −d e f a u l t −shape coches " c a r "
s e t −d e f a u l t −shape peatones " person "
jhon.sn@live.com 14 Jun 2017

agentes, procedimientos y modelos 73

c r e a t e −coches 10 [
s e t x y min−pxcor who
s e t heading 90
s e t v e l o c i d a d ( random− f l o a t 1 ) / 10 ^ 4 ]
c r e a t e −peatones 50 [
move−t o one−o f p a t c h e s with [ p c o l o r = green ] ]
end

to carrera
l e t deben−s e g u i r ? t r u e
l e t c o l o r −ganador 0
while [ deben−s e g u i r ? ] [
ask coches [
fd v e l o c i d a d
i f x cor >= max−pxcor [
s e t deben−s e g u i r ? f a l s e
s e t c o l o r −ganador c o l o r ] ] Figura 5.3: Propiedades del tipo peaton.
ask peatones with [ c o l o r = c o l o r −ganador ] [ s e t s i z e 2 ] ]
end
 
En las figuras 5.3 y 5.4 se muestran ventanas de inspección de dos
de los representantes de las razas que se han definido en el modelo.
Se pueden observar los valores que tienen estos representantes en la
propiedad breed y la presencia de la propiedad velocidad en el coche,
pero no en el peatón.

Variables globales

Anteriormente vimos cómo definir variables locales, que se pueden


usar dentro de cada procedimiento y que se destruyen cuando el pro-
cedimiento ha terminado su ejecución. Pero también podemos definir
variables globales, que pueden ser conocidas y modificadas por todos
los procedimientos, y que no se destruyen en ningún momento13 .
La forma en que se definen variables globales en NetLogo es senci-
lla: basta declararlas en la cabecera del código por medio de la palabra Figura 5.4: Propiedades del tipo coche.
clave globals14 .
13
Pero sí pueden ser limpiadas por medio
de la instrucción clear-all.

14
Debemos precisar que éstas no son
las únicas variables globales que admi-
te NetLogo: algunos de los controles que
veremos en el capítulo siguiente llevan
asociados una variable global por defec-
to.
jhon.sn@live.com 14 Jun 2017

74 netlogo

Las variables globales deben cumplir las mismas restricciones en


cuanto a su nombre que las variables locales: no existir como primi-
tivas, no coincidir con nombres de otras variables, no comenzar por
ciertos caracteres, etc.

Más sobre procedimientos

Sabemos que los procedimientos permiten diseñar acciones perso-


nalizadas que pasan a funcionar como las primitivas. Aprendimos que
para definir un procedimiento, el bloque de instrucciones debe ir pre-
cedido de la palabra clave to y cerrarse con la palabra clave, que sirven
de delimitadores de la definición. Si queremos permitir el uso de datos
de entrada para un procedimiento basta indicarlos entre corchetes en
su definición tras el nombre del procedimiento en cuestión:
t o nuevo−procedimiento [ e n tr a d a 1 e n tr a d a 2 . . . ]
bloque de a c c i o n e s / i n s t r u c c i o n e s
end

Recordemos algunas cosas importantes sobre procedimientos:

No puede existir más de un procedimiento con el mismo nombre,


15
Es decir, a diferencia de otros Logos, ya sea una primitiva de NetLogo, u otro definido por el usuario15 .
NetLogo no admite la redefinición de
procedimientos. Pueden trabajar con variables locales, que se definen por medio de
la instrucción let dentro del código. Las variables locales se crean
en el momento de definirse y se destruyen automáticamente cuando
el bloque al que pertenecen termina de ejecutarse.

Los datos de entrada se comportan como variables locales, por lo


que se crean cuando se ejecuta el procedimiento y se destruyen au-
16
Esto permite tener muchos procedi- tomáticamente cuando el procedimiento acaba16 .
mientos que usan los mismos nombres
para sus datos de entrada. El orden de los datos de entrada importa, porque al llamar a la
función se asignarán según el orden que les hayamos dado.

Por ahora únicamente hemos definido procedimientos que realizan


acciones, pero mencionamos que también podemos definir procedi-
mientos que calculan valores y los devuelven al estilo de las funciones:
17
Los reportes pueden realizar también los reportes17 .
acciones, pero siempre deben terminar La definición de este tipo de procedimientos presenta algunas dife-
su ejecución devolviendo un resultado.
rencias:

1. Se definen por medio de la palabra clave to-report.

2. Hacen uso de la instrucción report para devolver el valor final de


su ejecución. Independientemente de dónde esté situada, la ejecu-
ción de dicha instrucción provocará la detención del procedimiento.
jhon.sn@live.com 14 Jun 2017

agentes, procedimientos y modelos 75

Veamos un primer ejemplo que permite calcular el valor de una


parábola en un punto:
 
to −r e p o r t p a r a b o l a [ a b c x ]
report ( a * x ^ 2 + b * x + c )
end
 
Pueden emplearse conceptos como el de recursión para calcular
funciones de una forma más natural. Por ejemplo, un reporte que cal-
cula el factorial de un número18 : 18
Observa que, en este caso, necesitamos
  dos usos de report: uno para el caso ba-
to −r e p o r t f a c t [ n ] se y otro para el caso en que se aplica la
recursión.
i f e l s e n = 0 [ report 1] [ report (n * f a c t (n − 1 ) ) ]
end
 
Y la traza de la ejecución:
fact 3 = 3 * fact 2 = 3 * (2 * fact 1) =
= 3 * (2 * (1 * fact 0)) = 3 * ((2 * (1 * 1)) =
= 3 *( 2 * 1) = 3 * 2 = 6
Los datos de entrada pueden ser objetos más complejos que los
utilizados hasta ahora. El siguiente reporte recibe como entrada dos
agentes móviles y devuelve, escrito como una lista, el punto medio de
las posiciones que ocupan:
 
to −r e p o r t punto−medio [ ag1 ag2 ]
l e t x1 0
l e t x2 0
l e t y1 0
l e t y2 0
ask ag1 [ s e t x1 xcor s e t y1 ycor ]
ask ag2 [ s e t x2 xcor s e t y2 ycor ]
r e p o r t l i s t ( ( x1 + x2 ) / 2 ) ( ( y1 + y2 ) / 2 )
end
 
El funcionamiento del procedimiento anterior es:

Se crean variables locales para almacenar las posiciones de cada 19


La posición del agente ag1 se almace-
nará en (x1,y1) y la del agente ag2 en
agente19 .
(x2,y2).

Se rellenan los valores de (x1,y1) y (x2,y2)20 .


20
Realmente, se hacen llamadas a cada
Por último, se calcula el punto medio y se construye la lista con él, agente y se le pide que sea él quién re-
llene ese valor.
que es la que se devuelve por medio de report.

Actividad: Genera un reporte de tortuga (es decir, que sólo


lo pueden ejecutar las tortugas) que devuelva la lista de sus
coordenadas como un par [x y].
jhon.sn@live.com 14 Jun 2017

76 netlogo

Condicionales que devuelven valores


Existe una variación de la estructura if-else que puede utilizarse
para devolver valores que dependen de un condicional. Por ejemplo,
21
| x | es el propio número si es positivo, supongamos que queremos calcular el valor absoluto de un número21 .
y su opuesto si el número de negativo. Con lo aprendido hasta ahora, podemos escribirlo en NetLogo co-
mo:
 
to −r e p o r t va lo r −a b s o l u t o [ n ]
i f e l s e n >= 0 [ r e p o r t n ] [ r e p o r t ( − 1 * n ) ]
end
 
Pero con la nueva variante de ifelse podemos hacer algo como:
 
to −r e p o r t va lo r −a b s o l u t o [ n ]
r e p o r t i f e l s e −value ( n >= 0 ) [ n ] [ − 1 * n ]
end
 
Es la propia función ifelse-value la que está funcionando como
reporte. Su estructura general es:
ifelse-value condicion [reporte afirmativo][reporte negativo]
Por ejemplo, el factorial se podría escribir como:
 
to −r e p o r t f a c t [ n ]
r e p o r t i f e l s e −value ( n = 0 ) [ 1 ] [ n * f a c t ( n − 1 ) ]
end
 
En principio, esta estructura no añade una funcionalidad nueva,
pero en algunos casos puede ahorrarnos el tener que definir proce-
dimientos auxiliares, evitando las respectivas llamadas. Por ejemplo,
recordemos que la instrucción n-values genera listas del tamaño que
le pidamos ejecutando una cierta función (reporte) para ir calculando
los valores de la lista. Por tanto, para obtener este resultado:
 
n−v a l u e s 10 [ i f e l s e −value ( ? < 5 ) [ 0 ] [ 1 ] ]
 
si no hubiéramos hecho uso de ifelse-value, tendríamos que haber
22
Esta característica de poder trabajar definido un reporte auxiliar para pasárselo a la función n-values22 .
con funciones anónimas definidas en el
momento de usarlas es lo que se conoce
como lambda-cálculo. NetLogo da un so- Ejecuciones cuidadosas
porte bastante completo de ellas por me-
dio de las tasks, que veremos más ade- Cuando NetLogo encuentra un resultado inesperado en una ejecu-
lante.
ción, algo que no puede manejar, detiene todos los procedimientos e
23
Normalmente da un mensaje indican- informa al usuario del error que se ha producido23 . Si no queremos
do las condiciones que había cuando se que esto suceda podemos controlar la ejecución del comando peligroso
produjo el error, la cadena de procesos
que estaban en ejecución y el tipo de por medio de la instrucción carefully. Su formato es el siguiente:
error que ha encontrado. carefully [ acciones1 ] [ acciones2 ]
Este comando ejecuta las acciones del bloque acciones1 y, si se pro-
duce un error durante la ejecución de sus comandos, en vez de parar
24
Un uso habitual de carefully se da e informar del error, se ejecuta el bloque acciones224 . Como interna-
cuando se está realizando una división
y no se ha controlado si el divisor puede
ser 0.
jhon.sn@live.com 14 Jun 2017

agentes, procedimientos y modelos 77

mente se ha registrado el error (aunque la ejecución no haya para-


do), podemos hacer uso de dicha información por medio del report
error-message. Por ejemplo, si tenemos definido el siguiente procedi-
miento:
 
t o con−cuidado [ l i s t a ]
carefully
[ show one−o f l i s t a ]
[ show e r r o r −message ]
end
 
al ejecutar con-cuidado [1 2 3] produciría la impresión en el Centro
de Comandos de uno de los valores de la lista [1 2 3], en este caso sin
producirse ningún error. Pero si intentamos ejecutar el mismo proce-
dimiento sobre la lista vacía, se registraría un error al intentar ejecutar
el primer bloque de instrucciones, porque one-of necesita una lista no
vacía de la que poder extraer algo. Sin embargo, el uso de carefully
impide que dicho error detenga la ejecución en marcha y el procedi-
miento muestra el mensaje ONE-OF got an empty list as input en el
Centro de Comandos antes de continuar con el resto de la ejecución.

Actividad: Crea un reporte que realice la división entre 2 números


de forma cuidadosa, considerando la opción de que el divisor pueda
ser 0. Haz un reporte similar para poder tratar la raíz cuadrada de
un número, considerando la opción de que éste pueda ser negativo.

Jugando con el tiempo de ejecución


Ya sea para retardar la ejecución del procedimiento, o para asegurar-
se de que ciertas acciones se llevan a cabo de forma periódica, NetLogo
dispone de comandos capaces de controlar de alguna forma el tiempo
en la ejecución de los procedimientos.
Para el primer caso, retardar una ejecución, tenemos el comando wait,
que recibe como entrada el número de segundos (puede ser una can- 25
Puede usarse para hacer que la ejecu-
ción de un modelo sea más lenta. Noso-
tidad decimal), y hace que la ejecución se detenga durante el tiempo
tros lo usaremos más adelante para con-
señalado25 : trolar eventos del ratón.
wait n
Para repetir un conjunto de acciones de forma periódica26 , disponemos 26
O incluso para controlar que ciertas ac-
de every, que tiene la forma: ciones no se repiten con demasiada fre-
cuencia.
every n [ acciones ]
Este comando ejecuta el bloque de acciones sólo si han pasado, al
menos, n segundos desde la última vez que el mismo agente ejecutó
esas mismas acciones. Si han pasado menos segundos, el bloque es ig-
norado. Su utilidad real queda de manifiesto cuando se inserta dentro
de alguna estructura de repetición, ya que por sí solo no provoca la
repetición del comando27 . 27
Por tanto, permite controlar la periodi-
cidad de la ejecución en una estructura
de repetición.
jhon.sn@live.com 14 Jun 2017

78 netlogo

Por ejemplo, una instrucción del tipo: ask turtles [every 1 [...]],
no tiene ningún efecto, ya que cada tortuga va a ejecutar una sola
vez su bloque de instrucciones y, por tanto, no hay estructura repeti-
tiva que podamos controlar con every. Sin embargo, la ejecución de:
loop [every 1 [ask turtles [...]]], hace que cada segundo todas
28
Importante: y, cada tortuga, no antes las tortugas ejecuten su bloque de acciones28 .
de un segundo desde que ella ejecutó el
mismo bloque.
La estructura habitual de un modelo

Aunque cada programador tiene su forma de plantear un problema


y sus trucos para resolverlo, es aconsejable estructurar los modelos
29
Entendemos por sintaxis al nombre siguiendo algunas normas básicas, tanto en la sintaxis29 , como en el
que se le da a los procedimientos, varia- orden en que se distribuyen los distintos procedimientos y reportes
bles, razas, etc.
que harán que el modelo funcione correctamente.
NetLogo es un lenguaje y entorno que facilita la evolución continua
de los modelos, lo que significa que éstos no suelen programarse de
una vez y quedar estáticos, sino que están sometidos a un proceso de
aproximación en el que se van añadiendo detalles que poco a poco
acercan el modelo al fenómeno real que se quiere modelar, y del que,
dependiendo de su complejidad, puede resultar imposible obtener un
modelo completamente satisfactorio.
Por todo esto, es esencial mantener algunas reglas a la hora de pro-
30
Ésta es una regla general que se debe gramar con NetLogo30 , ya que así se aceleran tanto los procesos de
aplicar a cualquier lenguaje de progra- evolución del modelo actual como la generación de los próximos mo-
mación.
delos a los que nos enfrentemos. Siguiendo unas pocas normas no
31
A veces unos minutos, otras veces al- resultará difícil tener una idea en la cabeza y poco tiempo después31
go más, pero verás que NetLogo es una estar jugando con un modelo que se ha diseñado para ese fin, reapro-
herramienta de desarrollo rápido.
vechando trozos de otros modelos propios o ajenos. NetLogo se con-
vierte entonces en una herramienta de prototipado que atrapa por su
tremenda versatilidad y agilidad de desarrollo.
Un patrón que se ajusta a muchos de los modelos que vamos a
encontrar en este libro, y que probablemente desarrollarás en el futuro,
32
Casi todo lo que aparece en este pa- es el siguiente32 :
trón lo hemos visto de una forma u otra,  
y poco a poco iremos acercándonos a −−−−−−−−−−−−−−−−−−−−−−− Cabecera −−−−−−−−−−−−−−−−−−−−−−−−
aquellas partes que no conocemos. Pue-
des comprobar que los modelos básicos
Carga de e x t e n s i o n e s
que hemos visto hasta ahora siguen es-
tas directrices. D e f i n i c i ó n de r a z a s
Propiedades e s p e c í f i c a s de l a s r a z a s
Variables globales

−−−−−−−−−−−−−−−−−−−−− Procedimientos −−−−−−−−−−−−−−−−−−−−

Proce dimientos de c a rg a e i n i c i o ( s t a r t u p , . . . )
Proce dimientos de e j e c u c i ó n ( un paso de e v o l u c i ó n )
Comportamientos a g e n t e s ( movimiento , d e c i s i o n e s , . . . )
jhon.sn@live.com 14 Jun 2017

agentes, procedimientos y modelos 79

A c t u a l i z a c i ó n de medidores y g r á f i c a s
P r o c e d i m ie ntos a u x i l i a r e s ( hab itu alm en te r e p o r t e s )
 
Es momento de indicar que existe un nombre reservado de pro-
cedimiento que NetLogo, en caso de que lo hayamos definido, usa
de forma especial. Si creamos un procedimiento de nombre startup, 33
Como leer información de ciertos fi-
cheros, preparar de partida un conjunto
NetLogo lo ejecutará automáticamente cada vez que carguemos el mo-
de agentes que se sitúen en ciertas zonas,
delo, lo que nos permite ejecutar una serie de comandos y acciones33 dibujar algunas figuras en el mundo que
que no necesitan de la intervención del usuario para su funcionamien- puedan servir de guía, proporcionar va-
lores iniciales a variables globales, etc.
to.
Cuando hablamos de usuarios, realmente en NetLogo nos podemos
referir a dos tipos de usuarios bien diferenciados. Uno de ellos es el
programador (o programadores) que se encargan de preparar los pro-
cedimientos y facilitar el uso del modelo para explorar un fenómeno;
el otro es el usuario final (que puede ser el mismo programador) que
ejecuta el modelo por medio del interfaz y no modifica el código de
programación34 . 34
Un claro ejemplo de esta división de
Por ello, será importante proporcionar una interfaz lo más potente usuarios la podemos tener en los mode-
los que se generan con fines educativos:
posible, flexible y adaptada a las necesidades del modelo al que per- normalmente, el profesor preparará un
tenece, y que permita manipular las características fundamentales de modelo con el que los alumnos pueden
experimentar para comprender mejor el
éste sin necesidad de modificar el código que lo controla35 . funcionamiento, causas y efectos de cier-
A pesar de ello, y debido a la facilidad que NetLogo proporciona tos fenómenos, o quizás sólo para moti-
para crear modelos a aprendices de programadores, no debe elimi- var preguntas acerca de ciertos compor-
tamientos.
narse la posibilidad de que parte del trabajo para los usuarios finales
consista en la modificación (por leve que sea) del código del modelo 35
Sobre la generación del interfaz de in-
con el que se enfrentan, ya que ser capaces de modificar los procedi- teracción con el usuario centraremos el
capítulo siguiente.
mientos que lo componen es una prueba fehaciente de comprensión
del mismo.

Trabajando con múltiples ficheros


Al trabajar con modelos grandes que comparten procedimientos y
definiciones con otros modelos lo más fácil es separar los procedi-
mientos por áreas de aplicación en ficheros de código independiente.
En NetLogo se puede hacer por medio de la instrucción __includes36 . 36
El doble guion bajo por el que comien-
za la instrucción indica que es una pro-
__includes [“fichero1.nls” “fichero2.nls”] piedad experimental que podría cambiar
en futuras versiones, aunque debido a su
Se pueden usar tantos ficheros externos como se quiera (se almace- uso lo más probable es que cambie sólo
para estabilizarse.
narán con extensión .nls) y contienen todo aquello que normalmente
iría en la pestaña de código (procedimientos, propiedades extendidas
de agentes, definición de razas, variables globales, etc.). Ha de tener-
se en cuenta que todos los ficheros se cargan en el mismo espacio de
memoria, por lo que, por ejemplo, cada variable global ha de definirse
únicamente en uno de los ficheros, y será accesible por todos los proce-
dimientos, independientemente de en qué fichero haya sido definida.
jhon.sn@live.com 14 Jun 2017

80Paranetlogo
37
crear un fichero nuevo añade la
instrucción __includes con el nombre
del fichero y pulsa sobre el botón Check;
aprovecha entonces para crear un fichero
nuevo por medio del menú desplegable Cuando un modelo hace uso de múltiples ficheros aparecerá junto
y grábalo con el nombre que has escri-
to en la instrucción anterior (ten la pre- al desplegable de procedimientos de la pestaña de código un nuevo
caución de grabarlo en el mismo direc- menú que permite moverse entre los distintos ficheros que compo-
torio en el que está el fichero principal
y con el nombre usado en la instrucción
nen su código, crear uno nuevo o cargar uno existente37 . Los ficheros
__includes). abiertos se mostrarán como pestañas adicionales con su nombre.

Ejercicios

1. Alturas en los patches:

a) Define una función:


gama-color color-base numero rango1 rango2
que devuelva la gama de color-base proporcional al valor de
numero en el rango [rango1,rango2]. Cuanto más cerca esté este
valor de rango1, más oscuro será; y cuanto más cerca de rango2,
más claro.
b) Utiliza el reporte anterior para generar un procedimiento que,
dada una propiedad altura en los patches, asigne a cada patch
un valor aleatorio (entre 0 y 100) para esta propiedad y calcule
adecuadamente un color asociado para representar el mapa de
alturas según la tonalidad del patch.
Figura 5.5: Aplicación de gama-color.
c) Repite el ejercicio asignando una altura a cada patch por me-
dio de una función que haga uso de las coordenadas del patch
(producto de coordenadas, suma de coordenadas, máximo de las
coordenadas, etc.) (figura 5.5).

2. Sombreado:

a) Crea dos grupos de tortugas con posiciones al azar y orientadas


al oeste unas y al norte otras.
b) Haz un procedimiento que las mueva en la dirección de su orien-
tación, de forma que cambien el tono de su color a medida que
38
Puedes utilizar el procedimiento defi- se acercan al borde izquierdo o al borde superior38 .
nido en el ejercicio anterior para graduar
el cambio de color. 3. Haz un modelo que sitúe unas cuantas tortugas en el mundo y que
se muevan con el comportamiento que quieras, de forma que tanto
la velocidad como el color de la tortuga dependan de su posición
en el mundo (es decir, dependan de xcor e ycor).

4. Crea un procedimiento que reciba como dato de entrada una cade-


na de texto y devuelva por consola las palabras que la forman; se
reconocen por los espacios que hay entre ellas.
jhon.sn@live.com 14 Jun 2017

agentes, procedimientos y modelos 81

5. Crea un procedimiento que, usando una variable global, haga que


las tortugas puedan numerarse a sí mismas y que muestren esa
numeración en su etiqueta. No hagas uso de la propiedad who.

6. Haz un modelo en el que se comience por 3 tortugas situadas al


azar y después, en cada ejecución de un procedimiento que se defi-
nirá a tal fin, se cree una tortuga que se sitúe en el punto medio de
dos de las tortugas existentes (figura 5.6). ¿Puedes decir algo acerca
del punto del triángulo en el que se concentran las tortugas?

7. Movimiento con obstáculos:


En este ejercicio vamos a hacer uso de la instrucción patch-ahead.
Figura 5.6: Resultado esperado para el
a) Colorea de azul los patches con coordenadas pxcor y pycor múl- ejercicio 6.
tiplos de tres (los obstáculos).
b) Crea grupos de tortugas y disponlas sobre patches no azules.
c) Haz un procedimiento de movimiento de las tortugas de modo
que avancen una unidad si no chocan con un obstáculo (patches
azules) y en caso contrario se orienten al azar39 . 39
Usa para ello la expresión [pcolor] of
patch-ahead 1.
d) Usa una variable global de las tortugas para que a los 10 choques
mueran.

8. Movimiento con rebotes:

a) Colorea los patches del borde del mundo de color rojo.


b) Genera tortugas con posición y orientación aleatorias dentro de
la caja roja, y que tengan forma circular.
c) Haz un procedimiento para que las tortugas se muevan en línea
recta hasta que choquen con el borde y programa su comporta-
miento para que reboten en él40 (figura 5.7).
d) Genera dos tipos de tortugas, cada uno de ellos con velocidad Figura 5.7: Tortugas rebotando con las
paredes.
distinta y con diferentes rebotes.
40
Ten en cuenta que el ángulo de salida
debe ser igual al ángulo de entrada.
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

6
Creando el interfaz de uso. Controles,
gráficas y documentación

El objetivo de todo buen modelo es proporcionar un conocimien-


to más profundo del problema que se está modelando y, sin duda,
la repetida experimentación sobre el modelo y la visualización de su
comportamiento son necesarias para que este objetivo tenga más ga-
rantías de ser alcanzado. Por ello, junto a la exigencia de una capaci-
dad expresiva y de cálculo suficientes, debemos pedir que el sistema
de modelado que usemos nos proporcione las herramientas necesarias
para que la experimentación sea cómoda y los resultados obtenidos
sean fácilmente visualizables.
NetLogo cumple estos requisitos, junto a un lenguaje de programa-
ción natural y sencillo, ofrece un sistema muy intuitivo para generar
interfaces que permiten interactuar con los modelos, propiciando su
exploración y, en consecuencia, facilitando la comprensión del proble-
ma.
En este capítulo centraremos el esfuerzo en mostrar cómo, a par-
tir de un modelo, podemos añadir los controles necesarios para que,
no solo el usuario final del que hablábamos en el capítulo anterior,
sino el propio programador, explore el funcionamiento del modelo y
su proximidad al objetivo final. Veremos que no sólo es una forma de
proporcionar una piel gráfica a los procedimientos, sino que en muchos
casos complementa la parte de programación haciendo que nos preo-
cupemos sólo de lo imprescindible cuando estamos programando.

Añadiendo elementos a la interfaz

Si observamos la pestaña de la interfaz nos damos cuenta de que


hay más opciones además del mundo y la consola del Centro de Co-
mandos. Entre otras cosas, disponemos de una barra de herramientas
que (junto a partes que ya conocemos y hemos usado) ofrece un con-
junto de controles con los que potenciar la interfaz (figura 6.1).
Figura 6.1: Barra de herramientas de
controles.
jhon.sn@live.com 14 Jun 2017

84 netlogo

Primero vamos a ver cómo añadir estos controles a la interfaz, des-


pués haremos un recorrido por las funcionalidades que ofrece cada
uno y veremos cómo relacionarlos con los procedimientos que se defi-
nen en la pestaña de código.

Añadir controles
Esencialmente, hay dos formas de manipular (añadir, modificar o
eliminar) los controles para el interfaz:

1. Para añadir un control basta seleccionar el tipo de control en el me-


nú desplegable (figura 6.2) y, a continuación, pulsar en la parte del
interfaz en donde queremos situarlo; su posición será aproximada,
después puede ajustarse con más precisión. Si se desea añadir otro
control del mismo tipo, basta pulsar en el botón Add y después en
la parte donde se quiera situar .

Figura 6.2: Menú desplegable de contro-


les.

También existe la opción de pulsar con el botón derecho sobre al-


guna parte del interfaz en la que no haya controles y seleccionar el
control que se desea añadir de la lista emergente (figura 6.3).
Tras añadirlo, sea por el método que sea, aparece una ventana de
diálogo para rellenar los parámetros correspondientes al control.
Cuando analicemos los controles de forma individualizada, detalla-
remos cómo funcionan las ventanas de diálogo, que dependen de
Figura 6.3: Lista emergente de controles.
cada tipo de control.

2. Para modificar un control previamente hay que seleccionarlo, bien


por medio del arrastre del ratón (como se haría para seleccionar una
sección de texto en un editor tradicional), bien con el botón derecho
sobre el control y pulsando en Select del menú emergente (figura
6.4).
Una vez seleccionado podremos modificar sus dimensiones por me-
Figura 6.4: Select en menú emergente. dio de los puntos de control que lo rodean y cambiar su posición
arrastrándolo (figura 6.5).
Por el método del arrastre se pueden seleccionar varios controles
simultáneamente con el fin de moverlos juntos.
Figura 6.5: Puntos de control.

3. Para de-seleccionar un control, basta pulsar sobre cualquier área va-


cía de la interfaz.
jhon.sn@live.com 14 Jun 2017

creando el interfaz de uso. controles, gráficas y documentación 85

4. Para editar las características del control (los mismos parámetros


que nos piden en su creación), se puede o bien seleccionarlo y des-
pués pulsar sobre el botón Edit de la barra de herramientas, o bien
pulsar con el botón derecho sobre el control y seleccionar Edit... del
menú emergente.
1
El funcionamiento de estas flechas no
5. Para eliminar un control basta seleccionarlo y pulsar en el botón es el mismo que el que se obtiene por
Delete de la barra de herramientas, o bien pulsar con el botón de- medio del arrastre de los puntos de con-
trol cuando está seleccionado, sino que
recho sobre el control y seleccionar Delete del menú emergente. modifican el número de patches directa-
mente (las flechas diagonales reducen o
6. El propio mundo reacciona de forma similar a como se ha indicado amplían ambas direcciones simultánea-
en los puntos anteriores, con la salvedad de que no se puede crear ni mente, las flechas horizontales reducen
o amplían el número de patches en el eje
eliminar, y que dispone de algunas opciones más en su menú emer- X, y las flechas verticales lo hacen en el
gente. Proporciona unas flechas en su esquina superior izquierda eje Y), mientras que por el método del
(figura 6.6) para cambiar el tamaño de forma directa1 . arrastre lo que se cambia es el tamaño en
pixels de cada patch, pero manteniendo
el número de patches en cada dirección
del mundo. Es decir, las flechas cambian
Finalidad y parámetros de cada control
el tamaño del mundo en el que viven
los agentes y los puntos de control so-
Expliquemos con detalle cómo funciona y qué objetivo tiene cada lo cambian la representación del mundo
uno de los controles que podemos usar en el interfaz. en pantalla.
Los controles disponibles son:

Figura 6.6: Flechas para control del mun-


do.

1. Button / Botón: Su funcionalidad es sencilla, al pulsarlo se ejecuta


el código que se le asocia por medio de su ventana de diálogo2 . 2
Es uno de los más usados en los mode-
los, ya que es el único que permite eje-
cutar código directamente y, por tanto,
evita el uso del Centro de Comandos.
jhon.sn@live.com 14 Jun 2017

86 netlogo

Tiene funcionalidades añadidas que lo hacen aún más interesante:


3
Según el contexto, mostrará un peque-
ño icono en el propio botón para que el
Permite seleccionar el contexto en el que se debe ejecutar el códi-
usuario sepa en cuál se ejecuta.
go3 .
4
No se detendrá inmediatamente, sino Si está marcada la opción Forever, al pulsar el botón una vez, éste
cuando se haya completado el ciclo de
se quedará pulsado y ejecutará el código asociado en un bucle sin
ejecución en marcha.
fin; para detener su ejecución hay que volver a pulsar el botón4 .
Permite asignar una tecla de acción de manera que su pulsación
5
El teclado sólo está activo si el interfaz puede ser controlada con el teclado5 . La letra asignada se mos-
es el que tiene el foco de atención; para trará en la esquina superior derecha del botón.
que sea así pulsa con el ratón sobre un
área vacía del interfaz. Si Disable until ticks start está seleccionado, el botón no estará
6
Esta opción sólo tiene sentido si tu mo- disponible hasta que comience la ejecución de ticks6 .
delo funciona por ticks y, si es el caso,
permite diferenciar acciones previas a la En la caja de commands es donde se escribe el código que eje-
ejecución de otras que puedan accionar- cuta el botón. Muchas veces será simplemente el nombre de un
se durante la ejecución del modelo. Un
botón que no está disponible se reconoce procedimiento definido en la pestaña de código, pero también
porque, además de no reaccionar cuando se puede programar directamente en el control la acción que se
lo pulsas, presenta su etiqueta de color
desea ejecutar.
gris.
Por defecto, el botón muestra en la interfaz el código que se ha
añadido en commands; si se desea que aparezca un mensaje más
descriptivo y corto, deberá escribirse en Display name.

Actividad: Añade botones a los modelos que hemos creado


hasta el momento para facilitar la ejecución de aquellos procedi-
mientos para los que tenga sentido.

2. Slider / Barra de deslizamiento: define una variable global numé-


rica y permite de forma sencilla asignarle un valor.

Los parámetros de los que depende son:

Global variable: especifica el nombre de la variable global aso-


7
Importante: la variable que se asocia ciada7 .
aquí no debe declararse con el coman-
do globals en la cabecera de la pestaña Los posibles valores que tomará la variable asociada a este con-
de código. trol irán desde Minimum hasta Maximum, considerando un in-
8
Por ejemplo, si Minimum = 1, cremento de Increment8 ; pueden ser reportes, de manera que se
Maximum = 5 e Increment = 2, los posi- adapten automáticamente a otras condiciones del modelo.
bles valores que puede tomar serían 1,3
y 5. Value: es el valor actual de la variable asociada; para usar este
valor en cualquier parte del modelo basta hacer uso del nombre
de la variable global asociada.
jhon.sn@live.com 14 Jun 2017

creando el interfaz de uso. controles, gráficas y documentación 87

Units: permite añadir un texto que indique (solo a título infor-


mativo) las unidades en que se mide esta variable.
Si la opción vertical? está marcada, el slider tendrá dirección
vertical y no horizontal, que es la representación por defecto.

Actividad: En las siguientes actividades iremos creando por


pasos los controles necesarios para generar familias de tortugas.
Haz un modelo que cree el número de tortugas que indique el
usuario por medio de un control de tipo slider.

3. Switch: define una variable global booleana y proporciona una for-


ma sencilla y visual de asignarle su valor9 . Su único parámetro es 9
Al igual que en el caso anterior, no debe
el nombre de la variable global que se le asigna. ser definida con el comando globals en
el código.

4. Chooser / Selector desplegable: define también una variable global,


pero la selección de su valor (de tipo cadena, números, booleanos o
listas) se hace aquí por medio de una lista desplegable.

Los parámetros de los que depende este control son:


10
Debe ir una opción en cada línea, y
El nombre de la variable global que tiene asignada. han de ser valores estáticos: no se admi-
ten reportes ni variables del modelo.
El conjunto de opciones que se le ofrece al usuario10 .

Actividad: Añade al modelo de la actividad anterior dos razas


de tortugas y permite al usuario crear tortugas de una de las razas
seleccionando su tipo por medio de un selector desplegable.

5. Input / Caja de entrada: define una variable global como en los


casos anteriores, pero proporciona interfaces adecuadas para poder
contener números, cadenas y colores11 . Además del nombre, per- 11
Como vimos, NetLogo maneja los co-
mite seleccionar qué tipo de dato contendrá la caja. Una vez en lores como números, pero por medio de
esta caja se pueden seleccionar de forma
funcionamiento, esta caja proporciona un menú emergente con las visual.
opciones de copiar, cortar y pegar.
jhon.sn@live.com 14 Jun 2017

88 netlogo

Si es de tipo numérico, no tiene las restricciones del control


slider: puede introducirse cualquier número válido en NetLo-
go, y también constantes numéricas como pi, blue, etc.
Si es de tipo cadena (String) se puede decidir si se quiere una
12
En este caso añade un botón, Change, caja de texto multilínea12 .
al control que se muestra en el interfaz
para cambiar su contenido por medio de
un mini editor de texto muy básico, pero
que admite el retorno de carro.

Si es de tipo Color, el control muestra el valor del color seleccio-


nado de forma visual y usa la herramienta Color Swatches para
proporcionar al usuario el entorno de selección de colores (figura
6.7).
Figura 6.7: Aspecto de un control selec-
tor de color. Debido a su bajo uso, las opciones de string (reporter) y string
(commands) no las veremos aquí.

Actividad: Añade al modelo la opción de seleccionar el color de


las tortugas creadas por medio de un input de tipo color.

6. Monitor: los monitores permiten mostrar el valor de un reporte en


tiempo real. En la caja Reporter se puede poner directamente el
nombre de una variable, una fórmula que devuelva un valor, o el
nombre de cualquier reporte existente. Se puede establecer el nom-
bre con el que se mostrará, seleccionar la precisión en caso de que el
resultado sea numérico y definir el tamaño de fuente que se usará
para su representación.
jhon.sn@live.com 14 Jun 2017

creando el interfaz de uso. controles, gráficas y documentación 89

Actividad: Añade al modelo un monitor que indique el número


de tortugas presentes en el mundo.
13
Debido a su importancia y mayor com-
plejidad de uso, dedicaremos una sec-
ción especial a el control Plot más ade-
7. Plot / Gráfica: permite mostrar gráficas de diversos tipos13 . lante en este mismo capítulo.

8. Output / Salida: este control proporciona una área (con barras des-
lizantes) para la salida de texto14 . Su función es mostrar, por ejem- 14
Se admite únicamente un control de
plo, información mientras se va ejecutando el modelo15 . El único este tipo en el interfaz, de hecho, cuando
se ha añadido uno, no se puede volver a
parámetro personalizable es el tamaño de fuente que se usará para seleccionar del conjunto de controles dis-
mostrar la salida. NetLogo proporciona funciones específicas para ponibles.
mostrar información (imprimir) en este control, que veremos en el
15
Una vez en ejecución, por medio del
menú emergente podemos seleccionar
capítulo en el que tratemos la entrada/salida de datos. texto, copiar el texto seleccionado, borrar
su contenido y exportar el contenido a
un fichero de texto.

9. Note / Nota: permite añadir etiquetas de texto al interfaz. Su con-


tenido no puede ser modificado por medio de código, sino única-
mente accediendo a su diálogo de edición (figura 6.8).

Obsérvese que NetLogo colorea los controles según su funcionalidad:


gris los de ejecución (solo los botones), verde los de introducción de
datos y beis los de muestra de información.
Figura 6.8: Ventana de diálogo del con-
trol Note.

Representando gráficas con el control Plot

Sin lugar a dudas, las gráficas son útiles aliadas para comprender
cómo está sucediendo un fenómeno, y poder visualizar medidas que
cuantifican algunas de las variables que nos interesan de él. El control
Plot que proporciona NetLogo permite representar valores numéricos
de una forma más visual e intuitiva con distintos tipos de gráficas16 . 16
La forma en que funcionan las gráficas
en NetLogo es ligeramente distinta des-
de la versión 5.0, ya que el código que
maneja las acciones de iniciación y ac-
tualización de las gráficas se añaden en
el propio control, lo que quiere decir que
en los casos más habituales no es necesa-
rio escribir procedimientos para ellos en
la pestaña de código (aunque se puede
hacer y a veces es deseable, porque pue-
de dar más flexibilidad), sino que cada
elemento de la gráfica (incluídos los lá-
pices) puede tener sus propios trozos de
Al crear un plot aparece la siguiente la ventana de diálogo : código que le dicen cuándo y cómo han
de dibujar en la gráfica.
jhon.sn@live.com 14 Jun 2017

90 netlogo

Depende de los siguientes parámetros:

Name: Es el nombre que se mostrará en la cabecera de la gráfica y


también el que se usará en muchas de las instrucciones del lenguaje
relacionadas con el proceso de dibujado de gráficas que necesiten
explicitar sobre qué gráfica actuar, ya que podemos añadir tantas
gráficas como queramos.

Por medio de X axis label, X min y X max controlamos el nombre


del eje X, y sus valores mínimo y máximo. Lo mismo con el eje Y.

Si Show legend? está activado, se mostrarán junto a la gráfica los


nombres de los diversos lápices que intervienen en ella.

Si Auto Scale? está activado, entonces los ejes X e Y se adaptarán


automáticamente para mostrar los nuevos puntos que se vayan di-
17
El tamaño inicial será el que marquen bujando y caigan fuera del tamaño actual de la gráfica17 .
los valores de X min, X max, Y min, Y
max. Por medio de Plot setup commands y Plot update commands po-
demos definir comandos que se ejecutarán al crearse la gráfica (en
el primer caso) o en los procesos de actualización (en el segundo
18
Pulsando sobre los pequeños triángu- caso)18 ; los explicaremos un poco más adelante.
los que aparecen junto a ellos, se desplie-
ga una caja donde se pueden introducir En la sección de Plot Pens se pueden crear y personalizar los lápices
las acciones que se deseen realizar.
que se usarán para las diversas partes que componen la gráfica. Ca-
da una de las filas de la tabla que aparece debajo representa un lápiz
(por defecto se proporciona uno llamado default). Para cambiar el
color con el que escribe, basta pulsar sobre el rectángulo coloreado
19
Se mostrará la herramienta de Color que aparece junto al nombre del lápiz19 . Para cambiar el nombre
Swatches para la selección. del lápiz, basta hacer doble clic sobre él. Y por medio de la colum-
na Pen Update Commands se pueden introducir comandos que se
20
Esta actualización se llevará a ca- ejecutarán cada vez que se deba realizar una actualización de la grá-
bo por medio de la ejecución de
fica20 . La última columna permite eliminar el lápiz o personalizar
reset-ticks, de tick, o de la instrucción
update-plots, que veremos más adelan-
te.
jhon.sn@live.com 14 Jun 2017

creando el interfaz de uso. controles, gráficas y documentación 91

parámetros adicionales:

• Mode permite cambiar el tipo de lápiz que se usará para repre-


sentar el trozo de gráfica que dibujará este lápiz21 . 21
Las posibles opciones son: línea (line,
que genera una gráfica continua de pun-
• Interval es el número de unidades que se desplaza el lápiz en el tos unidos por líneas), de barras (bar) o
eje X cada vez que se realiza una impresión de un dato. de puntos (point, que genera una gráfica
de puntos individuales).
• Si Show in legend está activado, el lápiz se muestra en la leyenda
de la gráfica.
• Las cajas Setup commands y Update commands son equivalen-
tes a las que vimos antes, pero específicas para este lápiz.

Cómo se manipulan las gráficas desde código


Desde código, hay dos comandos básicos para representar informa-
ción en las gráficas: plot y plotxy.

1. Con plot sólo se necesita especificar el valor de Y; se supone que el


valor de X se actualiza automáticamente según el valor de interval
en la definición del lápiz (comenzando por 0). Por ejemplo, si qui-
siéramos representar el número de patches de color rojo que hay
a medida que va evolucionando el modelo, lo escribiríamos como
sigue:
plot count patches with [ pcolor = red ]

2. Si queremos explicitar el valor del par (x,y) para la representación


del punto, simplemente se hará uso de la instrucción plotxy. Por
ejemplo:
plotxy ticks ( count patches with [ pcolor = red ] )

Como hemos visto por la forma en que se definen los parámetros


del control Plot, tanto el propio control como los lápices que inter-
vienen tienen comandos de setup (inicio) y update (actualización)22 . 22
Usualmente, en alguno de ellos (si no
Estos comandos serán disparados automáticamente por otros coman- en los dos) aparecerá la instrucción plot
o plotxy.
dos de NetLogo:
jhon.sn@live.com 14 Jun 2017

92 netlogo

setup-plots ejecuta los comandos para cada control Plot (uno cada
vez). Para cada uno de ellos se ejecutan los comandos que aparezcan
en su campo Setup Commands; tras esta operación, se ejecutan los
comandos que aparezcan en el campo Setup Commands de cada
23
Si no se quiere ejecutar los comandos uno de sus lápices23 .
de cada lápiz, debe ponerse una instruc-
ción Stop al final del Setup Commands
update-plots funciona de forma similar a setup-plots, pero ejecu-
del control.
tando los comandos de Update Commands del control y los lápices.

La instrucción tick, tras incrementar el contador de ticks, realiza


una llamada a update-plots.

La instrucción reset-ticks, tras poner el contador de ticks a 0,


realiza una llamada a setup-plots seguida de otra a update-plots.

Si necesitamos manipular las gráficas directamente desde código


o modificar el valor de alguno de los parámetros de una gráfica du-
rante la ejecución del modelo, disponemos de un amplio conjunto de
instrucciones que nos permiten hacerlo. A continuación mostramos al-
24
En el manual de referencia de NetLo- gunas de las más comunes24 :
go se puede encontrar una explicación
detallada de todas ellas. clear-plot, clear-all-plot borra la gráfica plot actual, o todas las
gráficas del interfaz. La instrucción clear-all también borra todos
las gráficas.

set-current-plot: permite indicar cuál es la gráfica actual sobre la


que actuarán los comandos relacionados con gráficas que se ejecu-
ten a continuación.

set-plot-x-range, set-plot-y-range establecen los valores míni-


mo y máximo de los ejes X e Y.

plot-x-min, plot-x-max, plot-y-min, plot-y-max devuelven los va-


lores mínimos/máximos representados en el eje correspondiente.

set-current-pen, teniendo establecido una gráfica actual, permite


indicar el lápiz sobre el que actuarán los comandos relacionados
con lápices que se ejecuten a continuación.
25
Funciona de forma similar al lápiz de
las tortugas.
plot-pen-up, plot-pen-down sube/baja el lápiz de forma que, a pe-
sar de que se mueva por la gráfica, no deje rastro25 .

set-plot-pen-interval establece el valor de intervalo del lápiz ac-


tual.

set-plot-pen-color establece el color del lápiz actual.

26
Funciona de forma similar a la de los set-plot-pen-mode permite modificar el modo del lápiz26 .
diálogos avanzados del lápiz (0: line, 1:
bar, 2: point).
jhon.sn@live.com 14 Jun 2017

creando el interfaz de uso. controles, gráficas y documentación 93

plot-pen-reset permite borrar las secciones de las gráficas dibuja-


das por un lápiz en particular, y lleva este lápiz al (0,0) de la gráfica
tras restaurar sus características originales (color, modo, intervalo,
etc).

Al final de este capítulo puedes encontrar ejemplos de uso de las


instrucciones anteriores para manipular adecuadamente controles Plot.

Ejemplos

Como demostración del uso de los controles plot vamos a reali-


zar un modelo sencillo que mueva aleatoriamente dos tortugas por el
mundo y muestre en una gráfica la distancia entre ellas y la distan-
cia entre cada una y el origen de coordenadas, haciendo uso de tres
lápices distintos (figura 6.9).
El código asociado sólo tiene dos procedimientos definidos:
  Figura 6.9: Interfaz del modelo.
t o setup
ca
c r t 2 [ s e t x y random−xcor random−pxcor ]
ask t u r t l e 0 [ s e t c o l o r red ]
ask t u r t l e 1 [ s e t c o l o r blue ]
r e s e t −t i c k s
end

t o go
ask t u r t l e s [
r t ( random− f l o a t 1 − .5)
fd . 0 0 0 1 ]
tick
end
 

Y la definición de los procedimientos de dibujo en la ventana de


diálogo del control es:

Obsérvese el uso de tres lápices distintos con las instrucciones que


cada uno de ellos ha de usar para la actualización del plot en cada tick.
jhon.sn@live.com 14 Jun 2017

94 netlogo

Documentando el modelo

Cuando se crea un modelo es muy importante proporcionar una co-


rrecta documentación para que, bien nosotros en un futuro, bien otros
posibles usuarios e interesados en el mismo, podamos entender cada
detalle del mismo. No es habitual que un sistema de programación
que no está pensado para proyectos grandes ofrezca un sistema tan
completo de documentación como ofrece NetLogo.
Una técnica habitual cuando se documenta un programa es intro-
ducir comentarios en el código para que quede claro qué papel juega
cada elemento del código e incluso se explique cuál ha sido el algoritmo
(método) seguido en alguno de los pasos.
Los comentarios en el código se consguen en NetLogo gracias al
símbolo ;. Cuando NetLogo se encuentra con este símbolo (no dentro
de una cadena de texto entre comillas) supone que todo lo que viene a
continuación en esa misma línea es un comentario y lo ignora. El editor
de código lo colorea de gris para destacarlo del resto del código.

NetLogo, además de la opción anterior (que comparte con todos los


lenguajes de programación), ofrece un sistema de documentación más
flexible y potente capaz de crear documentos de texto enriquecido para
27
La documentación se almacena en el añadir información al modelo27 con imágenes, enlaces a URLs, listas
mismo fichero del modelo. enumeradas y de items, etc.
Se accede a este editor de documentación por medio de la pestaña
Info. Normalmente, los modelos de muestra que trae el sistema inclu-
yen en ella una introducción al modelo, la explicación del fenómeno
real que se intenta modelar, información acerca de cómo se ha creado
y de cómo usarlo, ideas para extenderlo, puntos clave de su simula-
ción y detalles de las característica propias de NetLogo que facilitan
su funcionamiento (usos específicos de ciertas primitivas, trucos sobre
tipos de agentes, etc).
jhon.sn@live.com 14 Jun 2017

creando el interfaz de uso. controles, gráficas y documentación 95

Hagamos un breve repaso de cómo se pueden crear documentos


ricos en contenido y en formato usando el editor.
Por defecto, la vista que se ofrece es no editable. Para pasar al modo
de edición ha de pulsarse sobre el botón Edit que se encuentra en la
barra de herramientas de la misma pestaña. El sistema que se usa
para la edición del texto se basa en un sistema de marcas llamado
Markdown28 . Como características principales para el formateo del 28
Es prácticamente el mismo que usan
texto destacamos: sistemas de edición de wikis tan famosos
como el de la Wikipedia.
Cabeceras de título: Comienzan con la marca #:

# Primer nivel
## Segundo nivel
### Tercer nivel
#### Cuarto nivel

Párrafos: No hacen uso de sangrías y se separan entre sí por medio


de líneas en blanco. Si no se pone la línea en blanco, se considera
continuación de la línea anterior.

Itálicas y negritas: Para las itálicas, rodea el texto con guiones bajos
(_texto_) y para las negritas, con doble asterisco (**texto**). Se
puede combinar (_**texto**_).

Actividad: Puedes encontrar multitud de ejemplos viendo cómo


están hechas las documentaciones de los modelos que NetLogo
trae como ejemplo. En especial, deberías mirar el que viene en los
ejemplos de código de nombre Info Tab Example.
jhon.sn@live.com 14 Jun 2017

96 netlogo

Cuando se crea un nuevo modelo, NetLogo automáticamente sugie-


29
Por supuesto puedes modificarla com- re la siguiente estructura inicial en la documentación29 :
pletamente o ignorarla, pero es aconseja-
ble tenerla en cuenta porque proporcio- WHAT IS IT?: una sección en la que explicitar una idea general de
na una guía bastante completa de la in-
formación que puede ser importante pa- qué está intentando mostrar o explicar el modelo.
ra futuros usuarios de tu modelo.
HOW IT WORKS: donde se exponen qué reglas usan los agentes
para crear el comportamiento global del modelo o, en general, cuál
ha sido la estrategia elegida para la solución.

HOW TO USE IT: explica cómo usar el modelo, incluyendo una


descripción de cada uno de los elementos del interfaz.

THINGS TO NOTICE: donde se hace énfasis en aquello que debe


tener en cuenta el usuario cuando ejecuta el modelo, o qué detalles
deben ser relevantes durante su ejecución.

THINGS TO TRY: en esta sección se presentan algunas considera-


ciones que debe tener el usuario para obtener resultados interesan-
tes.

EXTENDING THE MODEL: muestra sugerencias acerca de cam-


bios en el código para modificar algunos comportamientos, com-
pletar el modelo, hacerlo más preciso, etc.

NETLOGO FEATURES: destaca características interesantes, o po-


co habituales, respecto al uso de NetLogo, en especial respecto al
código.

RELATED MODELS: referencia a otros modelos que puedan tener


alguna relación con el modelo actual.

CREDITS AND REFERENCES: presenta una lista de referencias


relacionadas con el modelo: una dirección web en la que se amplía
información, artículos, libros, etc.

Ejemplos completos

Pequeño programa de multidibujo


Nuestro primer ejemplo sólo tiene la finalidad de jugar con el inter-
faz y añadir algunos controles para interactuar con el modelo mientras
está en ejecución. La idea es montar un sistema sencillo en el que, con
varias tortugas en movimiento en la pantalla, podamos controlar algu-
nas características de su movimiento y de su dibujo.
Se propone una interfaz como la que puedes ver en la figura 6.10.
Y el código asociado, que solo consta de dos procedimientos, uno
de creación del mundo y otro de ejecución, es el siguiente:

Figura 6.10: Interfaz del programa de


Multidibujo.
jhon.sn@live.com 14 Jun 2017

creando el interfaz de uso. controles, gráficas y documentación 97

 
t o setup
ca
c r t num−t o r t u g a s [ pd ]
end

t o go
ask t u r t l e s [
i f e l s e l a p i z − a r r i b a ? [ pu ] [ pd ]
r t angulo
fd v e l o c i d a d
s e t pen− s i z e g r o s o r ]
wait . 1
end
 
Se debe tener en cuenta que: 30
Slider con los valores comprendidos
entre 0 y 10.
La única variable útil para la creación es num-tortugas30 .

El botón go está definido como forever, de forma que es el propio En el código de go sólo indicamos,
31

pues, lo que debe hacer en cada paso.


botón el que se encarga de la ejecución sin fin del procedimiento de
dibujo31 . 32
Slider con valores comprendidos entre
-5 y 5, y un incremento de .01.
La variable angulo permite controlar el ángulo de rotación de las
tortugas en cada paso32 . 33
Slider con valores comprendidos entre
0 y 1, y un incremento de .01.
La variable velocidad permite controlar la velocidad de avance de
las tortugas en cada paso33 . 34
Slider con valores comprendidos entre
0 y 10, y un incremento de .01.
La variable grosor permite controlar el grosor del lápiz de las tor-
tugas34 . 35
Para ello, no se ha definido ningún
procedimiento asociado en la pestaña de
La variable lapiz-arriba? controla por medio de un switch si las código, sino que directamente en los pa-
tortugas dejan rastro o no al moverse. rámetros del botón se le ha asignado co-
mo códido: cd (clear-drawing).
Se ha añadido un botón extra que permite limpiar la pantalla35 .

Reconocimiento de grupos
Al segundo ejemplo consiste en realizar un modelo que, dada una
distribución de colores en los patches, sea capaz de reconocer los gru-
pos que se han formado36 . 36
La definición de grupo es intuitiva-
La idea es dar un procedimiento que, aprovechando una propiedad mente sencilla, pero no tanto en su for-
malización; así que nos quedamos con la
adicional de los patches (que llamaremos grupo), sea capaz de ir nu- intuición de que un grupo es un conjun-
merando los diversos grupos que encuentra y asignando a cada patch to de patches que comparten el mismo
color y que están conectados vertical u
el grupo al que pertenece. horizontalmente unos con otros.
Con lo aprendido en este capítulo podemos montar un interfaz (no
precisará mucha elaboración) que disponga de dos botones: uno pa-
ra crear un mundo y otro para calcular los grupos que existen; y un
monitor para mostrar el número de grupos encontrados:
jhon.sn@live.com 14 Jun 2017

98 netlogo

37
Como es habitual, no hay solución úni-
ca; y la decisión de hacerlo de esta forma
se debe a dos razones: utiliza únicamen-
te conceptos vistos hasta el momento e
introduce algunas ideas interesantes, co- Proponemos el siguiente código como posible solución al proble-
mo un proceso de recursión sobre pat-
ches. Observa que el código es realmente ma37 . Comenzamos mostrando la cabecera y el procedimiento que ge-
corto y el problema no es tan sencillo. nera el mundo al azar (en la columna al margen se da una explicación
del código).
 
La variable grupo de cada patch indicará
patches −own [ grupo ]
el grupo al que pertenece; inicialmente
se le asignará el valor -1. La variable glo-
bal num-grupos almacenará el número de g l o b a l s [ num−grupos ]
grupos encontrados.
t o setup
A los patches se les asigna un color os-
curo, usando el reporte base-colors, pa-
c l e a r −a l l
ra que sea más visible la etiqueta que ask p a t c h e s [
mostrará el grupo al que pertenece. Pa- s e t p c o l o r ( one−o f base − c o l o r s ) − 3
ra que se formen grupos grandes, vamos s e t grupo − 1]
propagando los mismos colores por me- r e p e a t 20 [
dio de una repetición; así, áreas disper-
sas del mismo color acaban agrupándo-
ask p a t c h e s [
se. s e t p c o l o r [ p c o l o r ] o f one−o f neighbors4 ] ]
end
 

Actividad: ¿Qué ocurre si en setup en vez de hacer 20 repeticiones


hacemos 50? ¿Y si hacemos 2?

Los procedimientos que se encargan de encontrar los grupos, nume-


rarlos, etiquetar los patches que los forman y mostrar los resultados
son los siguientes:
 
t o encuentra −grupos
l e t num−grupo 1
loop [
l e t i n i c i a l one−o f p a t c h e s with [ grupo = − 1]
i f i n i c i a l = nobody [
muestra−grupos
s e t num−grupos num−grupo − 1
s to p ]
jhon.sn@live.com 14 Jun 2017

Todo el proceso de cálculo está dentro de


un loop infinito del que salimos cuando
hayamos marcado ya todos los patches.
creando el interfaz de uso. controles, gráficas y documentación 99

Los grupos se van a identificar por un


ask i n i c i a l [ valor numérico, el índice del grupo, que
s e t grupo num−grupo se va actualizando a medida que los va-
mos encontrando.
e x t i e n d e −grupo ]
s e t num−grupo num−grupo + 1 ]
end

t o e x t i e n d e −grupo
l e t c pcolor Actividad: Observa el uso
l e t g grupo recursivo del procedimiento
ask n eighbors4 with [ ( grupo = − 1) and ( p c o l o r = c ) ] extiende-grupo. ¿Por qué
[ s e t grupo g estamos seguros de que el
e x t i e n d e −grupo ]
procedimiento recursivo es
end
correcto y se detiene?
t o muestra−grupos
ask p a t c h e s [ s e t p l a b e l grupo ]
end
 
¿Qué detalles de este modelo conviene tener en mente?

1. Para formar un grupo nuevo, se comienza con un patch que no


pertenezca a ningún grupo (se reconocen porque en ellos el valor
de grupo es -1) y a partir de él se va propagando el valor del grupo
nuevo en construcción de vecino a vecino38 . 38
Con la restricción de que sean del mis-
mo color y que no haya sido ya marcado,
2. Se ha usado el reporte base-colors, que devuelve una lista con los para que no se produzca el proceso infi-
nito de tú me marcas a mí, yo te marco ti,
14 colores básicos. tú me marcas a mí.

Ejercicios

1. Crea un modelo en el que tengas que poner un control de cada tipo


(incluso del tipo note) y en el que cada control tenga una utilidad
real39 . 39
Si no se te ocurre, puedes hacer varios
modelos que reúnan entre todos los dis-
2. Haciendo uso de sliders crea un conversor de temperaturas entre tintos tipos de controles.

grados centígrados y farenheit.

3. Con ayuda de los controles que consideres adecuados, crea una


calculadora funcional con las operaciones básicas habituales (suma,
resta, producto y división)40 . 40
Ayuda: Utiliza, al menos, dos variables
globales para ir almacenando los sucesi-
4. Crea un modelo en el que puedas definir el color de los patches (el vos valores numéricos y utilizarlos como
operandos cuando se pulse un botón de
mismo para todos ellos) por medio de 3 sliders para la proporción tipo operación. Recuerda que los núme-
de Rojo, Verde y Azul (RGB), y un botón de tipo forever que se use ros mayores que 9 se introducen por la
pulsación sucesiva de botones numéri-
para que, mientras esté pulsado, se actualice el color del mundo
cos.
automáticamente.

5. Crea un modelo que permita asignar valores a los coeficientes de


un polinomio de grado 3 por medio de controles adecuados41 , así 41
Recuerda que la diferencia entre los
sliders y las cajas de input es que es-
tas últimas admiten mucha más preci-
sión numérica y no tienen límites pre-
establecidos, pero son más incómodas
de usar.
jhon.sn@live.com 14 Jun 2017

100 netlogo

como el rango de valores de x, y represente su gráfica por medio de


un control plot.

6. Amplía el programa de multidibujo que se ha mostrado en este


mismo capítulo para que el usuario pueda ir añadiendo cada tortu-
ga, una a una, definiendo sus características de forma personalizada
(es decir, que los valores sean individuales para cada tortuga, y no
necesariamente iguales en todas ellas).

7. Haz un modelo en el que se generen varias tortugas que se muevan


por el mundo aleatoriamente, y que muestre la posición y rastro de
las tortugas en un plot a la vez que se desplazan por el mundo.

8. Usa alguno de los modelos simples que hemos hecho hasta el mo-
mento y rellena su pestaña de información con un contenido rico:

a) Que tenga secciones con cabeceras a distintos niveles.


b) Que tenga trozos de código de NetLogo para explicar el funcio-
namiento de algún procedimiento.
c) Que haga uso de listas y listas numeradas.
d) Que incluya alguna imagen.
e) Que incluya algún enlace a un recurso externo.

9. Caminos reticulares:

a) Crea un procedimiento setup (con un botón asociado en el inter-


face) que genere inicialmente una cantidad N de tortugas, donde
N es una variable introducida mediante un slider en el interface.
Las tortugas deben estar orientadas al azar formando un ángulo
de 0, 90, 180 0 360 grados y pueden dejar rastro o no, según un
switch introducido en el interface.
b) Crea un procedimiento que haga que las tortugas se muevan
avanzando una distancia y orientándose al azar al norte, sur, este
u oeste, a cada paso. Crea un botón para llamar continuamente a
este procedimiento desde el interface.
c) Crea monitores en el interface que nos den, a cada tick, las coor-
denadas de la tortuga 0, así como su orientación.

10. Suavizado de una serie aleatoria:

a) Copia y ejecuta el siguiente código:


 
g l o b a l s [ n smoothed ]

t o setup
c l e a r −a l l
set n 0
jhon.sn@live.com 14 Jun 2017

creando el interfaz de uso. controles, gráficas y documentación 101

s e t smoothed 0
r e s e t −t i c k s
end

t o go
s e t n n + one−o f [ − 1 0 1 ]
tick
s e t smoothed smoothness * smoothed +
( 1 − smoothness ) * n
end
 
donde smoothness es introducida mediante un slider (con valo-
res entre 0 y 1), y añadiendo un botón para setup y otro para
llamar de forma continua a go.
b) Haz un plot para representar el valor de n y el de smoothed a
cada tick.
c) Ejecuta el experimento para diferentes valores de smoothness.
d) Explica lo que hace la línea de código: set smoothed smoothness
* smoothed + (1 - smoothness) * n.
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

7
Descubriendo la potencia de NetLogo:
Los Conjuntos de Agentes

Un Agentset para NetLogo es, como su nombre indica, un conjun-


to de agentes; pero no de cualquier tipo: han de ser todos del mismo
tipo (todos tortugas, todos patches, o todos links), aunque no necesa-
riamente de la misma raza.
Hasta el momento hemos trabajado con las familias completas de
agentes y hemos sido capaces de pedirles que hicieran cosas a todos
juntos1 o solo a aquellos que verificasen algún criterio2 . 1
Por ejemplo, haciendo uso de turles,
patches, etc.
NetLogo nos permite construir con total libertad conjuntos de agen- 2
Gracias al uso de with; por ejemplo,
tes que contengan exclusivamente los que nos sirvan a nuestros propó- patches with [ pcolor = red].
sitos. Una vez diferenciado el conjunto de agentes, podremos operar
sobre ellos haciendo uso de ask.
En este capítulo vamos a aprender a usar los reportes de que dis-
pone NetLogo para generar conjuntos de agentes y vamos a definir
nuestros propios reportes para adaptar el lenguaje a las necesidades
del problema concreto que queramos resolver.
Antes de comenzar con las primitivas de NetLogo para tratar con-
juntos de agentes es importante señalar que, como hemos visto, las
variables no tienen tipo3 y en una misma variable podemos almacenar 3
A diferencia de lo que ocurre en otros
muchos lenguajes, que se llaman tipados,
un número, una cadena, un agente, o incluso un conjunto de agentes.
en los que cada variable se declara para
Por tanto, tiene sentido hacer algo como lo que sigue: que pueda almacenar un tipo específico
  de dato.
let r o j o s p a t c h e s with [ p c o l o r = red ]
let un− r o j o one−o f r o j o s
ask rojos [ set pcolor pcolor + 1 ]
ask unr ojo [ s e t p c o l o r blue ]
 
Además de los reportes generales, que puede ejecutar el observa-
dor y sobre los que después podemos hacer filtrados, será interesante
ver cómo funcionan ciertos reportes que pueden ejecutar los propios
agentes y que devuelven conjuntos de agentes a los que ellos pueden
acceder. Un ejemplo muy interesante es other, que funciona de la si-
jhon.sn@live.com 14 Jun 2017

104 netlogo

guiente manera: supongamos que tenemos un conjunto de agentes, C,


y un agente c1 dentro de ese conjunto; entonces, si c1 pregunta por
other C, el sistema le devolverá el resto de agentes que están en C y
que no son él mismo. Por ejemplo (figura 7.1):
 
ask patch 0 0 [ ask o t h e r p a t c h e s [ s e t p c o l o r blue ] ]
 

Inspeccionando conjuntos de agentes


Figura 7.1: Resultado del código.

Una vez que disponemos de conjuntos de agentes, además de pe-


dirles que realicen acciones por medio de ask, podemos inspeccionar
algunas propiedades básicas del conjunto; por ejemplo:

any?: permite saber si un conjunto de agentes es vacío (devuelve


true o false).

all?: permite saber si todos los agentes de un conjunto de agentes


verifican una condición (devuelve true o false).

count: permite saber cuántos agentes hay en un conjunto de agen-


tes.

En el ejemplo anterior:
 
observer > any ? p a t c h e s with [ p c o l o r = red ] => f a l s e
observer > a l l ? p a t c h e s [ p c o l o r = blue ] => f a l s e
observer > count p a t c h e s with [ p c o l o r = blue ] => 80
 
Para saber si un agente pertenece a un conjunto o no, podemos usar
member?, tal y como vimos con listas:
member? (turtle 0) (turtles with [ color = blue ]
y para comprobar si dos agentes o conjuntos de agentes son iguales
o distintos podemos usar los comparadores habituales =, !=. En esen-
cia, NetLogo trata los agentes y conjuntos de agentes como cualquier
otro dato de los que manipula. De esta forma, si tenemos una variable,
podemos saber si el dato que contiene es un conjunto de agentes por
medio de is-agentset?.

Reportes que devuelven agentes al azar


4
Se debe tener precaución al ejecutar es- Ya hemos hecho uso del reporte one-of, que en el contexto de los
te reporte, ya que el conjunto de agen-
agentes recibe como dato de entrada un conjunto de agentes y devuel-
tes no puede ser vacío, o se generará un
error que detendrá la ejecución. ve al azar uno de ellos4 .
Existe un reporte similar, pero que en vez de devolver un solo agen-
5
Al igual que ocurría con one-of, debe
tenerse la precaución de que haya, al me- te, devuelve la cantidad que le indiquemos: n-of. Por ejemplo:
nos, tantos agentes como le pidamos con ask n-of 10 patches [set pcolor blue]
la función n-of o NetLogo devolverá un
error de ejecución indicando que no hay toma al azar 10 de los patches y los pone en azul5 .
agentes suficientes para realizar la ope-
ración.
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 105

Debe diferenciarse entre (n-of 1) y (one-of). El primero devuelve


un conjunto de agentes formado por un sólo agente, mientras que el
segundo devuelve un agente.
Existen varios procedimientos que permiten extraer de un conjunto
de agentes aquellos que obtienen los valores extremos6 para un deter- 6
Los valores extremos de una función son
minado reporte: max-one-of, max-n-of, min-n-of, min-one-of. Veamos los máximos y los mínimos.

un ejemplo de uso para entender cómo funcionan (figura 7.2):


 
c r t 6 [ s e t x y random−pxcor random−pycor ]
ask max−n−o f 2 t u r t l e s [ pxcor ] [ s e t s i z e 2 ]
ask min−one−o f t u r t l e s [ pxcor ] [ s e t shape " c i r c l e " ]
 
En general, estas instrucciones siguen el formato:
max-n-of conjunto-agentes [reporte] [acciones]
Figura 7.2: Resultado del código.
En este ejemplo se crean y distribuyen al azar 6 tortugas, y se desta-
can las 2 con la coordenada X mayor (poniéndolas al doble de tamaño)
y la que tiene la coordenada X menor (cambiando su forma a circular)7 .
7
Estos reportes, en caso de que haya más
Existen versiones similares que se combinan con with para extraer los agentes de los que se piden verifican-
agentes en los que se obtienen los valores extremos de un reporte: do la condición, realizan una selección
with-max, with-min. al azar entre los candidatos, tal y como
indica el siguiente apartado.

Conjuntos de patches 8
Veremos que, de forma extendida, tam-
bién podrán ejecutarlos las tortugas.
El principal conjunto de agentes de patches se obtiene por el reporte
patches, del que ya hemos hecho uso a lo largo de los capítulos ante-
9
4 en las direcciones principales y 4 en
las diagonales.
riores. A partir de él podemos conseguir subconjuntos de agentes por
medio de restricciones haciendo uso del comando with.
Pero además de este conjunto principal, existen reportes que nos
devuelven interesantes conjuntos de patches por otros medios. Los
más sencillos son los que se consiguen por medio de la vecindad. Al
devolver relaciones de vecindad, no tiene sentido que estos reportes
los ejecute el observador, sino que tienen que ser ejecutados por los Figura 7.3: neighbors de un patch.
propios patches8 .
Si un patch determinado ejecuta neighbors obtendrá los 8 vecinos
que le rodean9 (figura 7.3):
 
ask patch 0 0 [ ask neighbors [ s e t p c o l o r blue ] ]
 
Si ejecuta neighbors4 obtendrá los 4 vecinos que se encuentran en
las direcciones principales (horizontal y vertical, como muestra la fi-
gura 7.4): Figura 7.4: neighbors4 de un patch.
 
ask patch 0 0 [ ask neighbors4 [ s e t p c o l o r blue ] ]
 
Si una tortuga ejecuta patch-here, obtiene el patch sobre el que se 10
Se trata de una norma general: si una
tortuga ejecuta un reporte de un patch,
encuentra. Y si una tortuga pregunta por los procedimientos anteriores
se considera que es como si lo ejecutase
(neighbors y neighbors4) obtendrá los patches vecinos del patch en el el patch sobre el que se encuentra. De es-
que se encuentra en el momento de la ejecución10 . ta manera, una tortuga puede acceder y
modificar las propiedades del patch so-
bre el que se encuentra.
jhon.sn@live.com 14 Jun 2017

106 netlogo

Si tenemos conjuntos de patches, podemos formar la unión de ellos


por medio de la instrucción patch-set (figura 7.5):
 
ca
c r t 1 [ s e t x y random−pxcor random−pycor ]
l e t Cpatches ( patch − s e t ( [ neighbors ] o f t u r t l e 0 )
( [ neighbors4 ] o f patch 3 3 ) )
Figura 7.5: Ejemplo de patchset. ask Cpatches [ s e t p c o l o r blue ]
 
Observa el uso de of unido al tratamiento entre corchetes de un re-
porte de un agente para obtener la respuesta que dicho agente tendría
si ejecutara el reporte: [reporte-agente] of agente. Este uso también
nos puede dar el valor de una de sus propiedades, por ejemplo:
[pcolor] of patch 0 0
Otro ejemplo de interacción entre tortugas y patches sobre los que
se sitúan es el siguiente (figura 7.6):
 
t o comunicacionTP
ca
c r t 2 [ pd ]
r e p e a t 100 [
ask t u r t l e s [
move−t o one−o f neighbors
Figura 7.6: Comunicación tortuga-patch.
set pcolor color − 2 ] ]
end
 
donde se pone de manifiesto cómo las tortugas hacen uso de un re-
porte perteneciente al patch sobre el que están situadas (neighbors) y
modifican directamente una propiedad de dicho patch (pcolor).
Existe un reporte especial, llamado no-patches, que devuelve el con-
junto de patches vacío (sin patches) y que podemos utilizar, por ejem-
plo, para dar un valor inicial a una variable en la que acumularemos
patches por medio de patch-set, o para comparar si un conjunto de
patches calculado por algún otro reporte es vacío (aunque para esto
también tenemos el comando any?).

Actividad: NetLogo incorpora una colección de reportes de


patches que permiten obtener otros patches que están en una deter-
minada dirección y distancia del que ejecuta el reporte, como son:
patch-at, patch-at-heading-and-distance, patch-left-and-ahead
y patch-right-and-ahead. Te invitamos a ver el manual de referen-
cia de NetLogo para conocer su comportamiento exacto y explorar
en los ejemplos de programación que vienen en la librería para ver
posibles casos de uso.

Si queremos obtener el conjunto de patches que están por debajo de


una determinada distancia de un patch dado, éste puede hacer uso del
comando in-radius (figura 7.7):
Figura 7.7: Ejemplo de in-radius.
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 107

 
ask patch 0 0 [
ask o t h e r p a t c h e s in −r a d i u s 3 [ s e t p c o l o r blue ] ]
 
Además del reporte general is-agenteset?, para el caso particular
de los patches podemos preguntar por is-patch-set?, que es más
específico.

Actividad: Para profundizar en el uso de las vecindades de


patches es recomendable ver el modelo Neighborhoods Examples
de la biblioteca que trae NetLogo.

Conjuntos de tortugas

Veremos en esta sección las primitivas de NetLogo que permiten


generar conjuntos de agentes formados por tortugas. Por supuesto,
todo lo que se aplique a tortugas se puede aplicar a sus razas (breeds)
sustituyendo la palabra clave turtles por el nombre en plural de la
raza.
Además del conjunto global de tortugas, que obtenemos por medio
del reporte turtles, podemos trabajar con una versión local, turtles-here,
que, ejecutada por un patch, devuelve el conjunto de agentes de tipo
tortuga que se encuentran en dicho patch. Si lo ejecuta una tortuga,
como ya va siendo habitual, devuelve el conjunto de agentes de tipo
tortuga que comparten patch con ella11 (figura 7.8): 11
En esta devolución se incluye ella mis-
  ma; si queremos excluirla podemos ha-
c r t 20 [ s e t x y random−xcor random−ycor ] cer uso de other.
ask p a t c h e s with [ pxcor >= 0 ] [
ask t u r t l e s −here [ s e t s i z e . 5 ] ]
 
Un objetivo similar tiene la primitiva turtles-at, que recibe el vec-
tor relativo a la posición actual: turtles-at 1 0, y devuelve las tor-
tugas que están en el patch especificado por la dirección (1,0); o
turtles-on, que funciona como turtles-here, pero puede recibir co-
mo dato todo un conjunto de patches, no uno sólo. Figura 7.8: Ejemplo de turtles-here.

El reporte no-turtles, análogo a no-patches, devuelve un conjunto


de tortugas vacío.
El comando equivalente a patch-set para formar uniones de con-
juntos de tortugas es turtle-set (figura 7.9):
 
c r t 10 [
s e t x y random−xcor random−ycor
s e t l a b e l who Figura 7.9: Ejemplo de turtle-set.
s e t c o l o r red ]
l e t A ( t u r t l e − s e t ( t u r t l e s with [who > 5 ] ) ( t u r t l e 0 ) )
ask A [ s e t c o l o r blue ]
 
jhon.sn@live.com 14 Jun 2017

108 netlogo

Según hemos comentado, si se define una raza nueva, por ejem-


plo: breeds [coches coche], se pueden utilizar las versiones: coches,
coches-here, coches-at y coches-on para las operaciones equivalen-
tes, pero restringidas al conjunto de tortugas de esa raza.
Como los agentes de tipo tortuga tienen una localización y orien-
12
Tiene el mismo comportamiento que tación espacial, además del uso de in-radius12 , también es posible
con los patches, pero en este caso se con- trabajar con el reporte in-cone, que devuelve los agentes que están
sidera como centro de distancias la lo-
calización real de la tortuga, no la del dentro de un cierto cono de visión que se definer por la distancia má-
patch en el que está situada. xima y el ángulo de apertura (figura 7.10):
 
c r t 1000 [
s e t c o l o r blue
s e t x y random−xcor random−ycor
set size .2
s e t shape " c i r c l e " ]
ask t u r t l e 0 [
s e t shape " d e f a u l t "
Figura 7.10: Ejemplo de in-cone. set size 1
s e t c o l o r green
ask o t h e r t u r t l e s in −cone 3 60 [ s e t c o l o r red ] ]
 
Además del reporte general is-agentset?, para el caso particular
de las tortugas podemos preguntar por is-turtle-set?, que es más
específico.

Actividad: Realiza un modelo en el que una tortuga persiga a otra


si la encuentra dentro de su campo de visión (que será simulado por
el reporte in-cone); si no, que se mueva aleatoriamente hasta que se
vuelvan a cruzar.

Mutabilidad e inmutabilidad de conjuntos de agentes

Debe tenerse en cuenta que un conjunto de agentes, una vez calcu-


lado por medio de una de las primitivas, no varía hasta que lo vol-
vamos a calcular, a no ser que lo hayamos calculado directamente con
los reportes de agentes más generales (turtles, patches o links). Vea-
mos un ejemplo. Suponiendo que existe una variable global de nombre
CON):
 
observer > c l e a r −a l l
observer > c r t 10
observer > s e t CON t u r t l e s
observer > count CON => 10
observer > c r t 10
observer > count CON => 20
observer > s e t CON t u r t l e − s e t t u r t l e s
observer > count CON => 20
observer > c r t 10
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 109

observer > count CON => 20


observer > count t u r t l e s => 30
 
Es decir, cuando se crea un conjunto a partir del comando turtle-set
lo que se realiza es una copia del conjunto de agentes que existe en ese
momento, pero esta copia no se actualiza aunque el conjunto original
cambie. Lo mismo sucede con las razas.
Esta inmutabilidad también se observa con el comando ask: en el
momento de ejecutarse un ask se calculan los agentes que han de reali-
zar las acciones que se indiquen, pero si durante ese proceso aparecen
nuevos agentes, éstos no ejecutarán las acciones originales.

La conciencia en los agentes

Supongamos que tenemos un reporte que calcula el punto medio


de la posición que ocupan dos agentes13 : 13
Este reporte lo definimos ya en un ca-
  pítulo anterior como ejemplo. Recorde-
to −r e p o r t punto−medio [ ag1 ag2 ] mos que el reporte punto-medio recibe
l e t x1 0 como dato de entrada los dos agentes y
l e t x2 0 devuelve una lista con el punto medio.
l e t y1 0
l e t y2 0
ask ag1 [ s e t x1 xcor s e t y1 ycor ]
ask ag2 [ s e t x2 xcor s e t y2 ycor ]
r e p o r t l i s t ( ( x1 + x2 ) / 2 ) ( ( y1 + y2 ) / 2 )
end
 
Si queremos que punto-medio lo pueda usar un agente para cal-
cular el punto medio entre él y otro agente del mundo es necesario
que le pueda pasar como datos de entrada a este reporte quién es el
otro agente y alguna referencia de él mismo. Para acciones como esta,
NetLogo permite que los agentes se referencien a sí mismos por medio
de la instrucción self. Los siguientes procedimientos muestran un uso
de esta primitiva:
 
t o mover−agente
l e t otro −agente ( one−o f o t h e r t u r t l e s )
l e t pm punto−medio s e l f otro −agente
f a c e x y ( f i r s t pm) ( l a s t pm)
fd ( d i s t a n c e otro −agente ) / 2
end
to principal
ca
c r t 2 [ s e t x y random−pxcor random−pycor ]
ask one−o f t u r t l e s [
pd
stamp
mover−agente ]
end
 
jhon.sn@live.com 14 Jun 2017

110 netlogo

Observa que mover-agente es un procedimiento de tortuga exclusi-


vamente, porque necesita que lo realicen agentes móviles. Su funcio-
14
Es aconsejable bajar mucho la veloci- namiento es como sigue14 :
dad de reproducción para ver el resulta-
do. Lo ejecuta por una tortuga (esta ejecución se lanza desde el procedi-
miento principal), que llamaremos tortuga accionadora, y que deja
una marca en la zona en la que está originalmente (por medio del
comando stamp).

Durante la ejecución del procedimiento esta tortuga selecciona al


azar uno de las otras tortugas (que se almacena en la variable local
otro-agente).

Se calcula el punto medio entre el otro-agente y la tortuga accio-


nadora usando el reporte punto-medio. Para ello se pasan como pa-
rámetros los dos agentes involucrados. La tortuga que ejecuta la
acción se autodenomina self.

A partir de la devolución del punto medio se orienta a la tortuga


en esa dirección (facexy x y) y avanza la distancia necesaria para
15
Que se calcula como la mitad de la situarse en el punto medio15 .
distancia de la tortuga accionadora al
otro-agente: distance otro-agente. Con frecuencia necesitaremos referenciar al agente que nos pide
hacer algo. Como ejemplo, vamos a hacer un procedimiento que pida
a una tortuga seleccionada al azar que seleccione a otra y se orienten
quedando enfrentadas (mirando una a la otra):
 
to enfrenta
ca
c r t 5 [ s e t x y random−pxcor random−pycor ]
ask one−o f o t h e r t u r t l e s [
set size 2
l e t otro −agente one−o f o t h e r t u r t l e s
f a c e otro −agente
ask otro −agente [
f a c e myself
set size 2 ] ]
end
 
En esta solución encontramos una diferencia respecto al anterior: si
somos la tortuga accionadora, hemos de pedirle al otro-agente que se
oriente hacia nosotros. Para poder realizar esta tarea con comodidad,
NetLogo proporciona la primitiva myself para que un agente pueda
16
Observa que tanto self como myself referenciar al agente que le ha encargado hacer una acción16 .
son realmente reportes, porque devuel-
ven un resultado. Actividad: Haz un modelo en el que haya tortugas desplazándose
aleatoriamente por el mundo y cuando dos de ellas se encuentren
sobre el mismo patch intercambien sus colores.
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 111

Creando y destruyendo agentes según necesidad

Ya hemos visto que la creación agentes se puede conseguir por me-


dio del comando create-turtles, o create-razas para familias de
razas definidas. Pero no es la única forma de conseguir generar nue-
vos individuos. Muchas veces podemos estar interesados en que la
creación de agentes vaya asociada a un agente previo, como si fuera
un proceso reproductivo.
NetLogo ofrece dos métodos distintos para obtener agentes móviles
(derivados de las tortugas)17 : 17
Los patches no se pueden crear y los
enlaces no pueden nacer de otros agen-
1. Que nazcan de otro agente móvil: en este caso se usa el comando tes

hatch (o hatch-razas) y el resultado es la creación de clones exactos


al agente que ha ejecutado el comando.

2. Que nazcan de un patch: en este caso se usa el comando sprout (o


sprout-razas), y el resultado es la creación de agentes con orien-
tación y color aleatorios; situados en el centro del patch que ha
ejecutado el comando.

Ambos tienen la misma estructura que el comando create-turtles,


como puedes ver en los ejemplos que aparecen a continuación (figuras
7.11 y 7.12):
 
t o crea −t o r t u g a s
ca
crt 3 [ Figura 7.11: Ejemplo de hatch.
set size 0.5
pd
fd 10
hatch 10 [
s e t heading heading * random− f l o a t 3
fd 3
hatch 10 [
s e t heading heading * random− f l o a t 3
fd 1 ] ] ]
end Figura 7.12: Ejemplo de sprout.

t o crea −por−p a t c h e s
ca
ask n−o f 15 p a t c h e s [
s e t p c o l o r one−o f base − c o l o r s
sprout 1 ]
end
 
La forma de destruir agentes (no patches18 ) es por medio del co- 18
Obviamente, los patches no se pueden
mando die, pero deben ejecutarlo ellos mismos. El siguiente ejemplo crear ni destruir durante la ejecución.

muestra cómo generar una población cambiante combinando los co-


mandos que hemos visto en este apartado:
jhon.sn@live.com 14 Jun 2017

112 netlogo

 
t u r t l e s −own [ edad ]
t o setup
ca
c r e a t e −t u r t l e s 3 [
fd 3
s e t edad 0 ]
r e s e t −t i c k s
end
t o go
i f not any ? t u r t l e s [ st o p ]
ask t u r t l e s [
Las tortugas se reproducen con una cier- r t random 360
ta probabilidad (2 %) y mueren cuando fd 0 . 5
superan los 50 ciclos de reloj.
s e t edad edad + 1
i f edad > 50 [ d i e ]
i f random 50 = 0 [ hatch 1 [ s e t edad 0 ] ] ]
tick
end
 

Actividad: Genera un modelo en el que las tortugas tengan


un par de propiedades llamadas avanza y giro que determinan
su movimiento y, cada cierto tiempo, cuando dos tortugas se
encuentren en el mismo patch, generen una hija que tenga como
propiedades una combinación (del tipo que quieras: lineal, aleatoria,
copia, etc.) de las propiedades de sus padres.

Ejemplos completos

Propagación de fuego por un terreno


En este modelo haremos uso únicamente de los patches. El objetivo
es analizar cómo influye la densidad de madera seca en el terreno
para la propagación de un fuego que comienza en un foco puntual.
Los pasos que seguiremos son:
Cambiar las dimensiones del mundo para que tenga un tamaño de
101x101 centrado en el origen y esté limitado en sus bordes.

Diseñar un procedimiento, prepara-terreno, que reciba como dato


de entrada la densidad de madera seca del terreno y asigne a ca-
da patch aleatoriamente la condición de ser madera seca o no, de
acuerdo con la densidad dada.

Situar un fuego en el patch central (0,0).

Crear un procedimiento, propaga, que propague, mientras queden


patches con fuego, el fuego de un patch ardiendo a sus vecinos con
madera seca.
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 113

Para diferenciar el estado de un patch usaremos su color19 . 19


Usaremos negro para los patches que-
Siguiendo las indicaciones anteriores, vamos a crear un control de mados; verde para los patches con ma-
dera fresca; marrón para los patches con
tipo slider (con valores entre 1 y 100) para introducir la densidad de madera seca y rojo para los patches con
madera seca en el terreno, y dos botones, uno para cada uno de los fuego. Un patch pasa del rojo (fuego) al
negro (quemado) tras haber propagado
procedimientos. Además, añadiremos un monitor que mida el porcen- el fuego a sus vecinos.
taje de madera seca quemada con respecto al tamaño total del terreno, de
manera similar a como se muestra en la siguiente figura.

El código asociado es:


 
t o prepara −t e r r e n o
ca
ask p a t c h e s [
s e t p c o l o r i f e l s e −value ( %−s e c o < random 1 0 0 )
[ green ] [ brown ] ]
ask patch 0 0 [ s e t p c o l o r red ]
end

t o propaga
while [ any ? p a t c h e s with [ p c o l o r = red ] ] [
ask p a t c h e s with [ p c o l o r = red ] [
ask neighbors4 with [ p c o l o r = brown ] [
s e t p c o l o r red ] Observa que el código se ha preparado
s e t pcolor black ] ] para que el bucle de la ejecución se reali-
end ce en la propia función propaga.
 

Y el código del monitor:


 
( count p a t c h e s with [ p c o l o r = b l a c k ] ) / ( count p a t c h e s ) * 1 0 0
 

Actividad: Añade un control plot que muestre la evolución del


porcentaje de madera seca quemada en tiempo real.
jhon.sn@live.com 14 Jun 2017

114 netlogo

Propagación de mensajes entre individuos


En este modelo haremos uso únicamente de las tortugas. El objeti-
vo es analizar la rapidez con la que se difunde un mensaje entre una
20
Para simplificar, comenzaremos asig- población móvil20 . Seguiremos los pasos que se enumeran a continua-
nando un movimiento aleatorio a los ción:
agentes.
Se define un procedimiento, prepara-mundo, que reciba como dato
de entrada el número de individuos en el mundo y los distribuya
aleatoriamente.

Se selecciona un individuo al azar que será el portador original del


mensaje.

Se crea un procedimiento, propaga, que propague, mientras queden


individuos que no tengan el mensaje, los mensajes desde los indi-
viduos que los tienen a los individuos que se encuentran en sus
mismos patches y que no los tienen.
21
En este caso, y de manera distinta al
ejemplo anterior, el botón de propaga-
ción es de tipo forever, con lo que la fun-
De nuevo, usaremos el color del agente para distinguir los individuos
ción propaga solo se preocupa de dar las que llevan mensajes de los que no; por ejemplo, rojo para los que llevan
condiciones para detenerlo. Ten en cuen- mensaje y azul para los que no.
ta también que hemos decidido en este
caso hacer una simulación que evolucio- Siguiendo las indicaciones anteriores, vamos a crear un control de
na con pasos sincronizados, por lo que tipo slider (con valores entre 1 y 100) para introducir la población de
hay que cambiar el modo de ejecución
en el interfaz.
individuos y dos botones, uno para cada uno de los procedimientos.
Además, añadimos un plot que muestre la evolución del proceso de
22
Observa la forma que sale en la gráfica, propagación del mensaje21 .
porque es muy característica de este tipo
El interfaz presenta un aspecto como el que se muestra a continua-
de procesos.
ción22 :

En la figura siguiente se muestran los datos necesarios para el con-


trol plot:
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 115

Y el código responsable de que todo funcione es:


 
t o prepara −mundo
ca
c r t Poblacion [
s e t shape " person "
s e t c o l o r blue
s e t x y random−pxcor random−pycor ]
ask one−o f t u r t l e s [ s e t c o l o r red ]
r e s e t −t i c k s
end

t o propaga
i f not any ? t u r t l e s with [ c o l o r = blue ] [ st o p ]
ask t u r t l e s [ move−t o one−o f neighbors ]
ask t u r t l e s with [ c o l o r = red ] [
ask o t h e r t u r t l e s −here with [ c o l o r = blue ] [
s e t c o l o r red ] ]
tick
end
 

Actividad: Introduce modificaciones en el modelo anterior para


cambiar el radio de acción de los mensajeros y el tipo de movimiento
de los agentes, y compara el efecto que se produce en la velocidad
de propagación del mensaje.

El juego de la vida
El juego de la vida es un juego de cero jugadores sin aleatoriedad, lo que
quiere decir que su evolución está determinada por el estado inicial y
no necesita ninguna interacción posterior.
El tablero de juego es una malla formada por cuadrados (células) que
se extiende por el infinito en todas las direcciones23 . Las células tienen 23
Nosotros consideraremos una variante
dos posibles estados: vivas o muertas (o encendidas/apagadas). El estado con un mundo finito, pero no limitado.

de la malla evoluciona a lo largo de unidades de tiempo discretas (se


podría decir que por turnos). El estado de todas las células se tiene en 24
Es decir, es un procedimiento parale-
lo real: todas las células se actualizan si-
cuenta para calcular el que tendrán en el turno siguiente24 .
multáneamente.
jhon.sn@live.com 14 Jun 2017

116 netlogo

Las transiciones dependen del número de células vecinas vivas (se


considerarán las 8 células vecinas de cada célula):

Una célula muerta con exactamente 3 células vecinas vivas nace (al
turno siguiente estará viva).

Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro
caso muere o permanece muerta (por soledad o superpoblación).

Para modelar este comportamiento en NetLogo nos encontramos


con un problema: cada célula cambia en función de la situación de sus
vecinas (y de ella misma) de forma simultánea, todas a la vez, pero sa-
bemos que NetLogo no es capaz de realizar un proceso paralelo real,
sino que la ejecución de las acciones de cada célula se hace siguiendo
un orden secuencial, una cada vez. Si no tuviéramos en cuenta este
hecho podría ocurrir que el orden en el que se actualizan las células
determinase el resultado final del proceso, ya que las primeras células
25
Como no hay movimiento de agen- que cambien su estado aparecerán distintas a los ojos de sus vecinas
tes y queremos la representación más
que se ejecutan más tarde. Para poder simular el paralelismo de la
simple posible, trabajaremos únicamen-
te con los patches. ejecución de todas las células tendremos que idear algún método si-
guiendo un proceso secuencial.
Lo que haremos será introducir una propiedad para cada célula25
que indique si en el siguiente paso debe estar viva o no:

1. Cada célula almacena su estado en el color. Blanco si está viva y


negro si no.

2. Cada célula decide si debe vivir o no en el siguiente paso, mirando


para ello el estado actual del resto de células (pero ninguna modifica
su estado actual), y almacena el estado futuro en una variable que
llamaremos sc.

3. Cuando todas las células hayan acabado el paso anterior, cada cé-
lula actualiza su estado actual (color) usando la información que
hayan almacenado en sc.

Aunque puede hacerse más eficiente y conciso, el algoritmo de deci-


sión que escribiremos para las células es exactamente el que determina
el juego. Partimos de un procedimiento de inicio que sitúa al azar cé-
lulas vivas en el mundo, siguiendo una densidad inicial determinada
por el usuario. El interfaz se muestra en la figura 7.13.
Los procedimientos que tenemos son:
 
patches −own [ s c ]
t o setup
Figura 7.13: Interfaz del Juego de la vi- c l e a r −a l l
da.
ask p a t c h e s [
i f random 100 < densidad − i n i c i a l [ s e t p c o l o r white ]
s e t sc black ]
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 117

r e s e t −t i c k s
end
t o go
ask p a t c h e s [
l e t vec−v i v o s count neighbors with [ p c o l o r = white ]
i f e l s e pcolor = black
[ i f vec−v i v o s = 3 [ s e t s c white ] ]
[ i f vec−v i v o s = 2 or vec−v i v o s = 3 [ s e t s c white ] ] ]
ask p a t c h e s [
set pcolor sc
s e t sc black ]
tick
end
 

Actividad: Intenta encontrar patrones que tengan comportamien-


tos interesantes en la evolución del juego e investiga un poco acerca
de la importancia de este modelo en áreas como la de Vida artificial.

Juego del más fuerte


Como ejemplo de uso de los métodos de referencia que hemos visto
en este capítulo vamos a plantear un juego de enfrentamientos similar
a los que encontramos en algunos juegos de rol.
Supongamos que tenemos una familia de agentes que tienen una
variable que indica su fuerza. Aleatoriamente, los agentes se mueven
por el mundo y, cuando dos de ellos se encuentran26 , se enfrentan de 26
Entenderemos que se encuentran si es-
forma que cada uno genere un número aleatorio proporcional a su tán a distancia menor que 1.

fuerza. En el enfrentamiento, el que obtenga el menor número muere.


Gana el último que quede.
Primero mostraremos la solución y después explicaremos las carac-
terísticas principales que la hacen interesante:
 
t u r t l e s −own [ f u e r z a ha−jugado ? muerta ? ]
t o setup
ca
c r t num−j u g a d o r e s [
s e t x y random−pxcor random−pycor
s e t f u e r z a random 100
Vamos a hacer una serie de suposiciones
s e t ha−jugado ? f a l s e que no afectan al juego, pero que ayuda-
s e t muerta ? f a l s e rán a definirlo: la fuerza de cada agen-
set l a b e l fuerza te será un valor entero aleatorio entre 0
s e t s i z e 1 + 2 * f u e r z a / 100 y 100; asignaremos a cada agente un ta-
maño proporcional a su fuerza; y en ca-
s e t shape " person " ]
da turno, un agente sólo podrá jugar una
r e s e t −t i c k s vez.
end
t o juego
i f ( count t u r t l e s = 1 ) [ s to p ]
ask t u r t l e s [
jhon.sn@live.com 14 Jun 2017

118 netlogo

move−t o one−o f neighbors


s e t ha−jugado ? f a l s e ]
ask t u r t l e s with [ any ? o t h e r t u r t l e s in −r a d i u s 1 ] [
s e t ha−jugado ? t r u e
l e t en o t h e r t u r t l e s in −r a d i u s 1 with [ not ha−jugado ? ]
i f any ? en [
ask one−o f en [
s e t ha−jugado ? t r u e
i f e l s e ( random f u e r z a < random [ f u e r z a ] o f myself )
[ s e t muerta ? t r u e ]
[ ask myself [ s e t muerta ? t r u e ] ] ] ] ]
ask t u r t l e s with [ muerta ? ] [ d i e ]
tick
end
 
Primero aclaremos el significado y utilidad de cada propiedad aña-
dida a las tortugas:

fuerza: almacena la fuerza que tiene cada tortuga; se asigna en el


momento de nacer.

ha-jugado?: como hemos impuesto que cada tortuga solo juegue


con un contrincante en cada turno, esta propiedad indica si la tor-
tuga ya ha jugado en este turno o no.
27
Debido a que no podemos eliminar la muerta?: indica si tras un combate la tortuga ha muerto27 .
tortuga directamente tras haber perdido
un combate (porque está dentro de un El procedimiento setup no presenta diferencias interesantes respec-
bucle de ejecución que podría llamar-
to a otros que hemos visto anteriormente, así que solo indicamos aquí
la más adelante y entonces se provoca-
ría un error), marcamos las que han ido la necesidad de iniciar los valores de las propiedades booleanas de for-
muriendo en los enfrentamientos y, so- ma adecuada para que el juego comience correctamente. La variable
lo cuando todos los enfrentamientos han
terminado, las eliminamos del mundo. num-jugadores es una variable global definida por un control slider
en el interfaz (figura 7.14).
El procedimiento juego es el que contiene toda la lógica del modelo:

Como será ejecutado por un botón forever solo nos preocupamos


de un paso de ejecución; y ponemos como condición de parada
que lleguemos a la situación de tener un solo jugador (que será el
ganador del torneo).

Separamos por una parte el bloque de movimiento y por otra el


bloque de enfrentamientos.

Para los enfrentamientos sólo se consideran las tortugas que tengan


posibles contrincantes (que calculamos en la variable en).
Figura 7.14: Interfaz del Juego del más
fuerte. Se debe tener en cuenta la restricción de que cada tortuga sólo hace
28
Por tanto, hemos de controlar para ca- un combate (como mucho) en un turno28 .
da tortuga qué contrincantes han jugado
ya o no, y si hay algunos que no hayan Se ha elegido realizar el enfrentamiento por medio de una peti-
jugado, se selecciona uno de ellos al azar
y se realiza el enfrentamiento.
ción de una tortuga sobre otra, de forma que en la ejecución de la
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 119

segunda tortuga hemos de hacer uso de myself para acudir a las


propiedades de la tortuga accionadora.

La tortuga que pierda en cada enfrentamiento se marca como muer-


ta por medio de la propiedad muerta?, y tras realizar todos los com-
bates del turno se eliminan las tortugas que estén marcadas.

Actividad: Añade un gráfico mostrando el número de jugadores


vivo en cada momento y modifica el radio de acción de los juga-
dores para ver cómo afecta a la evolución de la partida. Además,
puedes introducir algo parecido a estrategias entre los jugadores o
aprendizaje de habilidades que les permitan ganar en condiciones
menos favorables; por ejemplo, si un jugador gana a otro de fuerza
superior, recibe puntos extra en su fuerza.

Intersección de segmentos
Vamos a analizar a continuación uno de los ejemplos que trae la bi-
blioteca de NetLogo y que muestra cómo calcular intersecciones entre
segmentos. El modelo muestra segmentos que se mueven y calcula en
tiempo real los puntos de corte (figura 7.15).
Además de las funciones asociadas al cálculo algebraico de los cor-
tes29 resulta interesante el código que hace uso de propiedades de 29
Como el reporte intersection, que no
agentes para facilitar la tarea y que reproducimos a continuación: mostramos aquí porque usa métodos ha-
  bituales.
breed [ segments segment ]
breed [ markers marker ]

t o setup
c l e a r −a l l
s e t −d e f a u l t −shape markers " c i r c l e "
s e t −d e f a u l t −shape segments " l i n e "
c r e a t e −segments 9 [
s e t x y ( random−xcor / 2 ) ( random−ycor / 2 )
s e t s i z e 10 + random 5 ]
place −markers
r e s e t −t i c k s
end

t o go
ask segments [ r t 0 . 1 + who / 30 ]
place −markers
tick
end Figura 7.15: Interfaz del modelo de In-
tersección de segmentos.
t o place −markers
ask markers [ d i e ]
ask segments [
jhon.sn@live.com 14 Jun 2017

120 netlogo

ask segments with [ s e l f > myself ] [


l e t r e s u l t i n t e r s e c t i o n s e l f myself
i f not empty ? r e s u l t [
hatch −markers 1 [
s e t c o l o r gray
set size 1
setxy ( f i r s t r e s u l t ) ( l a s t r e s u l t ) ] ] ] ]
end
 
Analicemos con detenimiento el código para aprender de él:

Esencialmente, consta de: el procedimiento de creación de objetos


30
Los markers tendrán forma circular y
se calculan en función de los segmentos,
(setup), el que se encarga de animarlos (go), y el que sitúa los pun-
que son agentes situados puntualmente tos de corte para hacerlos visibles (place-markers).
en el centro del segmento que represen-
tan, y se les da una forma lineal con la Se generan dos tipos de tortugas, una para los segmentos (segments)
longitud adecuada. A partir del punto
central, el tamaño y la orientación, tene- y otra para los puntos de corte (markers)30 .
mos perfectamente determinado el seg-
mento completo. Estos tres datos vienen El procedimiento place-markers se encarga de calcular los cortes
definidos entre las propiedades básicas entre todos los pares de segmentos (por medio del reporte intersection)
de las tortugas.
y crear los markers para indicar dónde están31 .
31
Realiza un ask principal sobre los seg- El interés de este ejemplo radica en:
mentos para comparar cada uno de ellos
con el resto; con el fin de evitar hacer
estas comparaciones 2 veces restringe la
1. El uso de razas para identificar los objetos que intervienen (seg-
segunda llamada a aquellos que tienen mentos y puntos de corte).
un identificador estrictamente mayor. Si
se cortan (si el resultado de la intersec- 2. El uso de dos ask encadenados, con restricciones en el segundo,
ción no es vacío) el segundo segmento se
encarga de generar un marker y lo sitúa para asegurar que se recorren todas las combinaciones pero una
en el lugar del corte. sola vez.

3. El uso de self y myself para identificar los segmentos que inter-


vienen en la comprobación del corte.

4. La creación de individuos nuevos (de tipo marker) cuando es nece-


32
Como el número de markers depende sario representar un objeto nuevo del mundo32 .
de la posición relativa de los segmentos,
no siempre es el mismo, por lo tanto se
decide eliminar los markers en cada ite- Ejercicios
ración y crear uno nuevo cada vez que se
encuentra un punto de corte entre seg-
mentos. 1. Haz un procedimiento que reciba como dato de entrada un número,
N (que debe ser menor que el número de patches del mundo), y
33
Observa que puedes intentar hacer es- haga que en N patches distintos aparezcan tortugas33 .
te procedimiento de varias formas, haz
al menos una que haga uso de sprout y 2. Supervivencia:
otra que no.

a) Crea 3 tortugas de color rosa (fértiles) dispuestas sobre la cir-


cunferencia de centro el origen y radio 3 (botón setup). Cada
tortuga tiene un valor asignado al azar, entre 40 y 60, que será el
número de años (pasos) que va a vivir.
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 121

b) Las tortugas deben moverse de forma aleatoria por el mundo


(procedimiento deambula). A cada paso con probabilidad igual a
q = 1/5, cada tortuga generará un descendiente (procedimiento
reproduce). Las nuevas tortugas, con probabilidad p serán fér-
tiles, y con probabilidad 1 − p serán estériles (color azul). Ca-
da paso de tiempo equivale a un año de vida (procedimiento
envejece).

c) Añade botones al interfaz para llamar a los procedimientos y


sliders para introducir los parámetros globales q y p. Haz un
plot que muestre el número de tortugas en cada paso. Ejecuta el
modelo para diferentes valores de q y p.
d) Introduce controles para estabilizar la población: si el número de
habitantes sobrepasa una cierta cantidad, añade un factor extra
de mortalidad; si el número es muy pequeño, añade un factor
extra de natalidad.

3. Haz un procedimiento muy simple de alimentación de herbívoros:

a) El mundo no tendrá limitaciones y su evolución será por pasos


discretos.
b) Por medio de un slider determinaremos el porcentaje de patches
que tendrán hierba, y otro slider indicará cuántas ovejas hay ini-
cialmente distribuidas por el mundo (puedes ponerles una de las
forma de oveja que encontrarás entre las formas predefinidas de
la biblioteca).
c) Cada oveja tendrá una propiedad que indique su energía y otra
que indique su edad (ambas pueden ir entre 0 y 100). En el mo-
mento de nacer, cada oveja tiene valores aleatorios para estas pro-
piedades.
d) En cada paso las ovejas envejecen una cierta cantidad de tiem-
po y se mueven aleatoriamente por el mundo buscando comida;
además, un porcentaje nuevo de patches se vuelven comestibles.
Cada oveja consume la hierba que hay en su patch y la acaba.
e) Una oveja puede reproducirse si energía > 70 y edad > 2034 . 34
Consideraremos reproducción ase-
xual.
f ) En el movimiento en busca de comida las ovejas gastan una cierta
cantidad de energía, llamada metabolismo35 , y si come energía 35
Puedes decidirla de antemano o poner
recupera otra cierta cantidad. un slider para que el usuario decida qué
cantidad de energía gasta.
g) Una oveja que se queda sin energía muere; y también cuando
supera las 100 unidades de edad.
h) Cuando tengas todo definido, intenta encontrar parámetros para
los que se mantenga un equilibrio; es decir, que el número de
ovejas en el mundo permanezca entre márgenes aceptables.
jhon.sn@live.com 14 Jun 2017

122 netlogo

i) Añade un plot en el que se muestre, por medio de dos lápices,


la cantidad de patches con hierba y el número de ovejas en cada
unidad de tiempo.
36
Observa que para dibujar una espi- 4. Por medio de instrucciones de la familia patch-at, escribe de nue-
ral cuadrada, la tortuga puede seguir un
vo el procedimiento que permite a una tortuga dibujar una espiral
procedimiento muy simple: si no ha es-
tado en el patch que hay a su izquierda cuadrada36 . Recuerda que la tortuga debe marcar de alguna forma
que gire en esa dirección y se sitúe sobre los patches por los que va pasando y tener el lápiz bajado para que
él; en caso contrario, debe avanzar recto.
su rastro dibuje la espiral.

5. Ahora estás en condiciones de comprender completamente el códi-


go del modelo Flocking que puedes encontrar en la Biblioteca de
Modelos:

a) Ábrelo e intenta diferenciar los 3 comportamientos básicos que


rigen el comportamiento global del grupo de aves.
b) Introduce una raza de halcones, de forma que se vayan movien-
37
Puedes hacer que dependa de los pa- do de forma libre por el mundo37 .
rámetros que quieras: velocidad, capaci-
dad de giro, etc. c) Añade un comportamiento simple de alejamiento en las aves.
d) Añade la capacidad de caza para los halcones, de forma que
persigan a las piezas más cercanas; si las alcanzan, éstas desapa-
recen.
e) Añade un plot que muestre el número de aves en todo momento,
y analiza la evolución de la curva resultante en función de los
parámetros del modelo. ¿Puedes extraer alguna conclusión?

6. Crea un report que reciba como dato de entrada un conjunto de


agentes y devuelva una tortuga situada en el centro de masa del
conjunto original.

7. En este ejercicio vamos a generar tortugas escaladoras (figura 7.16).


Para ello:

a) Añade una propiedad altura en los patches y asigna a cada uno


Figura 7.16: Tortugas escaladoras.
de ellos un valor aleatorio entre 0 y 200.
38
La instrucción (diffuse prop porc) b) Ejecuta la instrucción (diffuse altura 0.3) 5 veces38 . ¿Qué re-
actúa sobre todos los patches y su resul- sultado tiene esta operación en el mundo?, ¿qué efecto produce
tado es: cada patch toma la proporción
proc de su propiedad prop y la distri- repetirla más o menos veces?
buye uniformemente entre sus vecinos.
De esta forma, cada uno se queda con c) Asocia a cada patch una gama de gris proporcional a su valor
(1-porc)*prop más la cantidad que ha- de altura, de forma que podamos reconocer como en un mapa
ya recibido de sus vecinos, porque todos
las alturas de los patches (este procedimiento lo hemos hecho en
han hecho la misma operación.
ejercicios anteriores).
39
Puedes hacer que dependa de un con- d) Genera la cantidad que desees de tortugas39 y distribúyelas alea-
trol para el usuario. toriamente en el mundo.
jhon.sn@live.com 14 Jun 2017

descubriendo la potencia de netlogo: los conjuntos de agentes 123

e) Haz un procedimiento que, en cada paso, permita que cada tor-


tuga se desplace al patch de su alrededor que tiene más altura.
Si está en el más alto de su vecindad, no se moverá. Repite el
procedimiento hasta que no haya tortugas moviéndose.
f ) Si has puesto los colores de los patches adecuadamente, podrás
observar cómo las tortugas escalan el mundo40 . 40
Baja el lápiz de las tortugas para que
marquen el camino que han seguido en
su desplazamiento.
8. Crea un procedimiento, llamado mueve-sin-chocar, que, suponien-
do que una tortuga se encuentra sobre un patch de un color, le per-
mita moverse por el mundo, pero solo pasando sobre patches del
mismo color. El movimiento ha de producirse de la siguiente for-
ma:

a) En cada paso, la tortuga avanza un unidad (pequeña, por ejem-


plo, .01) si a esa distancia no hay un patch de otro color.
b) Si en esa distancia hubiera un cambio de color, la tortuga gira
una cantidad aleatoria de grados e intenta moverse.

9. Haciendo uso de reportes como in-radius o in-cone, genera un


procedimiento que permita a las tortugas desplazarse por el mundo
sin chocarse entre sí41 . Si no lo has hecho, intenta hacer pri-
41

mero el ejercicio anterior.


10. Modelo de segregación racial de Schelling:

a) Abre el modelo Segregation de la Biblioteca de Modelos y mira


cómo funciona, intentando entender cada uno de los parámetros
que intervienen y la forma en que están definidos sus procedi-
mientos. Lee también la pestaña de información para conocer un
poco del origen de este modelo (figura 7.17).
b) Modifica el modelo para que el salto que pueden dar los agentes
en la búsqueda de una nueva localización venga determinado
Figura 7.17: Modelo de Schelling, inspi-
por el usuario por medio de un control. ¿Puedes observar alguna rado en un trabajo de Thomas Schelling
correlación entre el comportamiento del modelo y dicho salto? de 1971, Dynamic Models of Segregation.

c) Modifica el modelo para que puedan intervenir más de dos razas


de agentes.
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

8
Uso avanzado de listas

En este capítulo volvemos a centrarnos en algunas cuestiones de


programación general que profundizan en conceptos tocados en capí-
tulos anteriores. En concreto, veremos algunos usos de las listas como
estructuras de datos válidas para la recursión, y su relación con los
conjuntos de agentes y sus propiedades.

Recursión en listas

Ya vimos el concepto de recursión aplicado a procedimientos en los


que el parámetro que nos permite controlar las llamadas recursivas
era numérico1 . Pero existe una forma más general de recursión en la 1
Por ejemplo, para calcular la función fac-
que solo necesitamos una estructura de datos (no necesariamente nu- torial.

mérica) construida a partir de unos elementos básicos (casos base) y


operaciones para obtener estructuras más complejas a partir de estruc-
turas ya construidas2 . En este apartado vamos a presentar la recursión 2
Observa que los números naturales
utilizando las listas como estructura fundamental. cumplen esta condición: tenemos una
forma básica (el 0) y una forma de ir
Las listas nos proporcionan las condiciones adecuadas: disponemos construyendo nuevos números a partir
de un caso base (la lista vacía, []) y de formas de descomponer las listas de números ya construidos (por ejemplo,
la operación (x + 1), pero podrían servir
en partes más sencillas, ya sea quedándonos con su primer elemento y otros constructores).
el resto, first y but-first, o bien con su último elemento y el resto,
last y but-last. Por supuesto, no siempre tiene que ser así; se trata
de una primera aproximación a nuestro objetivo.
Para entender cómo funciona el caso general comenzaremos por
crear un caso sencillo de reporte que se puede definir haciendo uso de
esta idea: la longitud de una lista.
 
to −r e p o r t l o n g i t u d [ l i s t a ]
i f e l s e empty ? l i s t a
[ report 0 ]
[ report 1 + longitud ( bf l i s t a ) ]
end
 
Una vez definido el reporte anterior, podemos usarlo para calcular 3
Sólo por motivos didácticos, puesto
que NetLogo dispone de una primitiva,
la longitud de una lista cualquiera3 :
length, que calcula la misma función.
jhon.sn@live.com 14 Jun 2017

126 netlogo

 
observer > l o n g i t u d [ 1 2 3 ]
observer : 3
 
El proceso recursivo que sigue para obtener el resultado es:
long [1 2 3] = 1 + long [2 3] = 1 + (1 + long [3]) =
= 1 + (1 + (1 + long []))
= 1 + (1 + (1 + 0)) = 3
Esencialmente, se reduce a ir contando los elementos que tiene la
lista, pero en vez de hacerlo directamente, lo hacemos utilizando la
4
La recursión sobre listas aprovecha esta forma constructiva en que se puede definir una lista4 :
definición constructiva para ir descompo-
niéndolas hasta el caso base. La lista vacía, [], es una lista.

Si algo es una lista, poniendo un elemento delante obtengo otra


lista.

Vamos a definir la suma de una lista de números siguiendo una


idea similar:
 
to −r e p o r t suma [ l i s t a ]
i f e l s e empty ? l i s t a
[ report 0 ]
[ r e p o r t ( f i r s t l i s t a ) + suma ( b f l i s t a ) ]
end
 
Y su uso sobre listas numéricas:
 
observer > suma [ 1 2 3 4 ]
o b s e r v e r : 10
 
A partir de ahora vamos a construir, sin emplear nada más que la
recursión, procedimientos más complejos y generales.
Empezaremos con un procedimiento que, dados un número y una
lista de números, inserta el número delante del primer elemento de la
lista que sea mayor o igual que él:
 
to −r e p o r t i n s e r t a [ elemento l i s t a ]
i f e l s e empty ? l i s t a
[ r e p o r t ( l i s t elemento ) ]
[ i f e l s e ( elemento <= f i r s t l i s t a )
[ r e p o r t s e n t e n c e elemento l i s t a ]
[ report sentence ( f i r s t l i s t a )
( i n s e r t a elemento ( b f l i s t a ) ) ] ]
end
 
Una demostración de su uso sería:
 
observer > i n s e r t a 3 [ 1 2 4 ]
observer : [1 2 3 4]
 
jhon.sn@live.com 14 Jun 2017

uso avanzado de listas 127

Haciendo uso del procedimiento anterior en el caso particular en


que el segundo elemento sea una lista ordenada, podemos dar un re-
porte de ordenación de listas:
 
to −r e p o r t ordena [ l i s t a ]
i f e l s e empty ? l i s t a
[ report l i s t a ]
[ report inserta ( f i r s t l i s t a ) ( ordena ( b f l i s t a ) ) ]
end
 
 
observer > ordena [ 7 3 6 5 2 1 ]
observer : [1 2 3 5 6 7]
 

Actividad: Aunque NetLogo tenga primitivas para ello, intenta


definir por recursión sobre listas procedimientos que inviertan una
lista y concatenen dos listas.

Vamos a ir descubriendo otras posibilidades de las listas; pero antes,


veamos un reporte que viene con NetLogo y que nos será muy útil.

Filtrado de listas

Si cuando trabajamos con agentes disponemos del comando with,


que nos permite filtrar los aquellos que verifican cierta condición, con-
tamos al trabajar con listas con un sistema de filtrado que extrae de
una lista los elementos que verifican la condición elegida.
El comando en cuestión es filter:
filter [ reporte-filtro ] lista
Devuelve los elementos de lista que verifican el reporte; debe ser un
reporte que devuelva true/false, es decir, una condición o predicado.
El reporte que se proporciona como condición debe usar ? como dato
de entrada5 . Por ejemplo: 5
Será la variable que se irá sustituyendo
  por cada valor de lista para saber si veri-
observer > f i l t e r [ ? > 0 ] [ 1 2 3 −1 −2 0 − 3] fica el filtro. Su uso ya lo hemos visto en
observer : [1 2 3] situaciones similares y nos volveremos a
  encontrar con él en repetidas ocasiones.
Vamos a utilizar filter junto con la recursión para proporcionar un
sistema de ordenación rápida6 . Funciona de la siguiente forma: se elige 6
Este algoritmo de ordenación se conoce
un elemento de la lista, al que llamaremos pivote; los demás elementos habitualmente como quicksort. Fue crea-
do por C.A. Hoare basándose en la téc-
de la lista se sitúan a cada lado del pivote, de manera que a un lado nica de divide y vencerás.
queden todos los menores que él, y al otro los mayores; se repite este
proceso para cada una de estas sublistas mientras se pueda. Observa
la facilidad con que se escribe este procedimiento usando recursión:
 
to −r e p o r t ordena−rapido [ l i s t a ]
i f e l s e empty ? l i s t a
[ report l i s t a ]
jhon.sn@live.com 14 Jun 2017

128 netlogo

[ let x ( first lista )


l e t menores f i l t e r [ ? < x ] l i s t a
l e t mayores f i l t e r [ ? > x ] l i s t a
r e p o r t ( s e n t e n c e ( ordena−rapido menores )
x
( ordena−rapido mayores ) ) ]
end
 

Sistemas de ordenación en listas

Por supuesto, NetLogo tiene primitivas para ordenar listas de forma


automática: sort y sort-by.
Al usar sort se aplica el orden natural entre los elementos de la
7
Este reporte aplica el comparador < pa- lista7 . Si se aplica a listas heterogéneas, es decir, que tienen valores
ra saber qué orden aplicar a los elemen- de distinto tipo y que por lo tanto no se pueden ordenar bajo el mis-
tos. Funciona sobre valores numéricos y
sobre cadenas. mo criterio comparador, el sistema automáticamente se queda con los
valores numéricos y devuelve la ordenación de estos:
 
observer > s o r t n−v a l u e s 10 [ random 1 0 0 ]
observer : [ 1 2 26 37 54 60 79 85 85 89 9 0 ]
observer > sort [" b" "a "]
observer : [" a" "b "]
observer > sort [0 " a " 4 "b " ]
observer : [0 4]
 
Si se desea obtener un orden siguiendo otro criterio, se puede usar
el comando sort-by que, además de la lista sobre la que se aplica, debe
8
En consecuencia, este reporte debe es- recibir un reporte booleano que defina el orden entre los elementos8 .
tar preparado para recibir dos datos de Por ejemplo:
entrada  
observer > s o r t −by [ abs ?1 < abs ? 2 ]
[ n−v a l u e s 10 [ random 20 − 1 0 ]
o b s e r v e r : [ − 1 −2 3 −5 7 −8 8 −9 −10 − 10]
 
jhon.sn@live.com 14 Jun 2017

uso avanzado de listas 129

Es interesante saber cómo funcionan estos reportes, que hacen uso


de las variables reservadas ?1 y ?2. Lo que hace NetLogo para reorde-
nar los elementos de la lista es aplicar un algoritmo similar al quick-
sort que vimos anteriormente y utilizar la expresión que pasamos a
sort-by (abs ?1 < abs ?2, en el ejemplo) para decidir qué elementos
son menores que otros9 . 9
Teniendo en cuenta que si dos elemen-
También podemos desordenar aleatoriamente una lista: tos, a y b, verifican la condición cuando
  ?1 = a y ?2 = b, entonces a se pondrá an-
observer > s h u f f l e [ 0 1 2 3 4 ] tes que b. Si dos elementos tienen el mis-
mo valor en el reporte, es posible que en
observer : [3 2 4 1 0]
  distintas ejecuciones salgan con posicio-
nes intercambiadas en la lista resultante.

Iteraciones sobre listas

Además de la recursión explícita que hemos visto, NetLogo propor-


ciona algunas estructuras de iteración que permiten realizar operacio-
nes comunes sin necesidad de programar estructuras recursivas para
cada uno de los casos. Las dos estructuras que permiten iterar sobre
listas son: foreach y map. La elección de una u otra dependerá de si
queremos realizar acciones o aplicar reportes.

foreach se usa para ejecutar un bloque de comandos sobre cada


elemento de la lista. Su comportamiento es similar a ask, pero con
la diferencia de que se aplica sobre elementos de listas genéricas y
se respeta el orden que los elementos siguen en la lista. Su formato
básico es:
foreach lista [ bloque acciones (?) ]

Así, foreach [1 2 3] [ show ? ], devolverá en el Centro de Co-


mandos los valores 1, 2 y 310 . 10
Como hemos visto ya en otras ocasio-
nes, el símbolo ? representa al elemento
Además de esta versión básica, foreach admite una versión amplia- de la lista que está ejecutando el bloque.
da que posibilita recorrer varias listas simultáneamente 11 de forma 11
Con la única restricción de que todas
que, en cada iteración, vaya tomando por orden un elemento de ca- deben ser de igual longitud.

da lista y ejecutando el bloque de acciones sobre él. Para diferenciar


los elementos de las distintas listas, se representa por ?i al elemento
correspondiente de la lista i-ésima se. En este caso, debe tenerse la
precaución de incluir entre paréntess toda la expresión:
(foreach lista1 ... listaN [ bloque acciones (?1 ... ?N)])

Por ejemplo: (foreach [1 2 3] [4 5 6] [ show ?1 + ?2]), mos-


trará los valores 5, 7 y 9.

La estructura map es similar a foreach, pero funciona como un re-


porte que aplica una determinada función a cada elemento de la
lista, y devuelve la lista resultante:
map [reporte] lista

Formalmente: map[ f ][ a1 · · · a N ] = [ f ( a1 ) · · · f ( a N )]
jhon.sn@live.com 14 Jun 2017

130 netlogo

Por ejemplo: map [2 * ?] [1 2 3] devuelve [2 4 6].


Al igual que con foreach, map puede aplicarse sobre varias listas
simultáneamente, y en este caso:
(map[f(?1...?N)][a11...a1M] ... [aN1...aNM])=

=[f(a11...aN1) ... f(a1M...aNM)]

Por ejemplo: (map [?1 + ?2] [1 2 3] [4 5 6]) = [5 7 9].


La instrucción n-values, que ya vimos anteriormente se puede con-
seguir por medio de map: n-values N [f(?)] = map [f(?)] [0 ...
N-1].
12
Desde la versión 5 de NetLogo, en la
que se introducen las tasks (y que ve-
Existe otra estructura que trabaja de manera iterada sobre listas,
remos más adelante), se ha extendido la
funcionalidad de algunos de los coman- aunque su comportamiento es ligeramente distinto. Se trata de reduce,
dos que trabajan sobre reportes, entre que reduce una lista de izquierda a derecha usando el reporte/task de
ellos map, de forma que ahora se pueden
poner tasks o reportes sin necesidad de manera iterada hasta dejarla en un valor simple12 . Por ejemplo:
hacer uso de la definición por medio de
reduce + [1 2 3 4 ] = reduce + [ ( 1 + 2 ) 3 4 ] =
las variables ?, por lo que se puede es-
cribir: (map + [1 2 3] [4 5 6]). = reduce + [ 3 3 4 ] = reduce + [ ( 3 + 3 ) 4 ] =
= reduce + [ 6 4 ] = reduce + [ ( 6 + 4 ) ] =
= reduce + [ 1 0 ] = 10
13
Si se intenta aplicar reduce sobre la lis- En general, la definición recursiva es13 :
ta vacía se obtiene un error.
reduce f [ a ] = a
reduce f [ a l i s t a ] = reduce f [ f ( a , f i r s t l i s t a ) ( bf l i s t a ) ]

Por ejemplo, la forma de evaluar un polinomio en un punto a partir


de sus coeficientes sería:
 
to −r e p o r t evalua −p o l i n i o m i o [ c o e f i c i e n t e s x ]
r e p o r t reduce [ ( x * ? 1 ) + ? 2 ] c o e f i c i e n t e s
end
; ; e v a l u a r 3x^2 + 2x + 1 en x = 4
show evalua −polinomio [ 3 2 1 ] 4 => 57
 

Actividad: Haciendo uso de map, dar un procedimiento que reciba


dos listas del mismo tamaño y devuelva la lista de pares. Por
ejemplo: zip [1 2 3] [4 5 6] = [[1 4] [2 5] [3 6]]

Conjuntos de agentes y listas

Como ya hemos indicado, los conjuntos de agentes no tienen nin-


gún orden establecido, sino que son bolsas desordenadas de agentes y,
cada vez que ejecutamos acciones sobre ellos, toman un orden distinto.
Si necesitamos un orden específico en un conjunto de agentes po-
demos aplicar los comandos de ordenación de listas que vimos sobre
él, obteniendo como resultado una lista de sus agentes en el orden
pedido:
jhon.sn@live.com 14 Jun 2017

uso avanzado de listas 131

Al aplicar la instrucción sort los agentes del conjunto se ordenan


ascendentemente según su identificador (el que corresponda a cada ti-
po de agente). Observa su comportamiento cuando se aplica a tortugas
o a patches14 : 14
En el caso de los patches, el orden ha-
bitual es de izquierda a derecha y de
  arriba a abajo.
observer > c r t 4
observer > s o r t t u r t l e s
observer : [ ( t u r t l e 0) ( t u r t l e 1) ( t u r t l e 2) ( t u r t l e 3 ) ]
observer > show s o r t p a t c h e s
o b s e r v e r : [ ( patch −2 2 ) ( patch −1 2 ) ( patch 0 2 )
( patch 1 2 ) ( patch 2 2 ) ( patch −2 1 ) ( patch −1 1 )
( patch 0 1 ) ( patch 1 1 ) ( patch 2 1 ) ( patch −2 0 )
( patch −1 0 ) ( patch 0 0 ) ( patch 1 0 ) ( patch 2 0 )
( patch −2 − 1) ( patch −1 − 1) ( patch 0 − 1) ( patch 1 − 1)
( patch 2 − 1) ( patch −2 − 2) ( patch −1 − 2) ( patch 0 − 2)
( patch 1 − 2) ( patch 2 − 2)]
 

Si se desea aplicar otro criterio de ordenación podemos hacer uso


del comando sort-by que, al igual que en su aplicación sobre listas,
recibe el conjunto de agentes sobre el que se aplica y un reporte boo-
leano de dos entradas que indique el criterio para la ordenación de los
agentes. El siguiente ejemplo ordena las tortugas según tu tamaño en
orden creciente:
 
observer > c r t 4 [ s e t s i z e random 5 ]
observer > s o r t −by [ [ s i z e ] o f ?1 < [ s i z e ] o f ? 2 ] t u r t l e s
observer : [ ( t u r t l e 1) ( t u r t l e 0) ( t u r t l e 3) ( t u r t l e 2 ) ]
 

Conviene no olvidar que las listas de agentes no son conjuntos de


agentes, por lo que no pueden filtrarse por los mismos métodos ni se
pueden ejecutar sobre ellas instrucciones de tipo ask.
¿Cómo hacer entonces que, tras haber ordenado los agentes, eje-
cuten una acción siguiendo ese orden? Una posibilidad consiste en
recorrer de forma ordenada la lista de agentes y pedirles uno a uno
que ejecuten el bloque de acciones que tenemos para ellos. A partir
de las estructuras vistas en este capítulo podemos realizar esta tarea
como sigue:

f o r e a c h ( s o r t conjunto −de−a g e n t e s )
[
ask ? [ a c c i o n e s ]
]

Actividad: Por medio de foreach y shuffle, escribe un procedi-


miento que simule el comportamiento de ask.
jhon.sn@live.com 14 Jun 2017

132 netlogo

Listas de propiedades de agentes

Podemos obtener listas de valores asociados a las propiedades de


los agentes. Ya habíamos visto que
[ propiedad-n ] of agente-k
devuelve el valor de propiedad-n del agente agente-k, lo que nos per-
mite acceder a sus características sin necesidad de acceder a él por
15
Salvo en el caso particular de los agen- medio de ask15 .
tes móviles, que pueden acceder a las Si en vez de indicar un agente concreto (el agente-k en el caso an-
propiedades del patch sobre el que están
directamente. terior) especificamos un conjunto de agentes, el sistema nos devolverá
una lista con todas las propiedades-n de todos los agentes del conjun-
16
Debe tenerse en cuenta que la lista de- to16 .
vuelta no sigue ningún orden, sino que Por ejemplo, [color] of turtles devolverá una lista con todos los
es absolutamente aleatorio, por lo que
cada vez que ejecutemos este comando colores usados por las tortugas presentes en el mundo. En la lista se
obtendremos listas que están formadas muestran las repeticiones en caso de que haya tortugas con el mismo
por los mismos elementos aunque for-
malmente sean listas distintas por tener color.
distintas ordenaciones. El formato admite una expresión más general: podemos dar cual-
quier reporte (que puedan ejecutar los agentes) y obtendremos la lista
de resultados del reporte aplicado a cada uno de los agentes del con-
17
Una vez hemos obtenido el resulta- junto, de nuevo, sin un orden preestablecido17 . Así, [patch-here] of
do en forma de lista podemos aplicarle turtles devuelve una lista con todos los patches sobre los que están
cualquiera de los procedimientos permi-
tidos sobre ellas. los agentes. La diferencia entre:
p a t c h e s with [ any ? t u r t l e s −here ]
[ patch −here ] o f t u r t l e s

es que mientras el primero devuelve el conjunto de los patches en los


que hay alguna tortuga, por lo que no puede haber repeticiones, el
segundo devuelve la lista de patches que tienen alguna tortuga e ellos,
pudiendo aparecer un mismo patch varias veces en la lista en caso de
que haya más de una tortuga sobre él.

Actividad: Suponiendo que tenemos una propiedad peso en los


patches, escribe un procedimiento, seleccion-con-pesos, que selec-
cione al azar uno de ellos, pero con una probabilidad proporcional
al peso que tengan, de forma que tengan más probabilidad de ser
seleccionados los patches con mayor peso.

Obteniendo información de agentes

Cuando se trabaja sobre un conjunto numeroso de agentes que evo-


luciona con el modelo, es habitual intentar conocer está distribuida
cierta información entre la población, no solo desde el punto de vista
geométrico (distribución física) sino también en cuanto a las propieda-
des que verifica.
jhon.sn@live.com 14 Jun 2017

uso avanzado de listas 133

El método visto en el epígrafe anterior consistente en pasar una


propiedad de un conjunto de agentes a una lista puede resultar in-
teresante para conocer algo más acerca de la población, pero, ¿cómo
analizar una lista como la que se obtiene por este procedimiento?
Si la propiedad es numérica la forma más sencilla de analizar su
distribución en la población de agentes es por medio de un histogra-
ma, un tipo especial de gráfica que mide cómo de frecuentes son los
valores que contiene una lista.
Supongamos que tenemos unas tortugas que, naciendo en el origen,
pueden moverse en cada paso en una dirección aleatoria18 ; la pregunta 18
A este tipo de movimiento se le llama
es, ¿cuánto puede alejarse la tortuga con este tipo de movimiento en, un movimiento browniano (en nuestro
caso, al ser discreto, suele recibir el nom-
por ejemplo, 100 pasos? Para responder podemos lanzar 1000 veces bre de camino aleatorio).
el experimento de crear una tortuga en el centro y moverla, o bien
podemos crear 1000 tortugas simulatáneamente y hacer que cada una
de ellas realice el experimento; a partir de la lista de distancias de las
tortugas al origen podemos extraer el comportamiento estadístico de
la tortuga. Si representamos el histograma de estas distancias quizás
podamos sacar algunas conclusiones:

Actividad: ¿Qué conclusión puedes extraer? Observa que también


hemos calculado en dos monitores la media y la desviación estándar
de la lista de distancias.

El código que permite ejecutar el experimento es el siguiente:


 
t o experimento
ca
c r t 1000
r e s e t −t i c k s
r e p e a t 1000 [
ask t u r t l e s [
r t random 360
fd . 1
s e t c o l o r s c a l e −c o l o r blue ( d i s t a n c e x y 0 0 ) 0 10]
tick ]
end
 
Para representar el histograma lo único que necesitamos es indicarle
jhon.sn@live.com 14 Jun 2017

134 netlogo

19
Recuerda que si quieres que aparezcan
las barras en el histograma necesitarás
al plot que lo aplique sobre la lista de propiedades en uno de sus
modificar las propiedades del lápiz aso-
ciado, así como el intervalo para que el lápices19 :
número de barras utilizado sea mayor.

Por supuesto, unos cálculos equivalentes se pueden aplicar a cual-


quier tipo de lista numérica, no necesariamente proveniente de las pro-
piedades de agentes.

Actividad: Realiza los histogramas de listas producidas aleatoria-


mente por medio de las primitivas pseudo-aleatorias de NetLogo.

Creando nuevas estructuras de datos

Desde el punto de vista matemático una lista se parece mucho a un


vector. ¿Cómo podríamos obtener a patrir de ellas algo similar a las
20
En el capítulo dedicado a extensiones matrices?20
veremos que NetLogo se puede ampliar Para construir y manipular matrices desde NetLogo usando listas
de forma que sea capaz de trabajar con
arrays (vectores) y matrices directamen- basta recordar que una lista puede contener como elemento otra lista,
te. ¿qué ocurriría si se construye una lista con listas del mismo tamaño?
[[1 2 3 4]
21
Realmente, se pueden crear matrices [5 6 7 8]
de cualquier tipo de dato o de tipos mez- [ 9 10 11 1 2 ] ]
clados.
La estructura que se obtiene es muy similar a una matriz matemáti-
ca. Vamos a dar ahora algunos procedimientos para crear y manipular
22
Observa que, habitualmente, las matri- matrices numéricas por este medio21 .
ces matemáticas tienen índices que co-
Los procedimientos que se muestran como ejemplo a continuación
mienzan en 1, mientras que NetLogo, co-
mo muchos otros lenguajes de progra- permiten imprimir matrices de una forma más elegante, recuperar y
mación, usa el 0 como primer índice. escribir el valor de uno de sus elementos por medio de sus coorde-
nadas, y crear la matriz identidad22 . En la figura 15.3 se muestra un
ejemplo de uso:
 
to −r e p o r t crea −m at r i z [ n m ]
r e p o r t n−v a l u e s n [ n−v a l u e s m [ 0 ] ]
end
t o muestra [m]
show "−−−−−−−−"
f o r e a c h m [ show ? ]
show "−−−−−−−−"

Figura 8.1: Ejecución de test.


jhon.sn@live.com 14 Jun 2017

uso avanzado de listas 135

end
to −r e p o r t elemento [ i j m]
l e t f i l a item ( i − 1 ) m
r e p o r t item ( j − 1 ) f i l a
end
to −r e p o r t pon−elemento [ i j m v a l ]
l e t f i item ( i − 1 ) m
s e t f i r e p l a c e −item ( j − 1 ) f i v a l
r e p o r t r e p l a c e −item ( i − 1 ) m f i
end
to −r e p o r t i d e n t i d a d [ n ]
l e t A crea −m at r i z n n
f o r e a c h n−v a l u e s n [ ? + 1 ] [ s e t A pon−elemento ? ? A 1 ]
report A
end
to t e s t
show " Nueva Matriz : "
l e t A crea −m at r i z 2 3
muestra A
show " Ponemos A( 1 , 2 ) = 3 : "
s e t A pon−elemento 1 2 A 3
muestra A
show " I d e n t i d a d de 3 x3 : "
muestra i d e n t i d a d 3
end
 

Ejercicios

1. A partir de listas, vamos a crear una estructura nueva de datos


para poder manipular tablas (una tabla está formada por pares de la
forma [clave valor], de modo que para cada clave sólo existe un
par en la lista). Las instrucciones necesarias son23 : 23
Más adelante veremos una extensión
de NetLogo que permite incorporar es-
Crea-tabla: devuelve una lista vacía que servirá para comenzar te tipo de datos.
a trabajar con tablas.
add-tabla T c v: si T es una tabla que tiene algún par con clave
c, sustituye el valor que tenga esa clave por v. En caso contrario,
añade el par [c v] a la tabla.
lee-tabla T c: si T es una tabla que tiene algún par con clave
c, devuelve el valor que tenga asociado esa clave en T. En caso
contrario, devuelve false.
borra-tabla T c: si T es una tabla que tiene algún par con clave
c, elimina ese par de T y devuelve la tabla resultante. En caso
contrario, devuelve la tabla T.

Usa los procedimientos que acabas de definir para construir, por 24


Observa que ahora cada agente podría
tener una propiedad en la que almace-
ejemplo, un diccionario básico24 .
nase su propio diccionario.
jhon.sn@live.com 14 Jun 2017

136 netlogo

2. Haciendo uso de listas, genera un nuevo tipo de estructura que


25
Puedes ver un conjunto como una lista permita trabajar con conjuntos25 . Define un reporte que devuelva el
que no contiene elementos repetidos y conjunto-vacio y las operaciones habituales entre conjuntos: union,
en el que no importa el orden.
interseccion, pertenence?, igualdad de conjuntos, etc.

3. Genera un procedimiento, aplana, que dada una lista (que puede


contener otras listas como elementos) devuelva la lista que se con-
sigue aplanando todas las listas al mismo nivel. Por ejemplo:
aplana [1 2 [3 [4]] 5] = [1 2 3 4 5]

4. Genera un procedimiento, profundidad, que dada una lista, de-


vuelva el número de niveles de profundidad que tiene, contando
un nivel de profundidad como la existencia de una lista dentro de
ella. Por ejemplo: profundidad [1 2] = 1, profundidad [1 2 [3]]
= 2, profundidad [[[1]]] = 3.

5. Definir el reporte rango tal que rango L es la lista formada por los
26
Suponemos que L es una lista numéri- elementos menor y mayor de L26 . Por ejemplo rango [3,1,9,5] =
ca. [1,9].

6. Definir la función palindromo de forma que palindromo L devuel-


27
Una lista es un palíndromo si se lee va true si L es palíndroma27 y false en caso contrario. Por ejem-
igual de izquierda a derecha que de de- plo: palindromo [3,2,5,2,3] = true, palindromo [3,2,5,6,2,3]
recha a izquierda.
= false.

7. Definir por recursión la función take n L, que devuelve la lista de


los n primeros elementos de L. Por ejemplo, take 2 [4 5 6 7 8] =
[4,5].

8. Haciendo uso de foreach, escribe un procedimiento que reciba co-


mo dato de entrada un número y escriba como resultado su tabla
de multiplicar.

9. Haciendo uso de map y reduce, escribe un reporte para calcular el


producto escalar de dos vectores (que vendrán representados por
28
El producto escalar de dos vectores, ~a, medio de dos listas numéricas de igual longitud)28 .
~b, se calcula como:
n 10. Amplía los procedimientos que hemos visto para trabajar con ma-
( a1 , . . . , an ) · (b1 , . . . , bn ) = ∑ a i bi trices introduciendo reportes que permitan realizar operaciones co-
i =1
mo: suma de matrices, producto de matrices, producto de un escalar
por una matriz, etc.

11. Selecciona algunos de los modelos que hemos hecho hasta el mo-
mento en los que tengamos propiedades numéricas asociadas a con-
juntos de agentes, y añade (si tiene sentido) plots que muestren los
histogramas relativos a la distribución de esas propiedades en el
conjunto.
jhon.sn@live.com 14 Jun 2017

uso avanzado de listas 137

12. Crea un modelo en el que tengas tortugas moviéndose aleatoria-


mente por el mundo, y en cada instante seleccione las tortugas que
estén más lejos del origen de coordenadas y haga que su tamaño
sea el doble que el resto.

13. Crea un modelo en el que las tortugas se distribuyan aleatoriamen- 29


La codificación de César mueve cada
te por el mundo y después, ordenadamente según su coordenada X, letra un determinado número de espa-
cada una se desplace aleatoriamente a un patch vecino no ocupado cios en el alfabeto. En el siguiente ejem-
plo se usa un desplazamiento con n = 3,
por otra tortuga. por lo que una B en el texto original se
convierte en una E en el texto codificado.
14. Creando una lista adecuada con letras, genera un reporte que re-
ciba como dato de entrada una cadena y un valor numérico, n, y
devuelva la codificación de César29 de esa cadena usando como va-
lor de traslación n.
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

9
Interacción con el usuario. Manejo del
ratón y sistemas de mensajes

Ventanas de diálogo

Ya hemos visto que mientras se está ejecutando un modelo, el usua-


rio puede interactuar por medio de los controles dispuestos en el inter-
faz. Dependiendo de cómo se haya programado la lógica del modelo,
la interacción puede ser inmediata o depender de la ejecución de algún
procedimiento en particular por medio de un botón.
Pero, a veces, resultará necesario que la ejecución del modelo se de-
tenga, bien para mostrar una información que el usuario debe saber,
bien para pedirle algún tipo de dato imprescindible para la continui-
dad de la ejecución. Como muchos otros lenguajes de programación,
NetLogo soluciona la interacción con el usuario por medio de venta-
nas de diálogo que, muchas veces, realizan funciones más complejas o
específicas que las que podrían acometer los controles habituales del
interfaz1 . 1
Normalmente, las ventanas de diálogo
A estas alturas, no nos son del todo desconocidas las ventanas de son modales; es decir, una vez mostra-
das al usuario, precisan de una acción
diálogo para la introducción de datos específicos: hemos trabajado ya por parte de éste (la que necesite el tipo
con Color Swatches, a la que se puede acceder por medio de la barra de ventana) para devolver la ejecución al
procedimiento que la creó y que conti-
de menús y también, desde el propio modelo, por medio del control núe la ejecución.
input cuando se configura el tipo de dato como color (figura 9.1).
Otras ventanas de diálogo disponibles son las que analizaremos a
continuación.

Ventana de mensajes

El objetivo de la ventana de mensajes es mostrar información pun-


tual al usuario; y su uso es sencillo: Figura 9.1: Ventana de Diálogo Color
Swatches.
user-message mensaje
donde mensaje es una cadena que puede formarse a partir de variables
propias del modelo. Por ejemplo, las instrucciones siguientes provocan
jhon.sn@live.com 14 Jun 2017

140 netlogo

el mensaje de la figura 9.2:


 
let a 2
let b 3
user −message ( word a " + " b " son " ( a + b ) )
 
Como resultado, su ejecución detiene el procedimiento en el que se
Figura 9.2: Ventana de mensajes. haya ejecutado y espera hasta que el usuario pulse uno de los dos
botones:

OK: para continuar con la ejecución del procedimiento.

Halt: para detener todas las ejecuciones en marcha.

Actividad: Mezcla la ejecución cuidadosa que vimos en un capítulo


anterior con una ventana de mensaje para informar adecuadamente
al usuario de algún error sin detener la ejecución en marcha.

Ventana de introducción de datos


Si deseamos pedir alguna información al usuario, podemos usar el
reporte
user-input mensaje
que devuelve el dato que el usuario haya introducido por medio del
diálogo que genera, y que podremos usar para alimentar un proce-
dimiento o una variable. Por ejemplo el siguiente código genera el
diálogo mostrado en la figura 9.3:
 
l e t num user −input " ¿Cuántas t o r t u g a s q u i e r e s c r e a r ? "
Figura 9.3: Ventana de introducción de
datos. c r t num
 

Actividad: Usa una ventana de introducción de datos para pedirle


al usuario el número de agentes que se crearán en el momento de
ejecución.

Ventana de selección
Es también una ventana de introducción de datos, pero restringida
a una lista de opciones que se debe proporcionar:
user-one-of mensaje lista-opciones
El valor devuelto lo podemos asignar a una variable o usarlo direc-
tamente. Por ejemplo (figura 9.4):
 
Figura 9.4: Ventana de selección. l e t r e sp user −one−o f " S e l e c c i o n a un v a l o r : "
( n−v a l u e s 3 [ random 1 0 0 ] )
 
jhon.sn@live.com 14 Jun 2017

interacción con el usuario. manejo del ratón y sistemas de mensajes 141

Actividad: Usa una ventana de selección para pedirle al usuario el


tipo de agentes que se crearán en el momento de ejecución.

Ventana de Sí/No
Devuelve un valor booleano seleccionado por el usuario:
user-yes-or-no? mensaje
Por ejemplo (figura 9.5):
  Figura 9.5: Ventana de Sí/No.
i f e l s e ( user −yes −or−no ? " ¿Deseas c o n t i n u a r ? " ) [ go ] [ st o p ]
 

Ventanas de ficheros y directorios


Aunque el trabajo sobre ficheros lo analizaremos en un capítulo
posterior, sí indicaremos aquí que NetLogo proporciona tres ventanas
de diálogo específicas para manipular ficheros y directorios (figura
9.6):

1. Selección de directorio: user-directory, que devuelve una cadena


con el path absoluto2 del directorio seleccionado; si el usuario pulsa
en Cancel, la devolución será false:
  Figura 9.6: Ventana de selección de fiche-
l e t d i r −d e s t i n o user − d i r e c t o r y ro.
 
2
Esto es, la localización completa del fi-
2. Selección de fichero: user-file, devuelve una cadena con el path chero dentro del sistema de archivos del
absoluto del fichero seleccionado; si el usuario pulsa en Cancel, la ordenador.
devolución será false:
 
l e t f i c h e r o −para− a b r i r user − f i l e
 

3. Selección de nuevo fichero: user-new-file, devuelve una cadena


con el path absoluto del directorio seleccionado junto con el nom-
bre del fichero que el usuario haya introducido con el teclado; si el
usuario pulsa en Cancel, la devolución será false3 : 3
Se debe tener en cuenta que el diálogo
  no crea el fichero (eso lo hace otro co-
l e t f i c h e r o −para−c r e a r user −new− f i l e mando de NetLogo), pero si indicamos
  el nombre de un fichero existente, el sis-
tema nos preguntará si queremos reem-
plazarlo; tampoco lo elimina él, sino que
Conversiones y evaluaciones tendremos que usar la instrucción ade-
cuada para eliminarlo previamente.

A pesar de su utilidad, la ventana de introducción de datos anterior


presenta una limitación: cualquier dato que se obtenga a través de ella
es interpretado como una cadena de texto. NetLogo no tiene un siste-
ma de conversión de tipos ni sus variables tienen un tipo predefinido,
pero a cambio tiene el reporte read-from-string que es capaz de re-
conocer automáticamente qué tipo de información hay en una cadena
jhon.sn@live.com 14 Jun 2017
4
Si no fuera
de dato deter
ma cadena de
142 netlogo transforma en
mantiene com
5
Prueba el mi
de read-from-
y devuelve el valor con el tipo correspondiente4 . El siguiente código
error que se
nos muestra un ejemplo de uso5 : mar dos caden
 
de dato que h
l e t a read −from− s t r i n g user −input "Numero 1 : " user-input.
l e t b read −from− s t r i n g user −input "Numero 2 : "
show a + b
 
read-from-string no sólo puede convertir a números, sino a cual-
quiera de los otros tipos básicos de NetLogo, incluidas las listas:
 
observer > f i r s t ( read −from− s t r i n g " [ 1 2 3 ] " )
observer : 1
 
A pesar de todo, esta conversión sigue teniendo limitaciones, ya que
sólo reconoce constantes y no puede trabajar sobre expresiones que re-
6
Por ejemplo, cadenas del tipo 1+2. quieran ser evaluadas para obtener su valor6 . Para evaluar cadenas de
texto como si fueran expresiones NetLogo proporciona dos primitivas,
una que sirve para evaluar acciones (procedimientos que no devuelven
resultados) y otra para evaluar reportes. Sus formatos son:
run cadena
r u n r e s u l t cadena

Es aconsejable reservar el uso de estos evaluadores sobre cadenas al


mínimo imprescindible y en situaciones simples, ya que en evaluacio-
7
Como veremos más adelante, también nes complejas su resultado puede ser impredecible7 . A continuación
admiten tasks como datos de entrada, y se muestra un uso simple de estas primitivas:
en este caso se comportan de forma rá-  
pida y fiable. observer > r u n r e s u l t " 1 + 2 "
observer : 3
observer > run " c r t 2 "
 

Actividad: Crea un modelo que permita al usuario manejar una


tortuga por medio de instrucciones pregrabadas en un control de
tipo Input.

Interacción con el ratón en el mundo

Una segunda herramienta para interactuar con los modelos la en-


contramos en el ratón. Lo empleamos ya para manipular los controles
en la interfaz; ahora veremos cómo podemos aprovecharlo para ex-
tender la interacción al nivel de los agentes que se distribuyen por el
mundo.
NetLogo proporciona un conjunto de instrucciones que permiten
saber la posición del ratón en el mundo, así como cuándo y cómo se
han pulsado sus botones.
Vamos a hacer una enumeración de las instrucciones que permiten
controlar el ratón y después veremos algunos procedimientos cons-
truidos a partir de ellas, que serán de utilidad para cualquier modelo
jhon.sn@live.com 14 Jun 2017

interacción con el usuario. manejo del ratón y sistemas de mensajes 143

en el que deseemos permitir al usuario interactuar con el mundo di-


rectamente8 : 8
Como se puede observar, el sistema só-
lo permite controlar el botón izquier-
mouse-inside?: es un reporte booleano que indica si el ratón se do del ratón para interaccionar con los
agentes del mundo, ya que el botón de-
encuentra dentro o no del área que delimita el mundo. recho se reserva para acceder a carac-
terísticas avanzadas del interfaz (inspec-
mouse-down?: reporte que indica si el botón izquierdo del ratón ha cionar los agentes, editar el mundo, ma-
sido pulsado. Si el ratón está fuera del mundo, la respuesta siempre nipular los controles, etc.).

es false.

mouse-xcor, mouse-ycor: devuelve las coordenadas del ratón en el


mundo (usando los patches como unidades). Si el ratón se encuen-
tra fuera del mundo, devuelve las últimas coordenadas que tuvo
estando dentro.

Con estos simples comandos podemos proporcionar al usuario un


control gráfico suficientemente complejo para la interacción con el
mundo de los agentes.
Comencemos con un procedimiento muy sencillo que permite se-
leccionar uno de los patches del mundo:
 
t o patch −s e l e c c i o n a d o
user −message " Pulsa so br e un patch "
l e t patch −pulsado nobody
while [ patch −pulsado = nobody ] [
i f mouse−down?
[ s e t patch −pulsado patch mouse−xcor mouse−ycor ] ]
ask patch −pulsado [ s e t p c o l o r red ]
user −message
( word " El patch s e l e c c i o n a d o es : " patch −pulsado )
end
 
Observa que necesitamos incluir el control de cuándo se ha pulsa-
do el ratón dentro de una estructura repetitiva, porque no sabemos
cuándo el usuario realizará la pulsación. Lo que hemos hecho ha sido
utilizar una variable temporal, patch-pulsado, que controla si toda-
vía no se ha pulsado ningún patch9 o, por el contrario, el usuario ha 9
nobody, nadie, es una constante prede-

pulsado en alguno. En caso de que mouse-down? devuelva True, se ha finida en NetLogo que permite compro-
bar si una variable contiene algún agente
pulsado dentro del mundo, por lo que el ratón se sitúa en algún patch o no.
(ya que los patches rellenan el mundo), que podremos localizar por
medio de las coordenadas del ratón.
¿Cómo podemos hacer un procedimiento similar para tortugas? Ve-
remos que no es complicado, aunque hemos de tener en cuenta ciertas
diferencias: las tortugas no ocupan una región completa del plano,
sino únicamente un punto, por lo que es muy probable que donde
pulsemos no haya una tortuga (aunque intentemos ser muy exactos);
por lo tanto, no es suficiente con que se haya pulsado el ratón para que
haya una respuesta favorable. Por la misma causa, tendremos que dar
jhon.sn@live.com 14 Jun 2017

144 netlogo

una opción de proximidad (pero no exactitud) para decidir si se ha


seleccionado una tortuga; además, podría haber más de una tortuga
dentro del mismo rango, por lo que habrá que elegir una de entre las
10
La estructura general del procedimien- posibles opciones10 .
to es la misma, pero por medio del  
reporte distancexy podemos medir la t o t o r t u g a −s e l e c c i o n a d a
distancia al punto exacto en el que ha user −message " Pulsa so br e una t o r t u g a "
pulsado el usuario y controlar el ran- l e t re sp nobody
go de error (que ha sido establecido
como 1); posteriormente se realiza la
while [ res p = nobody ] [
selección de una de las tortugas más i f mouse−down? [
cercanas (con one-of turtles with-min i f any ? t u r t l e s with
[distancexy mouse-xcor mouse-ycor]). [ d i s t a n c e x y mouse−xcor mouse−ycor < 1 ] [
s e t r esp one−o f t u r t l e s with−min
[ d i s t a n c e x y mouse−xcor mouse−ycor ]
]]]
ask re sp [ s e t s i z e 2 ]
user −message ( word " La t o r t u g a s e l e c c i o n a d a es : " r e s p )
end
 
Vamos ahora a crear un procedimiento que sea capaz de seleccionar
una tortuga y moverla mediante la técnica de arrastrar y soltar (drag &
drop). El procedimiento será parecido al que acabamos de ver pero, una
vez seleccionada la tortuga, haremos que su posición siga la posición
del ratón mientras se mantenga pulsado el botón izquierdo:
 
t o a r r a s t r a −t o r t u g a −s e l e c c i o n a d a
user −message " Pulsa so br e una t o r t u g a y a r r á s t r a l a "
l e t re sp nobody
while [ res p = nobody ] [
i f mouse−down? [
i f any ? t u r t l e s with
[ d i s t a n c e x y mouse−xcor mouse−ycor < 1 ] [
s e t r esp one−o f t u r t l e s with−min
[ d i s t a n c e x y mouse−xcor mouse−ycor ]
while [ mouse−down ? ]
[ ask resp [ s e t x y mouse−xcor mouse−ycor ] ] ] ] ]
end
 
Como muestran los ejemplos anteriores, para poder captar los even-
tos del ratón en el modelo es necesario usar una estructura repetitiva
que mantenga la escucha continua. Como una estructura de repetición
Figura 9.7: Ejemplo de uso del ratón en permanente (del tipo de loop) bloquearía demasiados recursos del sis-
un modelo. tema y no permitiría suficiente control sobre el proceso, se suele usar
un botón de tipo forever que se sitúa en el interfaz de forma que el
usuario puede decidir si va a activar la interacción con el ratón o no.
El siguiente ejemplo es una muestra de la idea anterior. Además del
código, necesitarás un botón que ejecute el procedimiento setup, y otro
11
Tras haber pulsado setup, y mientras botón forever que ejecute el procedimiento go11 (figura 9.7):
está presionado el botón go, ve pulsando
en las tortugas que desees seleccionar.
jhon.sn@live.com 14 Jun 2017

interacción con el usuario. manejo del ratón y sistemas de mensajes 145

 
to −r e p o r t s e l e c c i o n −t o r t u g a
l e t r e s p nobody
i f mouse−down? [
i f any ? t u r t l e s with
[ d i s t a n c e x y mouse−xcor mouse−ycor < 1 ] [
s e t r esp one−o f t u r t l e s with−min
[ d i s t a n c e x y mouse−xcor mouse−ycor ] ] ]
r e p o r t r esp
end

t o setup
ca
c r t 10 [ pd s e t x y random−xcor random−ycor ]
end

t o go
l e t s e l e c c i o n a d a s e l e c c i o n −t o r t u g a
i f s e l e c c i o n a d a ! = nobody [
ask s e l e c c i o n a d a [
r e p e a t 100 [ r t random 30 − 15 fd . 1 ] ] ]
end
 

La estructura del report seleccion-tortuga es más sencilla que en


los ejemplos anteriores debido a que la estructura de repetición se
ha trasladado al botón go. Además, al convertirlos en un report que
devuelve el objeto seleccionado hemos independizado el proceso de
selección de la tarea reservada al objeto seleccionado y el mismo report
puede ser reutilizado por procedimientos distintos.
Hay otra característica de este ejemplo que es importante resaltar:
ahora necesitamos almacenar el resultado del report de selección en
una variable temporal (seleccionada) porque si hubiéramos usado el
siguiente procedimiento:

 
t o go
i f s e l e c c i o n −t o r t u g a ! = nobody [
ask s e l e c c i o n −t o r t u g a [
r e p e a t 100 [ r t random 30 − 15 fd . 1 ] ] ]
end
 

no tendríamos la seguridad de que la devolución de la primera llama-


da al report (dentro del condicional) coincidiese con la de la segunda
llamada (dentro del ask); si en el transcurso de una línea a la siguien-
te el usuario hubiera movido el ratón podría ocurrir que el reporte 12
Por lo que las acciones pedidas se eje-
cutarían sobre un agente distinto al que
devolviera agentes distintos o incluso que el segundo reporte fuera
se deseaba seleccionar o podrían provo-
nobody12 . car un error al no haber agente sobre el
que ejecutarlas.
jhon.sn@live.com 14 Jun 2017

146 netlogo

Actividad: Puedes encontrar más ejemplos de uso del ratón


en la biblioteca de modelos que viene con NetLogo, y pueden
ser especialmente interesantes los que vienen en la sección de
Code Examples (como Mouse Drag Multiple Example o Mouse
Recording Example). Carga los diversos modelos que hay en la
biblioteca y observa las distintas técnicas que se han usado para
interactuar con el ratón en el mundo.

Ejercicios

1. Haz uso de lo que has aprendido en este capítulo para generar un


modelo en el que, tras seleccionar alguna de las tortugas del mundo,
te muestre en una ventana de diálogo información relativa a dicha
tortuga.

2. Haz un modelo que te permita poner, quitar o modificar tortugas


en el mundo por medio del ratón y de ventanas de diálogo para
pedir la información necesaria para establecer sus propiedades.

3. Escribe un procedimiento que permita ir seleccionando, por medio


13
Piensa alguna forma para destacar los de pulsaciones sucesivas del ratón, un conjunto de agentes13 .
agentes que están siendo seleccionados.
4. Haz un procedimiento que permita desplazar simultáneamente to-
das las tortugas presentes en el mundo por medio del ratón (por
14
Combínalo con el ejercicio de selección drag & drop, es decir, pulsando en una zona y arrastrando)14 .
múltiple que hemos visto antes, para
aplicar el mismo procedimiento al con- 5. Distribuye aleatoriamente tortugas por el mundo y haz un proce-
junto de agentes seleccionados.
dimiento (que se ejecutará con un botón forever) que las oriente en
dirección a la posición del ratón.

6. Modelo de balística:

a) Sitúa en una de las esquinas del mundo una tortuga que será la
encargada de hacer el disparo, a la que llamaremos cañón.
15
Más adelante puedes hacer que estos b) Sitúa en el mundo un conjunto de objetivos15 .
objetivos sean móviles, o hacer que apa-
rezcan automáticamente cuando otros c) Por medio del ratón dirige el disparo, tanto en dirección (el cañón
vayan desapareciendo. se orienta hacia el punto en el que se ha realizado la pulsación
con el ratón) como en fuerza (proporcional a la distancia entre el
cañón y el punto en el que se ha pulsado).
d) El cañón lanzará una bala en las condiciones de disparo fijadas
16
Ahora mismo no nos preocuparemos anteriormente, que debe seguir un movimiento parabólico16 .
por las leyes exactas de la física, aunque
si quieres puedes intentar simularlas. e) Controla si la bala choca con alguno de los objetivos que hay
en el mundo.

7. Genera un modelo en el que puedas crear varias tortugas y en la


17
Inventa variantes del ejercicio. Por ejecución éstas persigan al ratón por la pantalla17 .
ejemplo, puedes poner distintas veloci-
dades, que dejen o no rastro, ángulo má-
ximo de giro durante la persecución, etc.
jhon.sn@live.com 14 Jun 2017

interacción con el usuario. manejo del ratón y sistemas de mensajes 147

8. Realiza un programa de dibujo tan completo como puedas:

a) Añade los controles necesarios para poder modificar el color que


esté en uso.
b) Puedes usar la función stamp, junto con formas de tortugas ade-
cuadas, para simular el uso de distintos pinceles18 . 18
Puedes usar algunos de los patches
no sólo como lienzo, sino también como
c) Añade controles para que el usuario pueda dibujar segmentos, zonas de selección de pinceles, colores
círculos, etc. o formas, para facilitar la interacción al
usuario.
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

10
Entrada y salida. Grabando el mundo,
imágenes, videos y ficheros

En el proceso de modelado de fenómenos es esencial que el usua-


rio (ya sea un experimentador independiente que usa el modelo, un
alumno que debe practicar con él, o el propio programador que debe
verificarlo) reciba la información necesaria para saber cómo se com-
porta en cada una de las posibles situaciones. Con este fin, hemos
presentado en capítulos anteriores diversas formas de mostrar infor-
mación por medio del uso de gráficas, de la propia representación del
mundo o de comandos como show o user-message.
En este capítulo hacemos una revisión de las formas más habituales
para establecer una comunicación más rica con, o desde, el modelo,
que van desde la simple impresión de mensajes haciendo uso del Cen-
tro de Comandos o del control Output, hasta la grabación de ficheros
externos, pasando por la exportación/importación de estados globales
del mundo o de las gráficas existentes.

Salida impresa

Desde el Centro de Comandos podemos hacer uso de primitivas si-


milares a show para mostrar información en él. Los matices que los di-
ferencian determinan cuándo conviene emplear unos comandos frente
a otros:

show valor: muestra valor en el Centro de Comandos precedido


por el agente (incluido el observador) que ha ejecutado esta ins-
trucción. Si estamos imprimiendo cadenas de texto, mantiene las
comillas dobles que las rodean y acaba con un retorno de carro1 . 1
Un retorno de carro implica que lo si-
  guiente que se imprima comenzará en
t u r t l e s > show " Mensaje " una línea nueva.
( t u r t l e 1 ) : " Mensaje "
( t u r t l e 0 ) : " Mensaje "
observer > show "M1" show "M2"
jhon.sn@live.com 14 Jun 2017

150 netlogo

o b s e r v e r : "M1"
o b s e r v e r : "M2"
 

write valor: se comporta igual que show, pero ni muestra el agente


que ejecuta la acción, ni acaba con un retorno de carro, aunque
sí deja las comillas alrededor de las cadenas de texto. Precede la
impresión con un espacio.
 
observer > w r i t e "M1" w r i t e "M2"
"M1" "M2"
 

type valor: Análogo a las anteriores, pero no muestra el agente, no


muestra las comillas, no deja espacios alrededor y tampoco realiza
el retorno de carro.
 
observer > type "M1" type "M2"
M1M2
 

print valor: Análogo a las anteriores, no muestra el agente, no


muestra las comillas, no deja espacios, pero sí realiza el retorno de
carro.
 
observer > p r i n t "M1" p r i n t "M2"
M1
M2
 

Obviamente, se pueden combinar los comandos anteriores para ob-


tener los efectos de unos y otros simultáneamente sobre un conjunto
de datos:
 
observer > type "M1" type " " type 3 p r i n t " " p r i n t "M2"
M1 3
M2
 
Las primitivas output-show, output-write, output-type y output-print
tienen el mismo comportamiento que las anteriores, pero realizan la
2
Si el modelo no tuviera ningún control impresión en el control Output que tenga el modelo2 .
de este tipo, la impresión se hace en el La siguiente tabla muestra un resumen de las opciones de cada una
Centro de Comandos, como con las ins-
trucciones anteriores. de las primitivas vistas:

Primitiva Agente Comillas Retorno de carro Espacio


show X X X
write X X
type
print X
jhon.sn@live.com 14 Jun 2017

entrada y salida. grabando el mundo, imágenes, videos y ficheros 151

Actividad: Añade en alguno de los modelos vistos hasta el


momento instrucciones de impresión para controlar por dónde, y
en qué condiciones, va la ejecución del modelo (en el mundo de la
programación es lo que se conoce como un sistema de debug).

Importación y exportación

En el menú de Ficheros (File), NetLogo proporciona dos submenús


que se encargan, respectivamente, de la exportación e importación de
diversos datos del modelo actual. Hagamos un repaso por las distintas
opciones que ofrecen.
Respecto a las opciones de exportación (figura 10.1):

Export World (Exporta Mundo): graba en un fichero toda la infor-


mación del mundo: las variables con sus valores actuales, el estado
Figura 10.1: Menú de exportación.
actual de todas las tortugas y patches, la capa de dibujo, las gráfi-
cas, el área de salida y el estado de las semillas aleatorias (las que
determinan la generación de números aleatorios). Dependiendo del
tamaño del mundo y del número de agentes, el tamaño del fichero
resultante puede ser bastante grande. Puede ejecutarse desde códi-
go por medio de la instrucción export-world fichero.

Export Plot (Exporta Gráfica): graba en un fichero los valores de


una gráfica. Se consigue el mismo resultado por medio del menú
emergente del gráfico que se obtiene haciendo clic sobre él con el
botón derecho. Puede ejecutarse desde código por medio de la ins-
trucción export-plot nombre-plot fichero.

Export All Plots (Exporta todas las Gráficas): graba en un fichero


los valores de todas las gráficas. Puede ejecutarse desde código por
medio de la instrucción export-all-plots fichero.

Export View (Exporta Vista): graba en un fichero en formato PNG


la vista actual del mundo (2D o 3D). Puede ejecutarse desde código
por medio de la instrucción export-view fichero.

Export Interface (Exporta Interfaz): graba en un fichero en formato


PNG una imagen del interfaz. Se obtiene el mismo resultado por
medio del menú emergente del interfaz haciendo clic sobre él (en
una zona vacía) con el botón derecho. Puede ejecutarse desde códi-
go por medio de la instrucción export-interface fichero.

Export Output (Exporta Salida): graba en un fichero en formato


TXT el contenido del control Output (si no lo hubiera, el contenido
del Centro de Comandos). Puede ejecutarse desde código por medio
de la instrucción export-output fichero.
jhon.sn@live.com 14 Jun 2017

152 netlogo

Respecto a las opciones de importación (figura 10.2):

Import World (Importa Mundo): carga de un fichero los valores de


todas las variables, agentes, plots, capa de dibujo y área de salida
que han sido previamente exportados a un fichero por el mismo
Figura 10.2: Menú de importación.
procedimiento. Puede ejecutarse desde código por medio de la ins-
trucción import-world fichero.

Import Patch Colors (Importa Colores de Patch): carga una imagen


sobre los patches, y utilizando para almacenar los colores el sistema
de colores de NetLogo. La imagen se escala a las mismas dimen-
siones del mundo, pero manteniendo la relación de aspecto origi-
3
La imagen resultante puede quedar nal3 . Se aceptan los formatos BMP, JPG, GIF y PNG. Si la imagen
distorsionada por dos razones: por la cargada soporta transparencias por medio del canal alfa (un siste-
pérdida de detalle resultante de los pat-
ches (ya que todos los pixels del patch ma estándar para permitir transparencias en las imágenes), los pi-
tendrán el mismo color), y por la adapta- xels que sean completamente transparentes serán ignorados, mien-
ción del color original al formato de co-
lores de NetLogo, que no incluye toda la tras que los que tengan transparencia parcial serán tratados como
posible gama RGB. opacos. Puede ejecutarse desde código por medio de la instrucción
import-pcolors fichero.

Import Patch Colors RGB (Importa Colores de Patch en RGB):


es equivalente al anterior, pero hace uso del sistema RGB para la
codificación de los colores, por lo que es más fiel a la imagen ori-
ginal. Puede ejecutarse desde código por medio de la instrucción
import-pcolors-rgb fichero.
4
La imagen que se carga se centra en el
mundo y se escala para que quepa en él,
Import Drawing (Importa Dibujo): carga una imagen en la capa de
pero mantiene las relaciones de aspec-
to originales. Recuerda que la capa de dibujo4 . Puede ejecutarse desde código por medio de la instrucción
dibujo sólo sirve de representación y la import-drawing fichero.
única interacción con las tortugas es que
éstas pueden modificarla por medio del
lápiz, pero no pueden sentirla.
Import HubNet Client Interface (Importa Interfaz de Cliente Hub-
Net): carga el interfaz de otro modelo en el cliente de Hubnet actual.

Existen diferencias entre importar una imagen a los patches e im-


portarla a la capa de dibujo. La principal es que, debido a que la capa
de dibujo no es accesible por los agentes de ninguna forma, la imagen
almacenada en ella tampoco lo será, mientras que la imagen alma-
cenada en los patches modifica el color de éstos y por tanto puede
ser percibido por los agentes e influir en el desarrollo del modelo. La
siguiente figura muestra la diferencia visual que representa la impor-
tación al usar los tres métodos (import-colors, import-colors-rgb y
import-drawing) sobre una malla de 33x33 patches.
jhon.sn@live.com 14 Jun 2017

entrada y salida. grabando el mundo, imágenes, videos y ficheros 153

Aprovechando la capacidad de importación de imágenes y la inter-


acción de las tortuga con la información almacenada en los patches,
vamos a hacer un pequeño programa que simule distintos estilos pic-
tóricos a partir de una imagen que carga el usuario. Para ello, tras
cargar la imagen en los patches, hacemos que las tortugas se muevan
por el mundo y dejen impresa su propia figura con el color del patch
sobre el que se sitúan:
 
t o setup
ca
l e t f user − f i l e
import −p c o l o r s −rgb f
import −drawing f
c r t 4 [ s e t shape one−o f [ " square " " d e f a u l t " " c i r c l e " ] ]
end
t o go
ask t u r t l e s [
s e t heading random 360
s e t s i z e random− f l o a t 3
move−t o one−o f p a t c h e s
s e t c o l o r l p u t ( random 2 5 5 ) p c o l o r
stamp ]
end
 

El procedimiento go va asociado a un botón forever. Con tan po-


cas líneas, el efecto es relativamente parecido al obtenido por algunos
programas de dibujo (figura 10.3).
Como muestran las imágenes siguientes, si se modifica la forma de
las tortugas para generar formas de pinceles y se añaden comporta-
mientos dependiendo del pincel, se pueden obtener resultados muy
variados.
Figura 10.3: Resultado del programa an-
terior sobre una imagen de muestra.
jhon.sn@live.com 14 Jun 2017

154 netlogo

Actividad: En algún modelo que hayamos construido anterior-


mente, prueba la exportación/importación del estado del mundo
para comprobar que se almacenan todos los datos y se recuperan
correctamente.

Grabación de películas
5
MOV es un formato multimedia habi- Al igual que se pueden grabar imágenes de la situación del mundo
tual que usa un algoritmo propietario
en un momento determinado, NetLogo permite grabar la evolución
desarrollado por Apple. El formato en
que graba NetLogo es una versión de del mundo en formato de película. Para ello dispone de un conjunto
Quicktime no comprimida, por lo que si de primitivas (que comienzan por movie-) que se encargan de ir alma-
las películas son largas pueden producir
archivos muy grandes. Existen diversos cenando los diversos fotogramas en una película en formato MOV5 .
programas (algunos gratuitos) que per- Una vez grabada, podremos reproducirla con cualquier reproductor
miten comprimir las películas, algunos
que admita dicho formato.
de ellos usan compresión con pérdida (lo
que significa que cuanto más se reduzca, Para comenzar la grabación de una película hemos de ejecutar el
más calidad se pierde), y otros sin pérdi- comando movie-start:
da (que mantienen la calidad del pixel
como en el original). La elección de uno movie-start nombre-pelicula
u otro dependerá del objetivo que persi- que preparará el sistema para ir almacenando los fotogramas a medida
gas con la película y de la necesidad de
que se lo vayamos ordenando. Para añadir un fotograma basta ejecutar
promediar calidad y tamaño.
movie-grab-view o movie-grab-interface, dependiendo de si quere-
mos almacenar solo la vista del mundo o el interfaz completo. Debido
a que los tamaños del mundo y del interfaz son distintos, en la gra-
bación de una película no puedes mezclar ambos tipos de fotogramas,
ya que el resultado no tendría un tamaño uniforme.
Para terminar la grabación de la película usa movie-close.
Con estas primitivas ya estamos en condiciones de hacer nuestra
primera película. Por ejemplo, el siguiente código hace una pequeña
película de 100 fotogramas de la ejecución de un modelo que evolu-
ciona con el procedimiento go:
 
setup
movie− s t a r t " e v o l u c i o n . mov"
movie−grab−view
r e p e a t 30 [
go
movie−grab−view ]
movie− c l o s e
 
Otras primitivas nos facilitan la tarea y el control del proceso de
producción. Por ejemplo, movie-set-frame-rate, que establece el nú-
mero de fotogramas por segundo con el que se reproducirá la película
6
Es información almacenada en la pro- grabada6 . Recuerda que esta instrucción debe ejecutarse después de
pia película, que permite al reproductor ejecutar movie-start, pero antes de grabar ningún fotograma.
conocer a qué velocidad debe reprodu-
cirla. Por defecto, si no usas esta primi- Si queremos saber cuántos fotogramas han sido grabados desde el
tiva, se reproducirá a 15 fotogramas por comienzo de la grabación, podemos usar la primitiva movie-status; y
segundo.
jhon.sn@live.com 14 Jun 2017

entrada y salida. grabando el mundo, imágenes, videos y ficheros 155

si queremos cancelar7 la grabación usaremos movie-cancel. 7


Cancelar no es solo detener la graba-
ción, sino eliminar el fichero que se está
Actividad: En la carpeta de Code Examples puedes encontrar un grabando.

modelo que te muestra cómo generar películas de una forma más


completa. Cárgalo y practica con las ideas que propone sobre otros
modelos.

Lectura y escritura de ficheros

Sin duda, a medida que hagamos modelos más complejos con NetLo-
go, necesitaremos leer y almacenar datos desde ficheros de una forma
distinta a la que nos ofrecen las instrucciones de importación y expor-
tación anteriores.
En NetLogo, las primitivas que permiten trabajar con ficheros co-
mienzan con el prefijo file-. Los dos modos en los que se puede
operar con un fichero desde NetLogo son lectura y escritura; una vez
establecido el modo, la única forma de cambiar es comenzando de
nuevo con el fichero y abriéndolo en el otro modo8 . 8
Cuando se ejecuta el modelo embebi-
do dentro de una página web (por me-
dio del applet asociado) no se permite
Abrir, cerrar y eliminar un fichero la escritura de ficheros, sólo la lectura, y
con la restricción de que los ficheros a
Para abrir un fichero se usa la instrucción file-open: los que se acceda estén localizados en el
mismo directorio del servidor en el que
file-open nombre-fichero
se encuentra el modelo.
donde nombre-fichero es una cadena que se interpreta como el path
relativo (es decir, la dirección respecto de la localización del modelo)
del fichero que se desea abrir9 . Una vez abierto, se deberán usar las 9
Por defecto, si no se proporciona
instrucciones adecuadas de lectura o escritura para acceder a su con- una ruta completa, el fichero se bus-
ca en el directorio donde está el có-
tenido. digo del modelo. Este comportamien-
Hemos dicho que un fichero sólo se puede abrir en uno de los mo- to se puede cambiar con la primiti-
va set-current-diretory. Por supuesto,
dos (lectura o escritura), pero la instrucción que se encarga de abrir para que se pueda acceder a un fichero
el fichero no especifica cuál de los dos se va a usar. Será la primera en modo lectura, es necesario que dicho
instrucción que se ejecute sobre el fichero una vez abierto quien deter- fichero exista..

minará el modo. Para cerrar el fichero que estemos usando se empleará


file-close, que no necesita parámetros adicionales.
Cuando se abre un fichero en modo escritura, todos los datos nue-
vos que se añadan se colocarán al final del fichero original. Si no hay
fichero original, se creará uno en blanco. Si no se desea añadir in-
formación nueva, sino reemplazar el contenido del fichero antiguo
con los nuevos datos, deberá eliminarse el fichero previamente con
file-delete, para lo cual el fichero tendrá que estar cerrado10 : 10
Si quieres crear el fichero desde el
file-delete nombre-fichero principio y no estás seguro de que
el fichero pueda existir, puedes combi-
nar estas instrucciones con el uso de
carefully que vimos anteriormente.
Leyendo y escribiendo datos de un fichero
Tras abrir el fichero11 , tenemos varias opciones para leer su conte- 11
Recordemos que, según vimos en el
capítulo anterior, hay tres primitivas
que permitían usar ventanas de diá-
logo para facilitar el trabajo con fi-
cheros: user-directory, user-file y
user-new-file.
jhon.sn@live.com 14 Jun 2017

156 netlogo

nido:

file-read: este reporte, que no necesita parámetros, lee la siguiente


constante almacenada en el fichero y la interpreta (tal y como ha-
ría si fuese introducida desde el Centro de Comandos) devolvien-
do su valor, por lo que puede reconocer números, listas, cadenas,
booleanos y el valor especial nobody. Las constantes se separan por
espacios en blanco y cada llamada a esta función moverá la cabeza
lectora del fichero a la siguiente constante que reconozca (saltando
el espacio). Para que file-read reconozca las cadenas, éstas deben
ir entre comillas dobles.

file-read-line: lee la siguiente línea completa en el fichero y la


12
Una línea se reconoce por un carác- devuelve como una cadena12 . Si el contenido de la línea leída es
ter especial de retorno de carro (también complejo suele combinarse esta instrucción con la que ya vimos,
puede aparecer el carácter de fin de fi-
chero, o ambos caracteres juntos) situa- read-from-string, para poder interpretar el contenido de la línea.
do al final. Este carácter no es devuelto
por el reporte. file-read-characters n: devuelve los n próximos caracteres del
fichero abierto en forma de cadena. Si quedan menos de n caracteres
para llegar al final del fichero, devolverá todos los que quedan. Si
entre los caracteres se encuentran símbolos de nueva línea, espacios,
etc., también los devuelve.

file-at-end?: no es una instrucción que devuelve datos leídos del


fichero; su función es leer si el siguiente carácter en el fichero es el
de fin de fichero, devolviendo un valor booleano indicando si es así
13
Al usar esta instrucción en una estruc- o no13 .
tura repetitiva podremos controlar la lec-
tura del fichero completo si desconoce- Las primitivas que nos permiten escribir datos en los ficheros son
mos su tamaño exacto.
adaptaciones (y con el mismo comportamiento) de las primitivas que
vimos para salida en el apartado anterior: file-print, file-show,
file-type y file-write.
Como ejemplo, el siguiente código graba las coordenadas de ca-
da tortuga en un fichero y, después de situarlas aleatoriamente en el
mundo, vuelve a leer del fichero donde estaba cada una y la sitúa en
su posición original.
 
f i l e −open " datos −t o r t u g a s . t x t "
ask t u r t l e s [
f i l e −w r i t e who
f i l e −w r i t e xcor
f i l e −w r i t e ycor ]
f i l e −c l o s e
ask t u r t l e s [ s e t x y random−xcor random−ycor ]
f i l e −open " datos −t o r t u g a s . t x t "
while [ not f i l e −at −end ? ] [
ask t u r t l e f i l e −read [ s e t x y f i l e −read f i l e −read ] ]
f i l e −c l o s e
 
jhon.sn@live.com 14 Jun 2017

entrada y salida. grabando el mundo, imágenes, videos y ficheros 157

Actividad: Recordemos las primitivas vistas en el capítulo anterior


para manejar ventanas de diálogo: algunas de ellas estaban directa-
mente relacionadas con ficheros, por lo que pueden facilitar la tarea
al usuario de seleccionar archivos de escritura y lectura. Añade al
ejemplo anterior un diálogo adecuado para que el usuario decida
cuál es el fichero de escritura y cuál el de lectura; de esta forma
puede almacenar y recuperar la información acerca del estado de
las tortugas cuando lo desee.

Lectura simultánea de varios ficheros


Los epígrafes anteriores han mostrado cómo abrir, leer/grabar y ce-
rrar ficheros para poder transferir datos desde los modelos de NetLo-
go, pero ¿de qué forma podríamos ir leyendo (o grabando) de varios
ficheros simultáneamente? Para conseguir trabajas con varios ficheros
hemos de mirar más detenidamente cómo funciona file-open.
Cuando se ejecuta la instrucción file-open sobre un fichero, NetLo-
go realiza dos acciones:

1. sitúa una marca global que indica que las operaciones de lectu-
ra/escritura que se ejecuten a continuación actuarán sobre dicho
fichero,

2. sitúa una marca específica para ese fichero, que se mueve sobre él
indicando el punto en el que está la cabeza que lee/escribe datos
suyos. Esta segunda marca desaparece cuando cerramos el fichero,
de forma que la siguiente vez que abramos el fichero esta segunda
marca se colocará al inicio del mismo

Por eso, si usamos la instrucción file-open cuando el fichero ya está


abierto, lo que se hace es activar la conexión con él.
Si usamos varias instrucciones file-open para activar distintos fi-
cheros, podremos ir leyendo alternativamente de varios ficheros sin
necesidad de abrir y cerrar cada uno de ellos. El siguiente ejemplo
puede dar una idea de cómo hacerlo14 : 14
En este código trabajamos sobre dos
  ficheros, de nombres prueba1.txt y
t o l e e −v a r i o s prueba2.txt, que deben existir en el di-
f i l e −c l o s e − a l l rectorio y que vamos leyendo alternati-
; Leemos e l primer f i c h e r o vamente hasta que uno de ellos acaba.
Para comprobar esta acción hemos crea-
show " Contenido f i c h e r o : prueba1 . txt " do un reporte, file-eof?, que recibe co-
while [ not f i l e −e o f ? " prueba1 . t x t "] [ mo dato de entrada un fichero y devuel-
show f i l e −read − l i n e ] ve si hemos llegado a su final o no.
f i l e −c l o s e
; Leemos e l segundo f i c h e r o
show " Contenido f i c h e r o : prueba2 . txt "
while [ not f i l e −e o f ? " prueba2 . t x t "] [
show f i l e −read − l i n e ]
jhon.sn@live.com 14 Jun 2017

158 netlogo

f i l e −c l o s e
; Leemos l o s dos f i c h e r o s simultáneamente
show " Contenido ambos f i c h e r o s "
while [ ( not f i l e −e o f ? " prueba1 . t x t " ) and
( not f i l e −e o f ? " prueba2 . t x t " ) ]
[ f i l e −open " prueba1 . t x t "
show f i l e −read − l i n e
f i l e −open " prueba2 . t x t "
show f i l e −read − l i n e ]
f i l e −c l o s e − a l l
end

to −r e p o r t f i l e −e o f ? [ f ]
f i l e −open f
r e p o r t f i l e −at −end ?
end
 

Ejercicios

1. Realiza extensiones al ejemplo de las tortugas pintoras. Por ejem-


plo, añadiendo comportamientos a los pinceles, tipos de pinceles,
cambios cromáticos, etc. Intenta crear comportamientos que simu-
len diversos estilos (puntillismo, Van Gogh, abstracto, etc.). Añade
una opción para grabar una película de cómo se puede ir formando
el dibujo final.

2. Escribe un procedimiento que lea un fichero de texto y lo muestre


completo en el centro de comandos o en el control output (en caso
de que exista).

3. Escribe un procedimiento que reciba como dato de entrada un fi-


chero y realice una copia de seguridad del mismo, copiando su con-
tenido en otro que tendrá el mismo nombre que el original, pero con
extensión .bak.

4. Grabación/lectura de gráficas:

a) Genera un modelo que tenga un reporte para calcular una fun-


ción matemática (por ejemplo, y = x2 ).
El nombre del fichero será selecciona-
15
b) Genera un procedimiento que vaya grabando en un fichero15 los
do por el usuario. pares de puntos ( x, f ( x )).
c) Genera otro procedimiento que permita leer los puntos almace-
nados en el fichero anterior y representarlos en un plot.
d) Repite el procedimiento con distintas funciones matemáticas.

5. Escribe un programa que lea un fichero de texto y vuelque su con-


16
Puedes hacer también variantes en la tenido en una lista, de forma que sus elementos sean las palabras16 .
que los elementos sean los caracteres o
las líneas.
jhon.sn@live.com 14 Jun 2017

entrada y salida. grabando el mundo, imágenes, videos y ficheros 159

6. Escribe procedimientos que reciban el nombre de un fichero y reali-


cen las siguientes operaciones:

a) Caracteres f: devuelva el número de caracteres que tiene el fi-


chero f.
b) Palabras f: devuelva el número de palabras que tiene el fichero
f.

c) Cabecera f N: devuelva las N primeras líneas del fichero f.


d) Pie f N: devuelva las N últimas líneas del fichero f.
e) Contraccion f N: devuelva los N primeros caracteres de cada lí-
nea de f, seguidos de puntos suspensivos en caso de que la línea
haya sido cortada.
f ) Resumen f: devuelva un resumen del fichero haciendo uso de los
procedimientos anteriores.

7. Para algunos de los modelos que hemos visto y que usan variables
globales por medio de controles en el interfaz, escribe procedimien-
tos que permitan cargar y grabar configuraciones del modelo en el
que se almacenen los valores de estas variables.
jhon.sn@live.com 14 Jun 2017
jhon.sn@live.com 14 Jun 2017

11
Grafos/redes en NetLogo

Hasta ahora hemos evitado trabajar con los enlaces (links), princi-
palmente porque necesitábamos conocer algunas técnicas de progra-
mación para poder aprovecharlos. Este es el momento, con lo que he-
mos aprendido hasta ahora, de empezar a conocer cómo funcionan.

¿Para qué puede servir un grafo?

En muchos de los problemas que tengamos que modelar nos en-


contraremos que, tan importantes como los objetos que intervienen,
son las relaciones que se establecen entre ellos. Los grafos1 proporcio- 1
O redes, nombre que reciben en áreas
nan la representación más flexible y sencilla para representar esos dos como la Física o las Ciencias Sociales,
donde han tenido un gran auge en los
niveles de la realidad: los objetos y sus relaciones. últimos años.
Las relaciones pueden ser reales o figuradas, es decir, admiten tanta
abstracción como el modelador del problema quiera darles; así, pue-
den representar conexiones físicas en el mundo real (por ejemplo, una
red de carreteras que conecta entre sí pueblos de una determinada
región (figura 11.1), enlaces químicos entre átomos de una molécula,
etc.) o relaciones abstractas (por ejemplo, podemos conectar dos núme-
ros si tienen algún divisor común, palabras que mantienen relaciones
semánticas, etc.).
Una vez representado nuestro problema mediante un grafo, des-
cubriremos que muchas de las preguntas que el fenómeno real nos
plantea se traducen en preguntas similares en el modelo matemático. Figura 11.1: Red de carreteras.
Así, averiguar qué ciudad es la que ofrece mejores condiciones para,
por ejemplo, colocar un centro de distribución de productos, y conocer
qué número tiene mayor cantidad de divisores en común con la ma-
yoría, son cuestiones que se traducen en analizar, en cada uno de los
grafos asociados, el número y tipo de conexiones que tienen los nodos
que representan esos objetos del mundo real.
Debido a que el modelo matemático de los grafos puede representar
objetos y relaciones tan distintos entre sí como acabamos de esbozar,
será necesario comenzar con algunas definiciones generales que des-
jhon.sn@live.com 14 Jun 2017

162 netlogo

pués usaremos para modelar problemas que provienen de dominios


2
En la actualidad, las redes sociales, y el completamente distintos2 .
uso de internet en general y de buscado- Entre los posibles grafos y redes que aparecen en fenómenos reales
res web en particular, han despertado en
el gran público el interés por este tipo de destacan las que se conocen como redes complejas, que son las que
objetos matemáticos, ya que la Teoría de verifican ciertas características que no se dan en redes simples. Nor-
Grafos ha ofrecido soluciones allí donde
otras herramientas han fracasado. malmente, una red compleja suele tener un gran número de elementos
y evoluciona en el tiempo con una dinámica que hace que las propie-
dades de esos elementos o de las relaciones que los conectan varíen
de manera impredecible, por lo que, incluso sabiendo las reglas sim-
ples que hacen que sus nodos se conecten o desconecten entre sí, no
podemos saber qué aspecto tendrá la red cuando pase un tiempo; se
hacen más impredecibles cuanto más tiempo de predicción queremos
adelantar. Ejemplos de redes complejas pueden ser las grandes redes
sociales que se establecen con herramientas como Facebook (definida
por los usuarios que la forman y las relaciones de amistad que hay
entre ellos); la red de comercio mundial (definida, por ejemplo, por
las corporaciones que actúan a nivel mundial y las relaciones contrac-
tuales entre ellas); las redes neuronales biológicas (definidas por las
neuronas y las conexiones sinápticas que se producen entre ellas); etc.
Antes de revisar los comandos que permiten manipular los grafos
en NetLogo, haremos una breve introducción a la Teoría de Grafos.

Introducción a Teoría de Grafos


3
En principio, tanto V como E pueden
ser conjuntos infinitos, aunque en el ca-
so que nos interesa siempre considerare-
La Teoría de Grafos estudia las redes complejas desde un punto de
mos el caso finito. vista matemático. Formalmente una red compleja se representa por un
grafo.
Un grafo, G, consiste en un conjunto de elementos, V, y otro con-
junto, E, formado por pares de elementos de V. Los elementos de V se
llaman nodos o vértices y los de E, lados o aristas3 . Así, el conjunto
V será de la forma V = {v1 , . . . , vn } y E = {l1 , . . . , lk } donde cada li es
un par de elementos de V: li = (vs , vt ) para ciertos s, t ∈ {1, . . . , n}.
Es usual referirse a cada nodo por el orden que ocupa en el conjunto
V, de modo que el nodo vi se representa por su índice i.
En los grafos no dirigidos cada lado, l, se define mediante un par
Figura 11.2: Grafo no dirigido. de nodos, l = (i, j); también suele ser denotado por lij , en el que el
orden de los nodos no importa (figura 11.2).
En los grafos dirigidos cada lado, l, lleva una orientación determi-
nada por el orden de escritura de los nodos, de forma que lij y l ji son
lados diferentes: el primero indica un lado dirigido del nodo i al nodo
j, mientras que l ji representa el lado que va dirigido desde j hasta i
(figura 11.3).
En general si l = lij diremos que el lado l es incidente en los nodos
i y j, o que une los dos nodos. Dos nodos unidos mediante un lado se

Figura 11.3: Grafo dirigido.


jhon.sn@live.com 14 Jun 2017

grafos/redes en netlogo 163

llaman vecinos o adyacentes.


En los grafos no se permiten conexiones de un nodo con él mismo,
ni tampoco que puedan existir dos nodos conectados por dos o más
lados distintos. Los multigrafos son aquellos grafos en los que sí se
permite este tipo de conexiones (figura 11.4).
también son interesantes los grafos con peso o ponderados, en los
que cada lado, l, lleva asociado un cierto peso, wl ∈ R; o, su gene-
ralización, los grafos etiquetados, en los que a sus nodos (o aristas,
o ambos) se les asocia una etiqueta de algún conjunto. Matemática- Figura 11.4: Ejemplo de multigrafo.
mente, un etiquetado, por ejemplo en los nodos, no es más que una
aplicación et : V → D, donde D es el conjunto de etiquetas. En este
sentido, un grafo ponderado no es más que un grafo en el que sus
aristas se etiquetan con números reales.
Dado un grafo G, su tamaño, N, es el número de nodos. El número
de lados, K, se mueve entre 0 y N ( N − 1)/2, siendo el caso extremo
aquel en el que todos los nodos son adyacentes. Este grafo se conoce
como grafo completo de orden N y se representa por K N . Por ejemplo,
K3 es un triángulo.
Un camino (en el grafo) del nodo i al nodo j es una sucesión al-
ternante de nodos y lados que comienza en el nodo i y termina en el
nodo j, de modo que cada lado de la sucesión conecta entre sí los dos
nodos que lo delimitan en la sucesión (figura 11.5).
La longitud del camino es el número de lados de la cadena. Un
trail es un camino en el que no se repiten lados y un path un camino
en el que no se repiten nodos. El camino de mínima longitud entre
Figura 11.5: Ejemplo de camino entre los
dos nodos, o geodésica, es el camino más corto entre ellos en cuanto a nodos 4 y 5. Observa que no es el más
número de aristas que recorre, y su longitud define una distancia entre corto entre esos dos nodos.

los nodos dentro del grafo (realmente, es la longitud de cualquiera de


las geodésicas que los une, porque todas deben medir lo mismo). Si
no existe un camino entre dos nodos su distancia es infinita. Un ciclo
es un camino cerrado de al menos tres nodos, en el que no se repiten
lados. Un ciclo de longitud k se representa por Ck 4 . 4
C3 es un triángulo, C3 = K3 .
Un subgrafo de G es un grafo formado por un subconjunto de no-
dos de G y un subconjunto de aristas de G; obviamente, sólo podemos
quedarnos con aristas que unan nodos que están en el subgrafo.
Un grafo es conexo si la distancia entre cualesquiera dos de sus no-
dos es finita5 . En caso contrario se llama disconexo. Una componente 5
Es decir, hay un camino que une cua-
conexa, o componente, del grafo es un subgrafo inducido conexo ma- lesquiera dos nodos del grafo.

ximal para la inclusión; es decir, que es un subgrafo de G que no puede


crecer añadiendo más nodos de G conectados con él.
El grado es uno de los conceptos más simples que podemos estudiar
en una red. El grado, k i , del nodo i es el número de lados que inciden
en él. El valor de k i es un entero no negativo. En física a veces esta
cantidad se llama conectividad del nodo.
jhon.sn@live.com 14 Jun 2017

164 netlogo

Un grafo conexo que no tiene ciclos se llama árbol. En un árbol


con n nodos hay exactamente n − 1 enlaces. Su importancia radica en
que los árboles son grafos que conectan todos los nodos utilizando el
menor número posible de aristas (figura 11.6).

Representación de grafos en NetLogo

Pero volvamos a NetLogo. Visto lo anterior, no resulta difícil ima-


Figura 11.6: Ejemplo de árbol. ginar que la manera en la que vamos a conseguir representar grafos
pasa por construir agentes de tipo enlace (link) entre pares de agentes
móviles (de tipo tortuga). De esta forma, los nodos del grafo se repre-
sentan por los agentes de tipo turtle, y las relaciones del grafo vienen
representadas por medio de agentes de tipo link.
6
Ya comentamos que los links (enlaces) Es decir, en NetLogo, no sólo los nodos o vértices del grafo son
no son agentes móviles, en el sentido
de que no puedo situarlos donde quie-
agentes que nos limitamos a conectar entre sí, sino que estas conexio-
ro; pero tampoco son estáticos, pues su nes se establecen usando otro tipo de agentes, con lo que ello conlleva:
posición depende de los agentes móviles que estas relaciones pueden tener sus propiedades particulares inde-
que conecta, que sí se pueden desplazar.
pendientes de los nodos, pueden formar familias que enriquezcan la
interpretación del modelo, pueden realizar acciones y tener comporta-
mientos de manera que no sean elementos estáticos del modelo, etc.6
Las propiedades que tiene un link por defecto (que se pueden am-
pliar, como veremos, siguiendo el mismo método que en la definición
de propiedades adicionales para los otros tipos de agentes) se mues-
tran en su ventana de inspección, a la que se puede acceder, como en
los otros casos, seleccionándola en el menú emergente que aparece al
hacer clic con el botón derecho sobre el enlace (figura 11.7).

end1, end2: representan los dos extremos del enlace, es decir, qué
agentes móviles son los que quedan relacionados por él. El orden
depende de cómo se haya formado el enlace, y será relevante para
el caso en que el enlace sea dirigido; aunque podemos modificarlo,
se representa por defecto como una flecha que parte de end1 y llega
a end2. En cambio, si es no dirigido, end1 será el agente que tenga
el identificador (who) más bajo.

color, label, label-color, hidden?, breed, shape: tienen la misma

Figura 11.7: Ventana de inspección de


función que en los agentes de tipo tortuga.
links.
thickness es el grosor de la línea que se usa para representarlo en el
mundo; se mide en unidades de patch, siendo 0 la medida mínima,
que se corresponde con un pixel.

tie-mode: establece si el enlace entre las dos tortugas hace que el


7
Esta característica, que denominaremos movimiento de una de ellas afecte al de la otra7 .
atadura, se verá con más detalle en las
siguientes páginas. Como hemos visto, los links pueden ser dirigidos o no dirigidos,
pero existe una restricción importante: en cada familia de links sólo
jhon.sn@live.com 14 Jun 2017

grafos/redes en netlogo 165

puede haber de un tipo. Esta restricción no es tal si tenemos en cuen-


ta que podemos crear familias de links, por lo que la única exigencia
que impone en este sentido NetLogo es que los enlaces se agrupen por
familias. Sin embargo, sí existe otra restricción que, aunque salvable
en la mayoría de los casos, puede limitar algunas de las posibilidades
de modelado por medio de links: de cada familia, sólo podrá haber un 8
Esto se aplica también al caso en que
no haya razas de links definidas, por lo
enlace como máximo uniendo dos nodos, y no hay forma de enlazar que la raza por defecto, links (al igual
un agente con él mismo; es decir, para cada familia de links, sólo se que existían turtles y patches) tendrá
pueden definir grafos simples, no multigrafos. sí está permitido que que estar formada o bien sólo por en-
laces dirigidos, o bien sólo por enlaces
dos nodos se unan con diversos enlaces, siempre y cuando sean de fa- no dirigidos. Qué tipo de enlaces con-
milias distintas, o bien sean dirigidos y estén orientados en direcciones tenga vendrá determinado por el primer
link que se cree: si es dirigido, todos ten-
contrarias8 . drán que ser dirigidos, si es no dirigido,
todos tendrán que ser no dirigidos. Sin
embargo, si se eliminan todos los links,
Cómo crear enlaces entre agentes el proceso puede empezar de cero y será
el primer link nuevo el que determine el
Existen varias formas de crear enlaces que dependerán, entre otras tipo de los siguientes.

cosas, del tipo de enlace que queramos crear. En general, para crear
un enlace siempre es necesario que sea uno de los agentes el que se
decida a crearlo9 . Los modos más comunes son: 9
Es decir, todos los comandos que vere-
mos son comandos de tortuga.
create-link-with agente2: el agente que ejecuta esta instrucción
crea un link no dirigido con agente2. En caso de que ya existiera
este link, no produce ningún efecto.

create-links-with conj-agentes: el agente que ejecuta esta ins-


trucción crea un link no dirigido con cada uno de los agentes que
hay en conj-agentes. Los enlaces que ya pudieran existir se omiten.

create-link-to agente2: el agente que ejecuta esta instrucción crea


un link dirigido que comienza en él y acaba en agente2. En caso de
que ya existiera este link, no produce ningún efecto.

create-links-to conj-agentes: equivalente al anterior, pero para


crear enlaces dirigidos con conjuntos de agentes.

create-link-from agente2: el agente que ejecuta esta instrucción


crea un link dirigido que comienza en agente2 y acaba en él. En
caso de que ya existiera este link, no produce ningún efecto.

create-links-from conj-agentes: equivalente al anterior, pero pa-


ra crear enlaces dirigidos desde conjuntos de agentes.

Si quisiéramos crear razas de enlaces, se definen en la cabecera del


código, tal y como vimos para el resto de razas, pero debemos espe-
cificar si la raza contendrá enlaces dirigidos o no dirigidos usando un
comando específico para cada caso:
undirected-link-breed [raza-links-plural raza-links-singular]
jhon.sn@live.com 14 Jun 2017

166 netlogo

directed-link-breed [raza-links-plural raza-links-singular]


Posteriormente, por medio de la partícula -own podemos definir
nuevas propiedades para los links (o para razas de links definidas en
el código).
Vamos a hacer como ejemplo un procedimiento que reciba como
dato de entrada el número de nodos y genere un grafo no dirigido
que conecte todos los nodos entre sí; es decir, un grafo completo (figura
11.8):
 
t o Grafo−Completo [ n ]
ca
crt n [
Figura 11.8: Grafo completo en el toro. s e t x y random−xcor random−ycor
s e t shape " c i r c l e "
s e t c o l o r blue ]
ask t u r t l e s [ c r e a t e −l i n k s −with o t h e r t u r t l e s ]
end
 
Destaquemos dos detalles:

1. Realmente, en el procedimiento anterior, cada link se intenta crear


dos veces.

Actividad: ¿Por qué?, ¿cómo podrías resolver esta duplicidad


innecesaria?

2. Los enlaces que se generan viven en el toro (que es la topología


por defecto en NetLogo); esta es la razón por la que algunos de los
enlaces se ven cruzando el mundo por los lados identificados, ya
que buscan la distancia más corta en el toro evitando unir ambos
nodos. Si quisiéramos que esto no fuera así, deberíamos cambiar
la topología para que no se identifiquen los límites. La figura 11.9
muestra el mismo grafo completo, pero sin las identificaciones entre
límites del mundo.

también podemos pedirles a los links que realicen una acción tras
ser creados. Por ejemplo:
 
Figura 11.9: Grafo completo. ask one−o f t u r t l e s [
c r e a t e −l i n k −with one−o f o t h e r t u r t l e s [ s e t c o l o r red ] ]
 
provocará que el link recién creado se ponga de color rojo.
Los enlaces cuentan con algunos reportes exclusivos; por ejemplo,
link-length devuelve la longitud del enlace, esto es, la distancia entre
sus extremos.
Pero no sólo se puede interactuar con los links desde las tortu-
gas, una vez creado un link, él mismo puede acceder a sus dos ex-
tremos usando las propiedades end1 y end2, o bien usando el reporte
jhon.sn@live.com 14 Jun 2017

grafos/redes en netlogo 167

both-ends que los links pueden ejecutar, que devuelve el conjunto de


agentes formado por sus dos extremos10 . 10
Es decir, both-ends={end1, end2}.

Podemos eliminar todos los links con la instrucción clear-links;


también identificar agentes que sean enlaces y, si lo son, su tipo, me-
diante los reportes booleanos is-link?, is-directed-link?, is-undirected-link?.
Al establecer una una relación entre dos agentes por medio de un
enlace se genera una relación de vecindad similar a la que los patches
tienen por su distribución en el plano: los vecinos de un agente serán
los otros agentes que están conectados con él por medio de enlaces.
El reporte más simple para obtener los vecinos de una tortuga es
link-neighbors, que devuelve el conjunto de tortugas que están co-
nectadas con ella por medio de enlaces no dirigidos. Por ejemplo (fi-
gura 11.10):
 
ask one−o f t u r t l e s [
s e t c o l o r green
ask l i n k −neighbors [ s e t c o l o r red ] ]
 
Figura 11.10: Vecinos en el grafo.
De forma análoga, si quisiéramos calcular los vecinos respecto de
una raza de enlaces no dirigidos tenemos: raza-neighbors.
Para el caso de enlaces dirigidos las tortugas disponen de dos posi-
bilidades: preguntar por los vecinos que le apuntan a ella, o preguntar
por los vecinos a los que ella apunto. Los comandos en el caso ge-
neral son, respectivamente: in-link-neighbors, out-link-neighbors
(figura 11.11). O en sus versiones para razas: in-raza-neighbors, out-
raza-neighbors.
 
ask one−o f t u r t l e s [
s e t c o l o r green
ask in −l i n k −neighbors [ s e t c o l o r red ]
ask out−l i n k −neighbors [ s e t c o l o r yellow ] ] Figura 11.11: Vecinos en el grafo dirigi-
  do.
también podemos hacer que un agente pregunte directamente si
otro está en su vecindad:

link-neighbor? tortuga2 (o la versión raza-neighbor? tortuga2):


devuelve true si existe un enlace no dirigido (de tipo raza) entre la
tortuga que ejecuta el reporte y tortuga2.

in-link-neighbor? tortuga2 (o in-raza-neighbor? tortuga2) : de-


vuelve true si existe un enlace dirigido (de tipo raza) que llega a la
tortuga que ejecuta el reporte desde tortuga2.

out-link-neighbor? tortuga2 (o out-raza-neighbor? tortuga2):


devuelve true si existe un enlace dirigido (de tipo raza) que va
desde la tortuga que ejecuta el reporte hasta tortuga2.

O, desde alguna de las tortugas, podemos encontrar el enlace que


la une a otra, si existe; si no, los siguientes reportes devuelven nobody:
jhon.sn@live.com 14 Jun 2017

168 netlogo

link-with tortuga2 (o raza-with tortuga2): devuelve el link no


dirigido (de tipo raza) entre la tortuga que ejecuta el reporte y
tortuga2.

in-link-from tortuga2 (o in-raza-from tortuga2): devuelve el link


dirigido (de tipo raza) que va desde tortuga2 hasta la tortuga que
ejecuta el reporte.

out-link-to tortuga2 (o out-raza-to tortuga2): devuelve el link


dirigido (de tipo raza) que va desde la tortuga que ejecuta el reporte
hasta la tortuga2.

De igual forma, si conocemos los dos agentes que están conecta-


dos, podemos acceder directamente al link que los une por medio del
reporte:
link agente1 agente2
o sus equivalentes: directed-link y raza-link.
Por último, cada agente puede tener acceso directo al conjunto de
enlaces a los que pertenece ejecutando los siguientes reportes:

my-links (my-raza): devuelve el conjunto de todos los enlaces no


dirigidos (de tipo raza) que están conectados con el agente (figura
11.12).

my-in-links (my-in-raza): devuelve el conjunto de todos los enla-


ces dirigidos (de tipo raza) que apuntan al agente.

my-out-links (my-out-raza): devuelve el conjunto de todos los en-


laces dirigidos (de tipo raza) que salen del agente.
Figura 11.12: Grado de los nodos de un
grafo.  
ask t u r t l e s [ s e t l a b e l count my− l i n k s ]
 
Las instrucciones para formar conjuntos de enlaces son:
link-set valor
(link-set valor1 valor2...)
El reporte anterior devuelve el conjunto de agentes formado por la
unión de todos los enlaces que recibe como entrada, que pueden ser
enlaces individuales, conjuntos de enlaces, nobody, o listas (incluso
listas enlazadas) que contengan los anteriores. Por ejemplo:
 
l i n k − s e t [ l i n k s ] o f t u r t l e s with [ c o l o r = blue ]
 
O, por ejemplo (figura 11.13):
 
ask one−o f t u r t l e s [
l e t e n l a c e s ( l i n k − s e t my−in − l i n k s my−out− l i n k s )
ask e n l a c e s [ s e t c o l o r red ] ]
Figura 11.13: Ejemplo de uso de  
link-set.
jhon.sn@live.com 14 Jun 2017

grafos/redes en netlogo 169

Para saber si una variable almacena un conjunto de enlaces dispone-


mos del reporte booleano is-link-set?. El reporte no-links devuelve
el conjunto de enlaces vacío.

Actividad: Crea un procedimiento para generar grafos bipartitos


completos. Para ello, crea tortugas que sean de 2 colores y después
genera los enlaces que conecten todas las de un color con todas las
del otro color.

Los enlaces como ataduras


Un enlace se puede establecer como una atadura (tie) entre los agen-
tes que conecta, de forma que el movimiento de uno de ellos afecte al
otro y provoque cambios en su localización y orientación. Para con-
trolar el tipo de atadura que un enlace produce entre los nodos que
conecta podemos asignar alguno de los valores siguientes a la propie-
dad tie-mode del enlace::

none: no existe atadura entre los agentes y sus movimientos son


independientes.

fixed: el enlace transmite el movimiento y orientación de una tortu-


ga a la otra; si una se mueve, la otra se mueve en la misma dirección
y longitud, y si una gira un ángulo, la otra también lo hará.

free: el enlace transmite el movimiento, pero no la orientación.

Se debe tener en cuenta que si el enlace es dirigido, la transmisión se


produce en una sola dirección: los movimientos de end1 se transmiten
a end2, pero no al revés.
Además del acceso directo a la propiedad anterior, existen varios
comandos que pueden ejecutar los enlaces y que modifican el valor de
dicha propiedad: tie, establece el valor de tie-mode del enlace a fixed;
untie, establece su valor none. Para asignar el valor free se debe hacer
directamente set tie-mode free, no existe un comando directo.

Actividad: Explora el funcionamiento del modelo Tie System


Example, que puedes encontrar en la carpeta de Code Examples.

Representación visual de los grafos

Hasta el momento simplemente podemos crear los enlaces, pero la


distribución que tienen los nodos en el mundo no mantiene relación
con la distribución del grafo que conforman. Normalmente suele ser
complicado ver la distribución que hay entre los nodos si no se orde-
nan adecuadamente, y las relaciones que se establecen pueden llegar
jhon.sn@live.com 14 Jun 2017

170 netlogo

a ser tan complejas, que muchas veces una buena distribución visual
es el mejor modo de aproximarnos a entenderlas.
NetLogo proporciona un conjunto de procedimientos automáticos
de distribución (layouts) que es aconsejable conocer para poder ex-
traer más conocimiento de las redes que se construyan.

distribución circular
La distribución más simple es la representación circular:
layout-circle nodos r
Sitúa los nodos uniformemente distribuidos en un círculo centrado
en el mundo con radio r (figura 11.14). Por lo general, espera que nodos
sea un conjunto de agentes, pero si se le pasa una lista de agentes usa
el orden de la lista para ordenar los nodos por ángulos crecientes.

Figura 11.14: Ejemplo de distribución


circular.
distribución radial
La distribución radial es adecuada para grafos que tienen pocos
11
A diferencia de la distribución circular, ciclos y se parecen a árboles. El comando para aplicar esta distribución
donde no tiene sentido, la distribución
es:
radial permite utilizar sólo un subcon-
junto de los enlaces para considerarlos layout-radial nodos enlaces raiz
en la nueva distribución. Toma como dato de entrada los nodos que se redistribuirán, los
enlaces que se considerarán para la distribución11 , y el agente que se
convertirá en raíz del árbol (figura 11.15). El proceso interno que se
sigue en la distribución de los nodos es el siguiente:

1. Toma el agente que será raíz y lo sitúa en el origen del mundo.

2. Los nodos que están conectados con él por medio de enlaces los
sitúa en círculo alrededor de él.

3. Repite este proceso usando circunferencias concéntricas de radio


Figura 11.15: Ejemplo de distribución ra-
dial. creciente y situando los nuevos nodos en los sectores cercanos a los
nodos con los que están conectados (por medio de enlaces).

distribución Tutte
12
Su nombre viene del matemático Wi- Esta distribución12 aplica un algoritmo de aproximaciones sucesivas
lliam Thomas Tutte, que fue quien la que converge a una posición estable para distribuir los nodos en el
propuso.
plano. El comando para obtener esta distribución es:
layout-tutte nodos enlaces radio
A grandes rasgos, el algoritmo interno que se sigue para obtener la
distribución es el siguiente:

1. Los agentes que están conectados por enlaces, pero que no apare-
cen en nodos, se sitúan en una circunferencia centrada en el mundo
jhon.sn@live.com 14 Jun 2017

grafos/redes en netlogo 171

y del radio indicado. Debe haber, al menos, tres agentes verificando


esta condición.

2. Los agentes que están en nodos se distribuyen de la siguiente forma:


cada agente se sitúa en el centroide (centro geométrico o baricentro)
del polígono formado por sus vecinos en enlaces.

3. Como es posible que la colocación secuencial de los agentes des-


place el centroide de otros agentes ya situados, el proceso se repite.
Al demostrarse que hay convergencia, estas repeticiones llevan fi-
nalmente a una distribución estable.
Los agentes iniciales (que se sitúan en la circunferencia exterior) sir-
ven para que el procedimiento iterado no colapse en un punto. Puedes
ver un resultado de su aplicación en la figura 11.16.

distribución spring Figura 11.16: Ejemplo de distribución


Tutte.
Pertenece a una colección de distribuciones basadas en fuerza, por-
que se consiguen modelando fuerzas de atracción y repulsión entre
los agentes que intervienen. En la aplicación del algoritmo interno que
se aplica para obtener esta distribución se supone que intervienen dos
tipos de fuerzas contrapuestas:
Los agentes se repelen entre sí como si fueran cargas eléctricas del
mismo signo.

Los enlaces actúan como muelles con una longitud ideal que, al ser
estirados o comprimidos, actúan como reguladores de la distancia
entre los agentes que están en sus extremos.
El comando para obtener esta distribución es:
layout −s p r i n g nodos−S e n l a c e s −S f −muelle
long −muelle f −r e p u l s i o n

Se deben tener en cuenta los siguientes detalles (figura 11.17):

sólo ordena los nodos que están en nodos-S y considera como mue-
lles los enlaces de enlaces-S. Los enlaces que hay en el mundo
Figura 11.17: Ejemplo de distribución
pero no están en enlaces-S son ignorados; los nodos que no están spring.
en nodos-S pero hacen uso de enlaces de enlaces-S son tratados
como puntos de anclaje y no se mueven.

La f-muelle indica la dureza del muelle, la resistencia a cambiar de


longitud (teniendo como ideal el valor long-muelle). Formalmente,
es la fuerza que el muelle ejerce si su longitud cambia en 1 unidad
(si su longitud es long-muelle, esta fuerza es 0). La dirección de la
fuerza es opuesta al cambio, de forma que si el muelle se estira, sus
nodos extremos estarán bajo una fuerza que los tiende a acercar; y
si se comprime, intentará separarlos.
jhon.sn@live.com 14 Jun 2017

172 netlogo

La f-repulsion indica la repulsión que hay entre nodos. Formal-


mente es la fuerza que dos nodos que están a distancia 1 sienten. Si
no hubiera enlaces, los nodos tenderían a separarse continuamente,
y es su acción conjunta con los muelles la que produce una distri-
bución estable.

La distribución spring se consigue por un procedimiento de apro-


ximaciones sucesivas, por lo que debemos indicar el número de re-
peticiones que se le permitirá dar, o bien poner su ejecución dentro
de un botón forever para poder iniciarlo o pararlo a voluntad.

Respecto a este tipo de distribución se debe indicar lo siguiente:

Proporciona buenos resultados cuando el número de nodos del gra-


fo no es muy elevado o cuando no tiene muchos enlaces en propor-
ción al número de nodos.

La implementación que incluye NetLogo exige que la longitud ideal


de todas las aristas sea la misma, aunque se pudiera conseguir una
mayor estabilidad permitiendo aristas de distinto tamaño.

Es una distribución muy flexible, por lo que puede adaptarse aña-


diendo propiedades adicionales, como son fuerzas en una sola di-
rección para grafos dirigidos, distribución de nodos en espacios 3D,
mezcla con otros métodos de distribución, etc.

Es muy intuitivo en su funcionamiento, por lo que el ajuste de sus


parámetros resulta más fácil que en otros algoritmos.

Es relativamente sencillo de implementar.

Permite un comportamiento interactivo, de forma que puedes ma-


nipular los nodos a la misma vez que se está ejecutando esta distri-
bución.

Se fundamenta en resultados teóricos sólidos.

Debe tenerse en cuenta que, si el grafo es muy grande, puede pre-


cisar de muchas iteraciones para una distribución correcta.

Y, por último, no siempre converge a la mejor representación, sino


13
Por lo que muchas veces se combi- que puede depender de la situación de la que se parta13 .
na con otras distribuciones que dan una
distribución inicial que se usa como pun-
to de partida de la distribución spring. Actividad: Crea un modelo que genere grafos al azar y que
se ordenen con un botón forever por medio de la distribución
spring. Añade controles de tipo slider para manipular en tiempo
de ejecución los parámetros de los que depende esta distribución y
comprueba los efectos de cada uno de ellos.
jhon.sn@live.com 14 Jun 2017

grafos/redes en netlogo 173

Ejemplos completos

Vamos a ver algunos ejemplos de algoritmos en grafos que pueden


resolverse de forma muy sencilla usando NetLogo. Serán planteados
como actividades, así que intenta resolverlos antes de mirar la solución
que se propone. En todos ellos supondremos que hemos creado una
familia nueva de tortugas, llamada nodos, para mantener los nodos del
grafo:
breed [nodos nodo]

Grafo completo

Actividad: Escribe un procedimiento que, dado n, genere el grafo


completo de n nodos (es decir, con todas las posibles aristas entre
ellos).

 
t o K−g r a f o [ n ]
c r e a t e −nodos n [
s e t shape " c i r c l e "
s e t c o l o r blue
c r e a t e −l i n k s −with o t h e r nodos ]
layout − c i r c l e nodos ( world−width / 2 ) − 2
end
 

Grafo aleatorio

Actividad: Escribe un procedimiento que, dados n y m, genere un


grafo aleatorio no dirigido de n nodos y m enlaces. Debe controlarse
el valor de m para que el grafo se pueda construir. ¿Cuál es el valor
máximo que puede tomar m?.

 
t o Grafo− a l e a t o r i o [ n m]
c r e a t e −nodos n [
s e t shape " c i r c l e "
s e t c o l o r blue ]
; Creamos a r i s t a s a l e a t o r i a m e n t e e n t r e nodos , h a s t a
; que lleguemos a t e n e r l a c a n t i d a d deseada
while [ count l i n k s < m] [
ask one−o f nodos [ c r e a t e −l i n k −with one−o f o t h e r nodos ] ]
layout − c i r c l e nodos ( world−width / 2 ) − 2
end
 
jhon.sn@live.com 14 Jun 2017

174 netlogo

Distancias en grafos

Actividad: Haz un procedimiento que, suponiendo que ya hay


un grafo creado que hace uso de nodos y links, reciba como dato
un nodo del grafo y etiquete el resto de nodos del mismo con la
distancia a él.

Vamos a dar dos soluciones a este problema. En la primera de ellas


aplicaremos un algoritmo que consiste en ir trabajando por niveles:
supuesto que tenemos etiquetados todos los nodos de nivel i, les pe-
dimos a sus vecinos no etiquetados que se etiqueten con la etiqueta
i+1. Una vez acabado ese nivel, incrementamos el valor de i para re-
llenar el siguiente.

 
t o D i s t a n c i a −desde [ nod− i n i c i o ]
ask nodos [ s e t l a b e l " " ]
ask nod− i n i c i o [ s e t l a b e l 0 ]
let i 0
while [ any ? nodos with [ l a b e l = i ] ] [
ask nodos with [ l a b e l = i ] [
ask l i n k −neighbors with [ l a b e l = " " ]
[ set label i + 1]]
set i i + 1 ]
14
Es equivalente a la anterior, pero usa la end
información que hay en las etiquetas de
 
los nodos directamente, sin necesidad de
un contador externo.
La segunda solución la hacemos sin contador, trabajando sobre los
vecinos de los nodos ya etiquetados14 (figura 11.18).

 
t o D i s t a n c i a −desde2 [ nod ]
ask nodos [ s e t l a b e l " " ]
ask nod [ s e t l a b e l 0 ]
while [ any ? nodos with
[ l a b e l ! = " " and
any ? l i n k −neighbors with [ l a b e l = " " ] ] ] [
ask nodos with
[ l a b e l ! = " " and
any ? l i n k −neighbors with [ l a b e l = " " ] ] [
let l label
ask l i n k −neighbors with [ l a b e l = " " ]
Figura 11.18: Ejemplo de distancias so-
[ set label l + 1]]]
bre un grafo. end
 
jhon.sn@live.com 14 Jun 2017

grafos/redes en netlogo 175

Componentes conexas

Actividad: Escribe un procedimiento que etiquete cada nodo


con un identificador que corresponda a la componente conexa a la
que pertenece. Es decir, se numeran las componentes conexas y
se etiquetan los nodos de cada componente con la etiqueta de la
componente a la que pertenecen.

El algoritmo que usaremos para calcular las componentes conexas


es simple:

Numeraremos las componentes conexas con valores consecutivos:


1, 2, 3,...

Cada nodo almacenará en su etiqueta el número correspondiente a


la componente conexa a la que pertenece.

Para cubrir toda una componente, se miran si quedan nodos sin


etiquetar. Si es así, se toma al azar uno de ellos y se le asigna el nú-
mero nuevo de componente. A continuación, su etiqueta se propaga
de forma recursiva entre sus vecinos.

El algoritmo es muy parecido al que se hizo para numerar los gru-


pos de colores en patches, pero ahora la vecindad que se considera es
la que viene determinada por los enlaces (figura 11.19):
 
t o componentes−conexas
ask nodos [ s e t l a b e l " " ]
l e t c o n t 0 ; contador para l a componente a c t u a l
; S i hay nodos s i n e t i q u e t a r es que
; hay componentes no marcadas
while [ any ? nodos with [ l a b e l = " " ] ] [ Figura 11.19: Ejemplo de cálculo de com-
s e t c o n t con t + 1 ponentes.
ask one−o f nodos with [ l a b e l = " " ] [
s e t l a b e l co nt
e x t i e n d e −componente co nt ] ]
end
 
Al final del proceso, la variable cont almacena el número total de Actividad: Modifica la so-
componentes conexas encontradas. El procedimiento auxiliar que pro- lución aquí dada para que,
paga la etiqueta a los vecinos no marcados es: en vez de etiquetar los nodos
  por componentes, adopten un
t o e x t i e n d e −componente [ c ont ]
color por cada componente.
ask l i n k −neighbors with [ l a b e l = " " ] [
s e t l a b e l con t
e x t i e n d e −componente c ont ]
end
 
jhon.sn@live.com 14 Jun 2017

176 netlogo

Grafos geométricos

Actividad: Escribe un procedimiento que, dados el número de


nodos y el radio, genere un grafo geométrico. Un grafo geométrico es
aquel que tiene sus nodos distribuidos en un espacio métrico (un
espacio en el que podemos medir distancias), y dos nodos están
conectados si su distancia es menor que el radio de conectividad
(figura 11.20).

 
t o grafo −geometrico [ n r ]
ca
c r e a t e −nodos n [ s e t x y random−xcor random−ycor ]
Figura 11.20: Ejemplo de grafo geométri- ask nodos [ c r e a t e −l i n k s −with o t h e r nodos in −r a d i u s r ]
co. end
 

Ejercicios

1. Haz un procedimiento que, supuesto que existe un grafo con nodos


y links, reciba como dato de entrada dos nodos y devuelva, si existe,
15
Puedes basarte en los que hemos visto un camino mínimo en el grafo que una esos dos nodos15 .
relacionados con distancias.
2. Haz un procedimiento que, dado un grafo, calcule su distribución
16
La distribución de grados es el histo- de grados16 y la represente como un histograma.
grama asociado a los grados de los no-
dos.
3. Haciendo uso de las instrucciones para manejar el ratón, genera
un procedimiento (que se ejecutará por medio de un botón forever)
que permita seleccionar un nodo de un grafo y resalte las aristas
incidentes en él y sus vecinos.

4. Haz un procedimiento de transmisión de mensajes en un grafo;


Puedes usar cualquiera de los que he-
17
dado un grafo17 :
mos ido generando en este capítulo.
a) El usuario puede seleccionar qué nodo será el que emita por
primera vez el mensaje.
b) El procedimiento general es que cada nodo que tiene un mensaje
se lo transmite a sus vecinos.
c) El procedimiento debe acabar automáticamente si no hay más
opciones de transmisión. ¿Qué condiciones son necesarias para
que esto ocurra?

¿Cuál es el número máximo de pasos que hace falta dar? ¿Tiene


alguna relación con alguno de los procedimientos que hemos visto
antes?
jhon.sn@live.com 14 Jun 2017

grafos/redes en netlogo 177

5. Busca información acerca del coeficiente de clustering y haz un


procedimiento que calcule dicho coeficiente para todos los nodos
de un grafo y lo use como etiqueta de cada nodo. Haz una repre-
sentación de la distribución (histograma) de clustering del grafo.

6. Haz un procedimiento que, dado un grafo, G, y un subconjunto 18


El subgrafo generado es el mayor grafo
que puedes conseguir con esos nodos y
de nodos suyo, calcule el subgrafo de G generado18 por ese sub-
haciendo uso de aristas de G.
conjunto. Por ejemplo, coloreando nodos y aristas para resaltarlo.
Haz también una variante en la que sea un reporte que devuelva el
conjunto de agentes dado por las aristas que correspondan.

7. Haz un procedimiento que, dado un grafo conexo, calcule un árbol


dentro que tenga todos los nodos; es lo que se llama un árbol span-
ning del grafo. Comprueba que, en general, este árbol no es único
(figura 11.21).

8. Haciendo uso de las ataduras (tie) haz un procedimiento que di-


buje cicloides19 . Puedes componer distintos movimientos para con-
seguir cicloides muy variadas: Figura 11.21: árbol spanning de un grafo
geométrico.

19
Una cicloide, en su versión más simple,
es una curva generada por un punto per-
teneciente a una circunferencia genera-
triz al rodar sobre una línea recta direc-
triz sin deslizarse.

9. Generación de grafos por enlace preferencial:

a) Abre el modelo Preferential Attachment20 de la Biblioteca de 20


Este modelo propone un método pa-
NetLogo. ra generar grafos que entran dentro de
la denominación de Libre de escala, y
b) Ejecuta el modelo varias veces y observa la gráfica que muestra que son muy habituales en redes rela-
cionadas con sistemas complejos (figura
su distribución de grados y la representación log-log de dicha 11.22).
distribución. ¿Qué significa que esta segunda gráfica sea (aproxi-
madamente) lineal?
c) Lee la información que viene en su pestaña de código e intenta
comprender el procedimiento que sigue para formarse.
d) Asigna una propiedad adicional a los nodos, y haz que la proba-
bilidad de que un nodo sea seleccionado en cada paso dependa
de su grado y de esta nueva propiedad (puedes introducir un
slider para controlar cuánto afecta cada una de estas cantidades
y observar los diversos comportamientos que surgen).

Figura 11.22: Grafo libre de escala.


jhon.sn@live.com 14 Jun 2017

178 netlogo

10. Difusión de propiedades numéricas en grafos:


Ya hemos visto un procedimiento, llamado diffuse, que permite
diseminar una propiedad entre los patches (toma una propiedad
21
Un procedimiento similar a este que numérica y en cada iteración cada patch disemina una cierta pro-
se describe aquí es el que se puede usar
porción de su valor entre sus vecinos). En este ejercicio vamos a
para obtener el valor de influencia entre
páginas web usado en el algoritmo Page- realizar un procedimiento similar para grafos21 :
rank, que fue usado originalmente por el
buscado Google. a) Añade a los nodos del grafo una propiedad numérica, valor,
que será la que vamos a diseminar, y crea otra propiedad que
usaremos como auxiliar, llamada diseminado-de-vecinos.
b) Haz un procedimiento22 que reciba como dato de entrada un
número, p ∈ [0, 1], que indicará la proporción de valor que cada
22
Normalmente, usaremos este procedi- nodo distribuirá entre sus vecinos. En un primer paso, hacemos
miento dentro de una estructura repeti- que la propiedad diseminado-de-vecinos valga 0 en todos los
tiva tipo repeat o en un botón forever.
nodos. Después, cada nodo distribuye p*valor uniformemente
entre sus vecinos (para ello, hacemos que sus vecinos acumu-
len en diseminado-de-vecinos esta cantidad). Y por último, ca-
da nodo pone valor = (1-p)valor + diseminado-por-vecinos,
es decir, lo que no había repartido junto con lo que ha recibido
23
¿Por qué crees que es necesario seguir de los demás.23
estos pasos y no hacerlo todo de una
vez? c) Asignando unos valores aleatorios iniciales a valor, ejecuta el
procedimiento anterior varias veces y haz que los nodos mues-
tren en su etiqueta este valor. ¿Observas algún comportamiento
en la variación de los valores?
d) Si comienzas por los mismos valores aleatorios, ¿cómo afecta el
valor de p al proceso?
e) ¿Puedes dar alguna relación entre los nodos que obtienen mayo-
res beneficios y la posición que ocupan en el grafo?
f ) Puedes hacer una modificación del procedimiento anterior para
que funcione sobre grafos dirigidos, donde la diseminación se
produce únicamente hacia los nodos vecinos a los que podemos
acceder de forma dirigida.
jhon.sn@live.com 14 Jun 2017

12
Mezclando agentes móviles y redes

Como hemos visto en el capítulo anterior, una red en NetLogo es


una combinación de agentes móviles y enlaces. Los segundos sólo tie-
nen sentido si existen los primeros, porque un enlace, forzosamente,
ha de conectar dos tortugas y no puede existir sin sus extremos.
Por otra parte, ya desde el segundo capítulo, hemos estado traba-
jando con los patches como soporte del mundo geométrico en el que
se mueven las tortugas y vimos que NetLogo ofrece la posibilidad de
modificar la topología de dicho mundo para que, a pesar de ser finito,
pueda ser ilimitado en una dirección o en las dos, caso este último en
que queda convertido algo similar a un cilindro o a un toro matemáti-
co.
Veremos ahora cómo utilizar las redes para generar un soporte que
ofrezca topologías alternativas. Vamos a aprender a crear una red que
sirva de soporte para los agentes, de forma que las relaciones de ve-
cindad existentes en la red determinen los movimientos que pueden
realizar los agentes y las vecindades existentes entre ellos. Antes de
entrar en el uso de redes generales, analizaremos una forma más di-
recta de conseguir otra geometría local para las tortugas haciendo uso
de una distribución de patches falsos que proporcionan una teselación
hexagonal del plano.

Teselaciones hexagonales

Si hasta ahora el plano sobre el que están las tortugas aparecía te-
selado por patches cuadrados, figura caracterizada por su fácil mani-
pulación geométrica, lo cierto es que polígonos como los hexágonos
pueden realizar una función similar (figura 12.1).
Si nos fijamos en la figura anterior, podemos observar que vertical-
mente las columnas de los hexágonos de una teselación se comportan
como patches, en el sentido de que están homogéneamente distribui-
dos y sin traslaciones horizontales; sin embargo, de una columna a la
siguiente se produce un desplazamiento vertical de medio hexágono. Figura 12.1: Teselación hexagonal del
plano.
jhon.sn@live.com 14 Jun 2017

180 netlogo

Tal distribución nos puede dar una idea de cómo conseguir formar
esta teselación considerando únicamente los patches:

1. Como primer paso, vamos a colocar en cada patch una tortuga con
forma hexagonal, sin preocuparnos de que logren la teselación re-
querida (figura 12.2).

2. Y ahora vamos a desplazar las columnas alternas media unidad


para que el aspecto sea el que queremos (figura 12.3).

Aún no es suficiente: es verdad que hemos conseguido darle el aspecto


visual de una teselación hexagonal, pero no hemos proyectado la geo-
Figura 12.2: Primer paso para conseguir
la teselación hexagonal del plano.
metría local al no haber indicado que los vecinos de cada hexágono
sean los 6 vecinos que le corresponden. Para ello, debemos calcular
para cada hexágono la posición relativa de los otros hexágonos que
serán sus vecinos y almacenarlos en una propiedad que crearemos en
ellos con dicho fin1 (hex-vecinos). Para los hexágonos que han sido
desplazados los vecinos serán:
hexagonos−on p a t c h e s at −p o i n t s
[ [ 0 1 ] [ 1 0 ] [ 1 − 1] [ 0 − 1] [ − 1 − 1] [ − 1 0 ] ]

Y para los hexágonos que no han sido desplazados:


hexagonos−on p a t c h e s at −p o i n t s
[ [ 0 1 ] [ 1 1 ] [ 1 0 ] [ 0 − 1] [ − 1 0 ] [ − 1 1 ] ]

Figura 12.3: Segundo paso para conse- El siguiente código da una idea de cómo se puede conseguir una ra-
guir la teselación hexagonal del plano. za de tortugas que funcione como una teselación hexagonal del plano
que proporciona la adecuada vecindad:
 
breed [ h e x c e l d a s hexcelda ]
1
Realmente, desde el punto de vista re-
lativo, sólo dependerá de si es uno de
los hexágonos colocados en una colum- hexceldas −own [
na que ha sido desplazada o no, debido a hex−v e c i n o s ; ; Contiene l a s 6 h e x c e l d a s v e c i n a s
que las tortugas que han sido desplaza- ]
das 0.5 unidades hacia abajo siguen per-
teneciendo al patch que las creó.
t o setup − t e s e l a c i o n
s e t −d e f a u l t −shape h e x c e l d a s " hex "
; D i s t r i b u c i ó n de l a s t o r t u g a s en donde l e s corresponde
ask p a t c h e s [
sprout −h e x c e l d a s 1 [
s e t c o l o r white
i f pxcor mod 2 = 0 [ s e t ycor ycor − 0 . 5 ] ] ]
; Asignación de l o s v e c i n o s de cada c e l d a
ask h e x c e l d a s [
i f e l s e pxcor mod 2 = 0
[ s e t hex−v e c i n o s hexceldas −on p a t c h e s at −p o i n t s
[ [ 0 1 ] [ 1 0 ] [ 1 − 1] [ 0 − 1] [ − 1 − 1] [ − 1 0 ] ] ]
[ s e t hex−v e c i n o s hexceldas −on p a t c h e s at −p o i n t s
[ [ 0 1 ] [ 1 1 ] [ 1 0 ] [ 0 − 1] [ − 1 0 ] [ − 1 1 ] ] ] ]
end
 
jhon.sn@live.com 14 Jun 2017

mezclando agentes móviles y redes 181

Para que la utilidad sea completa, necesitamos añadir otra raza de


tortugas que sea móvil y que pueda desplazarse por esta nueva tesela-
ción basándose únicamente en la información local que le proporciona
cada celda. Para ello, podemos añadir el siguiente código:
 
breed [ moviles movil ]
moviles −own [ p o s i c i o n ]
t o setup −moviles
c r e a t e −moviles 1 [
s e t c o l o r blue
s e t p o s i c i o n one−o f h e x c e l d a s
move−t o p o s i c i o n ]
end
t o mover−movil
l e t v e c i n a s [ hex−v e c i n o s ] o f p o s i c i o n
s e t p o s i c i o n one−o f v e c i n a s
move−t o p o s i c i o n
end
 
Observemos que cada agente móvil tiene una propiedad, posicion,
en la que almacenamos en qué celda se encuentra en cada momento2 . 2
Cuando usamos los patches esta condi-
Cada vez que creemos un móvil, hemos de asignarle una posición ade- ción no es necesaria porque las coorde-
nadas de la tortuga determinan con faci-
cuada por medio de las hexceldas. Posteriormente, cuando queramos