« TC: Conjuntos Recursi… « || Inicio || » Usando Patches de Net… »

NetLogo: Conceptos Básicos

Última modificación: 9 de Noviembre de 2017, y ha tenido 61 vistas

Etiquetas utilizadas: || || ||

¿Qué es NetLogo?

NetLogo es un lenguaje de programación simple y adaptado al modelado/simulación de fenómenos en los que aparecen muchos individuos interactuando (como, por ejemplo, en los fenómenos habituales que se dan en la naturaleza, las sociedades, o muchas áreas de las ciencias):

  • es adecuado para modelar sistemas complejos que evolucionan en el tiempo,
  • es adecuado para modelar centenares o miles de individuos (personas, bacterias, insectos, organizaciones, nodos de un grafo, etc.) que interactúan entre sí y con el entorno,
  • permite explorar la conexión entre las interacciones locales a nivel de individuo y los patrones macroscópicos que emergen de dichas interacciones.

Es también un ambiente de programación fácil e intuitivo de usar para crear y probar nuevos modelos:

  • Permite abrir y experimentar simulaciones.
  • Permite crear modelos rápidamente para comprobar hipótesis sobre sistemas descentralizados.
  • Viene con una gran biblioteca de simulaciones en ciencias naturales y sociales, que pueden ser usadas y modificadas.
  • Los modelos se constryuen usando un lenguaje muy simple, que incluso es adecuado como primer lenguaje de programación, y que tiene inspiración en el paradigma funcional/declarativo.
  • Posee una interfaz gráfica intuitiva y fácil de usar.

A pesar de todas las ventajas, debe tenerse presente que el objetivo de NetLogo es proporcionar una herramienta de prototipado y desarrollo rápido de modelos de simulación, no de aplicaciones finales.

Hay dos maneras de ejecutar NetLogo:

  1. Descargando e instalando el programa: lo que permite ejecutarlo como cualquier otro programa habitual.
  2. Usando la nueva versión Web del software desde un navegador (está en desarrollo y todavía no presenta las mismas funcionalidades que la versión de escritorio, pero ya está muy avanzado).

A pesar de ser interesante ejecutar un modelo en NetLogo Web, la ejecución como programa independiente ofrece una serie de ventajas:

  • El programa se ejecuta más rápido, por lo que los modelos van más deprisa.
  • Está disponible un menú para edición y tiene muchas otras funcionalidades disponibles.
  • Permite crear nuevos modelos.

Para descargar los ficheros de instalación de NetLogo, basta ir al sitio http://ccl.northwestern.edu/netlogo/. El software funciona en varios sistemas operativos: Windows, MacOS, y Linux, siempre y cuando haya instalada una máquina virtual Java (JVM - Java Virtual Machine). En la versión de descarga para Windows existe la opción de descargar una versión que incluye la JVM necesaria.

Conceptos básicos

A pesar de que el lenguaje NetLogo es bastante fácil de aprender, no pone límites a la sofisticación de los modelos que pueden ser creados con él. Tiene como orientación principal la de modelar sistemas compuestos por individuos que interaccionan entre sí y con el medio, basándonse en el paradigma de modelado por agentes:

  • Un agente es un individuo sintético, autónomo y dotado de reglas o características que gobiernan su comportamiento y su capacidad de tomar decisiones.
  • Loss agentes interaccionan entre sí y con el medio ambiente obedeciendo un conjunto de reglas.
  • Los agentes son flexibles y tienen capacidad de aprender y adaptar su comportamiento basándose en la experiencia. Esta capacidad requiere alguna forma de memoria. Los agentes incluso pueden tener reglas para modificar sus reglas de comportamiento.

Agentes

NetLogo viene equipado con cuatro tipos de agentes:

  • Agentes móviles (tortugas): son los agentes que se mueven por el mundo. El mundo es (en principio) 2D y está dividido en una malla de patches.
  • Agentes inmóviles (patches): cada una de las divisiones cuadradas del mundo.
  • Agentes conectores (links): agentes que conectan entre sí los agentes móviles (a modo de aristas de un grafo).
  • Agente observador: no tiene localización, y puede interactuar con todos los elementos del mundo. De alguna forma, representa al superagente que puede controlar todas las demás componentes del mundo.

Podemos controlar un modelo de NetLogo por medio de botones e interruptores. Además, el sistema ofrece la posibilidad de controlar los modelos por medio del centro de comandos. Desde el que se pueden ejecutar comandos sobre un modelo y modificar sus parámetros.

Para familiarizarnos con los comandos básicos de NetLogo, vamos a construir un acuario virtual de tortugas y peces. Al iniciar NetLogo nos encontramos con un modelo vacío, que podemos modificar y ampliar a nuestro antojo. 

