Anda di halaman 1dari 25

Implementacin de un Agente para el mundo de la aspiradora

I. Arquitectura del Sistema Mdulos del Sistema

A Continuacin se ver cada uno de estos mdulos. En el mdulo Agente est considerado, el Agente Reflejo Simple y el Agente con Memoria Interna.

II. Especificacin de los mdulos II.1 Modulo del Ambiente de Operacin A) Diagrama de Clases
Ambiente ~posX: int ~posY: int ~posX0: int ~posY0: int ~orientacion: int +SUR: int = 2 +NORTE: int = 1 +OESTE: int = 0 +ESTE: int = 3 <<create>>+Ambiente() +generarEstadoInicial(dimension: int, pBasuras: float, pObstaculos: float) +imprimirEstado(s: String) +colocarAgente(x: int, y: int, orientacion: int, ag: Agente) +realizarAccion(a: Accion) +getPercepcion(): Percepcion

(Ver cdigo en JAVA del AMBIENTE en el ANEXO) Ojo: El ambiente si sabe la orientacin del agente, pero el agente no lo puede percibir ya que no tiene sensores para percibir estas orientaciones. B) Parmetros del ambiente Estos parmetros definen la forma y contenido del ambiente, que para este caso es una malla donde un agente aspiradora tendr que limpiar la mugre all incluida. Para ello tendr que evitar los obstculos que encuentre en la malla. La lectura de los parmetros del ambiente se lo har desde un archivo de configuracin llamado config.ini, all estarn definidos:

Parmetros del ambiente Valor Dimensin de la celda 2 Probabilidad de basura 0.5 Probabilidad de obstculos 0.4 Posicin X inicial de la aspiradora 1 Posicin Y inicial de la aspiradora 0 Estos valores son definidos por el usuario.

0 0 1 Eje Y

Eje X

Ejemplo de un mundo de la aspiradora de tamao 2x2 : Suciedad o mugre : Obstculo (muro o mueble) : Aspiradora orientada hacia abajo : Aspiradora orientada hacia la izquierda : Aspiradora orientada hacia arriba : Aspiradora orientada hacia la derecha B) Representacin del Ambiente Representacin de Objetos en el ambiente Smbolo Objeto Representacin Suciedad M(1, 0...F+1, 0...F+1) S Obstculo M(2, 0...F+1, 0...F+1) O Representacin de objetos en las celdas del ambiente S O valor Constantes 0 0 0 VACIO 0 1 1 OBSTACULO 1 0 2 SUCIO 1 1 X El valor X indica que no existe esa posibilidad Si S o O es 0 indica que no esta presente la suciedad u obstculo respectivamente Si S o O es 1 indica que si est presente la suciedad u obstculo respectivamente

CODIGO EN JAVA DE ESTA SECCION


public void generarEstadoInicial(int dimension, float pBasuras, float pObstaculos) { float pb=pBasuras;// probabilidad de basuras float po=pObstaculos; // probabilidad de obstaculos e = new Estado();// e: es una variable de tipo estado e.setDimension(dimension);// estableciendo la dimension del ambiente int x,y; for(y=0; y<dimension; y++) {//Y: SON LAS FILAS for(x=0; x<dimension; x++){//X: SON LAS COLUMNAS if(Math.random()<pb) e.setCelda(x,y,Estado.SUCIO);//GENERANDO CELDA SUCIA. SUCIO es una constante de la tabla anterior else if(Math.random()<po) e.setCelda(x,y,Estado.OBSTACULO); //GENERANDO CELDA CON OBSTACULO. OBSTACULO es una constante de la tabla anterior else e.setCelda(x,y,Estado.VACIO); //GENERANDO CELDA VACIA. VACIA es una constante de la tabla anterior } } }

Por ejemplo para F=3 tenemos el siguiente ambiente: Simblicamente 0 0 2 2 A 0 1 2 0 A: es el agente

Grficamente

Los dos grficos son equivalentes

II.2 Modulo del Agente A) Diagrama de clases


