Manual Netlogo
Manual Netlogo
Manual Netlogo
Manual Bsico
Tabla de contenido
1. 2. 3. 4. Manual de Netlogo en espaol ................................................................................................. 2 Qu es Netlogo? Dnde puedo obtener el programa? .......................................................... 2 Introduccin al escenario de simulacin de Netlogo ................................................................. 3 Vistas en Netlogo (1) ................................................................................................................. 4 Ejercicio 1. Primitivas bsicas en la ventana de comandos. .......................................................... 5 Ejercicio 2. Procedimientos ........................................................................................................... 7 Ejercicio 3. Botones ....................................................................................................................... 8 Ejercicio 4. Propiedades de los agentes (1) ................................................................................. 10 Ejercicio 5. Propiedades de los agentes (2) ................................................................................. 12 Ejercicio 6. Propiedades de los agentes (3) ................................................................................. 14 Ejercicio 7. Propiedades de los agentes (4) ................................................................................. 15 Ejercicio 8. Variables globales. Variables de entrada. ................................................................. 17 Ejercicio 9. Variables globales y variables locales. Sentencias condicionales if ........................... 21 Ejercicio 10. Sentencias ifelse. Procedimientos con retorno (to-report) ..................................... 24 Ejercicio 11. Propiedades adicionales de los agentes .................................................................. 26 Ejercicio 12. Razas (breeds) de agentes ................................................................................... 29 Ejercicio 13. Bucles while ............................................................................................................ 31 Ejercicio 14. Representaciones grficas en Netlogo .................................................................... 33 Ejercicio 15. Listas (1) .................................................................................................................. 39 Ejercicio 16. Listas (2) .................................................................................................................. 43 Ejercicio 17. Operaciones sobre listas ......................................................................................... 45
Turtles (tortugas). Patches (celdas). Links (relaciones entre tortugas). Observer (observador).
Las tortugas son los agentes que se mueven por el mundo. Interaccionan entre s y con el medio. Cada tortuga viene identificada por un identificador que es nico para cada tortuga. Netlogo denomina mundo (world) al terreno en el que se mueven las tortugas. Cada porcin cuadrada de mundo se denomina patch. Cada patch est identificado por las coordenadas de su punto central. Las tortugas se mueven por el mundo (y, por tanto, por encima de los patches). Las tortugas interaccionan entre s segn unas reglas de comportamiento y con el medio (es decir, con los patches). Se pueden modelar la relacin entre distintas tortugas mediante links, que es el tercer tipo de agente presente en Netlogo. Los links se designan mediante un par (tortuga1, tortuga2), que indica las dos tortugas relacionadas mediante dicho link. Finalmente, la ltima figura presente en los modelos de Netlogo es el observador. ste no est representado en el mundo, pero puede interactuar con l (crea y destruye agentes, asigna propiedades a los agentes, etc).
En la parte superior observamos tres pestaas: interface (interfaz), information (informacin) y procedures (procedimientos). Aunque lo veremos con mayor detenimiento prximamente, en la primera de las pestaas (interface) ser donde se represente nuestro modelo. En la segunda pestaa (information) podremos aadir informacin sobre nuestro modelo para informar a los usuarios:
y en la ltima pestaa (procedures) escribiremos los procedimientos que se encargarn de llevar a cabo la ejecucin de nuestro modelo:
Ejercicio 2. Procedimientos
Un procedimiento en un nuevo comando definido por el programador que engloba un conjunto de comandos de Netlogo (esto es anlogo al concepto de funcin en otros lenguajes de programacin). A continuacin crearemos un nuevo procedimiento llamado comenzar. Dicho procedimiento englobar los comandos que utilizamos en el ejercicio anterior, es decir, crear una tortuga, y sta dibujar un cuadrado. Seleccionamos la pestaa procedures en la pantalla de Netlogo y escribimos lo siguiente:
Observa que para iniciar la definicin de un proceso utilizamos la palabra to seguida del nombre que queramos dar al procedimiento. Despus introducimos el conjunto de comandos que componen la primitiva y finalmente cerramos la definicin del procedimiento con la palabra end. Para ejecutar el comando, debes ir a la pestaa interface, y, en la lnea de comandos, teclear el nombre del procedimiento que acabas de crear (comenzar). Pulsa enter y observa lo que ocurre.
Ejercicio 3. Botones
El objetivo de este ejercicio es crear un botn para que al pulsarlo se ejecute el procedimiento creado en el ejercicio anterior. En la pestaa interface, en el men desplegable de la parte superior de la pantalla, elegimos button. A continuacin hacemos clic en el punto de la pantalla en el que deseemos colocar el botn. En el campo de comandos (commands) escribimos los comandos que queremos que se ejecuten al presionar el botn (en este caso escribiremos comenzar, sin comillas, para que se ejecute el procedimiento que acabamos de crear). Opcionalmente, en el campo display name puede escribirse el nombre que queremos que se muestre sobre el botn. Tambin podemos asignar al botn una tecla del teclado para no tener que utilizar el ratn. Para ello, introduce la tecla deseada en el campo action key. La pantalla debera mostrar un aspecto semejante al que se muestra a continuacin:
Marcar la casilla "Forever" provocar que el procedimiento "comenzar" se repitiera una y otra vez, hasta que pulsramos de nuevo el botn COMENZAR, momento en el que el programa terminar. En cambio, si dejamos esta casilla sin marcar, cada vez que pulsemos el botn COMENZAR, se llamar al procedimiento "comenzar" una sola vez, por lo que se dibujar el
cuadrado una sola vez y el programa terminar. Esto es til para simulaciones paso a paso, y es lo que emplearemos en el programa que estamos elaborando. Cuando hayas terminado, pulsa ok. Aprieta el botn y observa lo que ocurre.
10
Los patches tambin tienen sus propiedades: pxcor ;; coordenada x del patch pycor ;; coordenada y del patch pcolor ;; color del patch plabel ;; etiqueta del patch plabel-color ;; color de la etiqueta del patch En este ejercicio, modificaremos el procedimiento del ejercicio 3 para que el cuadrado est alineado con los ejes de coordenadas. El color del cuadrado no puede ser aleatorio, sino que debe ser definido de antemano. Adems, podremos el mundo de color azul (es decir, modificaremos la propiedad pcolor de todos los patches para que stos sean de color azul). Debemos partir del ejercicio anterior y modificar el procedimiento comenzar (en la pestaa procedures).
Observacin: Tambin es posible asignar propiedades a los agentes justo en el momento de crearlos. Comparemos las siguientes rdenes: OPCIN 1: crt 1 ask turtles [set color orange set heading 0] OPCIN 2: crt 1 [set color orange set heading 0]
En el caso de la opcin 1, en primer lugar se crea la tortuga (y se le asignan los parmetros por defecto, es decir, color y orientacin aleatorias) y, despus, con la segunda lnea de cdigo, se modifican las propiedades color y heading. En cambio, con la opcin 2, la tortuga se est creando directamente con las propiedades de color y heading definidas por el programador.
11
12
Nota: Para ver las formas que pueden adoptar las tortugas (y tambin para crear las nuestras propias) debemos seleccionar tools en la barra de men, y a continuacin en turtle shapes editor.
13
Comentarios:
1. Sintaxis para acceder a las propiedades de un agente: [propiedad] of agente 2. Para mostrar un mensaje en la ventana de comandos: type mensaje y print mensaje. La diferencia entre ambas primitivas es que print hace un retorno de carro al final del mensaje y type no.
14
15
PASO 8. Pedimos a los patches que tengan coordenada x negativa que se vuelvan de color amarillo. ask patches with [pxcor <0] [set pcolor yellow]
16
Ejercicio 8.nlogo - Un botn input - Una barra desplazadora (slider) - Un botn chooser Introduce estos 3 tipos de botones en la vista interfaz (interface) de la misma manera que introdujiste el botn del ejercicio 4. Observa la siguiente captura de pantalla:
17
Al colocar el botn input, se te pedir que le des un nombre a la variable global asignada a dicha entrada. Introduce el nombre lado, tal como se indica en la siguiente figura. Puesto que se trata de un nmero, elige number en el campo type:
18
En la ventana que aparece, escribimos lado en el campo global variable y en la siguiente lnea el intervalo en el que puede elegirse el lado del cuadrado. Escoge un mnimo de 1, un mximo de 10 y un incremento de 1, para poder incrementar el lado del cuadrado de uno en uno. Finalmente, en el campo value, escoge 5 (este es el valor que se tomar la variable lado por defecto). A continuacin, introduciremos un men desplegable (chooser), de una manera totalmente similar:
En el campo global variable, escribe lado. En el campo choices, escribe los posibles valores que pueden tomar el lado del cuadro (en este caso 1, 2, 3, 4, 5, 6, 7, 8, 9 10). Finalmente, introduciremos una nota de texto sobre cada botn introducido. Para ello, elige la opcin note en el men desplegable de dnde has sacado el resto de los botones:
19
Vuelve a la pestaa interface, haz clic en el botn comenzar y observa lo que ocurre.
20
Qu diferencia hay entre una variable global y una variable local? Las variables globales son accesibles para todos los procedimientos del programa, mientras que las variables locales slo tienen validez dentro de un mismo procedimiento. Otra diferencia es que las variables globales hay que declararlas (es decir, tenemos que decirle a Netlogo al principio del programa que vamos a utilizar una variable global de cierto nombre, aunque el valor se lo asignemos posteriormente). Las variables locales, en cambio, no se declaran al principio del programa, sino que se crean y se les asigna un valor segn se va necesitando a lo largo del programa. Para declarar una variable global, utilizaremos la primitiva globals, y, entre corchetes, el nombre de las variables globales que vayamos a utilizar en nuestro programa: globals [ variable_global_1 variable_global_2 variable_global_n ] Para asignar un valor a una variable global, se utiliza la primitiva set (recuerda: la misma que se utilizaba para dar valores a las propiedades de los agentes): set variable_global_1 5 ;; asignamos el valor 5 a la variable variable_global_1
21
Para asignar un valor a una variable local, por primera vez, se utiliza la primitiva let. Si a lo largo del mismo procedimiento debemos asignar un nuevo valor a esta variable, entonces utilizaremos la primitiva set: let variable_local 5 ;; asignamos el valor 5 a la variable ;; comandos set variable_local 7 ;; asignamos el valor 7 a la variable Nota: Si recuerdas, en el ejercicio 8 ya utilizamos variables globales. Entonces dijimos que la variable lado era una variable global. Sin embargo, en aquel caso no la tenamos que declarar dentro del cdigo del programa, ya que sta quedaba definida dentro de un botn (input, slider, chooser), por lo que el programa se encargaba de declararla de forma interna. Una vez hechas estas observaciones, comenzaremos a programar nuestro modelo. El cdigo se muestra a continuacin: El cdigo del procedimiento se muestra a continuacin:
22
Si se cumple la condicin que sigue a if, entonces se ejecutarn el conjunto de comandos que escribamos a continuacin, entre corchetes. Si no se cumple, no se ejecutarn dichos comandos. Nota: El hecho de emplear n como una variable global en este ejemplo es simplemente ilustrativo: ya que slo existe un procedimiento en nuestro programa, podramos haber utilizado una variable local en su lugar. Una vez escrito el procedimiento, en la vista interfaz debers introducir un botn que inicialice el procedimiento, una barra desplazadora para elegir el lado del polgono y un men desplegable para elegir el polgono a dibujar, de la misma manera que lo hemos hecho en ejercicios anteriores. Los valores de lado debern ser 1, 2, 3, 4, 5 6. Presta atencin a la configuracin del botn chooser. Las posibles opciones han de escribirse entre comillas:
23
Con procedimientos con retorno, nos referimos a aquellos que devuelven cierto valor al procedimiento que les ha llamado. Un procedimiento con retorno (a diferencia de un procedimiento convencional) comienza con la palabra clave to-report y termina con la palabra end. La variable o valor que devuelve al procedimiento llamante va precedido de la palabra clave report. La sintaxis genrica de este tipo de procedimientos es la que se muestra a continuacin:
to-report nombre_del_procedimiento [valor_recibido_del_procedimiento_llamante] ;; comandos ;; [...] report valor_resultante end
Aclaremos todo esto con un programa sencillo: elaboraremos un procedimiento que recibir un nmero y nos devolver su valor absoluto. El cdigo es el siguiente (escrbelo en la pantalla de procedimientos):
to-report valor_absoluto [numero] ifelse numero >= 0 [ report numero ] [ report (-1) * numero ] end
A continuacin, escribe lo siguiente en la ventana de comandos, para probar el correcto funcionamiento del procedimiento que has elaborado:
24
25
Despus, en la ventana de comandos escribe comenzar para ejecutar el procedimiento que acabas de crear. Vers que se muestra, en primer lugar, el agente al que hemos pedido que ejecute la accin y, a continuacin, la propiedad que le hemos mandado mostrar (en este caso edad).
26
Si recuerdas, en casos anteriores, para mostrar las propiedades de un agente en la ventana de comandos emplebamos la primitiva print (ver ejercicio 6). La diferencia entre print y show es que con show se muestra el agente llamado, mientras que con print no. Ambas dejan un retorno de carro al final. Para comprobar esta diferencia, puedes sustituir la lnea de cdigo ask turtles [show edad] por la siguiente: ask turtles [print edad] Como alternativa, se propone colocarle la edad a las tortugas del ejercicio 7. Vea que sucede y analice los cambios en las edades de las tortugas: Porqu tienen edades diferentes a las asignadas?
27
28
29
30
Para ilustrar el funcionamiento de los bucles while, vamos a construir un pequeo modelo. En l crearemos dos coches que, partiendo del lado izquierdo del mundo debern alcanzar el lado derecho del mundo avanzando una distancia aleatoria en cada iteracin.
31
En primer lugar definimos la raza coches con la palabra clave breed. En este modelo tenemos dos procedimientos, el primero de ellos llamado setup y el segundo llamado go. Esto es muy comn en los sistemas modelados en Netlogo. En general, el procedimiento setup inicializa las variables, los agentes, las grficas, la interfaz, etc. y prepara el terreno para que el procedimiento go ejecute la simulacin del modelo. En nuestro caso, el procedimiento setup define la forma por defecto de la raza coches, pinta el mundo de color blanco, crea dos coches, cada uno de un color y los coloca en la parte izquierda del mundo. El procedimiento go se encarga de hacer avanzar los coches hasta que uno de ellos alcanza la parte derecha del mundo. Observa que la condicin para que el bucle while se siga ejecutando es que todos los coches tengan una coordenada x inferior a la coordenada x del patch situado ms a la derecha del mundo (max-pxcor) Observa tambin cmo funciona la primitiva all?, que sirve para evaluar las propiedades de todo un conjunto de agentes. No olvides crear dos botones en la vista interfaz: uno que ejecute el procedimiento setup y otro que ejecute el procedimiento go.
Ejecuta el modelo, para ello pulsa primeramente el botn setup, para preparar el modelo. Finalmente pulsa el botn go, para iniciar la simulacin. Es posible que tengas que bajar la velocidad de la simulacin para poder ver cmo se desplazan los coches a lo largo del mundo. Puedes descargarte el cdigo fuente del programa en la seccin de 'Archivos adjuntos', al final de esta pgina.
32
Para ello, lo primero ser colocar un grfico en la vista interfaz. Las grficas se introducen de la misma manera que los botones, barras desplazadoras (sliders), etc. Selecciona plot tal como se muestra en la siguiente captura de pantalla:
Coloca la grfica en un hueco libre de la interfaz. Automticamente se abrir una ventana con las propiedades de la grfica, que deberemos rellenar:
33
En el campo name introduciremos un nombre para esta grfica. Escribe Distancia (sin las comillas). Debemos recordar el nombre que introducimos aqu, ya que lo utilizaremos en el cdigo del programa para indicarle a Netlogo dnde debe dibujar. A continuacin, las lneas X axis label y Y axis label nos permiten introducir una etiqueta para los ejes de coordenadas, as como definir el rango en el que stos estarn definidos. En un primer momento no modificaremos estos parmetros. Ahora nos centraremos en el campo Plot Pens, que nos permitir seleccionar lpices de distintos colores para los distintos datos que podemos representar dentro de una misma grfica. Como el primero de los coches (coche 0) tiene color verde, representaremos su distancia avanzada en cada iteracin mediante trazos verdes en el grfico que hemos creado. Para ello, pulsamos el botn create. Aparecer una ventana en la que deberemos introducir un nombre para el lpiz que estamos creando. Introduce coche1 en este campo, tal como se indica en la siguiente captura de pantalla: A continuacin elige el color verde para este lpiz:
34
Repite los mismos pasos para crear un lpiz para el segundo coche (coche1). Haz que este lpiz sea de color naranja, para que coincida con el color del coche.
35
Finalmente escoge el lpiz default y elimnalo del conjunto de lpices. Para ello pulsa el botn delete.
En la lista desplegable de lpices slo deberan quedar los lpices correspondientes a coche0 y coche1. Marca la casilla show legend y pulsa el botn ok para finalizar.
Ahora introduciremos un nuevo procedimiento llamado grafica en el cdigo del ejercicio 13. El cdigo correspondiente al ejercicio 14 se muestra a continuacin. Puedes descargrtelo en la seccin de 'Archivos adjuntos' al final de esta pgina.
36
37
Observaciones: Hemos aadido el cdigo del procedimiento grafica al final del cdigo del ejercicio 13. Para llamar a este procedimiento dentro del procedimiento go, simplemente intercalamos el nombre del procedimiento grafica en el cdigo del procedimiento go. El procedimiento grafica necesita conocer la distancia avanzada por los coches (variables distancia_coche_1 y distancia_coche_2) para poder realizar el grfico. En el ejercicio 13, estas dos variables estaban definidas como variables locales, dentro del procedimiento go, ya que solamente se iban a emplear dentro de este procedimiento. Sin embargo, en este ejercicio, el procedimiento tanto el procedimiento go como el procedimiento grafica necesitan acceder al contenido de estas variables. Por ello, tendremos que definir estas dos variables como variables globales. Esto lo haremos al principio del programa empleando la palabra clave globals:
globals [ distancia_coche_1 distancia_coche_2 ]
Como ya dijimos anteriormente en este tutorial, para asignar un valor a una variable global empleamos la primitiva set (observa la diferencia con las variables locales, para las cuales se emplea la primitiva let). Fijmonos en la diferencia en la forma de asignar valores a las variables distancia_coche_1 y distancia_coche_2 en el ejercicio 13 (variables locales) y en el ejercicio 14 (variables globales):
Haz clic en setup, despus en go y observa cmo se va trazando la grfica a medida que los coches avanzan.
38
Cmo acceder a los elementos de una lista? Para acceder al primer elemento de una lista usamos la primitiva first. Ejemplo
39
first [a b c d e f g h i j k] --> a
Para obtener el ltimo elemento de la lista utilizamos el primitiva last: last [a b c d e f g h i j k] --> k ;; nota: a, b, , k son nmeros o variables.
Para obtener todos los elementos de la lista excepto el primero se emplea la primitiva but-first. Ejemplo: but-first [a b c d e f g h i j k] --> [b c d e f g h i j k] o variables. ;; nota: a, b, , k son nmeros
Para obtener todos los elementos de la lista excepto el ltimo se emplea la primitiva but-last: but-last [a b c d e f g h i j k] --> [a b c d e f g h i j] son nmeros o variables. ;; nota: a, b, , k
Para obtener el elemento n de la lista, empleamos la primitiva item. Ejemplo: item 5 [a b c d e f g h i j k] --> f ;; nota: a, b, , k son nmeros o variables. Nota: Recuerda que Netlogo numera las listas a partir del elemento 0. Para tomar un elemento al azar de una lista se emplea la primitiva one-of: one-of [a b c d e f g h i j k ] --> cualquier elemento de la lista tomado al azar
Y para tomar varios elementos al azar de una lista empleamos n-of: n-of 3 [a b c d e f g h i j k ] --> nos devuelve otra lista con 3 elementos de la lista inicial tomados al azar.
Cmo modificar una lista? Para introducir un nuevo elemento al comienzo de una lista, empleamos la primitiva fput: fput z [a b c d e f g h i j k ] --> [z a b c d e f g h i j k ] nmeros o variables. ;; nota: a, b, , k son
Y para introducirlo al final de la lista, utilizamos la primitiva lput: lput z [a b c d e f g h i j k ] --> [a b c d e f g h i j k z] nmeros o variables. ;; nota: a, b, , k son
Para eliminar un elemento de una lista, usamos la primitiva remove: remove d [a b c d e f g h i j k ] --> [a b c e f g h i j k ] ;; nota: a, b, , k son nmeros o variables. Nota: remove elimina todas las paraciciones del elemento en la lista.
40
Si conocemos la posicin que ocupa un elemento dentro de una lista, podemos eliminarlo con la primitiva remove-item: remove-item 4 [a b c d e f g h i j k ] --> [a b c d f g h i j k] ;; nota: a, b, , k son nmeros o variables. Nota: Recuerda que Netlogo numera las listas a partir del elemento 0.
Una variacin de la primitiva remove es la primitiva remove-duplicates, que elimina todos los elementos repetidos en la lista, dejando nicamente la primera aparicin de los mismos. Ejemplo: remove-duplicates [a a b b b c c d e e e e e f f g g h h i i j j j k k ] --> [a b c d e f g h i j k]
Para reemplazar un elemento de la lista por otro, empleamos la primitiva replace-item: replace-item 4 [a b c d e f g h i j k ] z --> [a b c d z f g h i j k] son nmeros o variables. ;; nota: a, b, , k
Otras primitivas tiles relacionadas con listas: Para conocer la longitud de una lista (esto es, su nmero de elementos) empleamos la primitiva length: length [a b c d e f g h i j k ] --> 11 ;; nota: a, b, , k son nmeros o variables.
Para obtener el elemento que ms se repite dentro de una lista (es decir, la moda), se emplea la primitiva modes: modes [a a b c d e f g h i j k] --> a ;; nota: a, b, , k son nmeros o variables.
Para conocer la posicin de un elemento dentro de una lista se utiliza la primitiva position: position a [a b c d e f g h i j k ] --> 0 variables. ;; nota: a, b, , k son nmeros o
Para desordenar aleatoriamente los elementos de una lista utilizamos la primitiva shuffle: shuffle [a b c d e f g h i j k ] --> [d k a c e i j h f b g] nmeros o variables. ;; nota: a, b, , k son
Para obtener una lista ordenada de manera inversa a la original, empleamos la primitiva reverse: reverse [a b c d e f g h i j k ] --> [k j i h g f e d c b a] nmeros o variables. ;; nota: a, b, , k son
41
Para obtener una lista con los elementos ordenados en orden creciente, empleamos la primitiva sort: sort [4 6 2 8 4] --> [2 4 4 6 8] Nota 1: Recuerda siempre que, para Netlogo, el primer elemento de una lista es el elemento 0. Nota 2: Recuerda que si los elementos de una lista son caracteres, stos deben escribirse entre comillas: [a b c d e f g h i j k]
42
show mi-lista
Esta manera de contruir nuevas listas a partir de otras existentes es aplicable, tambin, a las rdenesbut-last, remove-item, replace-item que introdujimos en el ejercicio anterior. Para concatenar varias listas, usamos la orden sentence. Observa el siguiente ejemplo:
let lista1 [1 2 3 4] ;; creamos la lista inicial let lista2 [5 6 7 8] ;; asignamos a la variable mi-lista el let lista3 [9 10 11 12] let nueva-lista sentence lista1 lista2 ;; [1 2 3 4 5 6 7 8] let nueva-lista2 (sentence lista1 lista2 lista 3) ;; [1 2 3 4 5 6 7 8 9 10 11 12]
Observa que cuando vamos a concatenar tras o ms listas, la sentencia sentence completa debe ir entre parntesis.
43
Los elementos de las listas de Netlogo pueden ser, a su vez, otras listas. Para crear estas 'lista de listas' podemos utilizar nuevamente la orden sentence, pero esta vez con doble corchete. Compara las siguientes dos lneas de cdigo:
let lista (sentence [[ 1 2 3 ]] [[ 4 5 6 ]] [[7 8 9 ]]) ;; frente a... let lista (sentence [ 1 2 3 ] [ 4 5 6 ] [7 8 9 ]) ;;[1 2 3 4 5 6 7 8 9] ;;[1 2 3] [4 5 6] [7 8 9]
Se pueden anidar las funciones de extraccin para modificar elementos en 'listas de listas'. Observa el siguiente ejemplo, en el que deseamos sustituir el '6' por un '7':
let lista [[1 2] [3 4] [5 6]] set mylist (replace-item 2 mylist (replace-item 1 (item 2 mylist) 7 ) ) ;; [[1 2] [3 4] [5 7]]
44
El smbolo ? va tomando valores distintos en cada repeticin del bucle, segn los valores de los elementos de la lista. En la primera repeticin del bucle, ? vale 0 (primer elemento de la lista) y, as, se pide a la tortuga 0 que adquiera un tamao 0; en la segunda repeticin del bucle, ? vale 1, por lo que a la tortuga 1 se le asigna un valor 1... y as sucesivamente.
45
foreach tambin puede operar sobre varias listas a la vez (aunque stas deben ser de la misma longitud). En este caso hay que colocar la operacin completa entre parntesis. El smbolo ?1 hace referencia al valor que toma el elemento actual de la lista 1; ?2 hace referencia al valor que toma el elemento actual de la lista 2, etc. El siguiente ejemplo aclara la sintaxis de la orden foreach cuando opera sobre ms de una lista. En l calcularemos el producto escalar de dos vectores: a = [1 2 3] y b = [4 5 6]. El resultado del producto escalar ser: 1*4 + 2*5 + 3*6 = 32. Veamos cmo se programara todo esto (puedes descargarte el cdigo de la seccin 'Archivos adjuntos', Ejercicio17b.nlogo, al final de esta pgina):
Finalmente, aprenderemos el manejo de la primitiva map. Se trata de una orden que toma como entrada una lista y da como resultado otra lista que contiene el resultado de aplicar una funcin a cada uno de los elementos de la original. Al igual que ocurra con la primitiva foreach, con ? se hace referencia al valor actual. Su sintaxis es la siguiente: map ["operacin"] lista Para aclarar ideas, observemos la siguiente rutina en la cual queremos convertir el vector [1 2 3] en un vector unitario. Para ello, debemos dividir las componentes del vector entre el mdulo del mismo. Aprovecharemos para repasar el uso de la orden foreach y calcularemos la suma
46
de los cuadrados de los componentes del vector empleando esta primitiva. Despus calcularemos el mdulo del vector (raz cuadrada de la suma de los cuadrados de los componentes) y, finalmente, emplearemos la orden map para obtener un nuevo vector (unitario) en el que cada componente es la correspondiente componente del vector inicial dividida entre el mdulo del vector.
47