Está en la página 1de 23

lOMoARcPSD|6766982

Mundo Wumpus - Agentes deliberativos

Inteligencia Artificial (Escuela Politécnica Nacional)

StuDocu no está patrocinado ni avalado por ningún colegio o universidad.


Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)
lOMoARcPSD|6766982

ESCUELA POLITÉCNICA NACIONAL


FACULTAD DE INGENIERÍA DE SISTEMAS
INGENIERÍA EN SISTEMAS INFORMÁTICOS Y DE COMPUTACIÓN

ASIGNATURA: SIC524 INTELIGENCIA ARTIFICIAL GRUPO: GR1


FECHA DE ENTREGA: 2019/06/14 PERÍODO: 2019-A
TEMA: PRÁCTICA DE WUMPUS

PRÁCTICA DE WUMPUS
CONCEPTOS

 Agente y entorno

Un agente es un sistema informático, situado en algún entorno, que percibe el entorno


(entradas sensibles de su entorno) y a partir de tales percepciones determina (mediante
técnicas de resolución de problemas) y ejecuta acciones (de forma autónoma y flexible) que
le permiten alcanzar sus objetivos y que pueden cambiar el entorno.

Agente de software (softbot) es un programa de computadora capaz de realizar acciones de


forma autónoma en el ambiente en que está situado.

 Agente deliberativo

Son aquellas arquitecturas que utilizan modelos de representación simbólica del


conocimiento. Suelen estar basadas en la teoría clásica de planificación, donde existe un
estado inicial de partida, un conjunto de planes y un estado objetivo a satisfacer En estos
sistemas parece aceptada la idea de que un agente contenga algún sistema de planificación
que sea el encargado de determinar que paso debe de llevar a cabo para conseguir su
objetivo.

Por tanto, un agente deliberativo (o con una arquitectura deliberativa) es aquel que contiene
un modelo simbólico del mundo, explícitamente representado, en donde las decisiones se
toman utilizando mecanismos de razonamiento lógico basados en la concordancia de
patrones y la manipulación simbólica.

- Arquitectura B.D.I.:
Creencias – B (Believes)

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

o Conocimiento del agente sobre el entorno.

Deseos – D (Desires)
o Metas del agente.

Intenciones – I (Intentions)
o Manejan y conducen a acciones dirigidas hacia las metas
o Persisten
o Influyen las creencias

- Ventajas
o “Elegantes”.
o Semántica clara (lógica).

- Desventajas
o Complejidad computacional para la comprobación de teoremas (lenta
ejecución para agentes en tiempo real).
o Toma de decisiones: ambiente no cambia mientras se decide que hacer.
o Acción racional al iniciar toma de decisiones = racional al finalizar.

PROBLEMA

El Mundo de Wumpus

El mundo del Wumpus es un laberinto compuesto de casillas, en cada una de las cuales

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

puede haber un agujero sin fondo, un monstruo (El Wumpus), un montón de oro, o nada. La
tarea del agente consiste en entrar al laberinto, recorrerlo hasta encontrar el oro, tomarlo y
regresar a la salida sin haber caído en ningún agujero o haber sido devorado por el
Wumpus. El Agente que pueda resolver la tarea en el mundo del Wumpus deberá ajustarse
a la siguiente descripción:

Algunas consideraciones sobre el mundo del Wumpus:

- El agente solamente recibe las tres percepciones mostradas.


- Su base de conocimientos debe ser capaz de generar las acciones que
le permitan cumplir con la tarea.
- Solamente puede sujetar el oro cuando está en la misma casilla que
éste.
- Cuando suelta el oro lo hace en la misma casilla donde se encuentra.
- Solamente tiene una flecha que viaja en línea recta indefinidamente
hasta chocar con algo (pared o Wumpus).
- Si la flecha le pega al Wumpus, lo mata, en cuyo caso se oye un gemido
lastimero por todo el laberinto.

Las percepciones corresponden a colores (ver tabla arriba).

 Estado Interno Del Agente