Agente Accion -codigo: int +AV: int = 0 +G90: int = 1 +G_90: int = 2 +OFF: int = 3 +AS: int = 4 +getCodigo(): int +setCodigo(codigo: int) +getNombre(): String -accion 1 1..* -tabla: int[*] -reglas: int[*] -prendido: Boolean <<create>>+Agente() +operarARS(n: int) +operarACM(n: int) -interpretar_entrada(p: Percepcion): Estado -selecciona_regla(estado: Estado, reglas: int): int -aplica_regla(regla: int): Accion -agenteReflejoSimple(p: Percepcion): Accion -agenteConMemoria(p: Percepcion): Accion -actualiza_estado(e: Estado, p: Percepcion): Estado +getAmbiente(): Ambiente +setAmbiente(ambiente: Ambiente) -agente 1 1 1..* Tabla -puntaje: int Actuador -codigo: String +nombre: String 1..* 1..* 1 -agente 1 Sensor -codigo: String -nombre: String Percepcion -obst: int -suc: int -orig: int <<create>>+Percepcion() +getValor(): int +getObst(): int +setObst(obst: int) +getOrig(): int +setOrig(orig: int) +getSuc(): int +setSuc(suc: int) +imprimir() 1..*

(Ver cdigo en JAVA del AGENTE en el ANEXO) Cada Agente posee tres Sensores (Sensor tctil, fotosensor, sensor infrarrojo) y cada uno de los cuales mide dos Percepciones (existencia o ausencia de algo). Por otro lado, cada Agente posee algunos actuadores, pero para este ejemplo se han considerado cuatro actuadores (Ruedas, eje, tubo, circuito elctrico). Las ruedas se relacionan con el avance de la aspiradora, el eje, con los giros de direccin, el tubo, con la accin de aspirar todo lo que hay en la celda, y el circuito elctrico se relaciona con la accin de apagado automtico de la aspiradora. B) Tipos de Agente Principalmente existen 2 tipos de agentes, los cuales se diferencian por la informacin que poseen. Mientras que el agente reflejo simple trata de alcanzar su objetivo con tan solo tener una tabla de mapeo de percepcin-accin, el agente con memoria interna, adems de esa informacin trabaja con informaciones adicionales que a continuacin se menciona. El agente reflejo simple no considerar lo siguiente: Estado Como evoluciona el mundo Lo que hacen mis acciones El agente con memoria interna si considera lo anterior.

II.2.1 Agente Reflejo Simple AGENTE Sensores Percepciones (ST, FS, SI)

Ambiente Rejilla de 4x4 con: Obstculo (mueble o muro) Suciedad

Solucin?

Metas Limpiar Irse a casa

Acciones Avanzar Girar 90 Girar -90 Aspirar Apagarse

Actuadores

Esquema General de un Agente del mundo de la aspiradora A) Sensores Smbolo ST FS SI Nombre del Sensor Sensor tctil Foto-sensor Sensor infrarrojo Descripcin Percepciones

tiene un valor 1 si la mquina Obstculo topa con algn obstculo y un valor 0 en caso contrario est debajo de la mquina; ste Suciedad emite un 1 si hay suciedad y un 0 en caso contrario que emite un 1 cuando el Origen agente se encuentra en su ubicacin de origen, y 0 en cualquier otro caso. Valor=1 Top con un obstculo En la celda actual existe suciedad El agente se encuentra en su celda de origen Grafico

B) Percepciones Smbolo Percepcin Valor=0 Obst. Obstculo No ha topado con un obstculo Suc. Suciedad En la celda actual no hay suciedad Orig. Origen El agente no se encuentra en su celda de origen C) Actuadores Smbolo Nombre del Actuador

Acciones

R E T C

Ruedas Eje Tubo para aspirar Circuito

Avanzar Girar 90, Girar -90 Aspirar Apagarse Ejemplo Avanzar una casilla a la derecha

D) Acciones Smbolo Accin Av Avanzar 90 -90 As Girar 90

Antes y despus de un giro antihorario Girar -90 Antes y despus de un giro horario Aspirar Antes y despus de una accin aspirar Off Apagarse

E) Tabla Percepcin Accin Numero de entradas: hay 3 entradas que seran los respectivos valores de las percepciones. (Ver la tabla de sensores) Combinaciones: En la tabla, se han colocado todas las posibles combinaciones de las percepciones. Estado: Un estado est formado por: El tablero y la percepcin actual.

En la siguiente tabla el smbolo * significa cualquiera de las 4 orientaciones posibles que puede tomar el agente. El agente no conoce las orientaciones. El desempeo es un dato del problema (Ver anexo 1, en la parte de metas) Percepciones Acciones Desempeo Obst Suc Orig Orientacin (<,v,>,^) 0 0 0 0 * Av -1 1 0 0 0 * 90 -1 2 0 0 0 * -90 -1 3 0 0 0 * As -1 4 0 0 0 * Off -1000 5 0 0 1 * Av -1 6 0 0 1 * 90 -1 7 0 0 1 * -90 -1 8 0 0 1 * As -1 9 0 0 1 * Off -1 10 0 1 0 * Av -1 11 0 1 0 * 90 -1

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1

