Arboles e inteligencia artificial II
En la parte 1 de este artículo aprendimos sobre los árboles y como crearlos. En esta parte vamos a darle uso en un problema de inteligencia artificial.
El árbol de los animales
Vamos a crear una I.A. que tratará de adivinar en que animal estamos pensando. El programa irá aprendiendo a medida que jugamos y jugamos conocerá más animales. Lo que vamos a hacer es crear un árbol que vaya creciendo poco a poco.
Veamos una ejecución del programa para que veáis como funciona.
Estas pensando en un animal? s Es un pajaro? n Qué animal era? Raton Qué diferencia a un pajaro de un Raton? vuela Si el animal fuera un pajaro cual seria la respuesta? s Estas pensando en un animal? s vuela? s Es un pajaro? n Qué animal era? Aguila Qué diferencia a un pajaro de un Aguila? caza Si el animal fuera un pajaro cual seria la respuesta? n Estas pensando en un animal? s vuela? n Es un Raton? n Qué animal era? Perro Qué diferencia a un Raton de un Perro? Ladra Si el animal fuera un Raton cual seria la respuesta? n Estas pensando en un animal? s vuela? n Ladra? n Es un Raton? n Qué animal era? Rinoceronte Qué diferencia a un Raton de un Rinoceronte? tiene colmillos Si el animal fuera un Raton cual seria la respuesta? n Estas pensando en un animal? s vuela? s caza? n Es un pajaro? n Qué animal era? Buitre Qué diferencia a un pajaro de un Buitre? come carroña Si el animal fuera un pajaro cual seria la respuesta? n Estas pensando en un animal? s vuela? n Ladra? n tiene colmillos? s Es un Rinoceronte? n Qué animal era? Elefante Qué diferencia a un Rinoceronte de un Elefante? tienen trompa Si el animal fuera un Rinoceronte cual seria la respuesta? n Estas pensando en un animal? s vuela? n Ladra? n tiene colmillos? s tienen trompa? n Es un Rinoceronte? n Qué animal era? Jabali Qué diferencia a un Rinoceronte de un Jabali? vive en el agua Si el animal fuera un Rinoceronte cual seria la respuesta? s Estas pensando en un animal? s vuela? n Ladra? n tiene colmillos? n Es un Raton? n Qué animal era? Jirafa Qué diferencia a un Raton de un Jirafa? tiene el cuello largo Si el animal fuera un Raton cual seria la respuesta? n Estas pensando en un animal? s vuela? s caza? n come carroña? n Es un pajaro? n Qué animal era? Mosca Qué diferencia a un pajaro de un Mosca? es un insecto Si el animal fuera un pajaro cual seria la respuesta? n Estas pensando en un animal? s vuela? n Ladra? n tiene colmillos? s tienen trompa? n vive en el agua? s Es un Rinoceronte? s Soy el más grande!
Como se puede ver inicialmente el programa no «sabe» nada, solo sabe el nodo inicial que es pájaro y pregunta si es un pájaro. Si se le dice que no te preguntará que animal estabas pensando y te pedira que lo diferencies del que te a sugerido él para almacenarlo en su árbol. Así ha medida que se va jugando e introduciendo animales el programa va conociendo más ya que su árbol se va ramificando.
Veamos otra ejecución del programa más corta para anilizarla.
Está pensando en un animal? s Es un pájaro? n Cómo se llama el animal? perro Qué pregunta distinguiría a un perro de un pájaro? Puede volar Si el animal fuera un perro, cuál sería la respuesta? n Estás pensando en un animal? s Puede volar? n Es un perro? n Cómo se llama el animal? gato Qué pregunta distinguiría a un gato de un perro? Ladra Si el animal fuera un gato, cuál sería la respuesta? n Estás pensando en un animal? s Puede volar? n Ladra? s Es un perro? s Soy el más grande!
Esto generaría el siguiente árbol binario.
Como vemos según la información que le damos va generando nuestro árbol. Al principio de cada ronda empieza en lo más alto del árbol y hace la pregunta que contiene el nodo, cuando llega a un nodo hoja trata de adivinar. Date cuenta que todos los animales son nodos hojas y todas las preguntas son nodos ramas. Si falla pide el a usuario el nombre del nuevo animal y una diferencia con el intento fallido, entonces añade el nuevo animal y la nueva pregunta al árbol.
El código a continuación
#!/usr/bin/env python # -*- coding: utf-8 -*- # Módulos # Clases # --------------------------------------------------------------------- class Arbol: def __init__(self, carga=None, izq=None, der=None): self.carga = carga self.izquierda = izq self.derecha = der def __str__(self): return str(self.carga) # --------------------------------------------------------------------- # Funciones # --------------------------------------------------------------------- def si(preg): from string import lower resp = lower(raw_input(preg)) return (resp[0] == 's') # --------------------------------------------------------------------- def main(): bucle = True raiz = Arbol("pajaro") while bucle: if not si("Estas pensando en un animal? "): break arbol = raiz while arbol.izquierda != None: if si(arbol.carga + "? "): arbol = arbol.izquierda else: arbol = arbol.derecha #adivinar animal = arbol.carga if si("Es un " + animal + "? "): print "Soy el más grande!" continue #obtener informacion nuevo = raw_input("Qué animal era? ") info = raw_input("Qué diferencia a un " + animal + " de un " + nuevo + "? ") indicador = "Si el animal fuera un " + animal + " cual seria la respuesta? " arbol.carga = info if si(indicador): arbol.izquierda = Arbol(animal) arbol.derecha = Arbol(nuevo) else: arbol.derecha = Arbol(animal) arbol.izquierda = Arbol(nuevo) return 0 if __name__ == '__main__': main()
La función si() devuelve verdadero si se ha escrito S o s y falso si se ha escrito otra cosa. Es esta función la que interactúa con el usuario.
La condición del bucle externo es 1, lo que significa que seguirá hasta que se ejecute la sentencia break cuando el usuario ya no piense en ningún animal. El bucle while interno recorre el árbol de arriba a abajo, guiado por las respuestas del usuario. Cuando se añade un nuevo nodo al árbol, la pregunta sustituye a la carga y los dos hijos son el animal nuevo y la carga original.
Una carencia del programa es que, al salir, ¡olvida todo lo que le habías enseñado con tanto cuidado! Esto se soluciona almacenando la estructura del árbol en algún archivo o base de datos.
Este código tan simple si se le implementa una base de datos online que vaya haciendo crecer el árbol en cada juego de los usuarios. Al cabo de un tiempo, después de muchos juegos sería capaz de adivinar cualquier animal.
El código esta hecho en c++?
No, es Python.
en que version de python puedo realizar ente programa
Es python version 2.7.1.3 para que pueda funcionar, saludos
Nadie tiene este código en Java?
public class Arbol {
public Arbol izquierda;
public Arbol derecha;
public T carga;
public Arbol(Arbol izquierda, Arbol derecha, T cargar) {
this.izquierda = izquierda;
this.derecha = derecha;
this.carga = cargar;
}
public Arbol( T cargar) {
this.izquierda = null;
this.derecha = null;
this.carga = cargar;
}
public String toString(){
return carga.toString();
}
}
public class Memoria {
private Arbol raiz ;
private Scanner leer = new Scanner(System.in);
public boolean si(String preg){
System.out.print(preg);
String res = leer.nextLine();
return «si».equals(res.toLowerCase());
}
public void iniciar(String firstAnimal){
boolean bucle = true;
raiz= new Arbol(firstAnimal);
while(bucle){
if(!si(«Estas pensando en un animal?»)){
break;
}
Arbol arbol =raiz;
while (arbol.izquierda != null) {
if( si(arbol.carga+» ? «)){
arbol= arbol.izquierda;
}else{
arbol = arbol.derecha;
}
}
//adivinar
String animal = arbol.carga;
if( si(«Es un «+animal+» ?»)){
System.out.println(«Adivine!!»);
continue; //regresa al inicio del ciclo
}
//obtener informacion
System.out.println(«Qué animal era?»);
String nuevo= leer.nextLine();
System.out.print(«Qué diferencia a un » + animal + » de un » + nuevo + «? «);
String info = leer.nextLine();
String indicador = «Si el animal fuera un » + animal + » cual seria la respuesta? «;
arbol.carga = info;
if( si(indicador)){
arbol.izquierda= new Arbol(animal);
arbol.derecha= new Arbol(nuevo);
}else{
arbol.derecha= new Arbol(animal);
arbol.izquierda= new Arbol(nuevo);
}
}
}
}
//tu main
public static void main(String[] args) {
Memoria m = new Memoria();
m.iniciar(«pajaro»);
}
Gracias, parse.
Saludos desde Colombia :D
Con public T carga en la clase árbol se tiene error me ayudas
no tienes el codigo para c++
Si porfavor yo tambien lo necesito en c++, Ayuda. Ya probe convertirlo pero me da errores
AYUDA!! Alguien tiene el codigo en c++ !!
X2 a los comentarios de arriba (JAVA)