You are on page 1of 25

INTELIGENCIA ARTIFICIAL

PROYECTO FINAL

Implementar en Python la mquina invencible 1


Liga del cdigo: http://www.albertogarcia.info/la-maquinainvencible/

Implementar en Python la mquina invencible 2


Liga del cdigo: http://www.albertogarcia.info/la-maquinainvencible-2/

IA Y RESOLUCIN DE PROBLEMAS
EJEMPLO DE UN PROBLEMA SENCILLO: Juan tiene 5 caramelos. De camino a casa pierde 1 caramelo que cae del bolsillo. Cuando sube las escaleras de su portal pierde de nuevo otro caramelo. Finalmente al llegar encuentra 3 caramelos. Cuntos caramelos tiene?

Otros problemas ms complejos


1. Dada una ciudad de origen y destino, encontrar una combinacin de vuelos que nos permita cubrir la distancia en un mnimo de trasbordos (viaje en avin). 2. Otro problema similar se trata de ir de una ciudad a otra por carretera, pero tratando de realizar el menor nmero de kilmetros posible.

Qu objetivo tenemos al resolver el problema 1?

Qu objetivo en el problema 2?

PROBLEMA 1

PROBLEMA 2

EL PROBLEMA DEL VIAJANTE DE COMERCIO (TSP)

A B E D C A (FUNCIN DE EVALUACIN 169) A E D C B A (FUNCIN DE EVALUACIN 108) A C D E B A (FUNCIN DE EVALUACIN 169)

Convertido en tabla

Si tomamos todas las combinaciones posibles tendramos: 5! Opciones = 120 Con 7 ciudades: 7! = 3 628, 800

Con 20. Pfff!!! Excede la capacidad de cmputo

SOLUCIONES POSIBLES SEGN CIUDADES


4000000 3500000 3000000

2500000

2000000

1500000

1000000

500000

0 1 2 3 4 5 6 7 8 9 10

Cuntas son?

Para este tipo de problemas en vez de fuerza bruta utilizaremos tcnicas de IA, que son algoritmos de bsquedas (en amplitud, profundidad, primero anchura, entre otros). Utilizaremos la clase rbol hecha en Python para todos los algoritmos

BSQUEDA
En forma general las tcnicas de bsqueda pretenden encontrar una solucin vlida dentro del espacio de estados. Se pueden aplicar dos tipos de bsqueda: 1. Bsqueda No Informada o A ciegas (no se tiene informacin que ayude a guiar la bsqueda) 2. Bsqueda Informada (se tiene informacin que ayuda a guiar la bsqueda)

EJEMPLO PUZZLE LINEAL


Imaginemos un puzzle lineal, donde esta es la solucin

Un estado inicial puede ser cualquier ordenacin posible de las cuatro piezas. En cuanto al espacio de estados, un estado puede ser cualquier Ordenacin posible de las cuatro piezas.

EJEMPLO PUZZLE LINEAL


Necesitamos definir una operacin que nos permita ir explorando los posibles estados.

Una operacin bsica que nos permite generarlos es intercambiar dos piezas continuas. Para el caso del puzle de 4 piezas tendramos 3 operaciones posibles: 1. Intercambiar dos piezas de la derecha: operacin D 2. Intercambiar dos piezas de la izquierda: operacin I 3. Intercambiar dos piezas centrales: C

REPRESENTACIN DE ESTADOS: RBOLES Y GRAFOS


[2, 1, 4, 3] [1, 2, 4, 3] [1, 2, 4, 3] [1, 2, 4, 3] [1, 4, 2, 3] [1, 4, 2, 3] (Operador I) (Operador C) (Operador C)

RBOL DE ESTADOS
3 1 2 4 1 3 1 2 4 3 2 4 2 3 1 4 3 2 1 4 3 1 4 2

1 2 3 4

1 3 4 2

3 1 2 4

3 2 4 1

13 4 2 3 2 14 3 1 2 4

NODO. Cada uno de los estados HIJOS. Nodos resultantes al aplicar los operadores HERMANOS: Nodos hijos del mismo padre NODO RAZ. Es el nico que no tiene padre HOJA. Nodo que no tiene hijos RAMA. Tiene padre y al menos un hijo

RBOL DE ESTADOS
3 1 2 4 1 3 1 2 4 3 2 4 2 3 1 4 3 2 1 4 3 1 4 2

1 2 3 4

1 3 4 2

3 1 2 4

3 2 4 1

13 4 2 3 2 14 3 1 2 4

Cada vez que se aplica una operacin se dice que: hemos descendido un nivel

Debido a que son tres operaciones

BSQUEDA EN AMPLITUD
Primero se visita al nodo raz Seguidamente a todos sus hijos Para cada hijo se visitan todos sus hijos
1

CLASE NODO EN EL ARCHIVO arbol.py


El constructor acepta como primer parmetro un dato que se est almacenando en el nodo (en principio de cualquier tipo). Opcionalmente un segundo parmetro con una lista de hijos.

CLASE NODO EN EL ARCHIVO arbol.py


Mtodos: set_hijos(hijos) Asigna al nodo la lista de hijos que son pasados como parmetros get_hijos() Regresa una lista con los hijos del nodo get_padre() Regresa el nodo padre set_padre(padre) Asigna el nodo padre de este nodo

CLASE NODO EN EL ARCHIVO arbol.py


Mtodos: set_datos(dato) Asigna un dato al nodo get_datos Devuelve el dato almacenado en el nodo set_peso() Devuelve el peso del nodo dentro del rbol Igual(nodo) Devuelve True si el dato contenido en el nodo es igual al nodo pasado como parmetro

CLASE NODO EN EL ARCHIVO arbol.py


Mtodos: En_lista(lista_nodos) Devuelve True si el dato contenido en el nodo es igual a alguno de los nodos contenidos en la lista de nodos pasada como parmetro

Pseudocdigo de la bsqueda en amplitud


nodo_inicial = estado_inicial nodos_frontera = Cola FIFO nodos_visitados = Lista Almacenar nodo_inicial en nodos_frontera Mientras nodos_frontera no vaco: nodo_actual = extraer un nodo de nodos_frontera si nodo actual == solucin : salir con solucin introducir nodo_actual en nodos_visitados por cada operador : nodo_hijo = operador(nodo_actual) si nodo_hijo no en nodos_visitados ni nodos_frontera: introducir nodo_hijo en nodos_frontera

You might also like