0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1

* * * * * * * * * * * * * * * * * * * * * * * * * * * *

-90 As Off Av 90 -90 As Off Av 90 -90 As Off Av 90 -90 As Off Av 90 -90 As Off Av 90 -90 As Off

-1 100 -1000 -1 -1 -1 100 -1 -1 -1 -1 -1 -1000 -1 -1 -1 -1 -1 -1 -1 -1 100 -1000 -1 -1 -1 100 -1

F) Ejemplo ilustrativo de cmo el agente limpiara un ambiente de 2x2 Percepcin Desempeo Ambiente Accin Desempeo (Obst, Suc, Orig) acumulado No hay obstculo al frente No hay suciedad Avanzar -1 0 Si est en el origen (0,0,1) No hay obstculo al frente Si hay suciedad Aspirar 100 -1 No est en el origen (0,1,0) No hay obstculo al frente No hay suciedad Girar 90 -1 99 No est en el origen (0,0,0) No hay obstculo al frente No hay suciedad Girar 90 -1 98 No est en el origen (0,0,0) No hay obstculo al frente No hay suciedad Avanzar -1 97 No est en el origen (0,0,0) No hay obstculo al frente No hay suciedad Girar -90 -1 96 Si est en el origen (0,0,1) No hay obstculo al frente No hay suciedad Avanzar -1 95 Si est en el origen (0,0,1) No hay obstculo al frente Si hay suciedad Aspirar 100 94 No est en el origen (0,1,0) No hay obstculo al frente No hay suciedad Girar 90 -1 194 No est en el origen (0,0,0) No hay obstculo al frente No hay suciedad Girar 90 -1 193 No est en el origen (0,0,0) No hay obstculo al frente No hay suciedad Avanzar -1 192 No est en el origen (0,0,0) No hay obstculo al frente No hay suciedad Apagarse -1 191 Si est en el origen (0,0,1)

El desempeo final alcanzado por el agente es de 191 puntos. G) Diagrama de Flujo de un Agente Reflejo Simple

Leer archivo de configuracion (.ini)

Generar ambiente aleatorio Prender agente

Si sucede una condicion de parada SI NO Leer percepciones del estado actual

Realizar accion segun la tabla

Condicin de parada Numero mximo de operaciones. Cuando el agente llegue a realizar una cantidad determinada de operaciones, el programa se detendr. Esta cantidad ser determinada por el usuario. II.2.2 Agente con memoria interna Es parecido al agente reflejo simple, pero se diferencia en que este agente conoce su Estado, como evoluciona el mundo y lo que hacen sus acciones. Debido a que este agente trabaja con mas informacin es necesario que aqu definamos algunos estadsticos con los que podra trabajar el agente. A) Estadsticos Nmero de acciones ejecutadas Nmero de aspiraciones Numero de aspiraciones que efectivamente limpiaron una suciedad Numero de veces que choc con un obstculo Numero de veces que volvi a pasar por la posicin inicial Numero de veces que el agente gir en sentido horario Numero de veces que el agente gir en sentido antihorario B) Diagrama de Flujo del agente con memoria interna

Leer archivo de configuracion (.ini)

Generar ambiente aleatorio Prender agente Si sucede una condicion de parada SI NO Leer percepciones del estado actual Realizar accion segun sus reglas

Calcular estadisticos

Actualizar estado interno

II.3 Complejidad de los Agentes


I. Agente Reflejo Simple

