lunes, 1 de julio de 2013

Netlogo: Una introducción

Programación en NetLogo
Por Juan MC Larrosa

A1. Introducción
NetLogo es un entorno de modelado programable para simular fenómenos naturales y sociales desde la perspectiva de la modelización basada en agentes. Fue escrito por Uri Wilensky en 1999 (Wilensky, 1999) y ha estado en constante evolución desde entonces en el Center for Connected Learning and Computer-Based Modeling (Centro para el Aprendizaje Conectado y la Modelización informatizada) de la Northwestern University. Es especialmente adecuado para el modelado de sistemas complejos dinámicos. Los creadores de modelos pueden dar instrucciones a los cientos o miles de "agentes" de todos los que operan de forma independiente. Esto hace que sea posible explorar la conexión entre el comportamiento a nivel micro de los individuos y el macro-nivel de los patrones que emergen de la interacción de muchos individuos.
El programa se presenta con una amplia documentación y tutoriales. Es provisto con una biblioteca de modelos, que es una gran colección de simulaciones pre-escritas que pueden ser utilizadas y modificadas. Estas simulaciones abordar muchas áreas de contenido en las ciencias naturales y sociales, incluyendo la biología y la medicina, la física y la química, las matemáticas y ciencias de la computación, y la economía y la psicología social.
Es la generación siguiente de una serie ambientes multi-lenguajes de modelado de agentes que se inició con StarLogo. NetLogo se ejecuta en la máquina virtual Java, así que funciona en todas las principales plataformas (Mac, Windows, Linux, et al). Se ejecuta también como una aplicación independiente. Modelos y actividades HubNet se puede ejecutar como applets de Java en un navegador web.
Dada la teoría expuesta en el segundo capítulo y la descripción presentada en el tercer capítulo sobre los algoritmos genéticos (AG), el presente capítulo plantea la modelización del esquema teórico de juegos de formación de redes en un esquema de AG.
En este capítulo se presentará los experimentos computacionales para verificar como los modelos teóricos son modelados y analizados mediante el esquema de algoritmos genéticos. En ese sentido un esquema general será presentado con variaciones en el esquema de fitness el cual será adaptado a cada modelo particular proveyendo esto la adaptación a cada modelo teórico.
El modelado será desarrollado en un ambiente de programación basada en agentes llamado Netlogo.  Ese ambiente de programación ha sido creado en Java e interpreta un lenguaje de programación denominado Quasi-Pearl. En todos los casos analizados se generará una población inicial aleatoria (o una serie de poblaciones) a partir de la cual se valorará su desempeño y mediante diferentes estrategias de selección se extraerán individuos cuales serán apareados para obtener nuevos individuos y así generar una nueva población desarrollándose este procedimiento hasta la activación de algún procedimiento de finalización.

A.2 Esquema general
El código presenta una interface en donde se aprecia una red circular con un mínimo de tres nodos y un máximo de 100, pudiéndose elegir el número de nodos de la que se pretende analizar a través movilizar un menú deslizante a la derecha. Del mismo modo se presentan diversos menúes desplegables, deslizantes y botones de activación para ir seleccionando las diversas configuraciones de algoritmo genético. Entre las opciones se encuentran seleccionar los parámetros de los operadores genéticos así como elegir diversas estructuras de costos de interconexión y recepción de información directa o indirecta. A medida que el algoritmo realiza la búsqueda de las estructuras evolutivas de equilibrio va presentando cada una de las corridas en pantalla. Parte de la información se presenta en menús de la interfaz. El Gráfico 1 muestra la interfaz de uno de los cuatros códigos realizados para este trabajo, siendo todos básicamente similares.
Gráfico 1. Interface




A.3 Principios de programación en ambiente NetLogo
Agentes
El mundo NetLogo se compone de los agentes. Los agentes son seres que pueden seguir las instrucciones. Cada agente puede llevar a cabo su propia actividad, todo simultáneamente.

En NetLogo, hay cuatro tipos de agentes: las tortugas, los parches, los vínculos, y el observador. Las tortugas son los agentes que se mueven alrededor del mundo. El mundo es de dos dimensiones y se divide en una cuadrícula de parches. Cada parche es un cuadrado de "tierra" sobre las que las tortugas pueden moverse. Los enlaces son los agentes que conectan dos tortugas. El observador no tiene un lugar - usted puede imaginarlo cómo mirando al mundo de las tortugas y los parches.