En general, las tortugas y los patches se controlan usando respectivamente los siguientes comandos:

ask turtles [ comandos ] 
ask patches [ comandos ]

Comenzaremos por representar el agua dando un color azul a los patches. Para ello, escribimos el comando

ask patches [set pcolor blue] 

en el centro de comandos y pulsamos enter.

Aunque los patches ya están creados en el mundo cuando comenzamos a trabajar con él, no ocurre lo mismo con las tortugas (ni con los links), que hay que crearlos explícitamente para poder usarlos. Tanto el observador (observer), como las tortugas o los patches pueden crear tortugas nuevas, cada uno usando un comando distinto. Los comandos respectivos para ello son:

  • Observador: crt n (versión abreviada de create-turtles n). Este comando crea n tortugas todas ellas localizadas en el origen (aunque con orientaciones y colores al azar).
  • Tortugas: hatch n [ comandos ]. La tortuga genera n nuevas tortugas idénticas a ella y en la misma posición (xcor,ycor), posteriormente, cada cuna de las nuevas tortugas ejecutará los comandos.
  • Patch: sprout n [ comandos ]. Del patch "brotan" n tortugas localizadas en las coordenadas (enteras) del patch (pxcor,pyxor) y posteriromente, las nuevas tortugas ejecutará los comandos.

Vamos a colocar en nuestro ejemplo 10 tortugas en el acuario. Escribimos el comando

crt 10 

en el centro de comandos y pulsamos enter. Inicialmente, las tortugas están agrupadas en el patch que ocupa el origen de coordenadas, pero podemos moverlas a sus posiciones finales.

En NetLogo además de la posición (xcor,ycor), las tortugas también tienen una orientación(heading) medida en grados a partir del eje y. Para asignar valores a estas propiedades se dispone de los siguientes comandos:

  • set heading θ, donde θ es un número real entre 0 y 360.
  • setxy x y, donde (x,y) es un punto dentro del dominio.
  • set xcor x, donde x es un número real dentro del dominio.
  • set ycor y, donde y es un número real dentro del dominio.

Y para modificarlos también podemos usar los siguientes comandos:

  • fd l (forward l) La tortuga avanza l pasos en la dirección de su orientación.
  • lt θ (left θ.). La tortuga gira θ grados a su izquierda.
  • rt θ (right θ). La tortuga gira θ grados a su derecha.

Variables

Ya hemos visto algunas variables que vienen predefinidas en NetLogo, por ejemplo pcolor en el caso de patches y xcor, ycor, heading y color en el caso de las tortugas. Podemos crear nuestras propias variables, que pueden ser globales, cuando representan una propiedad global del sistema (por ejemplo, el número de generaciones que se van formando), variables que pertenecen a los patches y que son usadas para representar atributos de memoria de cada tesela de terreno (por ejemplo, la altitud de esa tesela, o la cantidad de comida que hay en ese trozo de suelo), o variables que pertenecen a tortugas y que representan igualmente atributos de memoria para cada una de las tortugas (por ejemplo, el sexo o la posición que ocupaba antes).

A continuación damos ejemplos de estos tres tipos de variables que se pueden encontrar en NetLogo:

  • Variables intrínsecas a cada patch:
patches-own [ altitud poblacion ]
  • Variables intrínsecas a cada tortuga:
turtles-own [ sexo posicion-anterior ]
  • Variables globales:
globals [ generacion ]

Estos comandos solo funcionan en la pestaña Procedures, que es donde se añade el código del modelo (con la ventaja lógica sobre el centro de comandos). Como ejemplo de aplicación vamos a dotar de sexo a las tortugas añadiendo el comando

turtles-own [ sexo ] 

en la pestaña Procedures y a continuación añadimos el comando

ask turtles [ set sexo (random 2) ] 

en el centro de comandos para dar valores (0 o 1) a la variable sexo que acabamos de crear.

NetLogo viene provisto de una extensa colección de funciones, por ejemplo:

  • count turtles. Cuenta el número de tortugas.
  • random n. Genera un número aleatorio entre 0 y n - 1.
  • random-float x. Genera un número aleatorio real en [0,x).
  • random-xcor, random-ycor. Genera números aleatorios reales para las coordenadas x e y, respectivamente, dentro del dominio gráfico.

Por supuesto, también permite construir nuestras propias funciones, como veremos más adelante.

Conjuntos de Agentes y Funciones

Conjuntos de agentes

Vamos ahora a usar el sexo de las tortugas para modificar su asepcto visual. Una forma de hacerlo consiste en dividir las torugas por el valor que contenga su variable sexo. Para ello podemos usar el comando

