23.04.2014 Views

INTELIGENCIA ARTIFICIAL 1 INFORME FINAL DE ... - Wiphala.net

INTELIGENCIA ARTIFICIAL 1 INFORME FINAL DE ... - Wiphala.net

INTELIGENCIA ARTIFICIAL 1 INFORME FINAL DE ... - Wiphala.net

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>INFORME</strong> <strong>FINAL</strong> <strong>DE</strong> <strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong><br />

TEMA : Agente Reflejo Simple y Agente de Búsqueda<br />

ALUMNOS : SECCION<br />

Condezo Fernández, Gerardo 2006147157 46J<br />

Domínguez Rojas, Bilha 1995109117 45J<br />

Manco Fernández, Renzo 2003194158 46J<br />

Nuñez Velarde, Cynthia 2001124643 45J<br />

Reyes Ubilluz, Jose 2003201199 45J<br />

Saldarriaga Coveñas, Diana 2001225361 46J<br />

CURSO : Inteligencia Artificial.<br />

PROFESOR : Samuel Oporto Díaz.<br />

La Molina, 18 de Junio del 2009<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 1


INDICE<br />

RESUMEN ...................................................................................................................<br />

INTRODUCCION ......................................................................................................<br />

CAPITULO I: AGENTE REFLEJO SIMPLE.............................................................<br />

1.1 Definición ................................................................................................................<br />

1.2 Representación del Ambiente ...................................................................................<br />

1.3 Conocimiento Declarativo ........................................................................................<br />

1.4 Conocimiento Procedural .........................................................................................<br />

1.5 Código para Determinar el Desempeño del Agente...................................................<br />

1.6 Ejemplo Desempeño del Agente................................................................................<br />

1.7 Tabla Acción-Percepción ..........................................................................................<br />

1.8 Análisis de Resultados .............................................................................................<br />

CAPITULO II: AGENTE <strong>DE</strong> BÚSQUEDA...............................................................<br />

2.1 Definición ...............................................................................................................<br />

2.2 Estados....................................................................................................................<br />

2.3 Criterio de Parada ...................................................................................................<br />

2.4 Planteamiento del Problema ....................................................................................<br />

2.5 Representación de Estados.......................................................................................<br />

2.6 Operadores..............................................................................................................<br />

2.7 Estado Inicial y Estado Meta...................................................................................<br />

2.7.1 Agente BFS .................................................................................................<br />

2.7.2 Agente DFS.................................................................................................<br />

2.8 Resultado de Búsqueda............................................................................................<br />

2.8.1 Agente BFS .................................................................................................<br />

2.8.2 Agente DFS.................................................................................................<br />

2.9 Análisis de Resultado..............................................................................................<br />

CONCLUSIONES .......................................................................................................<br />

RECOMENDACIONES..............................................................................................<br />

BIBLIOGRAFIA..........................................................................................................<br />

ANEXO ........................................................................................................................<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 2


RESUMEN<br />

El presente Informe final abarca el comportamiento del agente reflejo simple y<br />

del agente de búsqueda donde se presenta los detalles del análisis, y operación<br />

de estos agentes, que tiene como objetivo limpiar un ambiente aleatoriamente,<br />

generando basura, obstáculos, wumpus esparcidos de manera aleatoria en el<br />

ambiente.<br />

Para lograr dicho objetivo el agente contara con un solo sensor de ambiente, lo<br />

cual le permitirá percibir y efectuar las acciones permitidas. Se elaborara una<br />

tabla de percepción-acción, otra especificación será que el agente se encuentre<br />

con un hueco se termina la operación y en ese momento se podrá hacer la<br />

evaluación de la eficiencia, así determinamos la eficiencia de los agentes.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 3


INTRODUCCIÓN<br />

En el presente trabajo presentaremos el comportamiento de dos agentes el de<br />

reflejo simple y el de búsqueda, cada uno capaz de realizar acciones de limpieza<br />

cada vez que el mismo se topa con una porción de basura.<br />

En la primera parte del trabajo se emplearon gráficos, con la finalidad de que<br />

sea más entendible el comportamiento del agente simple, como por ejemplo la<br />

representación del ambiente del agente, tablas de resultado y estadísticos para<br />

dicho agente de igual manera las variables, estados y parámetros del agente.<br />

Los cálculos que se muestran son complejidad y rendimiento del agente reflejo<br />

simple.<br />

En el siguiente capitulo se hará una breve descripción del Agente de Búsqueda<br />

y como se podría implementar para la solución del problema propuesto en el<br />

primer capitulo, a la vez también se realizará el cálculo de su complejidad y<br />

rendimiento comparándose con el agente anterior propuesto en el primer<br />

capítulo.<br />

Al final se hará un breve análisis comparativo entre los agentes, con datos<br />

obtenidos de las corridas, determinando la eficiencia de cada uno con respecto a<br />

otro.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 4


CAPITULO I<br />

AGENTE <strong>DE</strong> REFLEJO SIMPLE<br />

1.1 <strong>DE</strong>FINICION<br />

Este agente va a realizar tres tipos de movimientos que son avanzar, girar 90º a<br />

la derecha y girar 90º a la izquierda. Los movimientos son determinados de<br />

acuerdo a la percepción del ambiente en el que puede encontrar elementos<br />

tales como basura, obstáculos y huecos. El accionar de estos agentes va a estar<br />

determinado por la tabla Percepción-Acción.<br />

1.2 REPRESENTACIÓN <strong>DE</strong>L AMBIENTE<br />

Nuestro ambiente físico es una habitación en la cual se ubica el agente, el cual<br />

tiene que aspirar la basura que encuentre durante su recorrido, esquivando los<br />

posibles obstáculos que se presenten, así como las paredes que se encuentran<br />

alrededor del ambiente, identificará cuáles son basuras que recogerá, no caer en<br />

los obstáculos y evitar pasar dos veces por el mismo lugar.<br />

PARED<br />

AGUJERO<br />

BASURAS<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 5


AGENTE INTELIGENTE<br />

1.3 CONOCIMIENTO <strong>DE</strong>CLARATIVO<br />

Encontramos diversas clases como esenciales e importantes como el ambiente,<br />

el agente y la tabla de acción. Analizaremos cada clase:<br />

public class Data {<br />

String fileView = "/enviroment/view.txt"; // archivo view<br />

String fileTable = "/enviroment/table.txt"; // archivo tabla<br />

percepcion accion<br />

Se extraen los archivos view y table que contienen los datos preliminares para la<br />

implementacion de un agente simple.<br />

Se asigna cada archivo a una variable String.<br />

int view = {{0, 0, 0}, // view referencial<br />

{0, 1, 0}, // lo que vale es lo que esta<br />

{0, 0, 0}}; // en la tabla<br />

Esto crea la vista de como empezara el agente simple o en que lugar empezara<br />

el agente simple en el ambiente generado. Aquí es donde se puede cambiar el<br />

tamaño de la matriz.<br />

int table = {{0, 0, 0, 9, 1}, // tabla percepcion accion<br />

{0, 0, 1, 9, 2}, // referencial<br />

{1, 0, 0, 9, 4},<br />

{0, 1, 0, 9, 5}};<br />

Esto crea la secuencia o descripción de cada asignación de variables para el<br />

applet.<br />

Crea una matriz de enteros que contiene la descripción del ambiente del<br />

agente.<br />

public<br />

String[]<br />

readInput(String filename)<br />

{<br />

}<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 6


Se crea un vector de datos.<br />

Se declara un buffer de lectura de datos.<br />

Se declara una cadena de texto para cada linea del archivo.<br />

Se crea el buffer de lectura y se le asigna un archivo relacionado con el<br />

parametro de entrada del nombre del archivo.<br />

Mientas se lee cada linea del archivo incluido en el buffer, se asigna cada linea<br />

al vector de datos.<br />

Se cierra el buffer y se retorna el vector de datos con el tamaño asignado de<br />

acuerdo a la cantidad de lineas en el archivo.<br />

public void writeOutput(Vector out, String filename){<br />

}<br />

Se crea un vector de salida y se le asigna el vector de datos enviado como<br />

parametro.<br />

Ejecuta el metodo de escritura de salida enviandole el vector de datos y el<br />

nombre del archivo.<br />

public void writeOutput(String[] output, String filename) {<br />

}<br />

Se crea un objeto de escritura de archivos asignandole el nombre del archivo y<br />

un indicador false.<br />

Se crea un buffer de escritura y se le asigna el objeto de escritura de archivos.<br />

Se crea una salida de archivos y se le asigna el buffer de escritura.<br />

Se recorre el vector de datos enviado como parametro y muestra en pantalla el<br />

contenido de cada posicion del vector.<br />

Se cierra la salida de archivos.<br />

private String getCurrentPath(){<br />

}<br />

Esto crea un vector de 3 X 3 para la creación del ambiente en donde interactuara<br />

el agente simple.<br />

}<br />