Funcion Agente Reflejo Simple (ARS) Entrada: Definimos como entrada de esta funcin al numero de operaciones seguidas que realizar el agente reflejo simple. Por ejemplo: n=10. A continuacin se analizarn los tiempos de ejecucin de cada operacin.
public void ejecutarARS(int n) { //BUCLE i: n operaciones for(int i=0; i<n; i++) { //Llamada a un metodo: 1 operacion Percepcion p = ambiente.getPercepcion(); //Llamada a una funcion: 10 operaciones Accion a = agenteReflejoSimple(ambiente.getPercepcion()); //Llamada a un metodo: 1 operacion ambiente.realizarAccion(a);

} } COMPLEJIDAD TOTAL DE LA FUNCION: n*(1+8+1)=10*(1+10+1)=120 operaciones private Accion agenteReflejoSimple(Percepcion p) { //variable global: reglas //Llamada a una funcion: 5 operaciones //se genera descripcin abstracta de la percepcin Estado estado = interpretar_entrada(p); //Llamada a una funcion: 4 operaciones // selecciona regla que cumple descripcin estado int regla = selecciona_regla(estado,reglas); //Llamada a una funcion: 1 operaciones Accion accion = aplica_regla(regla); return accion; } COMPLEJIDAD TOTAL DE LA FUNCION: 10 operaciones private Estado interpretar_entrada(Percepcion p) { NOTA: En bloques if...else, solo se considera una de las dos instrucciones. //Llamada a un metodo: if(p.getObst()==1) //Llamada a un metodo: estado.setCelda(1, 0, Estado.OBSTACULO); else //Llamada a un metodo: estado.setCelda(1, 0, -1); //Llamada a un metodo: if(p.getSuc()==1) //Llamada a un metodo:

else

estado.setCelda(1, 1, Estado.SUCIO); //Llamada a un metodo: estado.setCelda(1, 1, Estado.VACIO);

//Retorno de una variable: return estado; } COMPLEJIDAD TOTAL DE LA FUNCION: 5 operaciones private int selecciona_regla(Estado estado, int reglas[]) { //Llamada a un metodo: if(estado.getCelda(1, 1)==Estado.SUCIO) return 0; //Llamada a un metodo: if(estado.getCelda(1, 0)==Estado.OBSTACULO) return 1; //Llamada a un metodo: if(estado.getCelda(1, 0)==Estado.VACIO) return 2; //Llamada a un metodo: if(estado.getCelda(1, 1)==Estado.VACIO) return 3; return -1; } COMPLEJIDAD TOTAL DE LA FUNCION: 4 operaciones private Accion aplica_regla(int regla) { Accion a = new Accion(); if(regla==0) //Llamada a un metodo: a.setCodigo(Accion.AS); else if(regla==1) //Llamada a un metodo: a.setCodigo(Accion.G90); else if(regla==2) //Llamada a un metodo: a.setCodigo(Accion.AV); else if(regla==2) //Llamada a un metodo: a.setCodigo(Accion.AV); return a; } COMPLEJIDAD TOTAL DE LA FUNCION: 1 operacin Solo se llamar a una sola operacin

II.

Agente con memoria (o agente con estado interno)

La entrada es la misma que en el caso anterior, adems tambin lo analizaremos para un valor igual n=10;
public void ejecutarACM(int n) { //BUCLE i: n operaciones for(int i=0; i<n; i++) {

//Llamada a un metodo: 1 operacion Percepcion p = ambiente.getPercepcion(); //Llamada a una funcion: 20 operaciones Accion a = agenteConMemoria(ambiente.getPercepcion()); //Llamada a un metodo: 1 operacion ambiente.realizarAccion(a);

} } COMPLEJIDAD TOTAL DE LA FUNCION: n*(1+12+1)=10*(1+20+1)=220 operaciones private Accion agenteConMemoria(Percepcion p) { //global: reglas, estado // se actualiza la descripcin interna del estado que // mantiene el agente //Llamada a una funcion: 3 operaciones estado = actualiza_estado (estado, p); //ESTA LLAMADA A FUNCION YA SE ESTUDIO EN EL CASO ANTERIOR //Llamada a una funcion: 4 operaciones regla = selecciona_regla (estado, reglas); //ESTA LLAMADA A FUNCION YA SE ESTUDIO EN EL CASO ANTERIOR //Llamada a una funcion: 1 operacion Accion accin=aplica_regla(regla); //Llamada a una funcion: 12 operaciones estado = actualiza_estado (estado, accin); return accion; } COMPLEJIDAD TOTAL DE LA FUNCION: 20 operaciones private Estado actualiza_estado(Estado e, Percepcion p) { (Solo se llama a uno de los dos dos siguientes) if(p.getObst()==1) //Llamada a un metodo: e.setCelda(1, 0, Estado.OBSTACULO); else //Llamada a un metodo: e.setCelda(1, 0, -1); (Solo se llama a uno de los dos siguientes) if(p.getSuc()==1) //Llamada a un metodo: e.setCelda(1, 1, Estado.SUCIO); else //Llamada a un metodo: e.setCelda(1, 1, Estado.VACIO); //Retorno de una variable: return e; } COMPLEJIDAD TOTAL DE LA FUNCION: 3 operaciones private Estado actualiza_estado(Estado e, Accin p) { if(a.getCodigo()==Accion.AV) { //Llamada a una operacion if(or==Ambiente.OESTE && posX>0)

//Llamada a una operacion if(e.getCelda(posX-1, posY) != Estado.OBSTACULO) //Llamada a una operacion posX--; //Llamada a una operacion if(or==Ambiente.NORTE && posY>0) //Llamada a una operacion if(e.getCelda(posX, posY-1) != Estado.OBSTACULO) //Llamada a una operacion posY--; //Llamada a una operacion if(or==Ambiente.ESTE && posX<e.getDimension()-1) //Llamada a una operacion if(e.getCelda(posX+1, posY) != Estado.OBSTACULO) //Llamada a una operacion posX++; //Llamada a una operacion if(or==Ambiente.SUR && posY<e.getDimension()-1) //Llamada a una operacion if(e.getCelda(posX, posY+1) != Estado.OBSTACULO) //Llamada a una operacion posY++; } else if(a.getCodigo()==Accion.AS) { if(e.getCelda(posX, posY) == Estado.SUCIO) e.setCelda(posX, posY, Estado.VACIO); } else if(a.getCodigo()==Accion.G90) { if(or == Ambiente.NORTE) or = Ambiente.OESTE; if(or == Ambiente.OESTE) or = Ambiente.SUR; if(or == Ambiente.SUR) or = Ambiente.ESTE; if(or == Ambiente.ESTE) or = Ambiente.NORTE; } else if(a.getCodigo()==Accion.G_90) { if(or == Ambiente.NORTE) or = Ambiente.ESTE; if(or == Ambiente.ESTE) or = Ambiente.SUR; if(or == Ambiente.SUR) or = Ambiente.OESTE; if(or == Ambiente.OESTE) or = Ambiente.NORTE; } else if(a.getCodigo()==Accion.OFF) { this.prendido = false; }

} IMPORTANTE: Estamos considerando el peor de los casos, ya que en esta tlima funcin hay varias alternativas else if, pero el bloque que contiene el mayor numero de operaciones es el primero, es decir 12 operaciones COMPLEJIDAD TOTAL DE LA FUNCION: 12 operaciones O(1)

