Inicio > Inteligencia Artificial > Arboles e inteligencia artificial II

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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>