Beruflich Dokumente
Kultur Dokumente
2. Solución de problemas.
Espacio de estados.
Un espacio de estados es un grafo cuyos nodos corresponden a estados del problema. De
éste modo, utilizando ésta representación, la solución a los problemas se convierte en la
búsqueda de caminos ó rutas óptimas dentro del grafo.
C A
A B
B C
las restricciones al problema son las siguientes: solamente podemos mover un bloque
cada vez; un bloque puede levantarse únicamente cuando no tiene nada encima; el bloque
levantado puede colocarse sobre el piso ó sobre otro bloque.
Fundamentos de Inteligencia Artificial 2
C B
A A
B C
A A
BC BC
C B
B B C C
A AC ABC AB A
B C
AC AB
A A
B C
C B
en ésta figura, los nodos corresponden a estados posibles del problema y los arcos
corrresponden a transiciones válidas entre estados posibles; el problema de encontrar un
plan de solución es equivalente a encontrar un camino entre un nodo inicial (estado
inicial) y un nodo meta (estado final).
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 3
El rompecabezas de 8.
El problema consiste de una tabla de 3x3 celdas conteniendo ocho números del 1 al 8 y
una celda vacía. Como son ocho números, una celda siempre permanecerá vacía; un
número puede ‘moverse’ a una celda adyacente si ésta está vacía, dejando vacía la celda
donde se encontraba; el problema consiste en ordenar los números del 1 al 8 en forma
circular dejando la celda central vacía tal y como se muestra en la figura 2.3.
1 3 1 2 3
8 2 4 8 4
7 6 5 7 6 5
1 3
8 2 4
7 6 5
1 3 1 3 4
8 2 4 8 2
7 6 5 7 6 5
1 3 1 2 3 1 3 4 1 3 4
8 2 4 8 4 8 2 5 8 2
7 6 5 7 6 5 7 6 7 6 5
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 4
a b c d E f g h A b c d e f g h
8 TN CN AN RN DN AN CN TN 8 TN CN AN RN DN AN CN TN
7 PN PN PN PN PN PN PN PN 7 PN PN PN PN PN PN PN PN
6 6
5 5
4 4 PB
3 3
2 PB PB PB PB PB PB PB PB 2 PB PB PB PB PB PB PB
1 TB CB AB RB DB AB CB TB 1 TB CB AB RB DB AB CB TB
Estado X Estado Y
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 5
algoritmo sisprod.
1. [Establecer la base de datos inicial.]
DATOS <--- base de datos inicial;
2. [Aplicar reglas hasta que se satisfaga alguna condición de terminación
del problema (éxito ó fracaso)]
while DATOS no satisfaga la condición de terminación del problema
{
seleccionar alguna regla R del conjunto de reglas, tal que
pueda ser aplicada a DATOS;
DATOS <--- resultado de aplicar R a DATOS;
}
3. [Fin]
presentar los resultados.
end.
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 6
2.3. Heurísticas
Un vendedor tiene una lista de ciudades cada una de las cuales debe visitar solamente una
vez; existen carreteras directas entre cada par de ciudades de la lista. Se debe encontrar la
ruta que el vendedor debería seguir para que, siguiendo el camino más corto posible,
visitara todas las ciudades, comenzando por cualquiera de ellas y volviendo a la misma.
Un ejemplo de éste tipo de problemas para seis ciudades se plantea en la figura 2.6.
1 2 3 4 5 6
1 2
1 13 12 18 7 14
2 13 21 26 15 25
3 12 21 11 6 4
6 3
4 18 26 11 12 14
5 7 15 6 12 9
5 4 6 14 25 4 14 9
En principio se puede resolver éste problema explorando el árbol de todos los caminos
posibles y eligiendo aquél que tenga la longitud mínima; pero, si existen n ciudades, el
número de caminos diferentes entre ellas es (n-1)!, esto significa que el tiempo requerido
para resolver el problema es proporcional a n!. Por lo tanto, si tenemos once ciudades,
(11-1)! = 10*9*8*7*6*5*4*3*2*1 = 3,628,000 rutas son posibles, es decir, se trata de un
problema típico de explosión combinatoria en el que es útil aplicar técnicas heurísticas.
Una técnica heurística de propósito general que es útil para resolver problemas
combinatorios es el 'algoritmo del vecino más próximo', que trabaja seleccionando la
alternativa más cercana que aún no ha sido visitada y así sucesivamente hasta recorrer
todos los nodos y retornar al punto de partida :
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 7
2. Para seleccionar la siguiente ciudad, analizar todas las ciudades que aún no se han
visitado y seleccionar aquélla que sea la más cercana a la ciudad actual; ir a ella en el
siguiente paso.
3. Repetir el paso dos hasta que se hayan visitado todas las ciudades.
Ejercicio. Implemente el algoritmo del vecino más próximo en lenguaje Lisp ó prolog y
resuelva el problema planteado en la figura 2.6.
Ejercicio. Utilice el algoritmo anterior para resolver el siguiente problema: imagine que
usted es un agente de viajes y que un cliente le pide que le reserve su pasaje en algún
vuelo de Nueva York a Los Angeles, pero con la aerolínea XYZ ya que el cliente tiene un
pase de cortesía; usted observa la lista de vuelos de XYZ y encuentra que no existe un
vuelo directo y que tendrá que hacer la reservación utilizando transbordos.
Houston
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 8
En éste capítulo se presentan los métodos más importantes de propósito general para la
búsqueda de soluciones a los problemas presentados en el capítulo anterior; para la
búsqueda de éstas soluciones se han desarrollado técnicas como las siguientes :
-Búsqueda ciega.
-Primero en profundidad.
-Primero a lo ancho.
-Solución por costo mínimo.
-Reducción de Problemas, grafos AND/OR,
árboles de juegos.
-Heurística, funciones de evaluación, búsquedas heurísticas en
grafos AND/OR.
-Técnicas de poda : alfa, beta, alfa-beta, hacia adelante y otras.
Primero en profundidad.
Explora cada camino posible hasta su conclusión antes de intentar otro camino.
Ejemplo :
B C
D E F G
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 9
Primero a lo ancho.
Explora cada nodo sobre el mismo nivel antes de intentar analizar un nivel más profundo.
Ejemplo :
B C
D E F G
Ascenso de la colina.
Escoge como próximo paso el nodo que aparezca en el lugar más cercano a la meta; éste
método se basa en la analogía de un excursionista perdido en la oscuridad en la mitad de
una montaña donde él sabe que cualquier paso hacia arriba lo sitúa en la dirección
correcta.
Un algoritmo posible para éste método es el siguiente :
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 10
2 3 4
6 7 8
9 10 11
5
1 21
13 14 12
15
17 18 16
19 20
3 4
2
8
5 6 7
10 11 21
14 9
1 15 16
13 12
17 18
19 20
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 11
1, 9, 6, 2, 3, 4, 21
Ahora nuestro objetivo es programar el método en Lisp: supongamos que nuestra tarea es
encontrar un camino de un nodo A a un nodo Z en una gráfica G. Después de realizar
algunos pasos de la búsqueda en profundidad nos vamos a encontrar en una situación
general esquematizada en la figura 3.5.
A ... X Y ... Z
P1
llegamos hasta el nodo X usando algún camino parcial P1 y hay que decidir cómo
continuar. Si el nodo X coincide con Z, se terminó la búsqueda y el camino P1 es el
resultado. Si todavía no llegamos a la meta y X no tiene ningún sucesor hay que regresar
a su predecesor y continuar usando el próximo hermano de X disponible. Si X todavía
tiene sucesores disponibles, se toma el primero de ellos (sea éste Y), el camino parcial P1
se prolonga hasta él y el proceso se repite.
Diseñamos una función recursiva path1 con argumentos X, Z, P1, G, SCX, cuya tarea es
realizar los pasos especificados arriba; SCX representa la lista de los sucesores
disponibles del nodo X (son los sucesores que todavía no se encuentran en el camino
parcial P1). La definición de la función path1 se muestra a continuación :
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 12
en ésta función, primero se prueba si los nodos X y Z coinciden, y en éste caso se regresa
P1 como resultado. Luego se averigua si hay todavía sucesores disponibles y se reporta
falla (nil) en caso contrario (el regreso al predecesor de X y el uso de los hermanos de X
está asegurado por la recursión y las alternativas que siguen).
Luego se toma el primer sucesor disponible y se busca algún camino entre él y el nodo Z
llamando otra vez la misma función path1 con argumentos ajustados apropiadamente (la
función SUCD determina los sucesores disponibles y por ésto necesita tener acceso al
camino parcial P1). Si el avance por el primer sucesor no tuvo éxito, éste se quita de la
lista SCX y se repite la búsqueda con la lista reducida.
(defun pathdep (a z g)
(reverse
(path1 a z (list a) g (sucd a g (list a))) ))
ésta función llama a la función path1 dándole el nodo inicial (n1), el nodo meta (n21), el
camino parcial (contiene inicialmente sólo a n1), la gráfica g, y los sucesores disponibles
que se determinan usando la función sucd.
(setq g '( (n1 n9 n12) (n2 n3 n5 n6 n7) (n3 n2 n4 n8) (n4 n3 n8 n21)
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 13
en que para cada nodo se mencionan explícitamente todos sus nodos sucesores.
La función sucd elige al primer sucesor disponible apoyándose en la función auxiliar dif :
(defun dif (p q)
(cond ((null p) nil)
((member (car p) q) (dif (cdr p) q))
(t (cons (car p) (dif (cdr p) q))) ))
Cabe recordar que la función (caar G) es una abreviación de (car (car G)) y se usa como
selector del primer nodo de la gráfica G; asimismo (cdar G) es abreviación de (cdr (car
G)); ésto se ilustra en la figura 3.6 siguiente :
(CAR G) (CDR G)
(CAAR G) (CDAR G)
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 14
;-------------------------------------------------------------------------------------
; busprof1.lsp
;----------------------------------------------------------------------------------
; Representación de la gráfica g.
(setq g '( (n1 n9 n12) (n2 n3 n5 n6 n7) (n3 n2 n4 n8) (n4 n3 n8 n21)
(n5 n2 n6) (n6 n2 n5 n9) (n7 n2 n9) (n8 n3 n4 n10)
(n9 n1 n6 n7 n12) (n10 n8 n11 n15) (n11 n10)
(n12 n1 n9 n14 n17) (n13 n14 n17 n19) (n14 n12 n13)
(n15 n10 n16 n18) (n16 n15 n20) (n17 n12 n13 n19)
(n18 n15) (n19 n13 n17 n20) (n20 n18 n19) (n21 n4) ))
;--------------------------------------------------------
(defun pathdep (a z g)
(reverse
(path1 a z (list a) g (sucd a g (list a))) ))
;--------------------------------------------------------
(defun path1 (x z p1 g scx)
(prog (p)
(return (cond
((eq x z) p1)
((null scx) nil)
((setq p (path1 (car scx)
z
(cons (car scx) p1)
g
(sucd (car scx) g p1)
) ) p)
(t (path1 x z p1 g (cdr scx))) )
)))
;----------------------------------------------------------------
(defun sucd (n g p1)
(cond ((null g) nil)
((eq (caar g) n) (dif (cdar g) p1))
(t (sucd n (cdr g) p1)) ))
(defun dif (p q)
(cond ((null p) nil)
((member (car p) q) (dif (cdr p) q))
(t (cons (car p) (dif (cdr p) q))) ))
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 15
Ejemplo de ejecución :
$(system) <enter>
A:\> _
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 16
pathdep(A, Z, G, P) :-
path1(A, Z, [A], G, Pr) ,
invertir(Pr, P).
en el cuerpo de ésta cláusula se usa primero la relación path1 dándole los nodos límites
(A y Z) y el camino parcial que corresponde al inicio del algoritmo (la lista con un sólo
elemento: A); luego se invierte el resultado de path1 recibiendo así el camino final
buscado P.
La relación sucd se supone que determina al primer sucesor disponible (ó bien falla); para
su implantación usaremos la misma representación de la gráfica G como lo hicimos en
Lisp siendo la única diferencia la forma en que Prolog expresa y accesa las listas. La
definición de sucd la componen las cláusulas :
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 17
[[ X | ScX ] | _ ]
Por último es importante destacar el caracter diferente de los dos usos de member en la
primera regla: en el primer caso tiene definido solamente su segundo argumento (la lista)
y entonces con cada paso de retroceso asocia con el primer argumento el próximo
elemento de la lista. En el segundo caso se trata del uso convencional de member.
El algoritmo completo de búsqueda en profundidad es :
%---------------------------------------------
% busprof1.ari
%--------------------------------------------
pathdep(A, Z, G, P) :-
path1(A, Z, [A], G, Pr),
invertir(Pr, P).
path1(Z, Z, P, _, P).
path1(X, Z, P1, G, P) :-
sucd(X, G, P1, Y),
path1(Y, Z, [Y | P1], G, P).
sucd(X, [[X | Scx] | _ ], P1, Y) :-
!, miembro(Y, Scx),
not miembro(Y, P1).
sucd(X, [_ | GRest], P1, Y) :- sucd(X, GRest, P1, Y).
invertir([],[]).
invertir([Cabeza | Cola], Linvertida) :-
invertir(Cola, Colainvertida),
concatenar(Colainvertida, [Cabeza], Linvertida).
concatenar([],L,L).
concatenar([X | L1], L2, [X | L3]) :- concatenar(L1, L2, L3).
FACULTAD DE MATEMATICAS
Fundamentos de Inteligencia Artificial 18
miembro(X, [ X | _ ]).
miembro(X, [ _ | Cola ]) :- miembro(X, Cola).
resolver(Ni, Nf, P) :- pathdep( Ni, Nf,
[[n1, n9, n12],[n2,n3,n5,n6,n7], [n3,n2,n4,n8], [n4,n3,n8,n21],
[n5,n2,n6], [n6,n2,n5,n9],[n7,n2,n9], [n8,n3,n4,n10],
[n9,n1,n6,n7,n12], [n10,n8,n11,n15], [n11,n10],
[n12,n1,n9,n14,n17], [n13,n14,n17,n19], [n14,n12,n13],
[n15,n10,n16,n18], [n16,n15,n20], [n17,n12,n13,n19],
[n18,n15], [n19,n13,n17,n20], [n20,n16,n19],[n21,n4]], P).
Ejemplo de ejecución :
X = [n1,n9,n6,n2,n3,n4,n21] -> ;
X = [n1,n9,n6,n2,n3,n8,n4,n21] -> ;
X = [n1,n9,n6,n5,n2,n3,n4,n21] -> ;
X = [n1,n9,n6,n5,n2,n3,n8,n4,n21] -> ;
X = [n1,n9,n7,n2,n3,n4,n21] -> ;
X = [n1,n9,n7,n2,n3,n8,n4,n21] -> ;
X = [n1,n9,n12,n14,n13,n17,n19,n20,n16,n15,
n10,n8,n4,n21] -> <enter>
yes
?- halt. <enter>
A:\> _
FACULTAD DE MATEMATICAS