Comparacin del Numero de operaciones entre los dos tipos de agentes 10 50 200 500 1000 n Agente Reflejo simple 120 600 2400 6000 12000 Complejidad=12*n Agente con memoria 220 1100 4400 11000 22000 Complejidad=22*n donde n: Numero de veces que se ejecutan ambos agentes. Lo que se mide son el numero de operaciones que necesitan realizar por cada valor de n Por lo tanto, el agente con memoria, puede tomar mejores decisiones pero realizar un poco ms del doble de operaciones que el agente reflejo simple. II.4 Mdulo del Rendimiento Este mdulo se encarga de medir cuan bien trabaja el agente. Para ello trataremos de relacionar los siguientes parmetros: Tamao matriz: Se probar desde 3 hasta 10 Rendimiento: El rendimiento fue definido en la tabla percepcin-accin Nro basuras iniciales: Numero de celdas con suciedad al inicio Nro basuras faltantes: Numero de celdas que faltaron limpiarse %limpieza = (Nro basuras iniciales - Nro basuras faltantes)/ Nro basuras iniciales (0: indica que no se limpi nada; 1: indica que se limpi todas las celdas)

Hay algunos parmetros que se consideran para todas las corridas: Probabilidad de basuras = 0.5 Probabilidad de obstculos = 0.4 Numero de iteraciones por cada corrida: 200
Nro de Nro basuras Tamao matriz Rendimiento basuras inicial %limpieza faltantes 3 103 4 1 0.75 3 2 5 3 0.40 3 406 7 1 0.86 3 2 2 0 1.00 3 305 5 0 1.00 3 204 5 1 0.80 3 204 6 2 0.67 3 204 4 0 1.00 3 103 5 2 0.60 3 103 3 0 1.00 4 608 10 2 0.80 4 608 9 1 0.89 4 608 11 3 0.73

4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9

305 -200 507 406 103 608 406 507 2 911 810 608 709 305 507 305 204 -99 305 1012 911 -99 507 1517 1214 1012 608 103 -200 1012 -99 305 204 -99 305 1315 -99 1113 1214 103 -200 1416 406 1214 -99 911 2 1012 1719 406 1719 1113 1416