En nuestro caso, el agente tiene una matriz de casillas, las cuáles son inicializadas en -1 o
vacío, esto es porque al inicio no conocemos nada, y se va rellenando conforme vamos
avanzando por el mundo y conforme vamos conociendo el mismo.

Por otra parte, tenemos 2 variables que forman las coordenadas, ActualX y ActualY, estas
nos indican la posición actual del agente. Otras 2 variables que son NxtX y NxtY, estas
variables nos indicarán hacía que posición se va a mover el agente en base a las
operaciones de deliberación que realiza.

Será llenada de dos maneras:1.- Ingresando en la matriz visitada las percepciones que el
agente hace del mundo en esa casilla.2.- Con cálculos realizados sobre casillas vecinas a
partir de las percepciones obtenidas en la casilla en la que se encuentra la matriz que
representa el conocimiento del agente están basadas en los ejes X y Y en donde X
representa el barrido horizontal y Y representa el barrido vertical.

Para efecto de nuestro proyecto supusimos que el agente siempre comenzaba su recorrido
o búsqueda desde la matriz (0,0) es decir X=0 y Y=0 y se comenzaría a desplazar de la
siguiente manera:

1.- Avanzará una casilla hacia arriba, es decir, un valor en Y (Y+1) obtendrá las
percepciones de la casilla y deliberará sobre cuál será su propio movimiento, tomando en
cuenta las siguientes reglas: a) si existe briza o peste, retrocede y marca como inseguras las
casillas adyacentes) si existe un destello recoge el oro y regresa al inicio del laberinto o
matriz c) si la casilla está en blanco, es decir, no hay briza, ni destello, ni peste entonces el
agente avanzará otro valor en Y y marcará como casillas seguras las casillas que sean
vecinas a la de la posición actual.

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

2.- Si el agente retrocede después de avanzar una casilla en Y, entonces automáticamente


avanzará una casilla en X (X+1) y obtendrá las percepciones de esa nueva casilla, tomando
los mismos criterios anteriormente mencionados ( a, b, c)

3.- Se vuelve a repetir el algoritmo, pero ahora tomando en cuenta el conocimiento obtenido
del agente, lo cual lo hará decidir si avanzar hacia arriba o hacia la derecha, evaluando los
riesgos y las posibilidades de los distintos caminos.

4.- El robot avanzara utilizando este algoritmo hasta que no encuentre más un camino que
seguir, el camino que fue recorriendo es almacenado en una pila. si el robot no encuentra
camino que seguir, se realizara un pop en la pila para regresar una posición en el camino,
es decir, la casilla anterior a la actual, y se evaluará esa casilla hacia la derecha o izquierda
para encontrar un nuevo camino, esto se repetirá sucesivamente hasta que el agente haya
recorrido todos los caminos posibles o hasta que haya encontrado el oro. El algoritmo tiene
la capacidad de evaluar matrices de n * n pero para efectos gráficos y de ejemplo nosotros
realizamos una matriz de 4 * 4 como se muestra en el video de la entrada anterior.

Como ya se mencionó, el agente tendrá un estado interno que consta de una matriz de n *
n, una posición inicial y el algoritmo de recorrido anteriormente explicado. para identificar las
percepciones que el agente realizará se tomara en cuenta un código de colores que el
agente tendrá que percibir, es decir: cada casilla tendrá un color distinto de acuerdo a las
condiciones que presente, puede tener briza, peste, destello o cualquier combinación de las
tres y también puede estar en blanco. Estos colores permitirán al agente deliberar acerca de
su siguiente movimiento y generarse un conocimiento del mundo que lo está rodeando.
Cada color distinto generará un conocimiento nuevo dentro de la matriz del agente y
mientras más conocimiento tenga sobre el mundo en el que se está desenvolviendo mayor
será la probabilidad de que encuentre el oro y lo traiga de regreso.

CÓDIGO

 Clase Wumpus

