Razón Artificial

La ciencia y el arte de crear videojuegos

Arboles e inteligencia artificial II

Escrito por adrigm el 26 de agosto de 2010 en Inteligencia Artificial, Programación | 6 Comentarios.

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.

6 Comentarios en "Arboles e inteligencia artificial II"

  1. virgilio dice:

    El código esta hecho en c++?

  2. virgilio dice:

    en que version de python puedo realizar ente programa

  3. Duxz dice:

    Nadie tiene este código en Java?

    • christian galicia dice:

      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”);
      }

Deja un comentario