ask turtles with [ sexo = 0 ][ set color pink]

Lo que el comando anterior consigue es ejecutar una acción determinada sobre el subconjunto de las tortugas que verifica una cierta propiedad.

El NetLogo proporciona herramientas muy potentes para aplicar comandos selectivamente a un conjunto de agentes que verifiquen cierta propiedad por medio del ask conjunto-de-agentes [ comandos ]. En realidad, esta es la forma general de la instrucción ask, pero anteriormente la habíamos aplicado al caso particular en el que considerábamos como conjunto de agentes el total de tortugas (turtles) o patches. Algunos ejemplos de cómo construir conjuntos de agentes son:

  • turtles with [ sexo = 1 ]. Tortugas de sexo = 1.
  • turtles with [ xcor > 0 ]. Tortugas en el lado derecho del mundo.
  • patches with [ pycor > 0 ]. Patches en el "hemisferio" norte.
  • turtles-here. Todas las tortugas en cietro patch, esta forma debe ser usada por otra tortuga o patch. Por ejemplo la regla: las tortugas infectadas (color rojo) infectan a las demás que están en el mismo patch sería traducida al siguiente comando:
    ask turtles with [ color = red ][ ask turtles-here [set color red] ]
  • other turtles. Similar a turtles, pero en este caso no se considera la tortuga que ejecuta la llamada.

Estructuras de control

Vamos a cambiar también la apariencia visual de las tortugas de sexo = 1. En este caso vamos a usar estructuras de control para ilustrar su uso. Para ello, podemos ejecutar el comando

ask turtles [ if (sexo = 1) [ set color sky ] ]

Las estructuras de control ofrecen otra forma de ejecutar selectivamente acciones en NetLogo:

  • if condicion [ comandos ]. Si se verifica la condición, se ejecutan los comandos. Por ejemplo:

    if (sexo = 1) [ set color sky ]
  • ifelse condicion [ comandos1 ][ comandos2 ]. Si se verifica la condición, se ejecutan los comandos1, si no, los comandos2. Por ejemplo:
    ifelse (sexo = 0) [ set color pink ][ set color sky ]
  • while [ condicion ][ comandos ]. Mientras se verifique la condición se ejecutan los comandos. Por ejemplo:
    ask turtles [ while [ ycor < 0 ][ set ycor (ycor + 1) ] ] 
    (las tortugas se desplazan hacia el hemisferio norte).

NetLogo permite combinar predicados por medio de operadores lógicas para construir estructuras más sofisticadas. Las tres operaciones más comunes son and (y), or (o) y not(no).

Especies (rebaños, familias,...)

En el sistema no estamos limitados al uso de una sola especie de agentes móviles (tortugas), sino que podemos crear tantas como queramos, cada una con sus propios atributos y comportamientos. De esta forma podemos imitar ecosistemas compuestos por varias especies o economías sofisticadas formadas por distintos tipos de productores y consumidores.

Para crear una especie se usa el comando:

breed [ especie-plural especie-singular ] 

al principio de la parte de Procedures.  De esta forma, nos podemos referir a la especie entera o a uno de sus individuos. Algunos comandos y reportes usarán nombre plural (la de la especie), como por ejemplo create-, mientras que otros harán uso de la versión singular, -neighbor (entorno del individuo). En general, las reglas que sigue para usar uno u otro son las derivadas del lenguaje natural.

Una vez definida una especie nueva, automáticamente se genera un conjunto de agentes asociado a ella, de forma que todo lo que hemos visto para conjuntos de agentes en general se aplica para seleccionar individuos de una misma especie.

Por ejemplo para crer dos especies (ranas y peces) usaríamos los comandos:

breed [ ranas rana ] 
breed [ peces pez ]

Una vez creadas, todas las nuevas especies tienen comandos equivalentes a los de las tortugas, que son heredados automáticamente. Para usarlos basta sustituir, en cada comando, la palabra clave turtles por el del nombre de la especie. Por ejemplo:

  • create-turtles n
  • ask turtles [ comandos ]
  • ask turtles [ hatch n [ comandos ] ]
  • count turtles
  • ask turtles with [ condición ][ comandos ]
  • turtles-here
  • other turtles
  • turtles-own
  • create-peces n
  • ask peces [ comandos ]
  • ask peces [ hatch n [ comandos ] ]
  • count peces
  • ask peces with [ condición ][ comandos ]
  • peces-here
  • other peces
  • peces-own

Además, cada especie hereda las siguientes primitivas de forma automática: create-hatch-sprout--here-at-on y is-?.

