ok, tenemos también los agentes basados en metas y lo agentes basados en metas son agentes que están tratando de alcanzar alguna meta; uno puede pensar en los agentes basados en la utilidad, pero son un poco diferentes, los agentes basados en la utilidad, se puede decir que la meta es maximizar, pero aquí necesitamos algunos criterios, algunas metas especificadas a alcanzar en el futuro, como uno quiere, en el ejemplo, podemos decir que si uno quiere manejar su auto desde el comienzo en un lugar hasta el lugar donde está el hogar o desde el hogar hasta el lugar de trabajo y entonces ustedes tienen la meta exacta de que es lo que están tratando de alcanzar y si quieren alcanzar esa meta entonces es eso; no hay un sentido de usar funciones de utilidad o algo así, en vez de satisfacer y alcanzar esa meta como una parte de lo que se está intentando; ahora a veces uno hace algunas clases de mediciones, para saber si estoy cerca de la meta; esa clase de utilidad, pero no quiero sonar como que son extremadamente diferentes, sino que son formas distintas de pensar en el conocimiento de los agentes volvemos acá y vamos a abrir el modelo basado en metas, escribimos "goal" y en el capítulo 5 lo encontramos y este es el modelo del tráfico en grilla que es un poco diferente del modelo básico del tráfico que en verdad opera en una grilla de 2 dimensiones y la versión tradicional de este modelo en forma esencial se asigna algo diferente para que el tráfico realice que corran en diferentes sentidos y traten de ver como se puede ajustar la forma en que los autos se mueven, aunque los autos se mueven siguiendo un patrón simple, arriba y abajo, acá le estamos dando a cada agente una meta, un hogar y un lugar de trabajo, entonces están constantemente moviéndose del hogar al trabajo y ustedes pueden ver que se mueven por ahí y algunos giran a la izquierda o a la derecha y vemos diferentes clases de giros que están haciendo ahora en el sistema; a medida que se mueven por ahí, están tratando de alcanzar esta meta; están tratando girar a la izquierda o a la derecha para poder quedar más cerca de su meta y entonces en un tiempo determinado, el tiempo cambia y van al hogar, van al trabajo y luego del trabajo, van al hogar miremos esto con más detalle, tenemos el comando "seguir" en NetLogo que nos permite hacer esto, podemos pedirle que siga a una de las tortugas y entonces va a quedar iluminada esa tortuga en particular y les podemos permitir, podemos verlas yendo entre el trabajo y el hogar, nos muestran cual es su meta, cuando las seguimos, está tratando de ir al trabajo y ahora está tratando de ir a la casa; ahora va al trabajo, a la casa, etc. es bastante lindo ver como funcionan; esta tortuga en particular, esta tratando de ir y venir, hay otras y algunas veces las pueden ver cuando se mueven por ahí, que quedan como estancadas y quedan yendo y viniendo, yendo y viniendo, eso es debido a que el código que escribimos para poder determinar como se hace para ir y venir desde el trabajo o desde la casa no es siempre el mejor código; les digo la verdad; algunas veces quedan estancados en lo que llamamos un mínimo local, un lugar de donde no pueden salir, de hecho esta de acá está estancada ahora mismo, no debido a que el código ande mal sino por el tráfico, hay mucho tráfico en esa intersección y eso causa el problema ya que no puede atravesarlo para poder resolverlo; esto sucede definitivamente y podríamos escribir un código que recablee y que permita que vayan a otros lugares pero quisimos que el ejemplo sea simple e ilustrativo, vamos a ver un poco el código sólo para tener una idea de que es lo que está haciendo en verdad, entonces ahora cuando miramos al código, el código de go tenemos ahora este comando que dice que "enfrentemos el siguiente parche" que no estaba en el modelo original, entonces veamos que es lo que hace ese nuevo código obviamente, ya hablamos un poco de eso antes, pero enfrentar le dice a una tortuga que encare para una dirección en particular y en este caso es que encare un parche y que trate de determinar cual es el siguiente parche; hay un montón de código acá que básicamente establece las metas y luego se mueve al siguiente parche que se encuentra más cerca de esa meta, entonces cuando está yendo a casa y el siguiente parche es mi casa, entonces tengo que volver al trabajo y si llego al trabajo, entonces necesito ir a casa y así si la meta es igual a "casa" y un miembro está en un parche aquí en el vecindario de la casa, entonces asigne mi meta como el trabajo, así voy al lugar siguiente y uno puede ir y venir y entonces de esa forma tenemos siempre actualizada la localización; la próxima cosa que vamos a hacer es es intentar darnos cuenta cual de los otros parches están disponibles para moverse; las opciones son del vecindario cuyo color de parche es blanco, son rojos son el camino, o son verdes que es la luz del tráfico, que podemos considerar que cuelgan por encima del camino, entonces son elecciones válidas; hay opciones, uno de esos parches va a minimizar la distancia entre mi meta y yo mismo, entonces con cada parche que se encuentra cerca de mi casa o de mi trabajo, depende de hacia donde me estoy dirigiendo, entonces va a minimizar la distancia entre ellos, va a elegir ese parche para minimizar la distancia cada vez que se elija esa opción; esta es la meta de los agentes y cada uno tiene una meta diferente y cada vez que suceden los pasos como ticks, entonces se moverá más cerca de esa meta, ahora la meta cambia a lo largo del tiempo, lo cual lo vuelve interesante, pero es esencialmente lo que es; por qué estamos trayendo este tipo de problemas donde a veces tenemos a las tortugas moviéndose para adelante y para atrás, por ejemplo, porque ellas pueden enfrentarse; los parches quedan fuera de los límites, los asigamos así, son las cuadras, las cuadras de las calles sobre las que simplemente se puede manejar sobre esas cuadras de la ciudad; entonces puede ser posible que una tortuga encuentre en una cierta forma que es lo mismo alcanzar el objetivo y entonces si es un poco más a la izquierda entonces puede ser el caso que moviéndose a la izquierda en realidad quede más cerca la meta, pero si se mueve a la derecha puede que se beneficie al encontrarse justo en el medio, puede que cada vez que se mueve un parche para un lado o para el otro, quede levemente más lejos de su meta y por lo tanto queda moviéndose para adelante y para atrás, hay formas de encarar este problema, de hecho hay toda una literatura en Inteligencia Artificial que trabaja sobre la planificación de senderos y en búsquedas y que nos previene de volver atrás por los mismos pasos que se encuentran, para poner un, para los objetivos de ésto, no quisimos hacer el código muy complejo y entonces no incluimos mucha de esa discusión; pero como un ejercicio para que hagan en casa, siéntanse libres de cambiar el código y vean si pueden darse cuenta como pueden parar el hecho de que las tortugas queden atrapadas en lo que se llama "mínimo local", como espacios locales que están muy cerca del óptimo pero no lo suficiente, hay ahí otros óptimos mejores, mejores soluciones en algún lado; fíjense si se pueden dar cuenta, siéntanse libres para modificar el código y veremos que sale por último tenemos los agentes adaptativos y estos son agentes que contienen no sólo las decisiones sino las acciones que quieren tomar, pero también las estrategias; la idea que a veces trata de expresar esto es que la acción que un agente puede tomar y en otros casos de conocimiento de agente es la misma dado el hecho de que están viendo el mismo medio ambiente, pero un agente adaptativo en realidad aprende de las experiencias pasadas y realiza diferentes acciones en el futuro; ustedes pueden tener un agente adaptativo que sea un agente basado en utilidad, donde están tratando de darse cuenta cuales son las acciones que pueden maximizar la utilidad, basados en la experiencia que puedan tener o una meta básica, que no alcancen esa meta debido a que en vez de ir para un lado fueron para el otro, aún cuando estaban en el mismo lugar y basados en la misma dirección y eso sería todavía un agente adaptativo, es un agente que cambia no únicamente las acciones que lleva a cabo sino las reglas mediantes las cuales decide que acción debe tomar y entonces creamos un modelo que se llama "tráfico básico adaptativo" en donde los agentes andan por ahí un poco hasta que aceleran y observan cual es la velocidad máxima y entonces tratan de darse cuenta cual es la mejor aceleración para el sistema como un todo, déjenme que les muestre ok acá vamos a ver el ejemplo final del conocimiento de agente que vamos a explorar en la biblioteca de modelos de NetLogo, en el capítulo 5, del manual del IABM ustedes van a encontrar el que se llama "Traffic Basic Adaptive Individuals" y con eso vamos a estar trabajando hoy, en esta sección; el modelos es muy similar al modelo original del tráfico básico, tiene el "setup" y el "go" que es el mismo de antes, ustedes se darán cuenta que hay un par de nuevos deslizadores y de gráficos nuevos, hay algunos botones nuevos, hay un nuevo deslizador que se llama "aceleración inicial" en vez de "aceleración", debido a que les vamos a permitir a los agentes que puedan modificarla a lo largo del tiempo, también tenemos un deslizador que se llama "ticks entre tareas", que básicamente controla cuan a menudo los agentes van a explorar nuevas soluciones, nuevas adaptaciones, primero explorando aquellas que ya tienen y van a ver este gráfico que nos muestra la aceleración, así podemos tener alguna idea de cual es la distribución de la aceleración; entonces miremos que hace el "adaptive go", cuando lo presiono, ustedes van a notar que este gráfico ya no tiene una sola línea, pero ahora tiene números diferentes que indican como los diferentes autos están explorando las aceleraciones diferentes y algo muy interesante sucede cuando le permitimos a este modelo que corra por un tiempo, ahora vemos básicamente que se ilumina como el modelo básico del tráfico, con la diferencia de que en este gráfico, con las velocidades máximas y mínimas no son como, son volátiles, hay un poco más de estabilidad en términos de la forma en que trabaja y lo que quiero decir con eso es que el hecho de que los autos vayan hacia un 0 absoluto todo el tiempo, si lo aceleramos un poco, ahora empezamos a ver más, ahora la velocidad mínima es mayor que 0 y eso nos indica que los autos no están, no van a frenar completamente, no están frenando y llegando a un atasco de tráfico, están yendo hacia un atasco de tráfico leve y si dejamos que siga corriendo el modelo, aún por más tiempo eventualmente llegaremos a un estado de flujo libre donde todas las tortugas, todos los autos se moveran a una velocidad justa y alta y como pueden ver, aún en el medio hay un poco de atasco de tráfico, en el medio de esto, pero aún con la velocidad mínima del tráfico, los libera eso es algo bueno cuando puede haber mucho tráfico luego; debido a que se están adaptando en forma constante, eso sucede todo el tiempo; si lo dejan corriendo lo suficiente eventualmente llegarán a una situación en la que todos los autos se estarán moviendo a su máxima velocidad y eso es debido a que a medida que continúan moviéndose el promedio de aceleración sube y baja y los separa lo suficiente y por lo tanto ya no es un problema ahora miremos un poco el código que hace que esto suceda; déjenme que lo agrande un poco; ahora hay un procedimiento que se llama "go adapative", que básicamente le dice a la tortuga que se adapta y el código para que se adapte, básicamente dice, esto es lo que vamos a hacer cada vez que corremos una prueba recuerden cuan rápido podemos ir durante esa prueba y cada vez que alcanzamos un poco más de velocidad, ponemos esa velocidad en la prueba, ahora si el modelo, si es el tiempo para la prueba, si es tiempo de explorar una nueva aceleración, entonces veremos cual fue la velocidad promedio durante la última prueba que corrimos, si la velocidad promedio durante ese tiempo fue más grande que la mejor velocidad que hayamos tenido antes, entonces vamos a sumarla a la aceleración que estuvimos usando la última vez, esa es nuestra mejor aceleración y vamos a registrarla a lo largo del tiempo, ahora lo que vamos a hacer, una vez que hicimos todo eso, si es el caso entonces lo que vamos a hacer es cambiar la aceleración en forma azarosa un poco, vamos a mover arriba y abajo con un azar basado en un número de punto flotante entre el valor negativo .01 y el valor positivo .01, por supuesto que dejaremos que sea 0; vamos a reiniciar la velocidad, entonces si encontramos una buena velocidad lo que vamos, vamos a recordar cual es pero luego vamos a usar la utilidad y ver si era mejor esa velocidad si no lo hacemos, entonces vamos a asignar la velocidad que sea igual a un poco como fue la última velocidad más la mejor velocidad que tenemos esto es debido al hecho de que puede que imaginemos, debido a que otras cosas están cambiando en el modelo, una vez que uno mira a la aceleración el modelo se comporta de forma extremadamente rápida, eso puede ser un escenario único, a lo largo del tiempo vamos a promediar la mejor velocidad que hemos visto hacia una velocidad promedio y entonces vamos a permitirle olvidar como lo hizo durante aquel tiempo y que trate de buscar por la mejor velocidad que pueda mostrar y ese es el caso donde vamos a reiniciar la velocidad de vuelta a la velocidad que tuvo, porque esa fue muy buena y entonces vamos a tratar de mantenerla, ok? este es un muy buen ejemplo de adaptación la velocidad y las acciones de los agentes van a variar basadas en su conducta pasada si tuvieron una muy buena conducta en el pasado, dada esa aceleración entonces van a continuar usando esa aceleración en el futuro, si no tuvieron una buena aceleración en el pasado, entonces van a tratar de hacer algo diferente en el futuro este no es el 1er ejemplo de un modelo de agentes adaptativo que vemos en esta clase les voy a decir cual fue el otro modelo que vimos, del que estuvimos hablando bastante, pero en vez de decírselos se los voy a dejar como una pregunta; piensen y traten de recordar, que otro modelo en el cual los agentes actúan diferente en el futuro basados en su conducta pasada, ese también es un modelo basado en agentes adaptativo