Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Busqueda No Informadas Inteligencia Arti PDF
Busqueda No Informadas Inteligencia Arti PDF
INTELIGENCIA ARTIFICIAL
ALMENDÁRIZ VANESSA
MOLINA SAMANTHA
Contenidos
ÍNDICE ................................................................................................................................................2
Tabla de Figuras .........................................................................................................................2
Introducción ...................................................................................................................................3
Marco Teórico ................................................................................................................................3
Búsqueda no informada .............................................................................................................3
Problema ....................................................................................................................................4
Implementación Conceptual ..........................................................................................................4
Diagrama de estados completos ................................................................................................5
Implementación Computacional ....................................................................................................5
Resultados ......................................................................................................................................8
Conclusiones ..................................................................................................................................9
Anexos ..........................................................................................................................................10
Tabla de Figuras
Figura 1: Generar estados. .................................................................................................................6
Figura 2: Método clone implementado para las funciones regresar y enviar. ...................................6
Figura 3: Comprobación del número de caníbales y de misioneros. ..................................................6
Figura 4: Función sucesor. ..................................................................................................................7
Figura 5: Función Arbol en la Clase Arbol ...........................................................................................7
Figura 6: Árbol que contiene los estados alcanzables por el agente. .................................................8
Figura 7: Resultado de la búsqueda primero en profundidad con profundidad iterativa...................9
Introducción
Uno de los problemas que se analiza en Inteligencia Artificial es el problema de los
caníbales y los misioneros, en el cual se parte de un estadio inicial con tres
caníbales y tres misioneros en una orilla y el estado objetivo es llevar a los seis a
la otra orilla. Para hallar la solución de este problema se ha usado la búsqueda
primero en profundidad con profundidad iterativa, que es una estrategia de la
búsqueda no informada, con la eliminación de estados repetidos.
Marco Teórico
Búsqueda no informada
Estados repetidos
El problema de los tres misioneros y los tres caníbales radica en un estado inicial,
donde los seis se encuentran en un lado de la orilla, y un estado objetivo que
consiste en llevar a los seis al otro lado de la orilla. Para el transporte se tiene una
canoa, en la cual pueden viajar dos personas (puede ser un misionero y un
caníbal, o dos caníbales o dos misioneros) o una (un misionero o un caníbal).
Implementación Conceptual
El objetivo del problema es pasar a todos a la otra orilla. La condición que se pone
es que sólo se puede pasar a dos personas a la vez y que no debe ocurrir nunca
que en una de las orillas haya un número mayor de caníbales que de misioneros,
ya que se los comerían.
Estado inicial:
I D
M:3;C:3 M:0;C:0
Estado objetivo:
I D
M:0;C:0 M:3;C:3
Estados:
Parámetros:
Número de misioneros a la izquierda, número de caníbales a la izquierda,
número de misioneros a la derecha, número de caníbales a la derecha,
posición bote.
Operaciones:
Transportar 2 misioneros.
Transportar 2 caníbales.
Transportar 1 misionero y 1 caníbal.
Diagrama de estados completos
M:3;C:3 M:0;C:0
M:3;C:1 M:0;C:2
M:2;C:2 M:1;C:1
M:2;C:2 M:1;C:1
M:2;C:2 M:1;C:1
M:0;C:2 M:3;C:1
M:0;C:1 M:3;C:2
Implementación Computacional
En estas dos funciones se implementa un clonable para poder clonar los estados.
El método clone copia y regresa un clón del objeto. [2]
Si, no cumple con las condiciones, salta al siguiente elemento de la lista de nodos
hijos, el else if es igual al estado objetivo. Para la ejecución, el else es la parte
recursiva que manda a generar estados de ese nodo, verifica si esta a la izquierda
o a la derecha y en función de eso, envía o regresa. Puede enviar o regresar 2
caníbales, 2 misioneros o 1 caníbal y 1 misionero.
Para generar el árbol de forma gráfica, se creó una clase Arbol y se usó los
métodos para hacer árboles de JAVA.
La eliminación de estados repetidos del árbol permite obtener una solución óptima
mediante la disminución de la utilización de recursos, tales como memoria y
tiempo. Los estados repetidos pueden demorar el hallazgo de la solución cuando
esta no se encuentre en el inicio del árbol. Esto se debe a que tiene que recorrer
todo el árbol inclusive con estados ya visitados, la eliminación de estos disminuye
el tiempo en el cual se realizará la misma, al igual que el uso de la memoria ya
que sólo almacena los estados no repetidos.
Conclusiones
En este tipo de problemas de búsqueda no informada es de importancia para el
agente tener una meta específica, y determinar las posibles estrategias u
acciones.
Si se establece condiciones o información sobre los estados sucesores, es
posible que no afecte de forma importante el número de movimientos para
llegar al estado objetivo. Sin embargo, cuando se analiza cada movimiento
pueden existir nodos que provoquen un bucle infinito y por lo tanto es
necesario reducir o quitar esos estados.
Una manera eficiente para resolver este problema es que no tenga ciclos y
estados repetidos. Estos deben ser eliminados. El nivel al que llega el árbol
para su solución es el nivel 11.
Referencias
Anexos
CLASE ARBOL
package artificial;
import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.*;
public Arbol() {
Estado estadoInicial = new Estado(3, 3, 1);
estadoInicial.generarEstados();
java.util.List<Estado> estadosObtenidos = new ArrayList<>();
estadosObtenidos.add(estadoInicial);
DefaultMutableTreeNode raiz = new
DefaultMutableTreeNode(estadoInicial);
funcionSucesor(estadoInicial, estadosObtenidos, raiz);
Container content = getContentPane();
tree = new JTree(raiz);
ToolTipManager.sharedInstance().registerComponent(tree);
CLASE ESTADO
package artificial;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Numero de misioneros en el lado izquierdo.
*/
private int numeroMisionerosIzquierda;
/**
* Numero de canibales en el lado izquierdo.
*/
private int numeroCanibalesIzquierda;
/**
* Numero de misioneros en el lado izquierdo.
*/
private int numeroMisionerosDerecha;
/**
* Numero de canibales en el lado izquierdo.
*/
private int numeroCanibalesDerecha;
/**
* Posicion 0: derecha, 1: izquierda.
*/
private int posicion;
/**
* Lista de estados hijos.
*/
private List<Estado> estados;
public Estado() {
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
s.append("M: ");
s.append(numeroMisionerosIzquierda);
s.append("; C: ");
s.append(numeroCanibalesIzquierda);
s.append(" | M: ");
s.append(numeroMisionerosDerecha);
s.append("; C: ");
s.append(numeroCanibalesDerecha);
s.append(" | Posicion: ");
s.append(posicion);
return s.toString();
}
@Override
protected Estado clone() throws CloneNotSupportedException {
try {
return (Estado) super.clone();
} catch (Exception e) {
throw new CloneNotSupportedException();
}
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Estado other = (Estado) obj;
if (this.numeroMisionerosIzquierda !=
other.numeroMisionerosIzquierda) {
return false;
}
if (this.numeroCanibalesIzquierda !=
other.numeroCanibalesIzquierda) {
return false;
}
if (this.numeroMisionerosDerecha !=
other.numeroMisionerosDerecha) {
return false;
}
if (this.numeroCanibalesDerecha != other.numeroCanibalesDerecha)
{
return false;
}
if (this.posicion != other.posicion) {
return false;
}
return true;
}
/**
* @return the numeroMisionerosIzquierda
*/
public int getNumeroMisionerosIzquierda() {
return numeroMisionerosIzquierda;
}
/**
* @param numeroMisionerosIzquierda the numeroMisionerosIzquierda to
set
*/
public void setNumeroMisionerosIzquierda(int
numeroMisionerosIzquierda) {
this.numeroMisionerosIzquierda = numeroMisionerosIzquierda;
}
/**
* @return the numeroCanibalesIzquierda
*/
public int getNumeroCanibalesIzquierda() {
return numeroCanibalesIzquierda;
}
/**
* @param numeroCanibalesIzquierda the numeroCanibalesIzquierda to
set
*/
public void setNumeroCanibalesIzquierda(int numeroCanibalesIzquierda)
{
this.numeroCanibalesIzquierda = numeroCanibalesIzquierda;
}
/**
* @return the numeroMisionerosDerecha
*/
public int getNumeroMisionerosDerecha() {
return numeroMisionerosDerecha;
}
/**
* @param numeroMisionerosDerecha the numeroMisionerosDerecha to set
*/
public void setNumeroMisionerosDerecha(int numeroMisionerosDerecha) {
this.numeroMisionerosDerecha = numeroMisionerosDerecha;
}
/**
* @return the numeroCanibalesDerecha
*/
public int getNumeroCanibalesDerecha() {
return numeroCanibalesDerecha;
}
/**
* @param numeroCanibalesDerecha the numeroCanibalesDerecha to set
*/
public void setNumeroCanibalesDerecha(int numeroCanibalesDerecha) {
this.numeroCanibalesDerecha = numeroCanibalesDerecha;
}
/**
* @return the posicion
*/
public int getPosicion() {
return posicion;
}
/**
* @param posicion the posicion to set
*/
public void setPosicion(int posicion) {
this.posicion = posicion;
}
/**
* @return the estados
*/
public List<Estado> getEstados() {
return estados;
}
/**
* @param estados the estados to set
*/
public void setEstados(List<Estado> estados) {
this.estados = estados;
}