6 8 8 7 6 8 8 11 14 13 14 12 13 10 13 12 11 17 15 18 14 19 20 24 21 17 17 19 22 19 28 23 24 22 25 27 22 25 22 24 31 26 34 26 33 20 20 42 41 41 42 46 37

1 8 1 1 3 0 2 4 12 2 4 4 4 5 6 7 7 16 10 6 3 18 13 7 7 5 9 16 22 7 27 18 20 21 20 12 21 12 8 21 31 10 28 12 32 9 2 30 22 35 23 33 21

0.83 0.00 0.88 0.86 0.50 1.00 0.75 0.64 0.14 0.85 0.71 0.67 0.69 0.50 0.54 0.42 0.36 0.06 0.33 0.67 0.79 0.05 0.35 0.71 0.67 0.71 0.47 0.16 0.00 0.63 0.04 0.22 0.17 0.05 0.20 0.56 0.05 0.52 0.64 0.13 0.00 0.62 0.18 0.54 0.03 0.55 0.90 0.29 0.46 0.15 0.45 0.28 0.43

9 9 9 9 10 10 10 10 10 10 10 10 10 10

305 1012 103 2123 2325 1921 1315 -99 -99 2 305 507 1820 2022

35 45 36 48 48 50 53 54 53 44 40 43 48 50

30 33 33 25 23 29 38 53 52 42 35 36 29 28

0.14 0.27 0.08 0.48 0.52 0.42 0.28 0.02 0.02 0.05 0.13 0.16 0.40 0.44

Z: Rendimiento

X: Tamao de la matriz

Y: % de limpieza de basuras

(Grafico generado con la herramienta MATLAB) Grafico XYZ En el grfico se observa que el rendimiento del agente aumenta conforme aumenta el porcentaje de basuras. El tamao de la matriz no influye mucho en el rendimiento.

Y: Rendimiento

X: Tamao de la matriz (Grafico generado con la herramienta MATLAB) Grafico XY: Segn el grfico XY el rendimiento, el cual es un valor entero, aumenta a medida el ambiente se hace mas grande.

(Grafico generado con la herramienta MATLAB) Grafico XZ: Segn el grfico XZ el % de limpieza del agente disminuye a medida que el ambiente se hace ms grande.

X: Tamao de la matriz

Y: % de limpieza de basuras

X: Rendimiento

(Grafico generado con la herramienta MATLAB) Grafico YZ: Segn el grfico YZ el rendimiento y el % de limpieza no esta muy correlacionados.

Anexo1: Planteamiento del Problema del Mundo de la Aspiradora Implante un simulador de ambiente para la medicin del desempeo en el mundo de una aspiradora. Tal mundo se puede describir de la siguiente manera: Percepciones: Todo agente de aspiradora obtiene cada vez un vector de percepcin formado por tres elementos. El primero, un sensor tctil, tiene un valor 1 si la mquina topa con algn obstculo y un valor 0 en caso contrario. El segundo proviene de una foto-sensor que est debajo de la mquina; ste emite un 1 si hay suciedad y un 0 en caso contrario. El tercero proviene de un sensor infrarrojo, que emite un 1 cuando el agente se encuentra en su ubicacin de origen, y 0 en cualquier otro caso. Acciones: Existen cinco acciones posibles: avanzar, dar vuelta de 90 a la derecha, dar vuelta de 90 a la izquierda, aspirar la mugre y apagarse. Metas La meta de todos los agentes es limpiar e irse a casa. Para ser ms precisos, la medida del desempeo ser de 100 puntos por cada pieza de suciedad aspirada, menos 1 punto por cada accin emprendida y menos 1000 puntos si no est en su lugar de origen cuando se apague. Ambiente: El ambiente est formado por una rejilla de cuadrados. En algunos de ellos hay obstculos (muros y muebles), en tanto que otros cuadrados son espacios libres. En algunos de stos hay mugre. Por cada accin avanzar se adelanta un cuadrado a menos que en es e cuadrado haya un obstculo, en cuyo caso el agente permanecer en donde se encuentra, y se enciende el sensor tctil. Mediante la accin aspirar la mugre siempre se limpia la mugre. El comando apagar da por terminada la simulacin. Se puede variar la complejidad del ambiente a lo largo de tres dimensiones: Forma de la habitacin: En el caso ms sencillo, la habitacin es un cuadrado de nXn, siendo n un valor fijo. Para complicarlo, se le puede considerar rectangular, en forma de L, o de forma irregular, o bien, como una serie de habitaciones conectadas entre si mediante pasillos. Muebles: Poner muebles en una habitacin complica ms las cosas que cuando la habitacin est vaca. Para un agente de limpieza por aspiradora, desde el punto de vista de la percepcin no existe diferencia entre un mueble y un muro: para el sensor tctil ambos son un nmero 1. Distribucin de la mugre: En el caso ms sencillo, la mugre est distribuida uniformemente por toda a habitacin, aunque o ms real es que la mugre se concentre en ciertos lugares, como seria a lo largo de un sector muy transitado, o frente a un silln.