Incluso, los individuos de una especie pueden migrar de especie. Por ejemplo un pez no tiene que ser pez el resto de su vida, y podría convertirse en un anfibio (suponiendo que hemos declarado ambas especies), modificando adecuadamente la propiedad breed que tienen todos los agentes:

ask one-of peces [ set breed ranas]

Como apoyo visual, el NetLogo ofrece también una forma de modificar el aspecto de las diversas familias de tortugas que podemos crear por medio del comando: 

ask turtles [ set shape nombre-de-forma ]

Ahora podemos aplicar los comandos para crear nuestro acuario de tortugas y peces. Para ellos, escribimos en Procedures:

breed [ ranas rana ] 
breed [ peces pez ]
tortugas-own [ sexo ]

y en el centro de comandos:

ask patches [set pcolor blue] 
create-ranas 10
ask ranas [fd 10]
ask ranas [set sexo (random 2)]
ask ranas [if (sexo = 0) [set color pink]]
ask ranas with [sexo = 1] [set color sky]
create-peces 5
ask peces [fd 5]
ask ranas [set shape "frog"]
ask peces [set shape "fish" set color green]

Para cada individuo se puede preguntar por la especie a la que pertenece, ya que automáticamente se añade entre sus variables una especial, de nombre breed, en la que almacena el nombre de su especie. Por ejemplo:

if breed = peces [ ... ]

Gracias a esta variable, podemos hacer que un individuo cambie de especie (sí, es verdad que no es algo habitual en la biología, pero pensemos que las especies pretenden ser tan generales como para representar cualquier tipo de familia de agentes). Para ello basta usar la palabra clave set tal y como hacemos con cualquier variable:

ask one-of peces [ set breed ranas ]

Acciones y funciones

NetLogo también permite la construcción de nuestros propios comandos. El uso más común es el de los acciones, que son como guiones que agrupan en unidades lógicas un conjunto de comandos que se repite habitualmente, lo que facilita su ejecución y modificación en caso de necesidad. Se definen de la siguiente forma:

to nombre-accion [parametro1 parametro2 ... parametron] 
comando-1
comando-2
comando-3
...
end

Para llamar una rutina se usa directamente su nombre junto con los valores asociados a los parámetros de entrada.

Las funciones son otra forma de agrupar comandos, cno la diferencia de que una función devuelve un valor.

to-report nombre-funcion [parametro1 parametro2 ... parametron]
    comando-1
    comando-2
    ...
    report val
end

Por ejemplo:

to-report cuadrado [ x ] 
report x*x
end

Experimentos

BehaviorSpace es una de las herramientas integradas en NetLogo que permite realizar experimentos sobre los modelos. Su función básica consiste en hacer correr el modelo muchas veces, modificando sistemáticamente los parámetros del modelo y grabando los resultados de cada ejecución.

Es habitual que los modelos tengan muchos parámetros de los que dependen, cada uno abarcando un rango. Es habitual que la modificación de dichos parámetros provoque un cambio drástico en el comportamiento del sistema que está siendo modelado. En los sistemas complejos suele ser especialmente díficil conocer a priori los valores de los parámetros para los que el modelo va a segur un comportamiento interesante (para muchos de los posibles valores el modelo tendrá un comportamiento absolutamente carente de interés).

Vamos a tomar un ejemplo muy simple, el modelo de propagación del fuego por un bosque, uno de los que viene de ejemplo con la distribución de NetLogo, en el que el fuego comienza por el lado izquierdo del mundo propagándose por contacto entre árboles. En el modelo únicamente disponemos de un parámetro que es la densidad de árboles en el bosque (que puede oscilar entre 0 y 100) y medimos la evolución en la proporción de árboles quemados. Se puede observar que el modelo presenta una transición de fase muy brusca en la que, para ciertos valores de la densidad (por debajo de una franja muy estrecha) la propagación del fuego es muy baja, frente a aquellos valores de densidad por encima de dicha franja, para los que la proporción final de árboles quemados ronda el 100%.

Por supuesto, podríamos ir haciendo diversas ejecuciones del modelo modificando manualmente la densidad, pero el proceso es tedioso cuando el espacio de parámetros es excesivamente grande. Es aquí donde entra en juego la herramienta BehaviorSpace, que nos permite automatizar este proceso e ir almacenando los resultados que nos interesen en un fichero (en forma de hoja de cálculo o de tabla) para ser analizados posteriormente con la herramienta adecuada.

En la siguiente figura vemos el cuadro de diálogo correspondiente a la generación de experimentos, y se muestran las características de un experimento: las repeticiones para cada combinación de valores de los parámetros, cómo se modifican las variables involucradas, cómo se realizan las mediciones en el modelo, etc:

« TC: Conjuntos Recursi… « || Inicio || » Usando Patches de Net… »