public int[][] view() {<br />

Se crea un vector entero de 3 X 3.<br />

Se crea un vector string T que lee los datos de entrada #getCurrentPath()# y lee<br />

el archive.<br />

Mientras se recorre el vector string T, se crea el vector string s asignandole<br />

elcontenido de cada una de las posiciones del vector T, y por cada elemento del<br />

vector s se le asigna el contenido a la posicion respectiva del vector entero 3 x 3.<br />

Retorna el vector de 3 X 3<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 7


public int[][] table() {<br />

}<br />

Se crea una matriz de 99x5.<br />

Se crea una variable de filas y se le asigna 0.<br />

Se crea un vector T al que se le asigna el contenido del archivo filetable que<br />

contiene la tabla de percepcion acción referencial.<br />

Mientras se recorre el vector T, se evalúa si la posición del vector empieza con<br />

"|" o con " "; si es true asigna el numero de posición a la variable de filas.<br />

Se corta la rutina, se crea el vector S y se le asigna la posición actual del vector T<br />

dividido con " ", mientras se recorren las posiciones del vector s, se le asigna a la<br />

matriz table el contenido de la posicion actual del vector S.<br />

Retorna el resultado del método copy enviándole la matriz table y la variable de<br />

filas.<br />

public void print(int[][] M) {<br />

}<br />

Se recorre un vector entero bidimensional con dos variables enteras para luego<br />

imprimir la posición entre estos dos dejando un espacio en blanco.<br />

public void print(String[] S) {<br />

}<br />

Se recorre un vector entero para luego imprimir cada uno de sus objetos.<br />

public int[][] copy(int[][] M, int rows) {<br />

}<br />

Se reciben dos variables, una de ellas un vector entero bidimensional y una<br />

variable entera.<br />

Se crea un vector entero bidireccional y se le asigna los parámetros de las<br />

variables recibidas.<br />

Se crea una variable entera que recorre hasta llegar al limite da la variable rows<br />

y almacena en el vector creado.<br />

Retorna el vector creado.<br />

public class Enviroment {<br />

private int Mmin = 3, Mmax = 20;<br />

protected int[][] Space;<br />

protected Dimension Size;<br />

protected Dimension Position;<br />

private String Orientation = "";<br />

private int Beated = 0;<br />

private int EMPTY = 0; // vacio<br />

private int WALL = 1; // pared<br />

private int HOLE = 2; // hueco<br />

private int TARGET = 9; // basura<br />

private double pWall = 0.2; // porcentaje paredes<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 8


private double pHole = 0.01; // porcentaje de huecos<br />

private double pTarget = 0.2; // porcentaje de basuras<br />

private int[][] View = {{0, 0, 0}, {0, 1, 0}, {0, 0, 0}};<br />

protected String[] ORIENTATION = {"TOP", "LEFT", "DOWN", "RIGHT"};<br />

En esta sección se declaran y se inicializan las variables que se usaran en la clase<br />

Enviroment, se inicializan los porcentajes de las paredes, huecos, objetivos,<br />

matriz de estado inicial, orientación, etc.<br />

public Enviroment() {<br />

View = (new Data()).view();<br />

setEnviroment();<br />

}<br />

public Enviroment(int[][] view) {<br />

SetViews(view);<br />

setEnviroment();<br />

}<br />

public Enviroment(double wall, double hole, double target) {<br />

SetPercentObjects(wall, hole, target);<br />

setEnviroment();<br />

}<br />

public Enviroment(int[][] view, double wall, double hole, double target) {<br />

SetPercentObjects(wall, hole, target);<br />

SetViews(view);<br />

setEnviroment();<br />

}<br />

Se describe el método constructor recibiendo diferentes parámetros para<br />

inicializar las variables de entorno.<br />

private void setEnviroment() {<br />

Size = new Dimension();<br />

Size.height = (int) (Mmin + (Mmax - Mmin) * Math.random());<br />

Size.width = (int) (Mmin + (Mmax - Mmin) * Math.random());<br />

Space = new int[Size.height + 2][Size.width + 2];<br />

En esta sección del método se crea un objeto que representa las dimensiones a<br />

usar en el ambiente, y se setean los respectivos valores del ancho y largo, así<br />

como la matriz de espacios.<br />

for (int r = 1; r < Size.height + 1; r++) {<br />

for (int c = 1; c < Size.width + 1; c++) {<br />

if (Math.random() < pWall) {<br />

Space[r][c] = WALL;<br />

}<br />

if (Math.random() < pHole) {<br />

Space[r][c] = HOLE;<br />

}<br />

if (Math.random() < pTarget) {<br />

// coloca elementos<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 9


}<br />

}<br />

Space[r][c] = TARGET;<br />

En esta sección del método se recorren las posiciones del ancho y largo del<br />

entorno y se asignan a la matriz de espacios los respectivos elementos de pared,<br />

hueco y objetivo de acuerdo a los porcentajes definidos al comienzo de la clase.<br />

for (int r = 0; r < Size.height + 2; r++) {<br />

Space[r][0] = WALL;<br />

Space[r][Size.width + 1] = WALL;<br />

}<br />

for (int c = 0; c < Size.width + 2; c++) {<br />

Space[0][c] = WALL;<br />

Space[Size.height + 1][c] = WALL;<br />

}<br />

// coloca el borde<br />

// coloca el borde<br />

Se colocan y asignan las paredes a los espacios que serán bordes.<br />

Position = new Dimension();<br />

Position.height = 1 + (int) ((Size.height) * Math.random());<br />

Position.width = 1 + (int) ((Size.width) * Math.random());<br />

Space[Position.height][Position.width] = 0; // siempre inicia en vacio<br />

Orientation = ORIENTATION[(int) (3 * Math.random())];<br />

Se asigna la posición inicial tomando como base la altura, el ancho y el método<br />

que genera números aleatorios, también se asigna una orientación aleatoria<br />

tomando como base el arreglo de orientaciones definidos al inicio de la clase y<br />

multiplicándolo por 3 veces el número aleatorio generado.<br />

public void SetPercentObjects(double wall, double hole, double target) {<br />

pWall = wall;<br />

pHole = hole;<br />

pTarget = target;<br />

}<br />

En este método se asignan los porcentajes que representan a las paredes, huecos<br />

y objetivos.<br />

public int setAction(int[] action) {<br />

Dimension pos = getPosition();<br />

String ori=getOrientation();<br />

//System.out.println(action);<br />

Se obtiene la posición y la orientación.<br />

if(action[0]==1){ //RECOGE<br />

//int[][] env=getEnviroment();<br />

System.out.println("parentEnviroment.setAction Regoger");<br />

Space[pos.height][pos.width]=0;<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 10


}<br />

print();<br />

Si la acción que se envía como parámetro es igual a 1, se recoge la basura y se<br />

asigna 0 a la posición intersecada por el ancho y largo.<br />

else<br />

if(action[0]==0){ //<strong>FINAL</strong>IZA<br />

System.out.println("parentEnviroment.setAction Finaliza");<br />

print();<br />

Si la acción es 0, el agente finaliza su movimiento.<br />

else<br />

if(action[0]==2){ //GIRA+<br />

System.out.println("parentEnviroment.setAction Gira+");<br />

if(ori.equals("TOP")){<br />

Position.height=pos.height+1;<br />

Position.width=pos.width;<br />

}else if(ori.equals("LEFT")){<br />

Position.height=pos.height;<br />

Position.width=pos.width+1;<br />

}else if(ori.equals("DOWN")){<br />

Position.height=pos.height-1;<br />

Position.width=pos.width;<br />

}else if(ori.equals("RIGHT")){<br />

Position.height=pos.height;<br />

Position.width=pos.width-1;<br />

}<br />

Evalúa el valor de la orientación, y de acuerdo a eso se le asignan nuevos<br />

valores de la posición de la siguiente orientación.<br />

}<br />

if(ori.equals("TOP")){<br />

Orientation="LEFT";<br />

}else if(ori.equals("LEFT")){<br />

Orientation="DOWN";<br />

}else if(ori.equals("DOWN")){<br />

Orientation="RIGHT";<br />

}else if(ori.equals("RIGHT")){<br />

Orientation="TOP";<br />

}<br />

print();<br />

Evalúa el valor de la orientación y asigna el nuevo valor de la orientación de<br />

acuerdo a la rotación.<br />

else<br />

if(action[0]==3){ //AVANZA<br />

System.out.println("parentEnviroment.setAction Avanza");<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 11


}<br />

if(ori.equals("TOP")){<br />

Position.height=pos.height-1;<br />

Position.width=pos.width;<br />

}else if(ori.equals("LEFT")){<br />

Position.height=pos.height;<br />

Position.width=pos.width-1;<br />

}else if(ori.equals("DOWN")){<br />

Position.height=pos.height+1;<br />

Position.width=pos.width;<br />

}else if(ori.equals("RIGHT")){<br />

Position.height=pos.height;<br />

Position.width=pos.width+1;<br />

}<br />

Si la acción es 3, se le asigna las nuevas posiciones para que el agente avance a<br />

una nueva posición.<br />

return 0; // continuan las iteraciones<br />

}<br />

public int[][] getPerception() {<br />

int[][] percept = new int[3][3];<br />

for (int r = 0; r < 3; r++) {<br />

for (int c = 0; c < 3; c++) {<br />

int p = Space[Position.height + r - 1][Position.width + c - 1];<br />

percept[r][c] = View[r][c] * p;<br />

}<br />

}<br />

return percept;<br />

}<br />

Este método asigna los valores de la matriz View a la matriz de percepción, y<br />

luego retorna la matriz de percepción para ser usada luego por los otros<br />

métodos o clases.<br />

public int getPerceptionOnly() {<br />

return Space[Position.height][Position.width];<br />

}<br />

Este método obtiene el valor de la matriz de espacios correspondientes a las<br />

posiciones de ancho y largo actuales.<br />

public int[] getPerceptionHorizontal() {<br />

int[][] percept = getPerception();<br />

for (int r = 0; r < 3; r++) {<br />

if (View[r][0] == 1 || View[r][1] == 1 || View[r][2] == 1) {<br />

return percept[r];<br />

}<br />

}<br />

return null;<br />

}<br />

public int[][] getPerceptionVertical() {<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 12


}<br />

int[][] percept = getPerception();<br />

for (int c = 0; c < 3; c++) {<br />

if (View[0][c] == 1 || View[1][c] == 1 || View[2][c] == 1) {<br />

int[][] vpercept = {{percept[0][c]}, {percept[1][c]}, {percept[2][c]}};<br />

return vpercept;<br />

}<br />

}<br />

return null;<br />

Estos dos métodos obtienen las percepciones horizontales y verticales.<br />

public void print(int[][] M) {<br />

for (int r = 0; r < M.length; r++) {<br />

print(M[r]);<br />

}<br />

}<br />

Este método recibe como parámetro una matriz y muestra en pantalla los<br />

valores de esa matriz.<br />

public void print(int[] M) {<br />

for (int c = 0; c < M.length; c++) {<br />

System.out.print(M[c] + " ");<br />

}<br />

System.out.println(" ");<br />

}<br />

Este método recibe como parámetro un arreglo unidimensional y muestra en<br />

pantalla los valores de este.<br />

public void print() {<br />

print(Space);<br />

System.out.println("Dimension = [" + Size.height + "] [" + Size.width + "]");<br />

System.out.println("Position = [" + Position.height + "] [" + Position.width + "]");<br />

System.out.println("Orientation= [" + Orientation + "]");<br />

System.out.println("View:");<br />

print(View);<br />

}<br />

Este método muestra en pantalla, la dimension, la posición y orientación.<br />

public Dimension getSize() {<br />

return Size;<br />

}<br />

public Dimension getPosition() {<br />

return Position;<br />

}<br />

public int[][] getEnviroment() {<br />

return Space;<br />

}<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 13


public String getOrientation() {<br />

return Orientation;<br />

}<br />

public String getOrientations() {<br />

return Orientation;<br />

}<br />

public int getBeated() {<br />

return Beated;<br />

}<br />

Estos métodos obtienen el tamaño, la posición, la matriz del entorno, la<br />

orientación y la propiedad de golpe.<br />

public void setBeated(int beated) {<br />

Beated = beated;<br />

}<br />

Este método asigna el valor de la propiedad de golpe basándose en el<br />

parámetro enviado.<br />

static int sign(int view, int value) {<br />

if (view < 0) {<br />

return -1;<br />

} else {<br />

return value;<br />

}<br />

}<br />

A este metodo se le envia dos enteros y retorna el valor de acuerdo al signo de<br />

la variable view.<br />

static int action(int action) {<br />

return 0;<br />

}<br />

Este metodo retorna 0.<br />

public static void main(String[] args) {<br />

int[][] view = {{1, 1, 1}, {1, 1, 1}, {1, 1, 1}};<br />

Enviroment E = new Enviroment(view);<br />

E.print();<br />

E.getPerception();<br />

}<br />

Este es el método principal que inicializa la matriz view con 1 en todas sus<br />

posiciones, crea el entorno enviando la matriz view, y obtiene la percepción del<br />

entorno respectivo.<br />

package agent;<br />

import enviroment.*;<br />

import gui.*;<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 14


public class reflexAgent {<br />

public int[][] table; // tabla percepción acción<br />

public double[][] statistics; // estadisticas<br />

public Enviroment Envirom; // medio ambiente<br />

public Visual GUI; // applet<br />

private double SLEEP = 0.25; // número máximo de pasos a procesar<br />

private int MAXSTEPS = 100; // número máximo de pasos a procesar<br />

public int step = -1; // ciclo actual<br />

public static int targets=0;<br />

int golpe=0;<br />

/*<br />

* Estadisticas<br />

*/<br />

static int egolpe=0;<br />

static int eavanza=0;<br />

static int ebasura=0;<br />

static int ehueco=0;<br />

static int cont=0;<br />

static int limit=50;<br />

Lo primero que se hizo es importar las clases enviroment y gui, son las clases<br />

que nos determinan el entorno variable.<br />

En esta sección se declaran y se inicializan las variables que se usaran en la clase<br />

reflexAgent, se inicializan el número mínimo de pasos que el agente está<br />

dormido, el numero máximo de pasos que realizara el agente, las entradas y el<br />

golpe; además de inicializar las variables estáticas enteras para contar las<br />

estadísticas del agente como: el golpe, cuantas veces avanza, la cantidad de<br />

basura, la cantidad de huecos, un contador y limite de termino propuesto.<br />

public reflexAgent(int maxstep, double sleep) {<br />

table = (new Data()).table(); // lee la tabla percepción acción<br />

Envirom = new Enviroment(); // crea el medio ambiente<br />

MAXSTEPS = maxstep;<br />

SLEEP = sleep;<br />

}<br />

public void setGUI(Visual gui) {<br />

GUI = gui;<br />

}<br />

Se describe el método constructor recibiendo diferentes parámetros para<br />

inicializar las variables del agente reflejo.<br />

public int[][] interpretPercept(int[][] p) {<br />

int ori = 0;<br />

System.out.println("golpe"+golpe);<br />

if(p[0][0] ==9){<br />

//Existe basura<br />

System.out.println("reflexAgent.interpretPercept Basura");<br />

ebasura++;<br />

int[][] vectorPerseccion = {{1,0,0,ori}}; //{{basura,hueco,golpe,orientacion}}<br />

return vectorPerseccion;<br />

}else if(p[0][0] ==2){<br />

//Hueco<br />

System.out.println("reflexAgent.interpretPercept Hueco");<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 15


ehueco++;<br />

int[][] vectorPerseccion = {{0,1,0,ori}}; //{{basura,hueco,golpe,orientacion}}<br />

return vectorPerseccion;<br />

}else if(p[0][0] ==1){<br />

//Pared<br />

System.out.println("reflexAgent.interpretPercept Pared");<br />

egolpe++;<br />

int[][] vectorPerseccion = {{0,0,1,ori}}; //{{basura,hueco,golpe,orientacion}}<br />

return vectorPerseccion;<br />

}<br />

}<br />

else if(p[0][0] ==0 && golpe==0){ //Libre sin golpe<br />

System.out.println("reflexAgent.interpretPercept Libre sin golpe");<br />

eavanza++;<br />

int[][] vectorPerseccion = {{0,0,0,ori}}; //{{basura,hueco,golpe,orientacion}}<br />

return vectorPerseccion;<br />

}<br />

return null;<br />

En este método se describe la percepción del agente sobre su entorno, donde se<br />

describirá como basura cuando es igual a 9 se cuenta cuantas basuras hay, como<br />

hueco cuando es igual a 2 se cuenta cuantos huecos hay, pared cuando es igual<br />

a 1 se cuenta cuantas veces choca, y si es igual a cero y no existe golpe se<br />

cuentas veces avanza el agente. (Este método nos sirve para realizar el conteo<br />

de las estadísticas que necesitamos)<br />

public int[] findAction(int[][] p) {<br />

}<br />

if(p[0][0] ==1){<br />

System.out.println("reflexAgent.findAction Recoge");<br />

int[] action={1};<br />

return action; //Recoge<br />

}else if(p[0][1] == 1){<br />

System.out.println("reflexAgent.findAction Finaliza");<br />

int[] action={0}; //Finaliza<br />

return action;<br />

}else if(p[0][2] == 1){<br />

System.out.println("reflexAgent.findAction Gira +");<br />

int[] action={2}; //Gira +<br />

return action;<br />

}else {<br />

System.out.println("reflexAgent.findAction Avanza");<br />

int[] action={3}; //Avanza<br />

return action;<br />

}<br />

Este método está relacionado con el anterior, porque cuando el anterior percibe<br />

el estado actual del agente frente al ambiente lo que establece este método es la<br />

acción a realizar frente a la percepción obtenida del método anterior.<br />

public void setStatistics() {<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 16


System.out.println("######### ESTADISTICOS ##########");<br />

System.out.println("Complejidad del agente: "+(ebasura+eavanza+egolpe+ehueco));<br />

int reglas=0;<br />

if(egolpe != 0){reglas++;} //gira<br />

if(eavanza != 0){reglas++;} //avanza<br />

if(ebasura != 0){reglas++;} //Recoge<br />

if(ehueco != 0){reglas++;} //Finaliza<br />

System.out.println("Nro reglas que a usado mas de una vez : "+reglas);<br />

System.out.println("Nro de veces que el agente Avanza: "+eavanza);<br />

System.out.println("Nro de veces que el agente Gira + o - : "+egolpe);<br />

System.out.println("Nro de veces que el agente se Golpea: "+egolpe);<br />

System.out.println("Nro de veces que el agente recoge Basura: "+ebasura);<br />

}<br />

double edesempeño =((double)ebasura/(double)targets)*100;<br />

System.out.println("Desempeño: "+edesempeño+"%");<br />

System.out.println("Nro de Basura existente en el Ambiente: "+targets);<br />

Este método nos muestra las estadísticas como: la complejidad, el número de<br />

reglas utilizadas, el número de veces que el agente avanza, el número de veces<br />

que el agente gira, el número de veces que el agente golpea, el número de<br />

basuras, el desempeño y el numero de basuras totales.<br />

public boolean stopCondition() {<br />

boolean stop = true;<br />

if(cont>=limit){<br />

stop = false; }<br />

cont++;<br />

return stop; }<br />

Este método permite parar la iteración del agente cuando el contador supera el<br />

limite estimado que anteriormente pusimos en la clase reflexAgent.<br />

public boolean cycling() {<br />

// retornar false si aún no se ha ciclado<br />

// retornar true si se ha ciclado<br />

return false;<br />

}<br />

Este método nos dice si se ha producido un ciclado o no.<br />

public static void main(String[] args) {<br />

String pathFile = "E:/web1/courses/intelligent_systems/ST414/2008-<br />

II/java/Agent/src/enviroment";<br />

reflexAgent A = new reflexAgent(20, 0.25);<br />

// el main permite instanciar la clase pero no se ejecuta<br />

// correr el programa Visual<br />

}<br />

}<br />

Este método nos permite correr el programa<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 17


1.4 CONOCIMIENTO PROCEDURAL<br />

INICIO<br />

Inicializa variables fileView y<br />

fileTable que contienen los<br />

nombres de los archivos view y<br />

table.<br />

Inicializa matrices view y table con<br />

el contenido de los archivos<br />

fileView y fileTable.<br />

Inicializa matrices view y table con<br />

el contenido de los archivos<br />

fileView y fileTable.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 18


Public String[] readInput(String filename)<br />

{<br />

Se crea un vector de datos.<br />

Se declara un buffer de lectura de<br />

datos.<br />

Se declara una cadena de texto para<br />

cada línea del archivo.<br />

Se crea el buffer de entrada<br />

asignándole el archivo enviado<br />

como parámetro.<br />

Se crea el buffer de entrada<br />

asignándole el archivo enviado<br />

como parámetro.<br />

Mientras la línea<br />

leída del archivo n<br />

osea nula.<br />

Se añade la línea leída del<br />

archivo al vector<br />

Retornar vector de datos<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 19


public void writeOutput(Vector out, String filename)<br />

{<br />

Se crea un vector de salida<br />

y se le asigna el vector de<br />

datos enviado como<br />

parámetro.<br />

Ejecuta el método de escritura<br />

de salida enviándole el vector de<br />

datos y el nombre del archivo.<br />

Se crea un objeto de escritura<br />

de archivos asignándole el<br />

nombre del archivo y un<br />

indicador false.<br />

Se crea un buffer de escritura<br />

y se le asigna el objeto de<br />

escritura de archivos.<br />

Se crea una salida de archivos<br />

y se le asigna el buffer de<br />

escritura.<br />

Desde la posición 0 hasta el<br />

tamaño de la salida de<br />

archivos, incrementándose<br />

la posición en 1<br />

Muestra en pantalla el contenido<br />

de cada posición del vector.<br />

Cierra la salida de archivos.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 20


public int[][] view() {<br />

}<br />

Crea un vector entero de 3 X 3 y<br />

crea un vector string T<br />

Lee el archivo<br />

Desde la posición 0 hasta el tamaño<br />

de la salida de archivos,<br />

incrementándose la posición en 1<br />

Se crea el vector string s asignandole<br />

elcontenido de cada<br />

una de las posiciones del vector T<br />

Desde la posición 0 hasta el tamaño<br />

de la salida de archivos,<br />

incrementándose la posición en 1<br />

Al vector s se le asigna el contenido<br />

a la posicion respectiva del vector entero<br />

de 3x3<br />

Retorna el vector de 3 X 3<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 21


public int[][] table() {<br />

Se crea una matriz de 99x5 y una variable<br />

de filas donde se le asigna 0.<br />

Se crea un vector T al que se le asigna el<br />

contenido del archivo filetable que<br />

contiene la tabla de percepcion acción<br />

referencial.<br />

Desde la posición 0 hasta el tamaño<br />

de la salida de archivos,<br />

incrementándose la posición en 1<br />

Si la posición del vector<br />

empieza con "|" o con " ";<br />

Si es true asigna el numero de<br />

posición a la variable de filas.<br />

Se corta la rutina de ejecución de la<br />

sentencia if.<br />

Se crea el vector S y se le asigna la<br />

posición actual del vector T dividido<br />

con " "<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 22


Se recorren las posiciones del<br />

vector S desde la posición 0 hasta el<br />

tamaño de la salida de archivos,<br />

incrementándose la posición en 1<br />

Se le asigna a la matriz table el<br />

contenido de la posicion actual del<br />

vector s.<br />

Retorna el resultado del metodo copy<br />

enviandole la matriz table y la variable<br />

de filas<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 23


public class Enviroment {<br />

Se declara y se inicializan las<br />

variables<br />

Se inicializa los porcentajes de las<br />

paredes, huecos, objetivos, matriz de<br />

estado inicial, orientación, etc.<br />

private void setEnviroment() {<br />

Se crea un objeto que representa las<br />

dimensiones a usar en el ambiente.<br />

Se setean los respectivos valores de<br />

ancho y largo, así como la matriz de<br />

espacios.<br />

Se recorre las<br />

posiciones del<br />

ancho y largo del<br />

entorno<br />

Si<br />

Si Math.random() < pWall<br />

No<br />

Space[r][c] = WALL<br />

Si<br />

Si Math.random() < pHole<br />

Spacer[r][c] = HOLE<br />

Si<br />

Si Math.random() < pTarget<br />

Spacer[r][c] = TARGET<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 24


Se recorre las<br />

posiciones del<br />

ancho y largo del<br />

entorno<br />

Se colocan y asignan las paredes a<br />

los espacios que serán bordes.<br />

Se asigna la posición inicial tomando<br />

como base la altura, el ancho y el<br />

método que genera números aleatorios<br />

se asigna una orientación aleatoria<br />

tomando como base el arreglo de<br />

orientaciones definidos al inicio de la<br />

clase y multiplicandolo por 3 veces el<br />

número aleatorio generado.<br />

public void SetPercentObjects(double wall, double hole, double target) {<br />

Se declaran las variables wall, hole,<br />

target<br />

Se asignan los porcentajes que<br />

representan a las paredes, huecos y<br />

objetivos.<br />

public int setAction(int[] action) {<br />

Se declara la matriz action<br />

Se obtiene la posición y la<br />

orientación<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 25


public int setAction(int[] action) {<br />

Se declara la matriz action<br />

Se obtiene la posición y la<br />

orientación<br />

Si la acción que envía<br />

como parámetro es igual a<br />

1<br />

se recoge la basura y se asigna 0 a la<br />

posición intersecada por el ancho y<br />

largo<br />

Si la acción que envía<br />

como parámetro es igual a<br />

0<br />

Finaliza su movimiento<br />

Si la acción que envía<br />

como parámetro es igual a<br />

2<br />

Evalúa el valor de la orientación, y de<br />

acuerdo a eso se le asignan nuevos<br />

valores de la posición de la siguiente<br />

orientación.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 26


Si la acción que envía<br />

como parámetro es igual a<br />

3<br />

se le asigna las nuevas posiciones<br />

para que el agente avance a una<br />

nueva posición<br />

Retorna percepcion<br />

static int sign(int view, int value) {<br />

Se declara las variables<br />

view y value<br />

public static void main(String[] args) {<br />

se le envia dos enteros y<br />

retorna el valor de acuerdo al<br />

signo de la variable view<br />

Se declara una matriz<br />

Se inicializa la matriz view<br />

con 1 en todas sus<br />

posiciones.<br />

public class reflexAgent {<br />

Se crea el entorno enviando<br />

la matriz view, y obtiene la<br />

percepción del entorno<br />

respectivo.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 27


Se importa las clases<br />

enviroment y gui<br />

Se declara y se inicializa las<br />

variables que usará la clase<br />

reflexAgent.<br />

Se inicializa el número mínimo<br />

de pasos que el agente está<br />

dormido, el numero máximo de<br />

pasos que realizara el agente,<br />

las entradas y el golpe .<br />

Se inicializa las variables<br />

estáticas enteras para contar<br />

las estadísticas del agente<br />

public int[][] interpretPercept(int[][] p) {<br />

Se declara la matriz p<br />

Si la matriz p es igual<br />

a 9<br />

Contar cuantas basuras hay<br />

Si la matriz p es<br />

igual a 2<br />

Contar cuantas huecos<br />

hay<br />

Si la matriz p es<br />

igual a 1<br />

Cuenta cuantas veces choca<br />

con pared.<br />

Si la matriz p es<br />

igual a 0<br />

Cuenta cuantas veces<br />

avanza el agente.<br />

public void setStatistics() {<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 28


Se declara la variable regla<br />

Si la variable regla es<br />

igual a cero.<br />

Se cuenta cuantas reglas hay<br />

Se visualiza en pantalla el<br />

número de reglas usadas.<br />

Si la estadistica<br />

golpe es diferente de<br />

cero<br />

Se cuenta cuantos golpes hay<br />

Se visualiza en pantalla el<br />

número de golpes.<br />

Si la estadistica<br />

avanza es diferente<br />

de cero<br />

Se cuenta cuantos veces<br />

avanza.<br />

Se visualiza en pantalla el<br />

número de veces que avanza.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 29


Si la variable<br />

estadistica basura es<br />

diferente de cero<br />

Se cuenta cuantas reglas hay<br />

Se visualiza en pantalla el número<br />

de basura que recoge.<br />

Se halla el porcentaje de<br />

desempeño<br />

Se visualiza en pantalla el<br />

porcentaje de desempeño del<br />

agente.<br />

Se visualiza en pantalla el<br />

número de basura en el<br />

ambiente<br />

public boolean stopCondition() {<br />

Se declara la variable stop<br />

como verdadera<br />

Si el contador es mayor<br />

o igual al límite<br />

Stop = falso;<br />

Cont++<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong><br />

Retorna la variable stop<br />

30


public static void main(String[] args) {<br />

Se instancia la clase main<br />

Se corre el programa.<br />

1.5 CODIGO PARA <strong>DE</strong>TERMINAR EL <strong>DE</strong>SEMPEÑO <strong>DE</strong>L AGENTE<br />

package agent;<br />

import enviroment.*;<br />

import gui.*;<br />

public class reflexAgent {<br />

public int[][] table;<br />

acción<br />

public double[][] statistics;<br />

public Enviroment Envirom;<br />

public Visual GUI;<br />

private double SLEEP = 0.25;<br />

pasos a procesar<br />

private int MAXSTEPS = 100;<br />

pasos a procesar<br />

public int step = -1;<br />

public static int targets=0;<br />

int golpe=0;<br />

// tabla percepción<br />

// estadisticas<br />

// medio ambiente<br />

// applet<br />

// número máximo de<br />

// número máximo de<br />

// ciclo actual<br />

/*<br />

* Estadisticas<br />

*/<br />

static int egolpe=0;<br />

static int eavanza=0;<br />

static int ebasura=0;<br />

static int ehueco=0;<br />

static int cont=0;<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 31


static int limit=50;<br />

Lo primero que se hizo es importar las clases enviroment y<br />

gui, son las clases que nos determinan el entorno variable.<br />

En esta sección se declaran y se inicializan las variables<br />

que se usaran en la clase reflexAgent, se inicializan el<br />

número mínimo de pasos que el agente esta dormido, el<br />

numero máximo de pasos que realizara el agente, las<br />

entradas y el golpe; además de inicializar las variables<br />

estáticas enteras para contar las estadísticas del agente<br />

como: el golpe, cuantas veces avanza, la cantidad de<br />

basura, la cantidad de huecos, un contador y limite de<br />

termino propuesto.<br />

public reflexAgent(int maxstep, double sleep) {<br />

table = (new Data()).table(); // lee la tabla<br />

percepcion accion<br />

Envirom = new Enviroment(); // crea el medio<br />

ambiente<br />

}<br />

MAXSTEPS = maxstep;<br />

SLEEP = sleep;<br />

public void setGUI(Visual gui) {<br />

GUI = gui;<br />

}<br />

Acá se describe el método constructor recibiendo<br />

diferentes parámetros para inicializar las variables del<br />

agente reflejo.<br />

public int[][] interpretPercept(int[][] p) {<br />

int ori = 0;<br />

System.out.println("golpe"+golpe);<br />

if(p[0][0] ==9){<br />

//Existe<br />

basura<br />

System.out.println("reflexAgent.interpretPercept<br />

Basura");<br />

ebasura++;<br />

int[][] vectorPerseccion = {{1,0,0,ori}};<br />

//{{basura,hueco,golpe,orientacion}}<br />

return vectorPerseccion;<br />

}else if(p[0][0] ==2){<br />

//Hueco<br />

System.out.println("reflexAgent.interpretPercept<br />

Hueco");<br />

ehueco++;<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 32


int[][] vectorPerseccion = {{0,1,0,ori}};<br />

//{{basura,hueco,golpe,orientacion}}<br />

return vectorPerseccion;<br />

}else if(p[0][0] ==1){<br />

//Pared<br />

System.out.println("reflexAgent.interpretPercept<br />

Pared");<br />

egolpe++;<br />

int[][] vectorPerseccion = {{0,0,1,ori}};<br />

//{{basura,hueco,golpe,orientacion}}<br />

return vectorPerseccion;<br />

}<br />

else if(p[0][0] ==0 && golpe==0){ //Libre<br />

sin golpe<br />

System.out.println("reflexAgent.interpretPercept<br />

Libre sin golpe");<br />

eavanza++;<br />

int[][] vectorPerseccion = {{0,0,0,ori}};<br />

//{{basura,hueco,golpe,orientacion}}<br />

return vectorPerseccion;<br />

}<br />

return null;<br />

}<br />

En este método se describe la percepción del agente sobre<br />

su entorno, donde se describirá como basura cuando es igual<br />

a 9 se cuenta cuantas basuras hay, como hueco cuando es<br />

igual a 2 se cuenta cuantos huecos hay, pared cuando es<br />

igual a 1 se cuenta cuantas veces choca, y si es igual a<br />

cero y no existe golpe se cuentas veces avanza el agente.<br />

(Este método nos sirve para realizar el conteo de las<br />

estadísticas que necesitamos)<br />

public int[] findAction(int[][] p) {<br />

if(p[0][0] ==1){<br />

System.out.println("reflexAgent.findAction<br />

Recoge");<br />

int[] action={1};<br />

return action; //Recoge<br />

}else if(p[0][1] == 1){<br />

System.out.println("reflexAgent.findAction<br />

Finaliza");<br />

int[] action={0}; //Finaliza<br />

return action;<br />

}else if(p[0][2] == 1){<br />

System.out.println("reflexAgent.findAction Gira<br />

+");<br />

int[] action={2}; //Gira +<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 33


eturn action;<br />

}else {<br />

System.out.println("reflexAgent.findAction<br />

Avanza");<br />

int[] action={3}; //Avanza<br />

}<br />

}<br />

return action;<br />

Este método esta relacionado con el anterior, porque cuando<br />

el anterior percibe el estado actual del agente frente al<br />

ambiente lo que establece este método es la acción a<br />

realizar frente a la percepción obtenida del método<br />

anterior.<br />

public void setStatistics() {<br />

System.out.println("######### ESTADISTICOS<br />

##########");<br />

System.out.println("Complejidad del agente:<br />

"+(ebasura+eavanza+egolpe+ehueco));<br />

int reglas=0;<br />

if(egolpe != 0){reglas++;} //gira<br />

if(eavanza != 0){reglas++;} //avanza<br />

if(ebasura != 0){reglas++;} //Recoge<br />

if(ehueco != 0){reglas++;} //Finaliza<br />

System.out.println("Nro reglas que a usado mas de una<br />

vez : "+reglas);<br />

System.out.println("Nro de veces que el agente Avanza:<br />

"+eavanza);<br />

System.out.println("Nro de veces que el agente Gira +<br />

o - : "+egolpe);<br />

System.out.println("Nro de veces que el agente se<br />

Golpea: "+egolpe);<br />

System.out.println("Nro de veces que el agente recoge<br />

Basura: "+ebasura);<br />

double edesempeño<br />

=((double)ebasura/(double)targets)*100;<br />

System.out.println("Desempeño: "+edesempeño+"%");<br />

System.out.println("Nro de Basura existente en el<br />

Ambiente: "+targets);<br />

}<br />

Este método nos muestra las estadísticas como: la<br />

complejidad, el número de reglas utilizadas, el número de<br />

veces que el agente avanza, el número de veces que el<br />

agente gira, el número de veces que el agente golpea, el<br />

número de basuras, el desempeño y el numero de basuras<br />

totales.<br />

AQUÍ ES DON<strong>DE</strong><br />

SALEN LAS<br />

ESTADISITICAS<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 34


public boolean stopCondition() {<br />

boolean stop = true;<br />

if(cont>=limit){<br />

stop = false; }<br />

cont++;<br />

return stop; }<br />

Este método permite parar la iteración del agente cuando el<br />

contador supera el limite estimado que anteriormente<br />

pusimos en la clase reflexAgent.<br />

public boolean cycling() {<br />

// retornar false si aún no se ha ciclado<br />

// retornar true si se ha ciclado<br />

return false;<br />

}<br />

Este método nos dice si se ha producido un ciclado o no.<br />

public void run() {<br />

//reflexAgent Agent;// percepcion leída por los<br />

sensores<br />

int[][] state;<br />

// percepción<br />

transformada para ser usada por P->A<br />

int[] action;<br />

// acción a ejecutarse<br />

while (stopCondition()) {<br />

int[][]percept =<br />

{{Envirom.getPerceptionOnly()}};//Saca la percepcion de 1x1<br />

System.out.println(Envirom.getPerceptionOnly());<br />

try{<br />

state = interpretPercept(percept);//Vector<br />

Percepcion<br />

action = findAction(state);//Reglas<br />

if(action[0]==0){<br />

break;<br />

}<br />

Envirom.setAction(action);//Hace el<br />

movimiento<br />

GUI.paint(GUI.getGraphics());<br />

// vuelve a pintar el ambiente<br />

Wait.manySec(SLEEP);<br />

}catch (Exception e) {<br />

e.printStackTrace();<br />

}<br />

// espera 1/4 de segundo<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 35


}<br />

}<br />

setStatistics();<br />

public static void main(String[] args) {<br />

String pathFile =<br />

"E:/web1/courses/intelligent_systems/ST414/2008-<br />

II/java/Agent/src/enviroment";<br />

reflexAgent A = new reflexAgent(20, 0.25);<br />

// el main permite instanciar la clase pero no se<br />

ejecuta<br />

// correr el programa Visual<br />

}<br />

}<br />

Este método nos permite correr el programa<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 36


1.6 EJEMPLO <strong>DE</strong>L <strong>DE</strong>SEMPEÑO <strong>DE</strong>L AGENTE<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 37


1.7 TABLA ACCION-PERCEPCION<br />

Estadisticas del Agente Reflejo Simple 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16<br />

Complejidad del agente 50 50 50 50 50 50 37 50 50 50 50 50 50 50 50 50<br />

Nro reglas que a usado mas de una vez : 2 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3<br />

Nro de veces que el agente Avanza: 33 40 36 33 40 38 24 38 39 35 40 38 32 37 37 39<br />

Nro de veces que el agente Gira -: 5<br />

Nro de veces que el agente Gira + : 17 12 16 7 9 5 5 8 13 9 7 16 12 9 10<br />

Nro de veces que el agente se Golpea: 17 5 12 13 5 7 6 4 9 14 6 5 14 12 6 9<br />

Nro de veces que el agente recoge Basura: 0 5 2 1 3 3 7 7 3 2 1 5 2 1 4 1<br />

Calcule el desempeño del agente 0% 20.83% 16.67% 10% 8.57% 8.33% 18.92% 30.43% 13.04% 7.69% 33.33% 38.46% 100% 4.54% 133.33% 16.67%<br />

¿El agente retorna a su posicion inicial? NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO<br />

Diga si la trayectoria del agente cruza con la del otro agente NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO<br />

El medio ambiente es dinamico NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO<br />

El medio ambiente es episodico NO SI NO NO SI NO SI NO NO NO NO NO NO NO NO NO<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 38


1.8 ANÁLISIS <strong>DE</strong> LOS RESULTADOS<br />

<strong>DE</strong>SEMPEÑO VS COMPLEJIDAD<br />

80<br />

70<br />

60<br />

50<br />

<strong>DE</strong>SEMPEÑO<br />

40<br />

30<br />

20<br />

10<br />

0<br />

0% 50% 100% 150% 200% 250%<br />

COMPLEJIDAD<br />

AMBIENTE VS COMPLEJIDAD<br />

80<br />

70<br />

60<br />

50<br />

COMPLEJIDAD<br />

40<br />

30<br />

20<br />

10<br />

0<br />

0 50 100 150 200 250 300 350 400<br />

AMBIENTE<br />

<strong>DE</strong>SEMPEÑO VS AMBIENTE<br />

250%<br />

200%<br />

<strong>DE</strong>SEMPEÑO<br />

150%<br />

100%<br />

50%<br />

0%<br />

0 50 100 150 200 250 300 350 400<br />

CAPITULO II<br />

AMBIENTE<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 39


AGENTE <strong>DE</strong> BÚSQUEDA<br />

2.1 <strong>DE</strong>FINICIÓN <strong>DE</strong>L AMBIENTE<br />

Este agente tiene la habilidad de observar completamente el Medio Ambiente,<br />

se caracteriza por resolver problemas de planificación. Para nuestro caso hemos<br />

planteado como podemos limpiar la totalidad de basuras en el ambiente<br />

utilizando el menor número de recursos.<br />

2.2 ESTADOS<br />

2.2.1 Estado Inicial<br />

El estado padre va ser como va estar configurado el medio ambiente en el<br />

momento inicial, antes de haber realizado cualquier operación o que los<br />

sensores hayan detectado algo.<br />

2.2.2 Estado Meta<br />

No existe ya que no sabemos con exactitud como estará el estado final<br />

distribuido.<br />

2.3 CRITERIO <strong>DE</strong> PARADA<br />

El sistema no permite realizar más de 50 iteraciones. Si el agente percibe un<br />

HUECO se apaga<br />

2.4 PLANTEAMIENTO <strong>DE</strong>L PROBLEMA<br />

• Se tiene un ambiente, compuesto por filas y columnas, estas serán<br />

ingresadas al azar.<br />

• Lo que se requiere es un agente que se comporte como una aspiradora,<br />

cuyos objetivos es movilizarse por todo el ambiente y limpiar toda la<br />

basura que encuentre a su paso.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 40


• El ambiente en el que se encontrará el Agente contará no sólo con basura<br />

sino también con obstáculos y huecos, los cuales deberá ser capaz de<br />

superar o evitar para lograr su meta.<br />

2.5 REPRESENTACIÓN <strong>DE</strong> ESTADOS<br />

PARED<br />

AGUJERO<br />

BASURAS<br />

2.6 OPERADORES<br />

AGENTE INTELIGENTE<br />

//OPERADORES AGENTES <strong>DE</strong> BUSQUEDA<br />

public final static int MOVER_<strong>DE</strong>RECHA = 0;<br />

public final static int MOVER_ABAJO = 1;<br />

public final static int MOVER_IZQUIERDA = 2;<br />

public final static int MOVER_ARRIBA = 3;<br />

public final static int BASURA = 1;<br />

public final static int OBSTACULO = 2;<br />

public final static int PARED = 2;<br />

public final static int PARE<strong>DE</strong>S = 2;<br />

public final static int HUECO = 3;<br />

public final static int AGENTE = 5;<br />

//VALORES PARA ORIENTACION <strong>DE</strong>L AGENTE<br />

public final static int NORTE = 1;<br />

public final static int ESTE = 2;<br />

public final static int SUR = 3;<br />

public final static int OESTE = 4;<br />

//ACCIONES<br />

public final static int ROTAR_90_POS = 1;<br />

public final static int ROTAR_90_NEG = 2;<br />

public final static int SUCCIONAR = 3;<br />

public final static int AVANZAR = 4;<br />

public final static int PARAR = 5;<br />

//MATRIZ <strong>DE</strong> PERCEPCION<br />

public final static int SENSOR_GOLPE = 0;<br />

public final static int SENSOR_ORIGEN = 1;<br />

public final static int SENSOR_BASURA = 2;<br />

public final static int SENSOR_HUECO = 3;<br />

public final static int SENSOR_ORIENTACION = 4;<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 41


VALORES GUARDADOS EN MEMORIA<br />

public final static int LIBRE = 0;<br />

public final static int GOLPE = 1;<br />

//TIPOS <strong>DE</strong> BUSQUEDA<br />

public final static int BFS = 0;<br />

public final static int DFS = 1;<br />

2.7 ESTADO INICIAL Y ESTADO META<br />

2.7.1 AGENTE BFS<br />

2.7.2 AGENTE DFS<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 42


2.8 RESULTADO <strong>DE</strong> BÚSQUEDA<br />

2.8.1 AGENTE BFS<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 43


2.8.2 AGENTE DFS<br />

2.9 ANÁLISIS <strong>DE</strong> RESULTADO<br />

El método BFS al momento de recorrer para buscar la mejor solución se demora<br />

demasiado, por eso un poco mas efectivo es el método DFS que la demora es<br />

menor.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 44


CONCLUSIONES<br />

- La complejidad de cada agente aumenta en la medida de su ambiente<br />

generado; el hecho de ser aleatorio implica la posibilidad de que el agente se<br />

encuentre en un determinado momento dentro de un campo cerrado y no<br />

logre salir de él.<br />

- El mejor rendimiento del agente se dará a medida que vayamos mejorando<br />

el algoritmo que debe seguir.<br />

- El rendimiento del agente es 0 si el agente no llego a limpiar toda la basura<br />

del ambiente y el rendimiento es 100 si el agente cumplio en limpiar toda<br />

basura del ambiente.<br />

- El desempeño del agente sera el resultado de calcular el numero de basura<br />

limpiada / numero total de basura en el ambiente; todo esto por 100. Con lo<br />

cual se obtiene el porcentaje.<br />

- El agente reflejo simple no puede recordar su pasado, en la cual no conserva<br />

ningún estado anterior, todas las acciones lo hace mediante las percepciones<br />

de ese instante.<br />

- El agente reflejo simple tiene una dependencia total al guiar sus acciones de<br />

una tabla percepción-acción hecha por los creadores<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 45


RECOMENDACIONES<br />

Se recomienda tener un código fuente bien ordenado para que la<br />

comprensibilidad del programa sea más rápido y a su vez, dará facilidad para<br />

futuras modificaciones de dicho programa.<br />

Debe realizarse pruebas prácticas en busca de las tablas de percepción – acción,<br />

la elección de las opciones más óptimas, tienen como desencadenante el<br />

conseguir mayor rendimiento del agente.<br />

Debe elegirse el agente adecuado para la tarea adecuada ya que cuando uno se<br />

equivoca representa un gasto enorme de recursos y la muy poca probabilidad<br />

de conseguir objetivos.<br />

Se debe de obtener modelos similares para que se pueda comparar con el<br />

modelo principal.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 46


REFERENCIAS BIBLIOGRAFICAS<br />

http://saevius.iespana.es/descargas/Investigacion/Agentes/RESUMEN%20A<br />

GENTES.pdf<br />

http://www.cruzrojaguayas.org/inteligencia/Estructura%20de%20Agentes%2<br />

0Inteligentes.htm<br />

http://www.angelfire.com/falcon/popikpe/cap_dos.htm<br />

ANEXO<br />

SE UTILIZO EL CODIGO ANTERIOR <strong>DE</strong>L GRUPO Nº 4 – 2008 – I NOMBRES:<br />

Breña Lora Erik; Farfán Rosas Miguel Ángel; Hidalgo Cárdenas<br />

Claudia Carolina; Perea Isasi Cinthya Paola; Pichilingue Rios Giuliana<br />

Miguelina; Ramos Caballero Arturo; Vicuña Solórzano Suzanne<br />

Giuliana.<br />

En base al trabajo que se hace referencia se realizo las siguientes<br />

modificaciones para la asignación de las variables de filas, columnas y<br />

nodos sean asignadas a gusto interesado.<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 47


se cambio de variable private a public para que se ha reconocido por el frmagente<br />

public static void calcularEstadisticas(BFS busqueda) {<br />

Se creo este método para guardar el número de filas y<br />

columnas obtenidas del frmagente<br />

public BFS(int nroFilas, int nroColumnas){<br />

}<br />

filasTotal = nroFilas;<br />

columnasTotal = nroColumnas;<br />

Se creo este método para que no exista ninguna referencia<br />

al método anterior public BFS(Estado inicio, Estado meta,<br />

int nodos) { y no existan falsas llamadas al método.<br />

public void AsignarEstadosNodos(Estado inicio, Estado meta, int nodos){<br />

estadoInicio = inicio;<br />

estadoMeta = meta;<br />

maximoNodosAbiertos = nodos;<br />

abiertos = new Vector();<br />

cerrados = new Vector();<br />

arbolBusqueda = new Arbol("Búsqueda BFS"); // CREA EL ARBOL BFS<br />

nodoHijo = new Nodo(estadoInicio); // INSTANCIA EL PRIMER NODO<br />

arbolBusqueda.insertarAlFrente(nodoHijo); //ADICIONAR NODO AL<br />

ARBOL<br />

}<br />

abiertos.addElement(estadoInicio); // AGREGA NODO A LOS NODOS<br />

ABIERTOS<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 48


private JButton getBtnCrearAgenteBusqueda() {<br />

if (btnCrearAgenteBusqueda == null) {<br />

btnCrearAgenteBusqueda = new JButton();<br />

btnCrearAgenteBusqueda.setBounds(new Rectangle(150, 150, 199, 27));<br />

btnCrearAgenteBusqueda.setText("Crear agente de busqueda");<br />

btnCrearAgenteBusqueda.addActionListener(new java.awt.event.ActionListener() {<br />

public void actionPerformed(java.awt.event.ActionEvent e) {<br />

System.out.println("actionPerformed()"); // TODO Auto-generated Event stub<br />

actionPerformed()<br />

Se recibe los valores insertados por el usuario y se guardan en nroFilas y<br />

nroColumnas<br />

int nroFilas = Integer.parseInt(txtNroFilas.getText()) + Constantes.PARE<strong>DE</strong>S;<br />

int nroColumnas =Integer.parseInt(txtNroColumnas.getText()) +<br />

Constantes.PARE<strong>DE</strong>S;<br />

Se envían las variables al método constructor de la clase BFS.<br />

BFS agenteBusqueda = new BFS(nroFilas,nroColumnas);<br />

MedioAmbiente ma = new<br />

MedioAmbiente(nroFilas,nroColumnas);<br />

int[][] mm1 = ma.getAmbiente(); //GUARDA ESTADO<br />

INICIAL EN UNA NUEVA VARIABLE<br />

int[][] mm2 = ma.getAmbienteFinal(); //GUARDA<br />

ESTADO META EN UNA NUEVA VARIABLE<br />

System.out.println("NUMERO <strong>DE</strong> BASURAS : " +<br />

ma.getNumBasuras());<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 49


int nroBasuras = ma.getNumBasuras();<br />

agenteBusqueda.basuras = nroBasuras;<br />

System.out.println("");<br />

System.out.print("ESTADO INICIAL | ");<br />

System.out.println("ESTADO META");<br />

Estado SS = new Estado(mm1); //INICIALIZA UNA INSTANCIA <strong>DE</strong> UN<br />

ESTADO EN BASE AL ESTADO INICIAL<br />

Estado GS = new Estado(mm2); //INICIALIZA UNA INSTANCIA <strong>DE</strong> UN<br />

ESTADO EN BASE AL ESTADO META<br />

agenteBusqueda.AsignarEstadosNodos(SS, GS,<br />

Integer.parseInt(txtNroNodos.getText()));<br />

Vector path = agenteBusqueda.busquedaBFS();<br />

System.out.println("================================");<br />

System.out.println("=====SE ALCANZÓ ESTADO META=====");<br />

System.out.println("================================");<br />

System.out.println("RUTA");<br />

System.out.println("=====");<br />

agenteBusqueda.imprimirRuta(path);<br />

BFS.calcularEstadisticas(agenteBusqueda);<br />

}<br />

});<br />

}<br />

return btnCrearAgenteBusqueda;<br />

}<br />

<strong>INTELIGENCIA</strong> <strong>ARTIFICIAL</strong> 50

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!