Esta clase contiene el método principal y la lógica del desenvolvimiento del agente por el
tablero. Aquí se determina los métodos correspondientes en caso de toparse con el
wumpus, los olores, el pozo, las brisas y el oro. Cada uno de estos contiene la lógica de
como se ira desenvolviendo el agente en esas situaciones.

package wumpus;

import java.util.Scanner;

public class wumpus {

static int scream = 0;


static int complete = 0;

static boolean check(Celda t) {


int temp = t.sense();
if (temp == 1 || temp == 2) {
return false;
}

return true;

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

public static void main(String args[]) {


Scanner scr = new Scanner(System.in);
Ambiente e = new Ambiente();
String w[][] = new String[5][5];
e.accept(w); // se crea el ambiente

System.out.println("\n\nBuscando la solución...");
Celda celda[] = new Celda[17];

int c = 1;
out: for (int i = 1; i < 5; ++i) {
for (int j = 1; j < 5; ++j) {
if (c > 16) {
break out;
}
celda[c] = new Celda(w[i][j], c); // enviamos el
caracter y la posicion
++c;

}
}

// celda donde se encuentra el agente


celda[13].seguro = 1;
celda[13].visited = 1;

int pos = 13; // posicion actual


int condition;
int limit = 0;
String temp1, temp2;
do {
++limit;
condition = -1; // ver en numeros si hay una brisa, olor, oro

if (celda[pos].caracterPos.contains("G")) { // si encuentra
el oro
complete = 1;
System.out.println("Oro encontrado!!");
break;
}

if (celda[pos].borde_der != 1 && celda[pos].der != 1 &&


celda[pos + 1].duda_pozo < 1
&& celda[pos + 1].duda_wump < 1 && celda[pos +
1].pozo != 1 && celda[pos + 1].wump != 1
&& !(celda[pos].back.contains("r")
&& (celda[pos].izq != 1 ||
celda[pos].arrib != 1 || celda[pos].abaj != 1)
&& check(celda[pos]))) {

temp1 = "l";

celda[pos].der = 1;
++pos;
System.out.println("\nSigue al frente. Posición=" +
pos);

celda[pos].back += temp1;

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

condition = celda[pos].sense();
if (condition == 3) { // si encuentra el oro en esa
posicion
complete = 1;
break;
} else {
if (condition == 1 && celda[pos].visited == 0) {
// si en esa posicion esta una brisa y aun no ha

// sido visitada
if (celda[pos].borde_der != 1 &&
celda[pos + 1].seguro != 1) {
celda[pos + 1].duda_pozo += 1;
}
if (celda[pos].borde_arrib != 1 && (pos -
4) >= 1 && celda[pos - 4].seguro != 1) {
celda[pos - 4].duda_pozo += 1;
}
if (celda[pos].borde_izq != 1 &&
celda[pos - 1].seguro != 1) {
celda[pos - 1].duda_pozo += 1;
}
if (celda[pos].borde_abaj != 1 && (pos +
4) <= 16 && celda[pos + 4].seguro != 1) {
celda[pos + 4].duda_pozo += 1;
}

celda[pos].seguro = 1;
} else {
if (condition == 2 && celda[pos].visited
== 0) { //// si en esa posicion esta un olor y aun no

//// ha sido visitada


if (celda[pos].borde_der != 1 &&
celda[pos + 1].seguro != 1) {
celda[pos + 1].duda_wump +=
1;
}
if (celda[pos].borde_arrib != 1 &&
(pos - 4) >= 1 && celda[pos - 4].seguro != 1) {
celda[pos - 4].duda_wump +=
1;
}
if (celda[pos].borde_izq != 1 &&
celda[pos - 1].seguro != 1) {
celda[pos - 1].duda_wump +=
1;
}
if (celda[pos].borde_abaj != 1 &&
(pos + 4) <= 16 && celda[pos + 4].seguro != 1) {
celda[pos + 4].duda_wump +=
1;
}

celda[pos].seguro = 1;
} else {
if (condition == 0) { //// si en
esa posicion no hay nada
celda[pos].seguro = 1;
}
}

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

}
}

celda[pos].visited = 1;

} else {
if (celda[pos].borde_izq != 1 && celda[pos].izq != 1
&& celda[pos - 1].duda_pozo < 1
&& celda[pos - 1].duda_wump < 1 &&
celda[pos - 1].pozo != 1 && celda[pos - 1].wump != 1
&& !(celda[pos].back.contains("l")
&& (celda[pos].der != 1 ||
celda[pos].arrib != 1 || celda[pos].abaj != 1)
&& check(celda[pos]))) {

temp1 = "r";

celda[pos].izq = 1;
pos = pos - 1;
System.out.println("\nRetrocede. Posición= " +
pos);

celda[pos].back += temp1;

condition = celda[pos].sense();
if (condition == 3) {
complete = 1;
break;
} else {
if (condition == 1 && celda[pos].visited
== 0) {
if (celda[pos].borde_der != 1 &&
celda[pos + 1].seguro != 1) {
celda[pos + 1].duda_pozo +=
1;
}
if (celda[pos].borde_arrib != 1 &&
(pos - 4) >= 1 && celda[pos - 4].seguro != 1) {
celda[pos - 4].duda_pozo +=
1;
}
if (celda[pos].borde_izq != 1 &&
celda[pos - 1].seguro != 1) {
celda[pos - 1].duda_pozo +=
1;
}
if (celda[pos].borde_abaj != 1 &&
(pos + 4) <= 16 && celda[pos + 4].seguro != 1) {
celda[pos + 4].duda_pozo +=
1;
}

celda[pos].seguro = 1;
} else {
if (condition == 2 &&
celda[pos].visited == 0) {
if (celda[pos].borde_der !=
1 && celda[pos + 1].seguro != 1) {
celda[pos +
1].duda_wump += 1;
}

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

if (celda[pos].borde_arrib !
= 1 && (pos - 4) >= 1 && celda[pos - 4].seguro != 1) {
celda[pos -
4].duda_wump += 1;
}
if (celda[pos].borde_izq !=
1 && celda[pos - 1].seguro != 1) {
celda[pos -
1].duda_wump += 1;
}
if (celda[pos].borde_abaj !=
1 && (pos + 4) <= 16 && celda[pos + 4].seguro != 1) {
celda[pos +
4].duda_wump += 1;
}

celda[pos].seguro = 1;
} else {
if (condition == 0) {
celda[pos].seguro = 1;
}
}
}
}

celda[pos].visited = 1;

} else {
if (celda[pos].borde_arrib != 1 &&
celda[pos].arrib != 1 && (pos - 4) >= 1
&& celda[pos - 4].duda_pozo < 1 &&
celda[pos - 4].duda_wump < 1
&& celda[pos - 4].pozo != 1 &&
celda[pos - 1].wump != 1
&& !(celda[pos].back.contains("u")
&& (celda[pos].izq !=
1 || celda[pos].der != 1 || celda[pos].abaj != 1)
&& check(celda[pos])))
{

temp1 = "d";

celda[pos].arrib = 1;
pos = pos - 4;
System.out.println("\nSube. Posición= " +
pos);

celda[pos].back += temp1;

condition = celda[pos].sense();
if (condition == 3) {
complete = 1;
break;
} else {
if (condition == 1 &&
celda[pos].visited == 0) {
if (celda[pos].borde_der !=
1 && celda[pos + 1].seguro != 1) {
celda[pos +
1].duda_pozo += 1;
}

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

if (celda[pos].borde_arrib !
= 1 && (pos - 4) >= 1 && celda[pos - 4].seguro != 1) {
celda[pos -
4].duda_pozo += 1;
}
if (celda[pos].borde_izq !=
1 && celda[pos - 1].seguro != 1) {
celda[pos -
1].duda_pozo += 1;
}
if (celda[pos].borde_abaj !=
1 && (pos + 4) <= 16 && celda[pos + 4].seguro != 1) {
celda[pos +
4].duda_pozo += 1;
}

celda[pos].seguro = 1;
} else {
if (condition == 2 &&
celda[pos].visited == 0) {
if
(celda[pos].borde_der != 1 && celda[pos + 1].seguro != 1) {
celda[pos +
1].duda_wump += 1;
}
if
(celda[pos].borde_arrib != 1 && (pos - 4) >= 1 && celda[pos - 4].seguro != 1) {
celda[pos -
4].duda_wump += 1;
}
if
(celda[pos].borde_izq != 1 && celda[pos - 1].seguro != 1) {
celda[pos -
1].duda_wump += 1;
}
if
(celda[pos].borde_abaj != 1 && (pos + 4) <= 16 && celda[pos + 4].seguro != 1) {
celda[pos +
4].duda_wump += 1;
}

celda[pos].seguro = 1;
} else {
if (condition == 0) {

celda[pos].seguro = 1;
}
}
}
}

celda[pos].visited = 1;
} else {
if (celda[pos].borde_abaj != 1 &&
celda[pos].abaj != 1 && (pos + 4) <= 16
&& celda[pos + 4].duda_pozo
< 1 && celda[pos + 4].duda_wump < 1
&& celda[pos + 4].pozo != 1
&& celda[pos + 4].wump != 1) {

temp1 = "u";

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

celda[pos].abaj = 1;
pos = pos + 4;
System.out.println("\nBaja.
Posición= " + pos);

celda[pos].back += temp1;

condition = celda[pos].sense();
if (condition == 3) {
complete = 1;
break;
} else {
if (condition == 1 &&
celda[pos].visited == 0) {
if
(celda[pos].borde_der != 1 && celda[pos + 1].seguro != 1) {
celda[pos +
1].duda_pozo += 1;
}
if
(celda[pos].borde_arrib != 1 && (pos - 4) >= 1 && celda[pos - 4].seguro != 1) {
celda[pos -
4].duda_pozo += 1;
}
if
(celda[pos].borde_izq != 1 && celda[pos - 1].seguro != 1) {
celda[pos -
1].duda_pozo += 1;
}
if
(celda[pos].borde_abaj != 1 && (pos + 4) <= 16 && celda[pos + 4].seguro != 1) {
celda[pos +
4].duda_pozo += 1;
}

celda[pos].seguro = 1;
} else {
if (condition == 2 &&
celda[pos].visited == 0) {
if
(celda[pos].borde_der != 1 && celda[pos + 1].seguro != 1) {
celda[pos
+ 1].duda_wump += 1;
}
if
(celda[pos].borde_arrib != 1 && (pos - 4) >= 1 && celda[pos - 4].seguro != 1) {
celda[pos
- 4].duda_wump += 1;
}
if
(celda[pos].borde_izq != 1 && celda[pos - 1].seguro != 1) {
celda[pos
- 1].duda_wump += 1;
}
if
(celda[pos].borde_abaj != 1 && (pos + 4) <= 16 && celda[pos + 4].seguro != 1) {
celda[pos
+ 4].duda_wump += 1;
}

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

celda[pos].seguro = 1;
} else {
if (condition ==
0) {

celda[pos].seguro = 1;
}
}
}
}

celda[pos].visited = 1;
} else {
if (limit > 50) {
int temp3 = pos;
int flag_1 = 0, flag2 = 0,
flag3 = 0, flag4 = 0;

System.out.println("\
nActualmente en posición " + temp3 + ".\nPensando....");

while (celda[pos].visited ==
1 && celda[pos].borde_der != 1) {
++pos;

if (celda[pos].pozo == 1 ||
celda[pos].wump == 1 || (celda[pos].borde_der == 1
&&
celda[pos].visited == 1 && celda[pos].seguro != 1)) {

pos = temp3;

flag_1 = 1;
}

if (flag_1 == 0) {
celda[pos].back +=
"l";
}

while (pos + 4 >= 1 &&


celda[pos].borde_arrib != 1 && celda[pos].visited == 1) {
pos -= 4;

if (celda[pos].pozo == 1 ||
celda[pos].wump == 1 || (celda[pos].borde_arrib == 1
&&
celda[pos].visited == 1 && celda[pos].seguro != 1)) {

pos = temp3;

flag3 = 1;
}

if (flag3 == 0) {
celda[pos].back +=

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

"d";
}

while (celda[pos].visited ==
1 && celda[pos].borde_izq != 1) {
--pos;

if (celda[pos].pozo == 1 ||
celda[pos].wump == 1 || (celda[pos].borde_izq == 1
&&
celda[pos].visited == 1 && celda[pos].seguro != 1)) {

pos = temp3;

flag2 = 1;
}

if (flag2 == 0) {
celda[pos].back +=
"r";
}

while (pos + 4 <= 16 &&


celda[pos].borde_abaj != 1 && celda[pos].visited == 1) {
pos += 4;

if (celda[pos].pozo == 1 ||
celda[pos].wump == 1 || (celda[pos].borde_abaj == 1
&&
celda[pos].visited == 1 && celda[pos].seguro != 1)) {

pos = temp3;

flag4 = 1;
}

if (flag4 == 0) {
celda[pos].back +=
"u";
}

celda[pos].seguro = 1;
celda[pos].visited = 1;
System.out.println("\r\n" +
"Alcanza la posición= " + pos);
limit = 0;
}
}
}

}
}

// asesinando al wumpus

if (celda[pos].caracterPos.contains("W") && scream != 1) {

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

scream = 1;
celda[pos].seguro = 1;
System.out.println("\n\nWumpus asesinado >--0-->");
celda[pos].caracterPos.replace("W", " ");
for (int l = 1; l <= 16; ++l) {
celda[l].duda_wump = 0;
celda[l].caracterPos.replace("S", " ");
}
}
// caerse en el pozo

if (celda[pos].caracterPos.contains("P")) {

celda[pos].pozo = 1;
System.out.println("\n\ncaído en el pozo de posición "
+ pos + ".");
}

//
for (int k = 1; k <= 16; ++k) {
if (celda[k].duda_pozo == 1 && celda[k].duda_wump ==
1) {
celda[k].duda_pozo = 0;
celda[k].duda_wump = 0;
celda[k].seguro = 1;
}
}
//asegurando que hay un wumpus en esa casilla
for (int y = 1; y <= 16; ++y) {
if (celda[y].duda_wump > 1) {
celda[y].wump = 1;
for (int h = 1; h <= 16; ++h) {
if (h != y) {
celda[h].duda_wump = 0;
celda[h].caracterPos.replace("S", "
");
}
}

}
//asegurando que hay un pozo en esa celda

for (int y = 1; y <= 16; ++y) {


if (celda[y].duda_pozo > 1) {
celda[y].pozo = 1;

}
}

try {
Thread.sleep(200);
} catch (Exception p) {
}

} while (complete == 0); // while del do

if (complete == 1) {

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

System.out.println("Ahora regresará siguiendo el camino mejor


explorado.");

}
}

 Clase Ambiente
Esta clase permite crear el escenario o ambiente en el que tendrá que desenvolverse el
agente. De igual forma presenta la disposición tanto del pozo y wumpus como de las brisas
y olores que respectivamente emiten.

package wumpus;

import java.util.Scanner;

public class Ambiente {

Scanner scr = new Scanner(System.in);


// char w[][]=new char[5][5];
int num_pozos; // número de pozos
int Wumpus_position; // posicion del wumpus
int oro_position; // posición del oro
int pozos_position[]; // arreglo que contiene las posiciones de los pozos
int brisa_posicion[] = new int[4];
int olor_posicion[] = new int[4];

void accept(String w[][]) {


for (int i = 0; i < 3; ++i) {
brisa_posicion[i] = -1;
olor_posicion[i] = -1;
}

for (int i = 0; i < 5; ++i) {


for (int j = 0; j < 5; ++j) {
w[i][j] = "";
}
}

int count = 1; // contador para colocar los numeros en el tablero


System.out.println("\n\n********* Problema del mundo de wumpus
*********\n\n");

System.out.println("Las posiciones son las siguientes.");

// Generando el tablero

for (int i = 1; i <= 4; ++i) {


System.out.println("\
n-----------------------------------------------------------------");
System.out.print("|\t");
for (int j = 1; j <= 4; ++j) {
System.out.print((count++) + "\t|\t");
}
}
System.out.println("\
n-----------------------------------------------------------------");
System.out.println("\nEl agente empieza en la posición: 13");

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

w[4][1] = "A"; // posicion inicial del agente


System.out.println("\nIngresa el número de pozos.");
num_pozos = scr.nextInt();
pozos_position = new int[num_pozos]; // asignando el tamaño del
arreglo de pozos
System.out.println("Las posiciones del pozo, el oro y el wumpus no
deben solaparse.");
System.out.println("Ingresa la posición de los pozos:");
// colocando la posicion de cada pozo
for (int i = 0; i < num_pozos; ++i) {
pozos_position[i] = scr.nextInt();
show_sense(pozos_position[i], 1, w); // pasamos la posicion y
la matriz
}
System.out.println("Ingresa la posición del wumpus:");
Wumpus_position = scr.nextInt();
show_sense(Wumpus_position, 2, w);

System.out.println("Ingresa la posición del oro:");


oro_position = scr.nextInt();

insert(w);
} // termina accept

void show_sense(int a, int b, String w[][]) {// recibe como parametros la


posicion del wumpus o del pozo, numero que

// identifica si es un pozo o wumpus, matriz


int t1, t2, t3, t4; // posiciones que tomaran los olores y brisas
t1 = a - 1; // izquierda
t2 = a + 1; // derecha
t3 = a + 4; // abajo
t4 = a - 4; // arriba
// condicionales para no salirse de bordes y colocar mal brisas y
olores
if (a == 5 || a == 9 || a == 13) {
t1 = 0;
}
if (a == 4 || a == 8 || a == 12) {
t2 = 0;
}
if (t3 > 16) {
t3 = 0;
}
if (t4 < 0) {
t4 = 0;
}

// indicar las posiciones de las brisas y el wumpus


if (b == 1) {
brisa_posicion[0] = t1;
brisa_posicion[1] = t2;
brisa_posicion[2] = t3;
brisa_posicion[3] = t4;
} else {
if (b == 2) {
olor_posicion[0] = t1;
olor_posicion[1] = t2;
olor_posicion[2] = t3;
olor_posicion[3] = t4;
}

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

int temp1, count; // contener la posicion de brisa o de olor


// empieza a colocar las posiciones de brisa o de olor
for (int i = 0; i < 4; ++i) {
if (b == 1) {
temp1 = brisa_posicion[i];
} else {
temp1 = olor_posicion[i];
}
// Empieza a colocar las letra B y S

count = 0;
for (int j = 1; j <= 4; ++j) {
for (int k = 1; k <= 4; ++k) {
++count;
if (count == temp1 && b == 1 && !w[j]
[k].contains("B")) {// verificamos sino existe otra b en el

// caso de que exista mas


pozos
w[j][k] += "B";
} else {
if (count == temp1 && b == 2 && !w[j]
[k].contains("S")) {
w[j][k] += "S";
}
}
}
}
}

// display(w);
}

// insertar donde se encuentra el pozo, wumpus y oro


void insert(String w[][]) {
int temp = 0;
int count = 0;
int flag1 = 0, flag2 = 0; // identifican si ya existe oro o wumpus
for (int i = 0; i < num_pozos; ++i) {
temp = pozos_position[i];
count = 0;
for (int j = 1; j <= 4; ++j) {
for (int k = 1; k <= 4; ++k) {
++count;
if (count == temp) {
w[j][k] += "Pozo";
} else {
if (count == oro_position && flag1 == 0)
{
w[j][k] += "Gold";
flag1 = 1;
} else {
if (count == Wumpus_position &&
flag2 == 0) {
w[j][k] += "Wumpus";
flag2 = 1;
}
}
}

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

}
}
}

display(w);
}

// imprime el ambiente del problema

void display(String w[][]) {


System.out.println("\nEl ambiente para el problema es el
siguiente:\n");
for (int i = 1; i <= 4; ++i) {
System.out.println("\
n-----------------------------------------------------------------");
System.out.print("|\t");
for (int j = 1; j <= 4; ++j) {
System.out.print(w[i][j] + "\t|\t");
}
}
System.out.println("\
n-----------------------------------------------------------------");
}

 Clase Celda

Esta clase contiene la información de las celdas por las cuales se irá desplazando el agente.
La información de cada una de estas se actualiza conforme el agente las vaya visitando.

package wumpus;

public class Celda {


int wump = 0;
int pozo = 0;
int oro = 0;
int seguro = 0;
int duda_pozo = 0;
int duda_wump = 0;
String caracterPos;
int num = 0;
int borde_der = 0;
int borde_izq = 0;
int borde_arrib = 0;
int borde_abaj = 0;
int visited = 0;
int izq, der, arrib, abaj;
String back = "";

Celda(String s, int n) {
caracterPos = s; // caracter en la posicion
num = n; // posicion
izq = der = arrib = abaj = 0;
if (n == 9 || n == 5) {
borde_izq = 1;
}

if (n == 8 || n == 12) {

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

borde_der = 1;
}

if (n == 1) {
borde_arrib = 1;
borde_izq = 1;
}
if (n == 13) {
borde_abaj = 1;
borde_izq = 1;
}
if (n == 4) {
borde_arrib = 1;
borde_der = 1;
}
if (n == 16) {
borde_abaj = 1;
borde_der = 1;
}

int sense() { // me permite determinar si es una brisa, olor u oro,


wumpus
if (caracterPos.contains("B")) {
return 1;
} else {
if (caracterPos.contains("S")) {
return 2;
} else {
if (caracterPos.contains("G")) {
return 3;
}
}
}
if (caracterPos.contains("W")) {
return 4;
} else {
return 0;
}
}

EJECUCIÓN 1
Se realiza el ejercicio con la siguiente información:

- 1 pozo ubicado en la posición 11


- El wumpus ubicado en la posición 5
- El oro ubicado en la posición 3
- El agente empieza en la posición 13

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

Al ingresar todos los datos se presenta la disposición de los elementos ingresados


anteriormente

Ahora el agente empieza a desenvolverse en el entorno en busca del oro. Para ello, debe
atravesar todos los obstáculos que se le vayan presentando (brisas, olores, pozo, wumpus).

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

EJECUCIÓN 2

Se realiza el ejercicio con la siguiente información:

- 1 pozo ubicado en la posición 6


- El wumpus ubicado en la posición 11
- El oro ubicado en la posicion 4
- El agente empieza en la posición 13

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

Al ingresar todos los datos se presenta la disposición de los elementos ingresados


anteriormente

Ahora el agente empieza a desenvolverse en el entorno en busca del oro. Para ello, debe
atravesar todos los obstáculos que se le vayan presentando (brisas, olores, pozo, wumpus).

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)


lOMoARcPSD|6766982

REFERENCIAS

[1] guestcd9e5e, "Agentes Inteligentes", Es.slideshare.net, 2019. [Online]. Available:


https://es.slideshare.net/guestcd9e5e/agentes-inteligentes. [Accessed: 13- Jun- 2019].

[2] Ccc.inaoep.mx, 2019. [Online]. Available:


https://ccc.inaoep.mx/~jagonzalez/AI/Sesion2_Agentes.pdf. [Accessed: 13- Jun- 2019].

[3] "hilios/wumpus", GitHub, 2019. [Online]. Available: https://github.com/hilios/wumpus/tree/


master/src/main/java/wumpus. [Accessed: 14- Jun- 2019].

Descargado por remigioleonel chagmana (remigioleonel.chagmana1994@gmail.com)

También podría gustarte