Cuando NetLogo se inicia, no hay tortugas todavía. El observador puede crear nuevas tortugas. Los parches pueden crear nuevas tortugas también. (Los parches no se pueden mover, pero por lo demás son tan "vivos", como las tortugas y el observador son.)

Los enlaces no tienen las coordenadas, sino que se tienen dos extremos (cada una tortuga). Enlaces aparecer entre los dos extremos, a lo largo de la ruta más corta posible, incluso si eso significa envolver todo el mundo.

La forma en que el World o lanscape de los parches está conectado puede cambiar. Por defecto, el mundo es un toro que significa que no está acotado, pero "se ajusta" - así que cuando una tortuga se mueve más allá del borde del mundo, desaparece y reaparece en el borde opuesto y cada parche tiene el mismo número de " muestras cercanas ", si usted es un parche en el borde del mundo, algunos de sus" vecinos "están en el borde opuesto. Sin embargo, puede cambiar las configuraciones de ajuste con el botón Configuración. Si el envase no está permitido en una dirección dada a continuación, en esa dirección (X o Y) el mundo es limitada. Parches a lo largo de esa frontera que tenga menos de 8 vecinos y las tortugas no se mueve más allá del borde del mundo. Vea la sección de Topología para más información.

Procedimientos
En NetLogo, los comandos y los reporteros les dicen a los agentes qué hacer. Un comando es una acción de un agente para llevar a cabo. Un reportero se obtiene un resultado e informar de ello.
La mayoría de los comandos comienzan con verbos ("create", "die", "jump", "inspect", "clear"), mientras que la mayoría de los reporteros son sustantivos o sintagmas nominales.
Los comandos y los reporteros integrados en NetLogo son llamados primitivas. El Diccionario NetLogo tiene una lista completa de comandos integrados y los reporteros.
Los comandos y los reporteros que se definen a sí mismo se denominan procedimientos. Cada procedimiento tiene un nombre, precedido por la palabra to. La palabra clave end marca el final de los comandos en el procedimiento. Una vez que se define un procedimiento, se puede utilizar en otra parte del programa.

Muchos de los comandos y los reporteros reciben entradas (inputs) - los valores que el comando o el reportero utiliza para llevar a cabo sus acciones.

Ejemplos: Aquí hay dos procedimientos de comandos:

to setup
  clear-all      ;; inicializa el mundo a cero
  crt 10         ;; crea 10 nuevas tortugas
end

to go
  ask turtles
    [ fd 1             ;; todas las tortugas se mueven un paso
      rt random 10     ;; adelante y rotan n pasos al azar
      lt random 10 ]
end

Observe el uso del punto y coma para agregar "comentarios" para el programa. Comentarios que su programa más fácil de leer y entender.

En este programa, setup y go son comandos definidos por el usuario. Por otro lado, clear-all, crt ("create turtles"), ask, lt ("left turn"), y rt ("right turn") son todos los comandos primitivos.
random y turtles son reporteros primitivos. random toma un solo número como una entrada y reporta un número entero aleatorio que es menor que la de entrada (en este caso, entre 0 y 9). turtles reporta el conjunto de agentes (agentes) constituida por todas las tortugas.
setup y go pueden ser llamados por otros procedimientos o por botones. Muchos modelos de NetLogo tienen el botón que llama una vez a un procedimiento llamado setup, (sólo se requiere inicializar los datos al principio) y un botón de llamada permanente que llama a un procedimiento llamado go.

En NetLogo, debe especificar qué agentes - tortugas, parches, enlaces, y al observador - van a ejecutar cada comando. (Si no se especifica, el código se ejecuta por el observador.) En el código anterior, el observador utiliza para pedir que el conjunto de todas las tortugas de ejecutar los comandos entre corchetes.

clear-all y crt sólo se puede ejecutar por el observador. fd, por el contrario, sólo puede ser ejecutado por las tortugas. Algunos otros comandos y los reporteros, como conjunto, pueden ser ejecutados por diferentes tipos de agentes.

Aquí están algunas características más avanzadas que puede aprovechar la hora de definir sus propios procedimientos.

Procedimientos con entradas

Sus propios procedimientos pueden tomar entradas, al igual que lo hacen las primitivas. Para crear un procedimiento que acepta entradas, incluye una lista de nombres de entrada entre corchetes después de que el nombre del procedimiento. Por ejemplo:

