Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PRÁCTICA DE WUMPUS
CONCEPTOS
Agente y entorno
Agente deliberativo
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)
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
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:
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.
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;
return true;
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;
}
}
if (celda[pos].caracterPos.contains("G")) { // si encuentra
el oro
complete = 1;
System.out.println("Oro encontrado!!");
break;
}
temp1 = "l";
celda[pos].der = 1;
++pos;
System.out.println("\nSigue al frente. Posición=" +
pos);
celda[pos].back += temp1;
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
celda[pos].seguro = 1;
} else {
if (condition == 0) { //// si en
esa posicion no hay nada
celda[pos].seguro = 1;
}
}
}
}
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;
}
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;
}
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";
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;
}
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";
}
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 +=
"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";
}
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
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
}
}
try {
Thread.sleep(200);
} catch (Exception p) {
}
if (complete == 1) {
}
}
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;
// Generando el tablero
insert(w);
} // termina accept
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
// display(w);
}
}
}
}
display(w);
}
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;
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) {
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;
}
EJECUCIÓN 1
Se realiza el ejercicio con la siguiente información:
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).
EJECUCIÓN 2
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).
REFERENCIAS