Está en la página 1de 25

Implementación de un Agente para el mundo de la aspiradora

I. Arquitectura del Sistema

Módulos del Sistema

aspiradora I. Arquitectura del Sistema Módulos del Sistema • A Continuación se verá cada uno de

A Continuación se verá cada uno de estos módulos. En el módulo Agente está considerado, el Agente Reflejo Simple y el Agente con Memoria Interna.

II. Especificación de los módulos

II.1 Modulo del Ambiente de Operación

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 código en JAVA del AMBIENTE en el ANEXO) Ojo: El ambiente si sabe la orientación del agente, pero el agente no lo puede percibir ya que no tiene sensores para percibir estas orientaciones.

B) Parámetros del ambiente

Estos parámetros 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 obstáculos que encuentre en la malla.

La lectura de los parámetros del ambiente se lo hará desde un archivo de configuración llamado config.ini, allí estarán definidos:

Parámetros del ambiente

Valor

Dimensión de la celda

2

Probabilidad de basura

0.5

Probabilidad de obstáculos

0.4

Posición X inicial de la aspiradora

1

Posición Y inicial de la aspiradora

0

Estos valores son definidos por el usuario.

0

1

Eje Y

0

1

Eje X

valores son definidos por el usuario. 0 1 Eje Y 0 1 Eje X Ejemplo de
valores son definidos por el usuario. 0 1 Eje Y 0 1 Eje X Ejemplo de
valores son definidos por el usuario. 0 1 Eje Y 0 1 Eje X Ejemplo de
valores son definidos por el usuario. 0 1 Eje Y 0 1 Eje X Ejemplo de

Ejemplo de un mundo de la aspiradora de tamaño 2x2

1 Eje X Ejemplo de un mundo de la aspiradora de tamaño 2x2 : Suciedad o

: Suciedad o mugre

un mundo de la aspiradora de tamaño 2x2 : Suciedad o mugre : Obstáculo (muro o

: Obstáculo (muro o mueble)

2x2 : Suciedad o mugre : Obstáculo (muro o mueble) : Aspiradora orientada hacia abajo :

: Aspiradora orientada hacia abajo

: Aspiradora orientada hacia la izquierda(muro o mueble) : Aspiradora orientada hacia abajo : Aspiradora orientada hacia arriba : Aspiradora orientada

hacia abajo : Aspiradora orientada hacia la izquierda : Aspiradora orientada hacia arriba : Aspiradora orientada

: Aspiradora orientada hacia arriba

: Aspiradora orientada hacia la derechahacia la izquierda : Aspiradora orientada hacia arriba B) Representación del Ambiente Representación de Objetos

B) Representación del Ambiente

Representación de Objetos en el ambiente

Símbolo

Objeto

Representación

S

Suciedad

M(1, 0

F+1,

0

F+1)

O

Obstáculo

M(2, 0

F+1,

0

F+1)

Representación 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 obstáculo respectivamente Si S o O es 1 indica que si está presente la suciedad u obstáculo 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:

Simbólicamente

Gráficamente

0 0 2 2 A 0 1 2 0
0
0
2
2
A
0
1
2
0
   
0 0 2 2 A 0 1 2 0    
 
 
 

A: es el agente

A: es el agente  
A: es el agente  
 

Los dos gráficos son equivalentes

II.2 Modulo del Agente

A) Diagrama de clases

Agente Percepcion -tabla: int[*] -obst: int -reglas: int[*] -suc: int -prendido: Boolean -orig: int
Agente
Percepcion
-tabla: int[*]
-obst: int
-reglas: int[*]
-suc: int
-prendido: Boolean
-orig: int
<<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)
<<create>>+Percepcion()
+getValor(): int
+getObst(): int
+setObst(obst: int)
+getOrig(): int
+setOrig(orig: int)
+getSuc(): int
+setSuc(suc: int)
+imprimir()
1
*
-agente
1
1 -agente
1
1
1
*
Actuador
Sensor
1
*
-codigo: String
-codigo: String
+nombre: String
-nombre: String

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

1 1 * 1 * Tabla -puntaje: int
1
1
*
1
*
Tabla
-puntaje: int

-accion