Anexo2: Programa n JAVA MAIN


public class Main { public static void main(String[] args) { //GENERACION DEL AMBIENTE ALEATORIO A PARTIR DE LOS PARAMETROS DE CONFIGURACION Ambiente amb = new Ambiente(); amb.generarEstadoInicial(10, 0.5f,0.4f); amb.imprimirEstado("\nTABLERO INICIAL"); //CREANDO UN AGENTE Agente ag = new Agente(); //COLOCANDO AL AGENTE EN SU AMBIENTE amb.colocarAgente(1,0,Ambiente.SUR,ag); amb.imprimirEstado("\nTABLERO INICIAL CON AGENTE"); //EL AGENTE OPERARA UN DETERMINADO NUMERO DE VECES ag.operarARS(200); //VEAMOS COMO QUEDA EL TABLERO LUEGO DE SU OPERACION //amb.imprimirEstado("\nTABLERO FINAL");

AGENTE
INICIO R=0 Se realizaron las n operaciones? SI NO Leer percepcion del ambiente Percepcion: OBST=0; SUC=0; ORIG=0 ESCOGER UNA ACCION Percepcion: OBST=1; SUC=0; ORIG=1 Variable que acumulara el rendimiento de realziar la "n" acciones Mostrar estadistica: rendimiento, nro basuras al inicio, nro basuras al final, nro basuras limpiadas FIN

Escoger con la misma probabilidad una de las sgtes ACCIONES: Avanzar, Girar 90, girar -90, Aspirar Percepcion: OBST=1; SUC=0; ORIG=0

Escoger con la misma probabilidad una de las sgtes ACCIONES: Avanzar, Girar 90, girar -90, Aspirar, Apagar Percepcion: OBST=0; SUC=0; ORIG=1

Percepcion: OBST=0; SUC=0

Percepcion: OBST=1; SUC=1

Escoger ACCION: Aspirar

Mostrar percepcion Realizar accion en ambiente

Acumular rendimiento R

public void operarARS(int n) { int R=0; int r=-1;

int bi = ambiente.getNroBasuras(); float peso[] = {0,0,0,0}; int accion[] = {0,0,0,0}; int t; for(int i=0; i<n; i++) { Percepcion p = ambiente.getPercepcion(); Accion a = new Accion(); if(p.getObst()==0 && p.getSuc()==0 && p.getOrig()==0) { t=0; r=-1; if(peso[t]<=0.9 && accion[t]==0) a.setCodigo(Accion.AV); else if(peso[t]<=0.8 && accion[t]==1) a.setCodigo(Accion.G90); else if(peso[t]<=0.8 && accion[t]==2) a.setCodigo(Accion.G_90); else if(peso[t]<=0.0 && accion[t]==3) a.setCodigo(Accion.AS); else { peso[t]=0; accion[t]++; if(accion[t]==4) accion[t]=0; } peso[t] += 0.1; } else if(p.getObst()==0 && p.getSuc()==0 && p.getOrig()==1) { t=1; r=-1; if(peso[t]<=0.9 && accion[t]==0) a.setCodigo(Accion.AV); else if(peso[t]<=0.8 && accion[t]==1) a.setCodigo(Accion.G90); else if(peso[t]<=0.8 && accion[t]==2) a.setCodigo(Accion.G_90); else if(peso[t]<=0.0 && accion[t]==3) a.setCodigo(Accion.AS); else if(peso[t]<=0.1 && accion[t]==4) a.setCodigo(Accion.OFF); else { peso[t]=0; accion[t]++; if(accion[t]==5) accion[t]=0; } peso[t] += 0.1; } else if(p.getObst()==0 && p.getSuc()==1) { r=100; a.setCodigo(Accion.AS); } else if(p.getObst()==1 && p.getSuc()==0 && p.getOrig()==0) { t=2; r=-1;

if(peso[t]<=0.0 && accion[t]==0) a.setCodigo(Accion.AV); else if(peso[t]<=1.0 && accion[t]==1) a.setCodigo(Accion.G90); else if(peso[t]<=1.0 && accion[t]==2) a.setCodigo(Accion.G_90); else if(peso[t]<=0.0 && accion[t]==3) a.setCodigo(Accion.AS); else { peso[t]=0; accion[t]++; if(accion[t]==4) accion[t]=0; } peso[t] += 0.1; } else if(p.getObst()==1 && p.getSuc()==0 && p.getOrig()==1) { t=3; r=-1; if(peso[t]<=0.0 && accion[t]==0) a.setCodigo(Accion.AV); else if(peso[t]<=1.0 && accion[t]==1) a.setCodigo(Accion.G90); else if(peso[t]<=1.0 && accion[t]==2) a.setCodigo(Accion.G_90); else if(peso[t]<=0.0 && accion[t]==3) a.setCodigo(Accion.AS); else if(peso[t]<=0.1 && accion[t]==4) a.setCodigo(Accion.OFF); else { peso[t]=0; accion[t]++; if(accion[t]==5) accion[t]=0; } peso[t] += 0.1; } else if(p.getObst()==1 && p.getSuc()==1) { r=100; a.setCodigo(Accion.AS); } //System.out.println("\nPERCEPCION="+p.getValor()); p.imprimir(); //Accion a = agenteReflejoSimple(ambiente.getPercepcion()); ambiente.realizarAccion(a); ambiente.imprimirEstado("\nTablero luego de Accion:

"+a.getNombre());

R=R+r; } System.out.println("RENDIMIENTO="+R); System.out.println("Numero de basuras iniciales="+bi); System.out.println("Numero de basuras al final="+ambiente.getNroBasuras()); System.out.println("Numero de basuras limpiadas="+(biambiente.getNroBasuras())); }

AMBIENTE

NO

Agente esta prendido?

Si agente se APAGA

SI

Si agente AVANZA

Si agente no esta en el borde y no tiene obstaculos al frente Si agente GIRA 90 o -90 Si agente ASPIRA avanzar OESTE Celda Actual = VACIA Actualizar orientacion del agente Cambiar estado del agente de prendido a apagado

avanzar ESTE avanzar NORTE

avanzar SUR

public void realizarAccion(Accion a) { if(this.prendido) { if(a.getCodigo()==Accion.AV) { if(or==Ambiente.OESTE && posX>0) if(e.getCelda(posX-1, posY) != Estado.OBSTACULO) posX--; if(or==Ambiente.NORTE && posY>0) if(e.getCelda(posX, posY-1) != Estado.OBSTACULO) posY--; if(or==Ambiente.ESTE && posX<e.getDimension()-1) if(e.getCelda(posX+1, posY) != Estado.OBSTACULO) posX++; if(or==Ambiente.SUR && posY<e.getDimension()-1) if(e.getCelda(posX, posY+1) != Estado.OBSTACULO) posY++; } else if(a.getCodigo()==Accion.AS) { if(e.getCelda(posX, posY) == Estado.SUCIO) e.setCelda(posX, posY, Estado.VACIO); } else if(a.getCodigo()==Accion.G90) { if(or == Ambiente.NORTE) or = Ambiente.OESTE; else if(or == Ambiente.OESTE) or = Ambiente.SUR; else if(or == Ambiente.SUR) or = Ambiente.ESTE; else if(or == Ambiente.ESTE) or = Ambiente.NORTE;

} else if(a.getCodigo()==Accion.G_90) { if(or == Ambiente.NORTE) or = Ambiente.ESTE; else if(or == Ambiente.ESTE)

or = else if(or or = else if(or or =

Ambiente.SUR; == Ambiente.SUR) Ambiente.OESTE; == Ambiente.OESTE) Ambiente.NORTE;

} else if(a.getCodigo()==Accion.OFF) { this.prendido = false; }

public void generarEstadoInicial(int dimension, float pBasuras, float pObstaculos) { int nb = Math.round(pBasuras*(float)(dimension*dimension)); int no = Math.round(pObstaculos*(float)(dimension*dimension)); e = new Estado(); e.setDimension(dimension); int x,y; for(y=0; y<dimension; y++) { for(x=0; x<dimension; x++){ if(nb>0) { e.setCelda(x,y,Estado.SUCIO); nb--; } else if(no>0){ e.setCelda(x,y,Estado.OBSTACULO); no--; } else { e.setCelda(x,y,Estado.VACIO); } } }