BĂşsquedas Inteligentes Soluciones de problemas
BI-ALGORITMOS Aplicaciones en Scheme
Juegos sin adversario: algoritmo A*
P
ara juegos simples unipersonales (por ej.
8-puzzle) puede usarse el algoritmo A* (Hart, 1968) que se describe en esta sección. Este algoritmo implementa una búsqueda primero el mejor. Se utiliza una función de evaluación estática f formada por: f=g+h La función g es una función de coste de llegar del estado inicial al estado evaluado. La función h es una estimación del coste de llegar desde el estado evaluado al estado final u objetivo del juego. En cada paso del algoritmo se selecciona el mejor nodo que no se ha expandido hasta el momento, es decir, aquel que tiene menor valor de función f. Este nodo se agrega a una lista de nodos explorados (NodosExplorados) y sus nodos sucesores se agregan a la lista de nodos pendientes de ser explorados (NodoNoExplorados). El algoritmo: Estado_Inicial.g := 0; Estado_Inicial.h := H(Estado_Inicial); Estado_Inicial.f := Estado_Inicial.g + Estado_Inicial.h; NodosNoExplorados := Estado_Inicial; NodosExplorados := Ø; Bool EncuentraEstadoFinal := FALSE; Mientras NOT EncuentraEstadoFinal AND NodosNoExplorados != Ø EstadoActual :=
Métodos de búsqueda De solución de problemas
SeleccionarMejorNodo (NodosNoExplorados); NodosExplorados := NodosExplorados + EstadoActual; Si EsEstadoFinal (EstadoActual) entonces EncuentraEstadoFinal := TRUE;
Sino Sucesores := CalcularSucesores (EstadoActual); Para cada EstadoSucesor de Sucesores EstadoSucesor.padre := EstadoActual; EstadoSucesor.g: EstadoActual.g + Coste (EstadoActual,EstadoSucesor); Si Pertenece(EstadoSucesor, NodosNoExplorados) entonces EstadoViejo:=ExtraerNodo (EstadoSucesor, NodosNoExplorados); EstadoActual.sucesores := EstadoActual.sucesores + EstadoViejo; Si EstadoViejo.g > EstadoSucesor.g entonces EstadoViejo.padre := EstadoActual; EstadoViejo.g := EstadoActual.g; EstadoViejo.f := EstadoViejo.g + EstadoViejo.h; Fin si; Sino si Pertenece(EstadoSucesor, NodosExplorados) entonces EstadoViejo:=ExtraerNodo (EstadoSucesor, NodosNoExplorados); EstadoActual.sucesores := EstadoViejo.g := EstadoActual.g;
ActualizarSucesores(EstadoViejo); EstadoViejo.f := EstadoViejo.g + EstadoViejo.h; EstadoViejo; Si EstadoViejo.g > EstadoSucesor.g entonces EstadoViejo.padre := EstadoActual; Fin si; Sino NodosNoExplorados := NodosNoExplorados + EstadoSucesor; EstadoActual.sucesores :=EstadoActual.su cesores EstadoSucesor; EstadoSucesor.f := EstadoSucesor.g + EstadoSucesor.h; fin sino; Fin para; Fin sino; Fin mientras; Aplicaci贸n en Scheme
Búsqueda en Profundidad
Implementación en Scheme (define A '(s (a (b (c) (e (d) (f (g)))) (d)))) (define A1 '(a (b (d) (e)) (c (f) (g)))) (define encontrado #f) (define (busqueda-profundidad SubArbol meta) (set! encontrado #f) (p SubArbol meta))
Se comienza en el vértice inicial (vértice con índice 1) que se marca como vértice activo. Hasta que todos los vértices hayan sido visitados, en cada paso se avanza al vecino con el menor índice siempre que se pueda, pasando este a ser el vértice activo. Cuando todos los vecinos al vértice activo hayan sido visitados, se retrocede al vértice X desde el que se alcanzó el vértice activo y se prosigue siendo ahora X el vértice activo.
(define (p SubArbol meta) (cond ((or (empty? SubArbol)(equal? encontrado #t)) '()) ((atom? SubArbol) #f) ((raiz? SubArbol) (nodo-meta? (car SubArbol) meta) (cons(car SubArbol)(p (cdr SubArbol) meta))) ((hoja? SubArbol) (nodo-meta? (car SubArbol) meta) SubArbol) (#t (append (p (car SubArbol) meta)(p (cdr SubArbol) meta)))))
ALGORITMO BEP:
(define (hoja? SubArbol) (cond ((empty? SubArbol) #f) ((atom? SubArbol) #f) ((and (atom? (car SubArbol))(empty? (cdr SubArbol))) #t) (#t #f)))
Sea G = (V, A) un grafo conexo, V’ = V un conjunto de vértice, A ’un vector de arcos inicialmente vacío y P un vector auxiliar inicialmente vacío: 1. Se introduce el vértice inicial en P y se elimina del conjunto V’. 2. Mientras V’ no sea vacío repetir los puntos 3 y 4. En otro caso parar. 3. Se toma el último elemento de P como vértice activo. 4. Si el vértice activo tiene algún vértice adyacente que se encuentre en V’: Se toma el de menor índice. Se inserta en P como último elemento. Se elimina de V’. Se inserta en A’ el arco que le une con el vértice activo.
(define (nodo-meta? N meta) (if(equal? N meta) (set! encontrado #t) (set! encontrado #f))) (define (raiz? SubArbol) (cond ((empty? SubArbol) #f) ((atom? SubArbol) #f) ((and (atom? (car SubArbol))(> (length SubArbol) 1)) #t) (#t #f)))
(busqueda-profundidad A1 'e)
Búsqueda en amplitud Se comienza en el vértice inicial (vértice con índice 1) y se marca como vértice activo, a diferencia con la BEP ahora se visitan en orden creciente de índice todos los vecinos del vértice activo antes de pasar al siguiente. Hasta que todos los vértices hayan sido visitados, en cada paso se van visitando en orden creciente de índice todos los vecinos del vértice activo. Cuando se han visitado todos los vecinos del vértice activo, se toma como nuevo vértice activo el primer vértice X visitado después del actual vértice activo en el desarrollo del algoritmo. ALGORITMO BEA: Sea G = (V, A) un grafo conexo, V’ = V un conjunto de vértices, A’ un vector de arcos inicialmente vacío y P un vector auxiliar inicialmente vacío: 1.Se introduce el vértice inicial en P y se
elimina del conjunto. 2.Mientras V’ no sea vacío repetir los puntos 3 y 4. En otro caso parar. 3. Se toma el primer elemento de P como vértice activo. Si el vértice activo tiene algún vértice adyacente que se encuentre en V’: Se toma el de menor índice. Se inserta en P como último elemento. Se elimina de V’. Se inserta en A’ el arco que le une con el vértice activo. Si el vértice activo no tiene adyacentes se elimina de P.
Aplicación en Scheme
Edición de búsqueda de solución de problemas