String 1 1 * 1 * Tabla -puntaje: int -accion (Ver código en JAVA del AGENTE

(Ver código en JAVA del AGENTE en el ANEXO) Cada Agente posee tres Sensores (Sensor táctil, 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 eléctrico). Las ruedas se relacionan con el avance de la aspiradora, el eje, con los giros de dirección, el tubo, con la acción de aspirar todo lo que hay en la celda, y el circuito eléctrico se relaciona con la acción de apagado automático de la aspiradora.

B) Tipos de Agente

Principalmente existen 2 tipos de agentes, los cuales se diferencian por la información que poseen. Mientras que el agente reflejo simple trata de alcanzar su objetivo con tan

solo tener una tabla de mapeo de percepción-acción, el agente con memoria interna, además de esa información trabaja con informaciones adicionales que a continuación 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 Percepciones (ST, FS, SI) Sensores Ambiente Rejilla de 4x4 con: • Obstáculo (mueble o
AGENTE
Percepciones
(ST, FS, SI)
Sensores
Ambiente
Rejilla de 4x4 con:
Obstáculo
(mueble o muro)
Suciedad
Acciones
Metas
• Avanzar
Solución?
• Limpiar
• Girar 90º
• Irse a
• Girar -90º
casa
• Aspirar
• Apagarse
Actuadores

Esquema General de un Agente del mundo de la aspiradora

A) Sensores

Símbolo

Nombre del

Descripción

Percepciones

 

Sensor

   

ST

Sensor táctil

tiene un valor 1 si la máquina topa con algún obstáculo y un valor 0 en caso contrario

Obstáculo

FS

Foto-sensor

está debajo de la máquina; éste emite un 1 si hay suciedad y un 0 en caso contrario

Suciedad

SI

Sensor infrarrojo

que emite un 1 cuando el agente se encuentra en su ubicación de origen, y 0 en cualquier otro caso.

Origen

B)

Percepciones

 

Símbolo

Percepción

Valor=0

Valor=1

Grafico

Obst.

Obstáculo

No ha topado con un obstáculo

Topó con un obstáculo

Obst. Obstáculo No ha topado con un obstáculo Topó con un obstáculo

Suc.

Suciedad

En la celda actual no hay suciedad

En la celda actual existe suciedad

Suc. Suciedad En la celda actual no hay suciedad En la celda actual existe suciedad

Orig.

Origen

El agente no se encuentra en su celda de origen

El agente se encuentra en su celda de origen

 

C) Actuadores

Símbolo

origen El agente se encuentra en su celda de origen   C) Actuadores Símbolo Nombre del

Nombre del

Actuador

Acciones

origen El agente se encuentra en su celda de origen   C) Actuadores Símbolo Nombre del

R

Ruedas

Avanzar

E

Eje

Girar 90, Girar -90

T

Tubo para aspirar

Aspirar

C

Circuito

Apagarse

D)

Acciones

 

Símbolo

Acción

 

Ejemplo

 

Av

Avanzar

 
Av Avanzar    
Av Avanzar    
 

Avanzar una casilla a la derecha

90

Girar 90º

 
90 Girar 90º    
90 Girar 90º    
 

Antes y después de un giro antihorario

-90

Girar -90º

 
-90 Girar -90º    
-90 Girar -90º    
 

Antes y después de un giro horario

As

Aspirar

 
As Aspirar    
As Aspirar    
 

Antes y después de una acción aspirar

Off

Apagarse

 
Off Apagarse    
Off Apagarse    
Off Apagarse    
 

E) Tabla Percepción – Acción

Numero de entradas: hay 3 entradas que serían 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 percepción actual.

En la siguiente tabla el símbolo * significa cualquiera de las 4 orientaciones posibles que puede tomar el agente. El agente no conoce las orientaciones.

El desempeño es un dato del problema (Ver anexo 1, en la parte de metas)

 

Percepciones

Acciones

Desempeño

Obst

Suc

Orig

Orientación

   
   