to draw-polygon [num-sides len]
  pen-down
  repeat num-sides
    [ fd len
      rt 360 / num-sides ]
end

En el resto del programa, usted podría pedir a las tortugas cada sorteo un octágono con una longitud lateral igual a su número de los que:

ask turtles [ draw-polygon 8 who ]

Procedimientos de reportero

Al igual que usted puede definir sus propios comandos, usted puede definir sus propios reporteros. Usted debe hacer dos cosas especiales. En primer lugar, use to-report en lugar de comenzar el procedimiento con to. Luego, en el cuerpo del procedimiento, utilice el reporte para comunicar el valor que desea que se informe.

to-report absolute-value [number]
  ifelse number >= 0
    [ report number ]
    [ report (- number) ]
end


Variables
Variables de agentes
Agente de variables son los lugares para almacenar los valores (como los números) en un agente. Una variable de agente puede ser una variable global, una variable de tortuga, una variable de parche, o una variable de enlace.

Si una variable es una variable global, hay un solo valor para la variable, y cada agente puede acceder a ella. Usted puede pensar en las variables globales como pertenecientes al observador.

Las variables de tortuga, parche, y enlace son diferentes. Cada tortuga tiene su propio valor para cada variable de tortuga, y cada parche tiene su propio valor para cada variable de parche, y lo mismo para los enlaces.

Algunas variables están integradas en NetLogo. Por ejemplo, todas las tortugas tienen una variable de color, y todos los parches tienen una variable de pcolor. (La variable parche comienza con "p" para que no se confunda con la variable de la tortuga.) Si se establece la variable, la tortuga o cambios de parches de color.

Otras variables incorporadas tortuga incluyendo xcor, ycor, y heading. Otras variables incorporadas de parches incluyen pxcor y pycor.

Usted también puede definir sus propias variables. Usted puede hacer una variable global mediante la adición de un interruptor o un control deslizante para su modelo, o con los globales clave en el comienzo de su código, así:

globals [ score ]

También se puede definir nueva tortuga, el parche y enlace variables usando las tortugas-propias, parches-y vínculos propios, palabras propias, como esto:

turtles-own [energy speed]
patches-own [friction]
links-own [strength]

Estas variables pueden ser utilizadas libremente en su modelo. Utilice el comando set para establecerlos. (Si no se les van a empezar a almacenar un valor de cero.)

Las variables globales se pueden leer y establecer en cualquier momento por cualquier agente. Además, una tortuga puede leer y establecer las variables de revisión de la revisión es de pie. Por ejemplo, este código:

ask turtles [ set pcolor red ]

hace que cada tortuga para hacer la revisión que está de pie en la luz roja. (Dado que las variables de parches son compartidos por las tortugas de esta manera, no se puede tener una variable de tortuga y una variable de parche con el mismo nombre.)

En otras situaciones en la que desea un agente para leer variable de un agente diferente, usted puede aprovechar. Ejemplo:

show [color] of turtle 5
;; imprime el color actual de la tortuga cuyo número who es 5

También se puede utilizar de una expresión más complicada que el nombre de una variable, por ejemplo:

show [xcor + ycor] of turtle 5
;; imprime la suma de las coordenadas x e y de la
;; tortuga cuyo número who es 5

Las variables locales

Una variable local se define y utiliza sólo en el contexto de un determinado procedimiento o parte de un procedimiento. Para crear una variable local, utilice el comando let. Usted puede utilizar este comando en cualquier lugar. Si lo usa en la parte superior de un procedimiento, la variable existe en todo el procedimiento. Si lo usa dentro de un conjunto de corchetes, por ejemplo dentro de un "ask", entonces existirá sólo dentro de los corchetes.

to swap-colors [turtle1 turtle2]
  let temp [color] of turtle1
  ask turtle1 [ set color [color] of turtle2 ]
  ask turtle2 [ set color temp ]
end

Listas
En los modelos más simples, cada variable tiene sólo una pieza de información, normalmente un número o una cadena de caracteres. La característica de la lista le permite almacenar múltiples piezas de información en una sola variable mediante la recopilación de las piezas de información en una lista. Cada valor en la lista puede ser cualquier tipo de valor: un número o una cadena de bits, un agente o agentset, o incluso otra lista.

