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