(<,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

0

1

0

*

-90

-1

13

0

1

0

*

As

100

14

0

1

0

*

Off

-1000

15

0

1

1

*

Av

-1

16

0

1

1

*

90

-1

17

0

1

1

*

-90

-1

18

0

1

1

*

As

100

19

0

1

1

*

Off

-1

20

1

0

0

*

Av

-1

21

1

0

0

*

90

-1

22

1

0

0

*

-90

-1

23

1

0

0

*

As

-1

24

1

0

0

*

Off

-1000

25

1

0

1

*

Av

-1

26

1

0

1

*

90

-1

27

1

0

1

*

-90

-1

28

1

0

1

*

As

-1

29

1

0

1

*

Off

-1

30

1

1

0

*

Av

-1

31

1

1

0

*

90

-1

32

1

1

0

*

-90

-1

33

1

1

0

*

As

100

34

1

1

0

*

Off

-1000

35

1

1

1

*

Av

-1

36

1

1

1

*

90

-1

37

1

1

1

*

-90

-1

38

1

1

1

*

As

100

39

1

1

1

*

Off

-1

F) Ejemplo ilustrativo de cómo el agente limpiaría un ambiente de 2x2

Percepción Desempeño Ambiente Acción Desempeño (Obst, Suc, Orig) acumulado No hay obstáculo al frente No
Percepción
Desempeño
Ambiente
Acción
Desempeño
(Obst, Suc, Orig)
acumulado
No hay obstáculo al frente
No hay suciedad
Si está en el origen
Avanzar
-1
0
(0,0,1)
No hay obstáculo al frente
Si hay suciedad
No está en el origen
Aspirar
100
-1
(0,1,0)
No hay obstáculo al frente
No hay suciedad
No está en el origen
Girar 90º
-1
99
(0,0,0)
No hay obstáculo al frente
No hay suciedad
No está en el origen
Girar 90º
-1
98
(0,0,0)
No hay obstáculo al frente
No hay suciedad
No está en el origen
Avanzar
-1
97
(0,0,0)
No hay obstáculo al frente
No hay suciedad
Si está en el origen
Girar -90º
-1
96
(0,0,1)
No hay obstáculo al frente
No hay suciedad
Si está en el origen
Avanzar
-1
95
(0,0,1)
No hay obstáculo al frente
Si hay suciedad
No está en el origen
Aspirar
100
94
(0,1,0)
No hay obstáculo al frente
No hay suciedad
No está en el origen
Girar 90º
-1
194
(0,0,0)
No hay obstáculo al frente
No hay suciedad
No está en el origen
Girar 90º
-1
193
(0,0,0)
No hay obstáculo al frente
No hay suciedad
No está en el origen
Avanzar
-1
192
(0,0,0)
No hay obstáculo al frente
No hay suciedad
Si está en el origen
Apagarse
-1
191
(0,0,1)

El desempeño 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
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

Condición de parada Numero máximo 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 información es necesario que aquí definamos algunos estadísticos con los que podría trabajar el agente.

A)

Estadísticos

Número de acciones ejecutadas

Número de aspiraciones

Numero de aspiraciones que efectivamente limpiaron una suciedad

Numero de veces que chocó con un obstáculo

Numero de veces que volvió a pasar por la posición 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
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 función al numero de operaciones seguidas que realizará el agente reflejo simple. Por ejemplo: n=10.

A continuación se analizarán los tiempos de ejecución de cada operación.

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 descripción abstracta de la percepción Estado estado = interpretar_entrada(p);

//Llamada a una funcion: 4 operaciones // selecciona regla que cumple descripción 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 instrucciones.

else,

//Llamada a un metodo:

if(p.getObst()==1)

solo se considera una de las dos

//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:

estado.setCelda(1, 1, Estado. SUCIO);

else

//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 operación

COMPLEJIDAD TOTAL DE LA FUNCION: 1 operación

Solo se llamará a una sola operación

COMPLEJIDAD TOTAL DE LA FUNCION: 1 operación Solo se llamará a una sola operación

II. Agente con memoria (o agente con estado interno)

La entrada es la misma que en el caso anterior, además también 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 descripción 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 acción=aplica_regla(regla);

//Llamada a una funcion: 12 operaciones estado = actualiza_estado (estado, acción);

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, Acción 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 función 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)

Comparación del Numero de operaciones entre los dos tipos de agentes

n

10

50

200

500

1000

Agente Reflejo simple

         

Complejidad=12*n

120

600

2400

6000