Las listas permiten el conveniente embalaje de la información en NetLogo. Si sus agentes realizar un cálculo repetitivo en múltiples variables, podría ser más fácil tener una lista de variables, en lugar de las variables de número múltiples. Varias primitivas simplifican el proceso de realizar el mismo cálculo para cada valor en una lista.

Listas de constante

Usted puede hacer una lista con sólo poner los valores que desee en la lista entre corchetes, como sigue: set mylist [2 4 6 8]. Tenga en cuenta que los valores individuales están separados por espacios. Puede hacer listas que contienen números y cadenas de esta forma, así como listas de listas, por ejemplo, [[2 4] [3 5]].

La lista vacía es escrita por poner nada entre paréntesis, así: [].

Crear listas sobre la marcha

Si desea hacer una lista en la que los valores son determinados por los periodistas, en lugar de ser una serie de constantes, utiliza el reportero lista. El reportero de la lista acepta otros dos reporteros, los ejecuta, y los informes de los resultados como una lista.

Si quisiera una lista que contiene dos valores aleatorios, que podría utilizar el siguiente código:

set random-list list (random 10) (random 20)

Esto conjunto random-list para una nueva lista de dos números enteros aleatorios cada vez que se ejecuta.

Para hacer las listas más o menos largo, puede utilizar el reportero lista con menos o más de dos entradas, pero para poder hacerlo, deberá adjuntar toda la llamada en paréntesis, por ejemplo:

(list random 10)
(list random 10 random 20 random 30)


Comandos
Comando
Sintaxis e interpretación
ask
ask agentset [commands]
ask agent [commands]

El agente determinado o conjunto de agentes (agentes) ejecuta las órdenes dadas.

Ej.
ask turtles [fd 1]  ;; Todas las tortugas de avanzar un paso
ask patches [set pcolor red]  ;; Todos los parches de color rojo
ask turtle 4 [rt 90] ;, Sólo la tortuga 4 gira a la derecha

Nota: sólo el observador puede pedir a todas las tortugas o todos los parches. Esto impide que sin darse cuenta que todas las tortugas de pedir a todas las tortugas o todos los parches de pedir a todos los parches, que es un error común de hacer si no somos cuidadosos con la que los agentes se ejecute el código que está escribiendo.

Nota: Sólo los agentes que están en el agentset en el momento de pedir comienza ejecutar los comandos.

breed
breed

Se trata de una variable integrada de tortuga y de enlace. Lleva a cabo la agentset de todas las tortugas o los enlaces de la misma raza que esta tortuga o un enlace. (Para las tortugas o los enlaces que no tienen ninguna raza en particular, se trata del agentset de todas las tortugas o de todos los enlaces, respectivamente.) Puede establecer esta variable a cambio de una tortuga o enlace de la raza.

Ej.
breed [cats cat]
breed [dogs dog]
;; código de tortuga:
if breed = cats [ show "meow!" ]
set breed dogs
show "woof!"

ca   
clear-all

Resetea todas las variables globales a cero, y llama a todas las variables integradas calls reset-ticks, clear-turtles, clear-patches, clear-drawing, clear-all-plots, y clear-output para inicialicen todo.

 if
if condición [ commands ]

El reportero debe reportar un valor booleano (verdadero ó falso).

Si condición reporta verdadero, se ejecutan los commands.

El reportero podría reportar un valor diferente para agentes diferentes, de modo que algunos agentes ejecutarían algunos comandos y otros no.

Ej.
if xcor > 0[ set color blue ]
;; las tortugas en la mitad derecha del landscape se tornan azules

ifelse
ifelse reportero [ commands1 ] [ commands2 ]

El reportero debe reportar un valor booleano (verdadero o falso).

Si el reportero reporta verdadero, se ejecutan los commands1.

Si el reportero reporta falso, se ejecutan los commands2.

El reportero podría reportar un valor diferente para agentes diferentes, de modo que algunos agentes ejecutarían los commands1 y otros los commands2.

Ej.
ask patches
  [ ifelse pxcor > 0
      [ set pcolor blue ]
      [ set pcolor red ] ]
;; la mitad izquierda del landscape se torna rojo y
;; la otra mitad se torna azul

item
item índice lista
item índice string

En listas, reporta el valor del ítem en la lista mencionada con el índice mencionado.

En las cadenas de caracteres (strings), reporta el carácter en la cadena mencionada en el índice citado.

Nótese que los índices comienzan de 0, no de 1. (El primer ítem es el item 0, el segundo ítem es item 1, y así.)

