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