12000

Agente con memoria

         

Complejidad=22*n

220

1100

4400

11000

22000

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 más del doble de operaciones que el agente reflejo simple.

II.4 Módulo del Rendimiento

Este módulo se encarga de medir cuan bien trabaja el agente.

Para ello trataremos de relacionar los siguientes parámetros:

Tamaño matriz: Se probará desde 3 hasta 10 Rendimiento: El rendimiento fue definido en la tabla percepción-acción 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)

se limpió nada; 1: indica que se limpió todas las celdas) Hay algunos parámetros que se

Hay algunos parámetros que se consideran para todas las corridas:

Probabilidad de basuras = 0.5

Probabilidad de obstáculos = 0.4

Numero de iteraciones por cada corrida: 200

   

Nro de

Nro basuras

 

Tamaño matriz

Rendimiento

basuras inicial

faltantes

%limpieza

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

305

6

1

0.83

4

-200

8

8

0.00

4

507

8

1

0.88

4

406

7

1

0.86

4

103

6

3

0.50

4

608

8

0

1.00

4

406

8

2

0.75

5

507

11

4

0.64

5

2

14

12

0.14

5

911

13

2

0.85

5

810

14

4

0.71

5

608

12

4

0.67

5

709

13

4

0.69

5

305

10

5

0.50

5

507

13

6

0.54

5

305

12

7

0.42

5

204

11

7

0.36

6

-99

17

16

0.06

6

305

15

10

0.33

6

1012

18

6

0.67

6

911

14

3

0.79

6

-99

19

18

0.05

6

507

20

13

0.35

6

1517

24

7

0.71

6

1214

21

7

0.67

6

1012

17

5

0.71

6

608

17

9

0.47

7

103

19

16

0.16

7

-200

22

22

0.00

7

1012

19

7

0.63

7

-99

28

27

0.04

7

305

23

18

0.22

7

204

24

20

0.17

7

-99

22

21

0.05

7

305

25

20

0.20

7

1315

27

12

0.56

7

-99

22

21

0.05

8

1113

25

12

0.52

8

1214

22

8

0.64

8

103

24

21

0.13

8

-200

31

31

0.00

8

1416

26

10

0.62

8

406

34

28

0.18

8

1214

26

12

0.54

8

-99

33

32

0.03

8

911

20

9

0.55

8

2

20

2

0.90

9

1012

42

30

0.29

9

1719

41

22

0.46

9

406

41

35

0.15

9

1719

42

23

0.45

9

1113

46

33

0.28

9

1416

37

21

0.43

9

305

35

30

0.14

9

1012

45

33

0.27

9

103

36

33

0.08

9

2123

48

25

0.48

10

2325

48

23

0.52

10

1921

50

29

0.42

10

1315

53

38

0.28

10

-99

54

53

0.02

10

-99

53

52

0.02

10

2

44

42

0.05

10

305

40

35

0.13

10

507

43

36

0.16

10

1820

48

29

0.40

10

2022

50

28

0.44

X: Tamaño de la matriz

Z: Rendimiento

50 28 0.44 X: Tamaño de la matriz Z: Rendimiento Y: % de limpieza de basuras

Y: % de limpieza de basuras

(Grafico generado con la herramienta MATLAB) Grafico XYZ En el gráfico se observa que el rendimiento del agente aumenta conforme aumenta el porcentaje de basuras. El tamaño de la matriz no influye mucho en el rendimiento.

Y: Rendimiento
Y: Rendimiento

X: Tamaño de la matriz

(Grafico generado con la herramienta MATLAB) Grafico XY: Según el gráfico XY el rendimiento, el cual es un valor entero, aumenta a medida el ambiente se hace mas grande.