Ej.
;; suponga que mylist es [2 4 6 8 10]
show item 2 mylist
=> 6
show item 3 "my-shoe"
=> "s"

length
length lista
length string

Reporta el número de ítems en una lista dada, ó el número de caracteres en una cadena de caracteres.

let
let variable valor

Crea una nueva variable local y le da un valor dado. Una variable local es una que existe solo dentro de un bloque cerrado de commands.

Es para crear la variable, si dentro del bloque de commands se quiere cambiar el valor se debe usar set.

Ej:

let prey one-of sheep-here
if prey != nobody
  [ ask prey [ die ] ]

lput
lput valor lista

Añade un valor al final de una lista y reporta la nueva lista.

Ej.
;; suponga que mylist es [2 7 10 "Bob"]
set mylist lput 42 mylist
;; mylist ahora queda [2 7 10 "Bob" 42]

max
max lista

Reporta el valor numérico máximo en la lista. Ignora otro tipo de ítems.

Ej.
show max [xcor] of turtles
;; Imprime la coordinada x de la Tortuga que está más
;; a la derecha en el landscape

min
min lista

Reporta el valor numérico mínimo en la lista. Ignora otro tipo de ítems.

Ej.
show min [xcor] of turtles
;; imprime la menor coordenada x de todas las tortugas

of
[reporter] of agent
[reporter] of agentset

For an agent, reports the value of the reporter for that agent (turtle or patch).

Ej.
show [pxcor]of patch 3 5       ;; imprime 3
show [pxcor] of one-of patches ;; imprime el valor pxcor de un parche aleatorio
show [who * who] of turtle 5    ;;=> 25
show [count turtles in-radius 3] of patch 0 0  ;; imprime el número de tortugas localizadas dentro de un radio de tres parches del origen

Para un conjunto de agentes (agentset), reporta una lista que contiene el valor del reportero para cada agente en el agentset (en orden aleatorio).

Ej.
crt 4
show sort [who] of turtles
=> [0 1 2 3]
show sort [who * who] of turtles
=> [0 1 4 9]

precision
precision número lugares

Reporta el número redondeado a lugares decimales.

Si lugares es negativo, el redondeo toma lugar al izquierda del punto decimal.

Ej.
show precision 1.23456789 3
=> 1.235
show precision 3834 -3
=> 4000

repeat
repeat número [ commands ]

Corre commands un número de veces.

Ej.    
 pd repeat 36 [ fd 1 rt 10 ] ;; la tortuga dibuja un círculo

replace-item
replace-item índice lista valor
replace-item índice string1 string2

En una lista, reemplaza un ítem en esa lista. índice es el índice del ítem a ser remplazado, empezando desde 0. (El  sexto ítem en una lista tendría un índice de 5.) Nótese que "replace-item" es usado en conjunción con "set" para cambiar una lista.

Del mismo modo para una cadena de caracteres, pero el carácter dado del string1 removido y los contenidos del string2 son cortados en vez.

show replace-item 2 [2 7 4 5] 15
=> [2 7 15 5]
show replace-item 1 "cat" "are"
=> "caret"

 set  
set variable valor

Fija a la variable un valor dado.

Variable puede ser cualquiera de los siguientes:

·        Una variable global declarada usando "globals"
·        La variable global asociada con un menú deslizable, un switch, un selector, ó un cuadro de ingreso de datos (input box).
·        Una variable perteneciente a un agente que está siendo llamado
·        Si el agente llamado es una tortuga, una variable perteneciente al parche debajo de la tortuga.
·        Una variable local creada por el comando let.
·        Una entrada al procedure actual.
·        Una variable especial local (?, ?1, ?2...).

sum
sum lista

Reporta la suma de los ítems en la lista.

Ej.
show sum [energy] of turtles
;; prints the total of the variable "energy"
;; from all the turtles

while
while [reporter] [ commands ]

Si el reporter reporta falso, sale del ciclo. En cualquier otro caso corre run commands y lo repite.

El reporter podría tener diferente valores para diferentes agentes  de modo que algunos podrían correr los commands un número diferente de veces que otros agentes.

Ej.
while [any? other turtles-here]
  [ fd 1 ]
;; la tortuga se mueve hasta que encuentra un parche que
;; no tenga ninguna tortuga encima.







No hay comentarios:

Publicar un comentario