Ahora vamos a ver otra aplicación novedosa y diferente, más avanzada, de los MBA
Hoy vamos a estar hablando de una construcción interesante y novedosa; ésta
en particular será específica del lenguaje NetLogo, pero la idea que está detrás de
ella, tiene que ver con, básicamente trata de dividir en grupos e intenta mapear y
reducir; realizar una acción sobre todos los ítems de una lista
y luego, las próximas lecturas serán sobre los comandos RUN y TASK, que significan la
posibilidad de encapsular funciones como objetos y luego en forma dinámica poder
cambiarlas a lo largo del tiempo; estas ideas son cruciales en la programación en
general, pero específicamente son cruciales en los MBA, ya que son cosas que
suelen hacerse a menudo en ese espacio
empecemos, lo que voy a hacer es hablar
de qué es lo que hacen los comandos en primer lugar y luego voy a hablar, voy a
mostrarles los comandos en NetLogo
MAP es una de ellas y es interesante y básicamente lo que hace es tomar un
reporte y una lista y aplicar ese reporte a todos los elementos de la lista, por
ejemplo ustedes pueden ver que tengo acá este código el cual dice MAP ROUND, signo
de pregunta barra invertida 1000 y el signo de pregunta es parte de la sintaxis
de NetLogo que básicamente dice, tome el iterador que acaba de crear, lo que se va
a iterar por cada elemento y para cada uno de los elementos asigne el signo de
pregunta como igual a ese valor, entonces por ejemplo, en este caso, vamos a tomar
el signo de pregunta y en primer lugar lo vamos a reemplazar por 34678, luego 125000
luego 75890 y así sucesivamente, lo que hace es mapear esto contra esta lista, lo
que va a hacer es tomar cada uno de los elementos, dividirlos por 1000 y luego
redondearlos y así sucesivamente, podemos pensar en esto como si tuviéramos 5
empresas en nuestro MBA y queremos calcular las ganancias cada 1000 para
todas las empresas, esta lista de miles, podría ser el resultado de las ganancias
de las tortugas y luego voy a mapearlas para poder hacer los cálculos en base a
1000
digamos que podemos ver ejemplos más complejos, digamos que queremos hacer
esto, pero luego queremos dividirlo por el número de empleados y esto podrían ser las
ganancias de los agentes y esto podría ser el número de empleados por cada agente,
así podemos tomar las ganancias dividirlas por el número de empleados para obtener
las ganancias por empleado dividirlo por 1000 y redondear esos números
y sólo para mostrarles que no me inventé estos ejemplos en mi cabeza, en el
problema del bar El Farol que ya vimos tenemos exactamente un caso donde se hace
algo así, entonces en este caso lo que hacemos es tomar las estrategias, que es
el peso, si recuerdan el problema del bar El Farol uno pondera cada peso contra el
pasado y luego tomamos la historia pasada y básicamente corremos el comando MAP para
mapear la marca de pregunta 1, que es el elemento de la estrategia multiplicado por
la marca de la pregunta 2 y esto genera una salida que es el resultado de la
multiplicación de estos dos items juntos como una lista y luego se los suma
para poder crear la concurrencia esperada dada esa estrategia para esa historia en
particular; esta es la idea detrás de MAP denme un segundo y les voy a mostrar como
funciona en NetLogo
ok, acá tenemos un ejemplo de cómo usar MAP en NetLogo, imaginemos que tenemos
algunas tortugas y su propiedad es la de "ingresos" (revenue) y también la de un
"número de empleados"
hacemos el arranque usual, limpiamos todo recomenzamos los ticks
lo que hace que todo esto sea muy simple es que vamos a crear 5
tortugas a las que le asignamos unos ingresos de 100 aleatorios y una cantidad
de empleados de; mejor hagamos que sea al azar pero entre 10000 y al azar pero 100
asignamos las coordenadas al azar en base a xcor y a ycor
asignamos su forma a un "círculo" y asginamos su color a "rojo"
dejenme verificar que todo funcione, setup
esperen un segundo, a ver si funciona
todo está bien
ahora podemos pedirles a las tortugas
que tengan unos nuevos ingresos en cada vuelta
asignamos a los ingresos un valor al azar de 10000 por sobre el ingreso que tenían
y ahora quiero mostrar, digamos, los ingresos de la compañía
medidos en miles, lo que hacemos es crear un monitor que dice MAP y repito el código
que escribimos antes, signo de pregunta, dividido por 1000
ingresos de las compañías, Ingresos de las Compañías
todo chequeado, puede que hayamos cometido algún error aquí, oh compañía, tortugas ok
el problema es, dicho sea de paso, esto es algo que enseño, cuando uno hace, eh, esto
devuelve algo de azar, por lo que quiero que devuelva siempre en el mismo orden
y entonces por ejemplo, podemos hacer un ordanamiento sobre este mapa
y así lo hacemos en forma estándar
estos son los ingresos de la compañía por cada 1000, vamos a agregar unos ingresos
agregamos y ahora mostramos los ingresos por cada 1000. Entonces el segundo ejemplo
de MAP que quiero mostrarles, es un poco más complicado que el primero y lo que
hice fue escribir una cantidad de código y vamos a verlo
esta es la solución más simple que uno puede escribir para este ejemplo de MAP
va a ser fácil escribir este ejemplo de esta manera: MAP que redondee, signo de
pregunta 1, dividido por signo de pregunta 2, dividido por 1000, esto es, ustedes
saben, ingresos divididos por los empleados dividido por 1000
y luego uno debería decir: ingresos de las tortugas, por qué tortugas? el nro de
empleados es la tortuga
pero el problema con esto como ustedes verán
es que
voy a cambiar esto
es que estos números siguen diciendo que cambian y uno puede pensar que: oh bueno
es lo mismo cuando vimos lo de los ingresos de las compañías, tenemos que
poder ordenarlos y resolver el problema
lo ordenamos y lo que obtenemos
es que todavía sigue cambiando, aún cuando lo hemos ordenado, entonces por qué pasa
esto? la razón es que si miramos el código estamos haciendo que los ingresos de las
tortugas y estamos haciendo que el número de empleados sea el de las tortugas, pero
le pedimos que nos devuelva un conjunto aleatorio de las tortugas, entonces no
sabemos si estos ingresos coinciden con el número de empleados, cada vez que corre
puede hacer una combinación diferente y por eso es que no coinciden con las
tortugas individuales; necesitamos algo que nos permita ver los ingresos y el
número de empleados para la misma tortuga y luego dividirlo para obtener el orden
que buscamos; por supuesto, debo mencionar si no estamos usando MAP podemos hacer
esto muy fácilmente, podemos hacer que los ingresos dividido por el número de
empleados
de tortugas
con eso podremos obtenerlo y si lo dividimos por 1000, podemos ponerlo
y redondearlo para que quede lindo
redondeamos todo
esto es lo que podemos tener y anda muy bien, pero quiero mostrarles el MAP, a
veces una solución como ésta no funciona muchas veces hace lo que uno quiere pero
a veces no, veamos entonces, borramos esto tenemos estos ingresos, podemos ir a ver
el MAP y lo que hice, por fuera del código y lo que quiero hacer acá es crear dos
globales, una que se llame rlist y elist (ingresos) y (playlist) y en el setup y en
cada go, primero creé una lista de combinación donde tengo la lista de los
ingresos en diferentes lugares, cada tortuga se juntan en su propia sublista
cómo se ve esto?
les muestro rápidamente
imprimo y lo muestro, algo que es útil cuando se debuguea, y se ve cómo esto
donde está cada uno en una sublista y lo que quiero hacer es tomar este número y
dividirlo por este número y dividirlo por este número; de la forma en que lo hago es
que la lista de ingresos, usando MAP para que sea el primer item de la lista, esto
va a ir por cada item, 99, 6, 9 y voy a asignar la lista de empleados, vamos al
primero, pero sin el primero, lo que hace el "pero sin el primero" es decir "dame el
segundo item de la lista" o sino cualquier otro; lo que devuelve es una lista, donde
tomo el primer item; y si miran a la rlist y a la elist tiene estas dos listas,
entonces ahora puedo escribir la función MAP, como MAP redondeo y debido a esto
no es que estén ordenandos de ningún modo pero sabemos que pertenecen a la misma
tortuga, debido a la forma en que asignamos la rlist y la elist, sabemos
que tenemos un sistema estable, y ahora hacemos setup y podemos repetir 100 go
y veremos esta forma
este es un ejemplo complejo, pero es uno muy bonito
ahora vamos a ver el comando REDUCE, REDUCE es similar a MAP, MAP toma cada
item en una lista y arma la salida transformándolos; REDUCE toma los items y
trata de combinarlos usando un reporter
la salida de esto es generalmente un número solo, en vez de ser otra lista
por ejemplo en este caso, podemos usar REDUCE más 35 104 54 28 35, lo que hacemos
es tomar 35 y sumarle 104, tomamos el resultado y le sumamos 54, tomamos el
resultado y le sumamos 28, tomamos el resultado y le sumamos 35 y luego lo
dividimos por 5 y si miramos bien lo que estamos haciendo es calcular un promedio
hay formas más sencillas de hacer eso en NetLogo, pero les quiero mostrar con un
ejemplo como se ve esto funcionando
un ejemplo más complejo puede ser lo siguiente que es usar REDUCE con un if
else-value signo de pregunta 2 igual a 35 entonces signo de pregunta 1 más 1 y sino
signo de pregunta 1 y lo que esto hace para que funcione, esencialmente vamos a
contar el número de ocurrencias en que aparece el 35 en la lista; en este caso
usamos el 0 porque nos indica cuantos "35" hemos encontrado; entonces este reporte va
a correr de la siguiente forma, el signo de pregunta 1 mapea contra el 0 y el signo
de pregunta 2 mapea al primer 35, luego de ello, esto dirá: es el valor del signo de
pregunta 2 igual a 35, si es entonces el signo de pregunta 1 le suma 1 a 0 entonces
ahora el siguiente signo de pregunta 1 será siempre el resultado de esto para el
próximo valor de entrada y ahora el signo de pregunta 1 es 1, ahora vamos a ver como
seguimos adelante, en este caso es no, entonces sólo la salida será 1, será no,
28? no, sigue el 1, 35? entonces si es 35 entonces tomo ese 1 y se lo sumo al otro
1 y entones tengo ahora 2 y esa será la salida
dejen que les muestre esto en NetLogo
ok, ahora hablamos de REDUCE, vamos a usar la misma maniobra con las diferentes
compañías de las que tenemos sus ingresos a lo largo del tiempo; en el primer
ejemplo lo que hicimos fue escribir la función REDUCE para calcular el promedio
de los ingresos de cualquiera de las firmas, podemos decir REDUCE más, oh todas
las firmas debería haber dicho, ingresos de las tortugas
dividido por el conteo de las tortugas
tenemos promedio de ingresos
y como no tenemos ninguna tortuga aún, veamos algunas y aquí vamos, pero
eventualmente se frena, tengo que sacar los ticks del código, lo hacemos más
sencillo
podemos dar GO y nos muestra el promedio de los ingresos
pero qué pasa si queremos un ejemplo más complejo? qué pasa si queremos, por
ejemplo, cuente el número de firmas que tienen más de 10000 en ingresos
lo que podemos hacer es agregar un monitor como siempre, y podemos básicamente decir
REDUCE if-else VALUE
como hicimos antes, asegurémonos de poner los corchetes, signo de pregunta 2 es más
grande que 10000, luego signo de pregunta 1 más 1, eso es básicamente, esta es la
misma noción que usamos cuando hicimos la búsqueda del 35, entonces en el caso donde
hay un valor más grande que 10000 y donde el incremento se cuenta de a 1, de otra
forma, no vamos a implementar nuestra cuenta, vamos a dejarla sola
y luego, una vez que tenemos esto, luego podemos ponerlo en una lista y una lista
en este caso va a ser generada por fput de 0 y fput toma una lista y pone
un valor hasta el primer elemento
de las tortugas
esto funciona, podemos decir que las firmas que son mayores que 10000
hacemos SETUP y luego GO y al principio hay sólo algunas firmas
sólo para repasar, usamos REDUCE y el reporter que usa el REDUCE es en este caso
es este valor de IF-ELSE donde es más grande que 10000 y este corchete
cierra ese reporter, que creo que tuve que doble chequearlo y este es el operador de
la lista y en este caso es el ingreso de las tortugas, donde se pone 0 en el frente
porque cuenta a medida que varía el contador y aquí terminamos