entero, aumenta a medida el ambiente se hace mas grande. X: Tamaño de la matriz (Grafico

X: Tamaño de la matriz

(Grafico generado con la herramienta MATLAB) Grafico XZ: Según el gráfico XZ el % de limpieza del agente disminuye a medida que el ambiente se hace más grande.

Y: % de limpieza de basuras

X: Rendimiento
X: Rendimiento

(Grafico generado con la herramienta MATLAB) Grafico YZ: Según el gráfico 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 medición del desempeño 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 percepción formado por tres elementos. El primero, un sensor táctil, tiene un valor 1 si la máquina topa con algún obstáculo y un valor 0 en caso contrario. El segundo proviene de una foto-sensor que está debajo de la máquina; é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 ubicación 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 más precisos, la medida del desempeño será de 100 puntos por cada pieza de suciedad aspirada, menos 1 punto por cada acción 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 obstáculos (muros y muebles), en tanto que otros cuadrados son espacios libres. En algunos de éstos hay mugre. Por cada acción “avanzar” se adelanta un cuadrado a menos que en es e cuadrado haya un obstáculo, en cuyo caso el agente permanecerá en donde se encuentra, y se enciende el sensor táctil. Mediante la acción “aspirar la mugre” siempre se limpia la mugre. El comando “apagar” da por terminada la simulación.

Se puede variar la complejidad del ambiente a lo largo de tres dimensiones:

Forma de la habitación: En el caso más sencillo, la habitación 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 habitación complica más las cosas que cuando la habitación está vacía. Para un agente de limpieza por aspiradora, desde el punto de vista de la percepción no existe diferencia entre un mueble y un muro: para el sensor táctil ambos son un número 1.

Distribución de la mugre: En el caso más sencillo, la mugre está distribuida uniformemente por toda a habitación, aunque o más real es que la mugre se concentre en ciertos lugares, como seria a lo largo de un sector muy transitado, o frente a un sillón.

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();

DE CONFIGURACION Ambiente amb = new Ambiente(); amb.generarEstadoInicial(10, 0.5f,0.4f); amb.imprimirEstado(

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 Variable que acumulara el rendimiento de realziar la "n" acciones R=0 Se realizaron
AGENTE
INICIO
Variable que acumulara el rendimiento
de realziar la "n" acciones
R=0
Se realizaron las n operaciones?
SI
Mostrar estadistica: rendimiento, nro
basuras al inicio, nro basuras al final, nro
basuras limpiadas
FIN
NO
Leer percepcion del ambiente
Percepcion: OBST=0; SUC=0; ORIG=0
ESCOGER UNA ACCION
Percepcion: OBST=1; SUC=0; ORIG=1
Escoger con la misma probabilidad
una de las sgtes ACCIONES:
Avanzar, Girar 90, girar -90,
Aspirar
Escoger con la misma probabilidad una
de las sgtes ACCIONES: Avanzar,
Girar 90, girar -90, Aspirar, Apagar
Percepcion: OBST=1; SUC=0; ORIG=0
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="+(bi- ambiente.getNroBasuras()));

}

AMBIENTE Agente esta prendido? NO SI Si agente se APAGA Si agente AVANZA Si agente
AMBIENTE
Agente esta prendido?
NO
SI
Si agente se APAGA
Si agente AVANZA
Si agente no esta en el borde y no tiene obstaculos al frente
Si agente ASPIRA
Si agente GIRA 90 o -90
avanzar OESTE
avanzar ESTE
Celda Actual =
VACIA
avanzar SUR
avanzar NORTE
Actualizar
orientacion del
agente
Cambiar estado del
agente de prendido a
apagado

public void realizarAccion(Accion a) { if(this.prendido) { if(a.getCodigo()==Accion. AV) {

}

if(or==Ambiente.

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++;

.getCelda( posX , posY +1) != Estado. OBSTACULO ) posY ++; OESTE && posX >0) else

OESTE && posX>0)

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 ; OESTE )
OESTE ;
OESTE )

else if(or == Ambiente.

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 = Ambiente. SUR ; else if(or == Ambiente. SUR)

or = Ambiente.

OESTE ; OESTE )
OESTE ;
OESTE )

else if(or == Ambiente.

or = Ambiente. NORTE ;

}

else if(a.getCodigo()==Accion. OFF) {

this.prendido = false;

}

}

}

public void

pObstaculos) { int nb = Math. round (pBasuras*(float)(dimension*dimension)); int no = Math. round (pObstaculos*(float)(dimension*dimension));

Math. round (pObstaculos*( float )(dimension*dimension)); generarEstadoInicial( int dimension, float pBasuras,

generarEstadoInicial(int dimension, float pBasuras, float

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 );

}

}