martes, 13 de noviembre de 2012

Practica4

Introducción

En la practica 4 se programara un sistema adaptativo relacionado con agentes inteligentes.

Agentes cooperativos: para que un agente pueda ser auto suficiente y conocedor del entorno en el que se encuentra, debe coordinarse y cooperar con cada uno de los otros agentes. Existen varias formas para hacer esto.

Tomando en cuenta El problema de el dilema del prisionero el agente i logrará tomar una decisión



Objetivo.

El objetivo de este problema es programar los agentes para los prisioneros y que estos  puedan decir que se tiene que contestar.

Para esto ninguno de los dos agentes se podrán comunicar, pero sus decisiones tendrán como efecto que queden encarcelados cierto tiempo o si quedaran en libertad. Se buscara la decisión mas apta para que cada prisionero pueda decidir su respuesta tomando en cuenta las posibilidades que se tienen, y al final se le dictara las sentencias.   



  •  Se les dice lo siguiente:
  •  Si uno confiesa y el otro no, al que confesó se le dejará libre y al otro se le encerrará por 3 años.
  •  Si ambos confiesan, los encierran por 2 años.
  •  Si ninguno confiesa, los encierran por 1 año



Justificación

Programaremos este sistema para poner así en práctica lo visto en clase, y utilizaremos precisamente un ejemplo visto ahí, que es “El dilema del prisionero” y veremos lo sucedido después de que ambos tomen su decisión. Al realizar esta práctica nosotros ya seremos capaces de realizar y comprender el mundo de los multi-agentes, lo cual nos ayudara de gran manera a ampliar nuestros conocimientos en los sistemas adaptativos. Quisimos empezar con algo no tan complejo, como una toma de decisión, en la que influye otro agente para su ganancia. De igual forma, esta práctica nos ayudara de manera considerable para la realización de nuestros proyectos finales.



 Desarrollo
El programa consiste en una sola clase llamada multiagente. En ella se crean dos objetos, que son los prisioneros  que están en la cárcel. Ambos agentes inician con una utilidad de 0. Si uno tomará una decisión, se le asigna el único método de la clase el cual se llama acción. Donde el agente, Evalúa cada una de las posibilidades de su decisión y  la de su compañero. Si la utilidad es mayor a la que conserva actualmente. Opta por quedarse con la decisión que le proporcione mas utilidad, si es caso contrario, la descarta y pasa a la siguiente posibilidad.















Código

class Multiagente:
    def __init__(self):
    
        self.accion1="confiesa" #  ambos objetos tienen dos opciones, confesar o no confesar
        self.accion2="no confiesa"
        self.utilidad=0
    def accion(self):
        # el agente pasa por el metodo accion donde evalua las posibles convinaciones y 
        # solo toma en cuenta la accion  donde la utilidad sea mayor desde donde comenzo
        #  en este caso, 0
        if agentei.accion1 and agentej.accion1:  # si ambos confiesan ambos tienen una utilidad de 2
            utilidadnueva=2
            if utilidadnueva>self.utilidad:
                print "si el agente i : ", agentei.accion1
                print "y el agente j: ", agentej.accion1
                self.utilidad=utilidadnueva
                if agente == "i":
                    print "El agente", agente, "tiene una utilidad de : ", agentei.utilidad
                    print "Entonces el agente ", agente, agentei.accion1
                if agente == "j":
                    print "El agente", agente, "tiene una utilidad de : ", agentej.utilidad
                    print "Entonces el agente ", agente, agentej.accion1
        

#si ambos no confiensan obtienen utilidades iguales de 3
        if agentei.accion2 and agentej.accion2:  
            utilidadnueva=3
            if utilidadnueva > self.utilidad:
                print "si el agente i : ", agentei.accion2
                print "y el agente j: ", agentej.accion2
                self.utilidad=utilidadnueva
                if agente == "i":
                    print "El agente", agente, "tiene una utilidad de : ", agentei.utilidad
                    print "Entonces el agente ", agente,agentei.accion2
                if agente == "j":
                    print "El agente", agente, "tiene una utilidad de : ", agentej.utilidad
                    print "Entonces el  agente ", agente, agentej.accion2
     
            
                
#utilidad 5 agente i
        if agentei.accion1 and agentej.accion2:  # si el agente confiesa y el otro no, la utilidad que recibira es 5
            utilidadnueva=5
            if agente =="j":
                utilidadnueva=0
            if utilidadnueva>self.utilidad:  
                print "si el agente i : ", agentei.accion1
                print "y el agente j: ", agentej.accion2
                self.utilidad=utilidadnueva
                if agente == "i":
                    print "El agente", agente, "tiene una utilidad de : ", agentei.utilidad
                    print "Entonces el agente ", agente,  agentei.accion1
                if agente == "j":
                    print "El agente", agente, "tiene una utilidad de : ", agentej.utilidad
                    print "Entonces el  agente ", agente, agentej.accion1
            
          
                
            
        if agentei.accion2 and agentej.accion1: # si el agente decide no  confiesar, pero el otro si, se le asigna utilidad de 0
            utilidadnueva=0
            if agente =="j":
                utilidadnueva=5
            if utilidadnueva> self.utilidad:
                print "si el agente i : ", agentei.accion2
                print "y el agente j: ", agentej.accion1
                self.utilidad=utilidadnueva
                if agente == "i":
                    print "El agente", agente, "tiene una utilidad de : ", agentei.utilidad
                    print "Enonces el agente ", agente, agentei.accion2
                if agente == "j":
                    print "El agente", agente, "tiene una utilidad de : ", agentej.utilidad
                    print "Entonces el agente ", agente,agentej.accion1
                
            #utilidad 5 agente j

        
        
        print "El mejor caso seria el ultimo donde la utilidad seria: " , self.utilidad
        
        
                
     


agentei = Multiagente() # se  el objeto agente i
agentej = Multiagente()# se crea el objeto agente j
utilidad=0

agente =str(raw_input(" Ingrese el agente que debe tomar la desicion ( i o j ): "))
while agente != "i" and agente != "j":  # se recibe el agente que tomara la decision
    agente =str(raw_input(" Ingrese el agente que debe tomar la desicion ( i o j ): "))
print "La utilidad del agente", agente, "comienza en: ", utilidad
# las utilidades de los agentes comienzan en 0

print


if agente == "i":
    # el agente i tomara la decision
    agentei.accion()

elif agente=="j":
    # el agente j tomara la decision
    agentej.accion()



Resultados.
A continuación se presentan los resultados. Donde el agente seleccionado toma la decisión que le conviene Tomo dos veces la decisión confesar... y la ultima le convendría más, ya que esa sería la mayor utilidad que podría llegar a obtener.


Video:
practica4




Conclusiones:

En esta practica se relaciono con el tema visto en clase de multiagentes. Se "simulo", la situación del problema ya descrito. Los agentes Continuamente están realizando procesos, las preferencias de los agentes se basan en su función de utilidad. Algunas mejoras futuras, seria crear un sistema de multiagentes que interactuen entre sí y puedan realizar mas de una tarea o decisión.

1 comentario:

  1. OK. Sí se va por utilidades, pero falta poner más en claro la estructura de decisión. Teniendo la matriz en cuenta, ¿finalmente qué decisión toma el agente? Si no hay estrategia dominante, ¿cómo resuelve la situación?

    ResponderEliminar