You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
U N I V E R S I D A D D E<br />
SAN MARTIN DE PORRES<br />
FACULTAD DE INGENIERIA Y ARQUITECTURA<br />
Escuela de Computación y Sistemas<br />
TEMA:<br />
ASPIRADORA<br />
CURSO:<br />
Inteligencia Artificial<br />
PROFESOR:<br />
Ing. Samuel Oporto<br />
SECCIÓN:<br />
45 J<br />
INTEGRANTES: Araoz Ore, Herbert<br />
García García, Francisco<br />
Roriguez Davalos, Julio<br />
Sánchez Solís, Martín<br />
LA MOLINA, NOVIEMBRE DEL 2007<br />
1
INDICE<br />
RESUMEN 3<br />
ENUNCIADO 4<br />
AGENTES INTELIGENTES 5<br />
CONCEPTO DE AGENTE REFLEJO SIMPLE 5<br />
METODOS DEL AGENTE REFLEJO SIMPLE 7<br />
CORRIDA DEL AGENTE REFLEJO SIMPLE PARA UN LADO ”N” 11<br />
RENDIMIENTO DE LAS CORRIDAS 15<br />
CONCEPTO DE AGENTE REFLEJO CON MEMORIA INTERNA 17<br />
METODOS DEL AGENTE REFLEJO CON MEMORIA 18<br />
CORRIDA DEL AGENTE REFLEJO CON MEMORIA PARA UN LADO ”N” 23<br />
RENDIMIENTO DE LAS CORRIDAS 34<br />
CONCLUSIONES 36<br />
ANEXO 1 37<br />
ANEXO 2 40<br />
2
RESUMEN<br />
El problema planteado al inicio del curso de Inteligencia Artificial es la creacion<br />
de la logica y algoritmos para un robot cuya funcion sera limpiar un ambiente<br />
cuadrado, este ambiente controlado sera definido por nosotros, será de lado “n”<br />
y de area “n x n”<br />
Se brindará una solución, tratando de ser la mas efectiva posible, al problema de<br />
barrer un ambiente. Para la solución del problema, se ha trabajado con el<br />
lenguaje Java en el IDE <strong>net</strong>beans.<br />
3
ENUNCIADO<br />
Percepción, todo agente tiene un vector de percepcion formado por 3 elementos:<br />
El sensor táctil, tiene un valor 1 si la maquina topa con algun obstáculo y un<br />
valor 0 en caso contrario.<br />
Un fotosensor, ubicado debajo de la maquina, este emite un 1 si hay suciedad y<br />
un 0 en caso contrario.<br />
Sensor Infrarrojo, emite 1 cuando el agente se encuentra en su ubicación origen<br />
y 0 en cualquier otro caso.<br />
Acciones, existen 5:<br />
• Avanzar.<br />
• Dar vuelta de 90 a la derecha.<br />
• Dar vuelta de 90 a la izquierda.<br />
• Aspirar la mugre.<br />
• Apagarse.<br />
Metas, la meta de todos los agentes es limpiar e irse a casa.<br />
100 puntos, por cada aspirada.<br />
-1 punto por cada accion emprendida<br />
-1000 puntos, si no esta en su lugar de origen cuando se apague.<br />
Ambiente, formada por rejilla de cuadros, en algunos de ellos hay obstáculos<br />
(muros y muebles), en tanto que otros espacios son espacio libre, en algunos de<br />
estos hay mugre. Por cada accion avanzar se adelanta un cuadrado al menos q<br />
en ese cuadrado haya un obstáculo, en cuyo caso el agente permanecera en<br />
donde se encuentra, y se enciende el sensor táctil. Mediante la accion aspirar<br />
mugre siempre se aspira la mugre. El comando apagar da terminado la accion<br />
4
AGENTES INTELIGENTES<br />
Un agente es todo aquello que puede considerarse que percibe su ambiente<br />
mediante sensores y que responde o actúa en tal ambiente por medio de<br />
efectores.<br />
Los agentes humanos tienen ojos, oídos y otros órganos que le sirven de<br />
sensores, así como manos, piernas, boca y otras partes de su cuerpo que le<br />
sirven de efectores. En el caso de agentes robóticos, los sensores son sustituidos<br />
por cámaras infrarrojas y los efectores son reemplazados mediante motores. En<br />
el caso de un agente de software, sus percepciones y acciones vienen a ser la<br />
cadena de bits codificados.<br />
CONCEPTO DE AGENTE REFLEJO SIMPLE<br />
Las acciones del agente se establecen en función a una tabla de percepción <br />
acción.<br />
Este agente podra funcionar siempre y cuando el ambiente sea accesible.<br />
Algunos agentes reflejos pueden almacenar la informacion de su estado actual.<br />
En terminos de programacion se puede decir que el Agente Reflejo Simple<br />
cumpla con la siguiente sentencia: if PERCEPCION then ACCION<br />
5
METODOS DEL AGENTE REFLEJO SIMPLE<br />
Los métodos para el funcionamiento del agente reflejo son:<br />
Met01: Detecta Sucio: A través de este método el agente reflejo identificara si<br />
la casilla esta sucio o no, así decidirá si debe limpiar o seguir con el siguiente<br />
método, este valor lo obtenemos con el Foto Sensor.<br />
Met02: Detecta Pared/Obstáculo: La pared/obstáculo se detecta a través del<br />
sensor táctil, una vez que el agente trata de avanzar y se choca con la pared u<br />
obstaculo, su percepcion de pared/obstaculo se convertira en 1.<br />
7
Met03: Limpia: (1) Si el método Detecta Sucio (Met01) nos da como valor 1,<br />
entonces el robot limpiara la superficie.<br />
Met04: Detecta Origen: Este método determinara si se encuentra en el origen,<br />
se obtiene a través de un sensor infrarojo. Cuando este sea 1 el agente reflejo<br />
simple se apagara.<br />
Met05: Gira 90+: (2)<br />
valor 1, el agente girara 90+ en su mismo eje.<br />
Cuando la percepcion pared/obstaculo se encuentra con<br />
8
Met06: Avanza: Cuando el Método Detecta Obstáculo se pone en 0, el agente<br />
reflejo avanza una casilla.<br />
Met07: Stop: (3)<br />
reflejo se apagara.<br />
Cuando el Método Detecta origen sea 1 entonces el agente<br />
(1) En nuestro agente reflejo simple, el metodo 03 Limpia, solamente funcionara<br />
si se de primero el metodo 01: detecta sucio.<br />
(2)En nuestro agente reflejo simple, el metodo 05 Gira, solamente funcionara si<br />
se de primero el metodo 02: detecta pared/obstaculo.<br />
(3) En nuestro agente reflejo simple, el metodo 07 Stop, solamente funcionara si<br />
se de primero el metodo 04: detecta origen.<br />
Include<br />
MET. 07: Stop<br />
MET. 04: Detecta<br />
Origen<br />
9
TABLA DE PERCEPCION – ACCION PARA EL AGENTE<br />
REFLEJO SIMPLE<br />
Reglas Origen Basura Pared/Obst. Sentido Acción<br />
1 0 0 0 * Avanzar<br />
2 0 0 1 * Gira +90<br />
3 0 1 0 * Limpia<br />
4 1 0 0 * Stop<br />
10
CORRIDA DEL AGENTE REFLEJO SIMPLE PARA UN LADO<br />
N=”6”<br />
Posicion 1<br />
Posicion 3<br />
Posicion 2<br />
Posicion 4<br />
11
Posicion 5<br />
Posicion 9<br />
Posicion 6<br />
Posicion 10<br />
Posicion 7<br />
Posicion 11<br />
Posicion 8<br />
Posicion 12<br />
12
Posicion 12 Posicion 16<br />
Posicion 13 Posicion 17<br />
Posicion 14 Posicion 18<br />
Posicion 15 Posicion 19<br />
13
RESULTADOS:<br />
Total Basuras: 5<br />
Total Limpiados: 2<br />
CORRIDA DEL AGENTE REFLEJO SIMPLE PARA UN LADO<br />
N=”7”<br />
RESULTADOS:<br />
Total Basuras: 6<br />
Total Limpiados: 3<br />
CORRIDA DEL AGENTE REFLEJO SIMPLE PARA UN LADO<br />
N=”8”<br />
RESULTADOS:<br />
Total Basuras: 7<br />
Total Limpiados: 2<br />
CORRIDA DEL AGENTE REFLEJO SIMPLE PARA UN LADO<br />
N=”9”<br />
RESULTADOS:<br />
Total Basuras: 6<br />
Total Limpiados: 0<br />
CORRIDA DEL AGENTE REFLEJO SIMPLE PARA UN LADO<br />
N=”10”<br />
RESULTADOS:<br />
Total Basuras: 8<br />
Total Limpiados: 3<br />
NOTA: SE OMITIO LOS PANTALLAZOS DE LAS DEMAS CORRIDAS POR<br />
PROBLEMAS EN EL TAMAÑO DEL ARCHIVO.<br />
14
RENDIMIENTO DE LAS CORRIDAS<br />
Aquí vamos a anlizar los resultados obtenidos y veremos cual ha sido el<br />
rendimiento de cada una de las corridas en funcion al lado de la cuadricula.<br />
Para N=”6”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
30 itera<br />
60000 ms<br />
60 seg.<br />
TOTAL BASURA 5<br />
TOTAL ELIMINADO 2<br />
RENDIMIENTO 40 %<br />
Para N=”7”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
20 itera<br />
40000 ms<br />
40 seg.<br />
TOTAL BASURA 6<br />
TOTAL ELIMINADO 3<br />
RENDIMIENTO 50 %<br />
Para N=”8”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
28 itera<br />
56000 ms<br />
56 seg.<br />
TOTAL BASURA 7<br />
TOTAL ELIMINADO 2<br />
RENDIMIENTO 28.57 %<br />
15
Para N=”9”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
17 itera<br />
34000 ms<br />
34 seg.<br />
TOTAL BASURA 6<br />
TOTAL ELIMINADO 0<br />
RENDIMIENTO 0 %<br />
Para N=”10”<br />
Total Basuras: 8<br />
Total Limpiados: 3<br />
Rendimiento: 3/8 = 0.374 = 37.5%<br />
16
CONCEPTO DE AGENTE REFLEJO CON MEMORIA INTERNA<br />
Este tipo de agente guarda estados internos lo que nos sirve sin consideración<br />
para ejecutar una acción.<br />
Los sensores no nos pueden informar a la vez de todos los estados que maneja<br />
nuestro ambiente, es por este caso que el agente necesita actualizar algo de<br />
información en el estado interno.<br />
Esto le permite discernir que entre estados del ambiente que generan la misma<br />
entrada de percepciones pero, sin embargo; para cada uno de los estados se<br />
necesitan acciones distintas.<br />
17
METODOS DEL AGENTE REFLEJO CON MEMORIA INTERNA<br />
Los métodos para el funcionamiento del agente reflejo con memoria son:<br />
Met01: Detecta Sucio: A través de este método el agente reflejo identificara si<br />
la casilla esta sucio o no, así decidirá si debe limpiar o seguir con el siguiente<br />
método, este valor lo obtenemos con el Foto Sensor.<br />
Met02: Detecta Pared/Obstáculo: La pared/obstáculo se detecta a través del<br />
sensor táctil, una vez que el agente trata de avanzar y se choca con la pared u<br />
obstaculo, su percepcion de pared/obstaculo se convertira en 1.<br />
18
Met03: Limpia: (1) Si el método Detecta Sucio (Met01) nos da como valor 1,<br />
entonces el robot limpiara la superficie.<br />
Met04: Detecta Origen: Este método determinara si se encuentra en el origen,<br />
se obtiene a través de un sensor infrarojo. Cuando este sea 1 el agente reflejo<br />
simple se apagara.<br />
Met05: Gira 90+: (2)<br />
Cuando la percepcion pared/obstaculo o visitado se<br />
encuentra con valor 1, el agente girara 90+ en su mismo eje.<br />
19
Met06: Avanza: Cuando el Método Detecta Obstáculo se pone en 0, el agente<br />
reflejo avanza una casilla.<br />
Met07: Detecta Visitado: Cuando el agente verifica si las coordenadas de la<br />
casilla siguiente ya ha sido visitada, en este metodo, la percepcion Visitado es<br />
pondra en 1.<br />
Met08: Stop: (3)<br />
reflejo se apagara.<br />
Cuando el Método Detecta origen sea 1 entonces el agente<br />
(1) En nuestro agente reflejo simple, el metodo 03 Limpia, solamente funcionara<br />
si se de primero el metodo 01: detecta sucio.<br />
20
(2)En nuestro agente reflejo simple, el metodo 05 Gira, solamente funcionara si<br />
se de primero el metodo 02: detecta pared/obstaculo o el metodo 07: detecta<br />
visitado.<br />
(3) En nuestro agente reflejo simple, el metodo 08 Stop, solamente funcionara si<br />
se de primero el metodo 04: detecta origen.<br />
21
TABLA DE PERCEPCION – ACCION PARA EL AGENTE<br />
REFLEJO CON MEMORIA<br />
Reglas Origen Basura Pared/Obst. Visitado Sentido Acción<br />
1 0 0 0 0 * Avanzar<br />
2 0 0 0 1 * Gira +90<br />
3 0 0 1 0 * Gira +90<br />
4 0 1 0 0 * Limpia<br />
5 1 0 0 0 * stop<br />
22
CORRIDA DEL AGENTE REFLEJO CON MEMORIA INTERNA<br />
PARA UN LADO N=”6”<br />
Posicion 1<br />
Posicion 3<br />
Posicion 2<br />
Posicion 4<br />
23
Posicion 5<br />
Posicion 9<br />
Posicion 6<br />
Posicion 10<br />
Posicion 7<br />
Posicion 11<br />
Posicion 8<br />
Posicion 12<br />
24
Posicion 13<br />
Posicion 17<br />
Posicion 14<br />
Posicion 18<br />
Posicion 15<br />
Posicion 19<br />
Posicion 16<br />
Posicion 20<br />
25
Posicion 23<br />
Posicion 21<br />
Posicion 24<br />
Posicion 22<br />
Posicion 25<br />
26
RESULTADOS DE CORRIDA DEL AGENTE REFLEJO CON<br />
MEMORIA<br />
Para N=”6”<br />
Estado<br />
inical Accion<br />
Sentio<br />
inicial<br />
Sentido<br />
final<br />
1 0 0 0 DERECHA AVANZA DERECHA<br />
2 0 0 0 DERECHA AVANZA DERECHA<br />
3 0 0 0 DERECHA AVANZA DERECHA<br />
4 0 0 0 DERECHA AVANZA DERECHA<br />
5 0 0 0 DERECHA AVANZA DERECHA<br />
6 0 0 1 DERECHA GIRO +90 ARRIBA<br />
7 0 0 0 ARRIBA AVANZA ARRIBA<br />
8 0 0 0 ARRIBA AVANZA ARRIBA<br />
9 0 0 1 ARRIBA GIRA +90 IZQUIERDA<br />
10 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
11 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
12 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
13 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
14 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
15 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
16 0 0 1 IZQUIERDA GIRA +90 ABAJO<br />
17 0 0 0 ABAJO AVANZA ABAJO<br />
18 0 0 0 ABAJO AVANZA ABAJO<br />
19 0 1 0 ABAJO LIMPIA ABAJO<br />
20 0 0 0 ABAJO AVANZA ABAJO<br />
21 0 0 0 ABAJO AVANZA ABAJO<br />
22 0 0 0 ABAJO AVANZA ABAJO<br />
23 0 0 0 ABAJO AVANZA ABAJO<br />
24 0 0 1 ABAJO GIRA +90 DERECHA<br />
25 0 0 0 DERECHA AVANZA DERECHA<br />
26 0 1 0 DERECHA LIMPIA DERECHA<br />
27 0 0 0 DERECHA AVANZA DERECHA<br />
28 0 1 0 DERECHA LIMPIA DERECHA<br />
29 0 0 0 DERECHA AVANZA DERECHA<br />
30 0 0 0 DERECHA AVANZA DERECHA<br />
31 0 1 0 DERECHA LIMPIA DERECHA<br />
32 0 0 0 DERECHA AVANZA DERECHA<br />
33 0 0 1 DERECHA GIRO +90 ARRIBA<br />
34 0 0 0 ARRIBA AVANZA ARRIBA<br />
35 0 0 1 ARRIBA GIRO +90 IZQUIERDA<br />
36 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
37 0 0 0 ABAJO AVANZA ABAJO<br />
38 0 0 1 ABAJO GIRA +90 DERECHA<br />
39 0 0 0 DERECHA AVANZA DERECHA<br />
40 0 0 1 DERECHA GIRO +90 ARRIBA<br />
41 0 0 0 ARRIBA AVANZA ARRIBA<br />
27
42 0 0 1 ARRIBA GIRO +90 IZQUIERDA<br />
43 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
44 0 0 0 ABAJO AVANZA ABAJO<br />
45 0 0 1 ABAJO GIRA +90 DERECHA<br />
SE GENERA LOOP<br />
RESULTADOS DE CORRIDA DEL AGENTE REFLEJO CON<br />
MEMORIA<br />
Para N=”7”<br />
Estado<br />
inical Accion<br />
Sentio<br />
inicial<br />
Sentido<br />
final<br />
1 0 0 0 DERECHA AVANZA DERECHA<br />
2 0 0 0 DERECHA AVANZA DERECHA<br />
3 0 0 1 DERECHA GIRO +90 ARRIBA<br />
4 0 0 0 ARRIBA AVANZA ARRIBA<br />
5 0 0 0 ARRIBA AVANZA ARRIBA<br />
6 0 0 1 ARRIBA GIRA +90 IZQUIERDA<br />
7 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
8 0 0 1 IZQUIERDA GIRA +90 ABAJO<br />
9 0 0 0 ABAJO GIRO +90 DERECHA<br />
10 0 0 0 DERECHA AVANZA DERECHA<br />
11 0 0 0 DERECHA AVANZA DERECHA<br />
12 0 0 0 DERECHA AVANZA DERECHA<br />
13 0 0 0 DERECHA AVANZA DERECHA<br />
14 0 0 0 DERECHA AVANZA DERECHA<br />
15 0 0 1 DERECHA GIRO +90 ARRIBA<br />
16 0 0 0 ARRIBA AVANZA ARRIBA<br />
17 0 0 1 ARRIBA GIRA +90 IZQUIERDA<br />
18 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
19 0 0 0 ABAJO AVANZA ABAJO<br />
20 0 0 0 ABAJO AVANZA ABAJO<br />
21 0 0 1 ABAJO GIRA +90 DERECHA<br />
22 0 0 0 DERECHA AVANZA DERECHA<br />
23 0 0 1 DERECHA GIRO +90 ARRIBA<br />
24 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
25 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
26 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
27 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
28 0 0 1 IZQUIERDA GIRA +90 ABAJO<br />
29 0 0 0 ABAJO AVANZA ABAJO<br />
30 0 0 0 ABAJO AVANZA ABAJO<br />
31 0 0 1 ABAJO GIRA +90 DERECHA<br />
32 0 0 0 DERECHA AVANZA DERECHA<br />
33 0 0 0 DERECHA AVANZA DERECHA<br />
34 0 0 1 DERECHA GIRO +90 ARRIBA<br />
28
35 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
36 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
37 0 0 0 ABAJO AVANZA ABAJO<br />
38 0 0 0 ABAJO AVANZA ABAJO<br />
39 0 1 0 ABAJO LIMPIA ABAJO<br />
40 0 0 0 ABAJO AVANZA ABAJO<br />
41 0 0 0 ABAJO AVANZA ABAJO<br />
42 0 0 0 ABAJO AVANZA ABAJO<br />
43 0 0 1 ABAJO GIRA +90 DERECHA<br />
44 0 0 0 DERECHA AVANZA DERECHA<br />
45 0 0 1 DERECHA GIRO +90 ARRIBA<br />
46 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
47 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
48 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
49 0 1 0 IZQUIERDA LIMPIA IZQUIERDA<br />
50 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
51 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
52 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
53 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
54 0 0 1 IZQUIERDA GIRA +90 ABAJO<br />
55 0 0 0 ABAJO AVANZA ABAJO<br />
56 0 0 1 ABAJO GIRA +90 DERECHA<br />
57 0 0 0 DERECHA GIRO +90 ARRIBA<br />
58 0 0 0 ARRIBA AVANZA ARRIBA<br />
59 0 0 0 ARRIBA AVANZA ARRIBA<br />
60 0 0 0 ARRIBA AVANZA ARRIBA<br />
61 0 0 0 ARRIBA AVANZA ARRIBA<br />
62 0 0 0 ARRIBA AVANZA ARRIBA<br />
63 0 0 0 ARRIBA AVANZA ARRIBA<br />
64 0 1 0 ARRIBA LIMPIA ARRIBA<br />
65 0 0 0 ARRIBA AVANZA ARRIBA<br />
66 0 0 1 ARRIBA GIRA +90 IZQUIERDA<br />
67 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
68 0 0 1 IZQUIERDA GIRA +90 ABAJO<br />
69 0 0 0 ABAJO GIRO +90 DERECHA<br />
70 0 0 0 DERECHA AVANZA DERECHA<br />
71 0 0 1 DERECHA GIRO +90 ARRIBA<br />
72 0 0 0 ARRIBA AVANZA ARRIBA<br />
73 0 0 1 ARRIBA GIRA +90 IZQUIERDA<br />
74 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
75 0 0 1 IZQUIERDA GIRA +90 ABAJO<br />
76 0 0 0 ABAJO GIRO +90 DERECHA<br />
77 0 0 0 DERECHA AVANZA DERECHA<br />
78 0 0 1 DERECHA GIRO +90 ARRIBA<br />
SE GENERA LOOP<br />
29
RESULTADOS DE CORRIDA DEL AGENTE REFLEJO CON<br />
MEMORIA<br />
Para N=”8”<br />
Estado<br />
inical Accion<br />
Sentio<br />
inicial<br />
Sentido<br />
final<br />
1 0 0 0 DERECHA AVANZA DERECHA<br />
2 0 0 0 DERECHA AVANZA DERECHA<br />
3 0 0 0 DERECHA AVANZA DERECHA<br />
4 0 0 0 DERECHA AVANZA DERECHA<br />
5 0 1 0 DERECHA LIMPIA DERECHA<br />
6 0 0 0 DERECHA AVANZA DERECHA<br />
7 0 0 0 DERECHA AVANZA DERECHA<br />
8 0 0 0 DERECHA AVANZA DERECHA<br />
9 0 0 0 DERECHA AVANZA DERECHA<br />
10 0 0 1 DERECHA GIRO +90 ARRIBA<br />
11 0 0 0 ARRIBA AVANZA ARRIBA<br />
12 0 0 1 ARRIBA GIRO +90 IZQUIERDA<br />
13 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
14 0 0 0 ABAJO AVANZA ABAJO<br />
15 0 0 1 ABAJO GIRA +90 DERECHA<br />
16 0 0 0 DERECHA AVANZA DERECHA<br />
17 0 0 1 DERECHA GIRO +90 ARRIBA<br />
18 0 0 0 ARRIBA AVANZA ARRIBA<br />
19 0 0 1 ARRIBA GIRO +90 IZQUIERDA<br />
20 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
21 0 0 0 ABAJO AVANZA ABAJO<br />
22 0 0 1 ABAJO GIRA +90 DERECHA<br />
SE GENERA LOOP<br />
RESULTADOS DE CORRIDA DEL AGENTE REFLEJO CON<br />
MEMORIA<br />
Para N=”9”<br />
Estado<br />
inical Accion<br />
Sentio<br />
inicial<br />
Sentido<br />
final<br />
1 0 0 0 DERECHA AVANZA DERECHA<br />
2 0 0 0 DERECHA AVANZA DERECHA<br />
3 0 1 0 DERECHA LIMPIA DERECHA<br />
4 0 0 0 DERECHA AVANZA DERECHA<br />
5 0 0 0 DERECHA AVANZA DERECHA<br />
6 0 0 1 DERECHA GIRO +90 ARRIBA<br />
7 0 0 0 ARRIBA AVANZA ARRIBA<br />
8 0 0 1 ARRIBA GIRO +90 IZQUIERDA<br />
30
9 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
10 0 0 0 ABAJO AVANZA ABAJO<br />
11 0 0 0 ABAJO AVANZA ABAJO<br />
12 0 0 0 ABAJO AVANZA ABAJO<br />
13 0 0 0 ABAJO AVANZA ABAJO<br />
14 0 0 0 ABAJO AVANZA ABAJO<br />
15 0 0 1 ABAJO GIRA +90 DERECHA<br />
16 0 0 0 DERECHA AVANZA DERECHA<br />
17 0 0 1 DERECHA GIRO +90 ARRIBA<br />
18 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
19 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
20 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
21 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
22 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
23 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
24 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
25 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
26 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
27 0 1 0 IZQUIERDA LIMPIA IZQUIERDA<br />
28 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
29 0 0 1 IZQUIERDA GIRA +90 ABAJO<br />
30 0 0 0 ABAJO AVANZA ABAJO<br />
31 0 0 0 ABAJO AVANZA ABAJO<br />
32 0 0 1 ABAJO GIRA +90 DERECHA<br />
33 0 0 0 DERECHA AVANZA DERECHA<br />
34 0 0 0 DERECHA AVANZA DERECHA<br />
35 0 0 0 DERECHA AVANZA DERECHA<br />
36 0 0 0 DERECHA AVANZA DERECHA<br />
37 0 0 0 DERECHA AVANZA DERECHA<br />
38 0 0 0 DERECHA AVANZA DERECHA<br />
39 0 0 0 DERECHA AVANZA DERECHA<br />
40 0 0 0 DERECHA AVANZA DERECHA<br />
41 0 0 1 DERECHA GIRO +90 ARRIBA<br />
42 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
43 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
44 0 0 0 ABAJO AVANZA ABAJO<br />
45 0 0 1 ABAJO GIRA +90 DERECHA<br />
46 0 0 0 DERECHA AVANZA DERECHA<br />
47 0 0 1 DERECHA GIRO +90 ARRIBA<br />
48 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
49 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
50 0 0 0 ABAJO AVANZA ABAJO<br />
51 0 0 1 ABAJO GIRA +90 DERECHA<br />
SE GENERA LOOP<br />
31
RESULTADOS DE CORRIDA DEL AGENTE REFLEJO CON<br />
MEMORIA<br />
Para N=”10”<br />
Estado<br />
inical Accion<br />
Sentio<br />
inicial<br />
Sentido<br />
final<br />
1 0 0 0 DERECHA AVANZA DERECHA<br />
2 0 0 0 DERECHA AVANZA DERECHA<br />
3 0 0 0 DERECHA AVANZA DERECHA<br />
4 0 0 0 DERECHA AVANZA DERECHA<br />
5 0 0 0 DERECHA AVANZA DERECHA<br />
6 0 0 1 DERECHA GIRO +90 ARRIBA<br />
7 0 0 0 ARRIBA AVANZA ARRIBA<br />
8 0 0 1 ARRIBA GIRA +90 IZQUIERDA<br />
9 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
10 0 0 0 ABAJO AVANZA ABAJO<br />
11 0 0 0 ABAJO AVANZA ABAJO<br />
12 0 1 0 ABAJO LIMPIA ABAJO<br />
13 0 0 0 ABAJO AVANZA ABAJO<br />
14 0 0 0 ABAJO AVANZA ABAJO<br />
15 0 0 0 ABAJO AVANZA ABAJO<br />
16 0 0 0 ABAJO AVANZA ABAJO<br />
17 0 0 0 ABAJO AVANZA ABAJO<br />
18 0 0 0 ABAJO AVANZA ABAJO<br />
19 0 0 1 ABAJO GIRA +90 DERECHA<br />
20 0 0 0 DERECHA AVANZA DERECHA<br />
21 0 0 0 DERECHA AVANZA DERECHA<br />
22 0 0 0 DERECHA AVANZA DERECHA<br />
23 0 0 0 DERECHA AVANZA DERECHA<br />
24 0 0 0 DERECHA AVANZA DERECHA<br />
25 0 0 0 DERECHA AVANZA DERECHA<br />
26 0 0 1 DERECHA GIRO +90 ARRIBA<br />
27 0 0 0 ARRIBA AVANZA ARRIBA<br />
28 0 0 0 ARRIBA AVANZA ARRIBA<br />
29 0 0 0 ARRIBA AVANZA ARRIBA<br />
30 0 0 0 ARRIBA AVANZA ARRIBA<br />
31 0 0 0 ARRIBA AVANZA ARRIBA<br />
32 0 0 0 ARRIBA AVANZA ARRIBA<br />
33 0 0 0 ARRIBA AVANZA ARRIBA<br />
34 0 0 0 ARRIBA AVANZA ARRIBA<br />
35 0 0 1 ARRIBA GIRA +90 IZQUIERDA<br />
36 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
37 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
38 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
39 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
40 0 0 1 IZQUIERDA GIRA +90 ABAJO<br />
41 0 0 0 ABAJO AVANZA ABAJO<br />
42 0 0 0 ABAJO AVANZA ABAJO<br />
32
43 0 0 0 ABAJO AVANZA ABAJO<br />
44 0 0 0 ABAJO AVANZA ABAJO<br />
45 0 0 0 ABAJO AVANZA ABAJO<br />
46 0 1 0 ABAJO LIMPIA ABAJO<br />
47 0 0 0 ABAJO AVANZA ABAJO<br />
48 0 0 0 ABAJO GIRO +90 DERECHA<br />
49 0 0 0 DERECHA AVANZA DERECHA<br />
50 0 0 0 DERECHA AVANZA DERECHA<br />
51 0 0 0 DERECHA GIRO +90 ARRIBA<br />
52 0 0 0 ARRIBA AVANZA ARRIBA<br />
53 0 0 0 ARRIBA AVANZA ARRIBA<br />
54 0 0 0 ARRIBA AVANZA ARRIBA<br />
55 0 0 0 ARRIBA AVANZA ARRIBA<br />
56 0 0 0 ARRIBA AVANZA ARRIBA<br />
57 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
58 0 0 0 IZQUIERDA AVANZA IZQUIERDA<br />
59 0 1 0 IZQUIERDA LIMPIA IZQUIERDA<br />
60 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
61 0 0 0 ABAJO AVANZA ABAJO<br />
62 0 0 1 ABAJO GIRA +90 DERECHA<br />
63 0 0 0 DERECHA GIRO +90 ARRIBA<br />
64 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
65 0 0 0 IZQUIERDA GIRO +90 ABAJO<br />
66 0 0 0 ABAJO AVANZA ABAJO<br />
67 0 0 1 ABAJO GIRA +90 DERECHA<br />
68 0 0 0 DERECHA GIRO +90 ARRIBA<br />
69 0 0 0 ARRIBA GIRO +90 IZQUIERDA<br />
SE GENERA LOOP<br />
NOTA: SE OMITIO LOS PANTALLAZOS DE LAS DEMAS CORRIDAS POR<br />
PROBLEMAS EN EL TAMAÑO DEL ARCHIVO.<br />
33
RENDIMIENTO DE LAS CORRIDAS<br />
Aquí vamos a anlizar los resultados obtenidos y veremos cual ha sido el<br />
rendimiento de cada una de las corridas en funcion al lado de la cuadricula.<br />
Para N=”6”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
45 itera<br />
90000 ms<br />
90 seg<br />
TOTAL BASURA 5<br />
TOTAL ELIMINADO 4<br />
RENDIMIENTO 80 %<br />
Para N=”7”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
78 itera<br />
156000 ms<br />
156 seg.<br />
TOTAL BASURA 6<br />
TOTAL ELIMINADO 3<br />
RENDIMIENTO 50 %<br />
Para N=”8”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
22 itera<br />
44000 ms<br />
44 seg.<br />
TOTAL BASURA 6<br />
TOTAL ELIMINADO 1<br />
RENDIMIENTO 16.67 %<br />
34
Para N=”9”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
51 itera<br />
122000 ms<br />
122 seg.<br />
TOTAL BASURA 8<br />
TOTAL ELIMINADO 2<br />
RENDIMIENTO 25 %<br />
Para N=”10”<br />
Tiempo de Ejecucion por accion<br />
Total de iteracion<br />
Total de Ejecucion<br />
TOTAL EN SEGUNDOS<br />
2000 ms<br />
69 itera<br />
138000 ms<br />
138 seg.<br />
TOTAL BASURA 8<br />
TOTAL ELIMINADO 3<br />
RENDIMIENTO 37.5 %<br />
35
CONCLUSIONES<br />
Como resultado de las pruebas al agente reflejo simple podemos concluir que:<br />
• En ciertas ocasiones el agente simple genera un loop por un error en la<br />
logica del algoritmo.<br />
• Como consecuencia de este loop, al no ejecutar la accion stop, no se podra<br />
ver los resultados de las acciones que realizo el agente simple.<br />
• El agente simple no iniciara una corrida cuando al empezar este apuntando<br />
hacia arriba, ese es un error del codigo.<br />
Como resultado de las pruebas al agente reflejo con memoria podemos concluir<br />
que:<br />
• El agente con memoria tuvo mayor tiempo de ejecución porque trata de<br />
recorer mas camino que no ha visitado.<br />
• Este agente tiene la capacidad de parar su algoritmo cuando ya se<br />
encuentra en un loop, por lo tanto si pudimos recoger los resultados de<br />
sus acciones.<br />
36
package robot;<br />
public class Robot1 {<br />
int nlados=0;<br />
int aleat[][];<br />
int posIniXRobot=0;<br />
int posIniYRobot=0;<br />
int posXRobot=0;<br />
int posYRobot=0;<br />
int nroTotBasura=0;<br />
String direccion = "DERECHA";<br />
ANEXO 1<br />
Código del Robot1 Agente Simple<br />
/** Creates a new instance of Robot1 */<br />
public Robot1() {<br />
}<br />
/**<br />
* direccion : 0 = derecha / 1 = arriba / 2 = izquierda / 3 = abajo<br />
*Metodo que mueve al robot a la siguiente posicion verificando previamente que<br />
no hay pared en la siguiente posicion a moverse<br />
*/<br />
public void avanzaRobot(int posx, int posy ){<br />
boolean b;<br />
verificaSiHayBasura(posx,posy);<br />
System.out.println("ROBOT EN POSICION ("+posx+","+posy+")");<br />
if(direccion.equals("DERECHA")){<br />
b = this.verificaSiEsMuro(posx+1,posy);<br />
if(!b){<br />
posXRobot++;<br />
}<br />
}<br />
else if(direccion.equals("ARRIBA")){<br />
b = this.verificaSiEsMuro(posx,posy-1);<br />
if(!b){<br />
posYRobot--;<br />
}<br />
}<br />
else if(direccion.equals("IZQUIERDA")){<br />
b = this.verificaSiEsMuro(posx-1,posy);<br />
if(!b){<br />
posXRobot--;<br />
}<br />
}<br />
else if(direccion.equals("ABAJO")){<br />
b = this.verificaSiEsMuro(posx,posy+1);<br />
if(!b){<br />
posYRobot++;<br />
}<br />
}<br />
37
}<br />
/**<br />
*Metodo que setea la posicion donde se encuentra la basura limpiada a -1 el cual<br />
nos indica que hubo basura y ya fue limpiada para efectos de contabilizar la basura<br />
recojida.<br />
**/<br />
public void limpiaBasura(int posx, int posy ){<br />
aleat[posx][posy]=-1;<br />
}<br />
/**<br />
* Metodo que me lista toda la basura limpiada<br />
**/<br />
public void listarBasuraLimpiada(){<br />
nroTotBasura=0;<br />
for(int i=1;i
**<br />
*Metodo principal que empieza todo<br />
**/<br />
public void empieza(){<br />
System.out.println("INGRESE NRO DE LADOS : ");<br />
String linea="";<br />
int tope=0;<br />
try{ linea = br.readLine(); }<br />
catch(Exception e){}<br />
nlados=Integer.parseInt(linea);<br />
listarPosInicial();<br />
posXRobot = posIniXRobot;<br />
posYRobot = posIniYRobot;<br />
do{<br />
tope++;<br />
avanzaRobot(posXRobot,posYRobot);<br />
} while(!((posIniXRobot==posXRobot) && (posIniYRobot==posYRobot)));<br />
listarBasuraLimpiada();<br />
}<br />
/**<br />
*Metodo que me cambia de direccion siempre lo hace en sentido antihorario.<br />
*Ejm : si direccion era izquierda y llamo al metodo cambiarDireccion() luego<br />
de esa llamada la nueva direccion sera abajo.<br />
**/<br />
public void cambiarDireccion(){<br />
if(direccion.equals("DERECHA")){<br />
direccion="ARRIBA";<br />
}<br />
else if(direccion.equals("ARRIBA")){<br />
direccion="IZQUIERDA";<br />
}<br />
else if(direccion.equals("IZQUIERDA")){<br />
direccion="ABAJO";<br />
}<br />
else if(direccion.equals("ABAJO")){<br />
direccion="DERECHA";<br />
}<br />
}<br />
/**<br />
*Aquí se instancia un objeto r1 de la clase Robot1 y llama al metodo empieza<br />
para que comience el recorrido del robot<br />
**/<br />
public static void main(String[] args){<br />
Robot1 r1 = new Robot1();<br />
r1.empieza();<br />
}<br />
}<br />
39
ANEXO 2<br />
CODIGO DEL ROBOT2 AGENTE CON MEMORIA<br />
package robot;<br />
public class Robot2 {<br />
int nlados=0;<br />
int aleat[][];<br />
int recorrido[][];<br />
int posIniXRobot=0;<br />
int posIniYRobot=0;<br />
int posXRobot=0;<br />
int posYRobot=0;<br />
int nroTotBasura=0;<br />
String direccion = "DERECHA";<br />
/** Creates a new instance of Robot2 */<br />
public Robot2() {<br />
}<br />
public void avanzaRobot(int posx, int posy ){<br />
boolean b;<br />
recorrido[posx][posy]=1;<br />
verificaSiHayBasura(posx,posy);<br />
System.out.println("ROBOT EN POSICION ("+posx+","+posy+")");<br />
if(direccion.equals("DERECHA")){<br />
b = this.verificaSiEsAccesible(posx+1,posy);<br />
if(!b){<br />
posXRobot++;<br />
}<br />
}<br />
else if(direccion.equals("ARRIBA")){<br />
b = this.verificaSiEsAccesible(posx,posy-1);<br />
if(!b){<br />
posYRobot--;<br />
}<br />
}<br />
else if(direccion.equals("IZQUIERDA")){<br />
b = this.verificaSiEsAccesible(posx-1,posy);<br />
if(!b){<br />
posXRobot--;<br />
}<br />
}<br />
else if(direccion.equals("ABAJO")){<br />
b = this.verificaSiEsAccesible(posx,posy+1);<br />
if(!b){<br />
posYRobot++;<br />
}<br />
}<br />
}<br />
40
public void limpiaBasura(int posx, int posy ){<br />
aleat[posx][posy]=-1;<br />
}<br />
/**<br />
* Metodo que me lista toda la basura limpiada<br />
**/<br />
public void listarBasuraLimpiada(){<br />
nroTotBasura=0;<br />
for(int i=1;i
System.out.println("INGRESE NRO DE LADOS : ");<br />
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));<br />
String linea="";<br />
int tope=0;<br />
try{ linea = br.readLine(); }<br />
catch(Exception e){}<br />
nlados=Integer.parseInt(linea);<br />
listarPosInicial();<br />
posXRobot = posIniXRobot;<br />
posYRobot = posIniYRobot;<br />
do{<br />
tope++;<br />
avanzaRobot(posXRobot,posYRobot);<br />
} while(!((posIniXRobot==posXRobot) && (posIniYRobot==posYRobot)));<br />
listarBasuraLimpiada();<br />
}<br />
/**<br />
*Método que me cambia de direccion siempre lo hace en sentido antihorario.<br />
*Ejm : si direccion era izquierda y llamo al metodo cambiarDireccion() luego de<br />
esa llamada la nueva direccion sera abajo.<br />
**/<br />
public void cambiarDireccion(){<br />
if(direccion.equals("DERECHA")){<br />
direccion="ARRIBA";<br />
}<br />
else if(direccion.equals("ARRIBA")){<br />
direccion="IZQUIERDA";<br />
}<br />
else if(direccion.equals("IZQUIERDA")){<br />
direccion="ABAJO";<br />
}<br />
else if(direccion.equals("ABAJO")){<br />
direccion="DERECHA";<br />
}<br />
}<br />
/**<br />
*Aquí se instancia un objeto r2 de la clase Robot2 y llama al metodo empieza<br />
para que comience el recorrido del robot<br />
**/<br />
}<br />
public static void main(String[] args){<br />
Robot2 r2 = new Robot2();<br />
r2.empieza();<br />
}<br />
42