INTELIGENCIA ARTIFICIAL 1 INFORME FINAL DE ... - Wiphala.net
INTELIGENCIA ARTIFICIAL 1 INFORME FINAL DE ... - Wiphala.net
INTELIGENCIA ARTIFICIAL 1 INFORME FINAL DE ... - Wiphala.net
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