• No results found

Para encontrar soluciones en un árbol y/o necesitamos un algoritmo similar al A*, pero con la capacidad de manejar los arcos Y apropiadamente. Este algoritmo debería encontrar un camino desde del nodo inicial a un conjunto de nodos que representan los estados meta. Nótese que puede ser necesario obtener más de un estado meta, pues cada rama de un arco Y puede conducir a su propio nodo meta.

Para ver por qué el algoritmo A* no es adecuado para la búsqueda en árboles y/o, consideremos la figura 3.14.

Los números representan el valor de f* en cada nodo. El problema radica en que la elección del nodo a expandir no sólo depende del valor de f* en ese nodo, sino también de si ese nodo es parte del mejor camino actual a partir del nodo inicial. El nodo simple más prometedor es C, pero no forma parte del mejor camino actual, pues hay que incluir al nodo D.

A (7) (5) B (3) C (4) D

- nodos primitivos: son los que se corresponden con problemas que se resuelven

directamente.

- nodos muertos: son los que se corresponden con problemas no descomponibles

y que no tienen solución.

- nodos intermedios.

Para cada uno de ellos el estimado heurístico h*(n) se puede definir como: - Si n es un nodo primitivo, entonces h*(n) = 0

- Si n es un nodo muerto, entonces h*(n) = ∞

- Si n es un nodo intermedio con j conectores, entonces h*(n) es el mínimo de los costos calculados para cada uno de los j conectores. Si el conector es Y, entonces su costo es:

(cos ( ,to n n ) h n*( ))

k k

k

+ ,

donde k es el número de nodos del conector. Si por el contrario, el conector es

O, entonces su costo es:

costo(n, nk) + h*(nk).

Para estimar la bondad de un nodo sólo se usa h*. No se usa g* como en el algoritmo A*, pues no es posible calcular tal valor único, ya que puede haber muchos caminos para un mismo nodo y además, tampoco es necesario, porque la travesía hacia abajo del mejor camino conocido garantiza que sólo aquellos nodos que estén en el mejor camino serán considerados para la expansión.

Si quisiéramos implementar este algoritmo usando un grafo y/o es necesario realizar tres cosas en cada paso:

- Atravesar el grafo comenzando por el nodo inicial y siguiendo el mejor camino actual, acumulando el conjunto de nodos que van en ese camino y aún no han sido expandidos.

- Seleccionar uno de estos nodos no expandidos y expandirlo. Añadir sus sucesores al grafo y calcular h* para cada uno de ellos.

- Cambiar la h* estimada del nodo recientemente expandido para reflejar la nueva información proporcionada por sus sucesores. Propagar este cambio hacia atrás a través del grafo. Para cada nodo que se visita mientras se va avanzando en el grafo, decidir cuál de sus arcos sucesores es más prometedor y marcarlo como parte del mejor camino actual, lo cual cambiará el mejor camino actual.

En Rich 1era edición puede verse los pasos de este algoritmo expresados más detalladamente. Bratko contiene una implementación del mismo en PROLOG. La figura 3.15 muestra un ejemplo de una traza de este algoritmo. Los números entre paréntesis indican el valor de h* en los nodos y los que no tienen paréntesis, indican los costos de los arcos. Los nodos encerrados entre dos círculos son nodos primitivos.

Diferencias entre el algoritmo A* y el AO*

En el algoritmo A* el camino deseado de un nodo a otro siempre era el de menor costo. Pero éste no es siempre el caso cuando se está buscando en un árbol y/o. Un ejemplo de esto se muestra en la figura 3.16. El nuevo camino al nodo 5 es más largo que yendo a través del nodo 3. Pero el camino por el nodo 3 no lleva a solución, pues necesita también una solución del nodo 4, la cual no existe. Por tanto el camino a través del nodo 10 es mejor.

Paso 1 Paso 2 a a (2) 1 3 (1) b c (3) Paso 3 Paso 4 a (4) a (6) 1 3 1 3 (3) b c (3) (9) b c (3) 1 1 1 1 d (0) (1) e d (0) e (7) 6 (1) h Paso 5 a (8) 1 3 (9) b c (5) 1 1 2 1 (0) d (7) e f (2) g (0) 6 2 3 (1) h (0) i j (1)

Fig. 3.15. Una traza del algoritmo AO*.

2 3 4 nodo muerto

7 8 5 6 9 10

Fig. 3.16. Ejemplo que muestra las diferencias entre A* y AO*. 3.4.5. Búsqueda por ascenso de cima (hill-climbing).

[Tomado de Data Mining. Pieter Adriaans, Dolf Zantinge. Addison-Wesley longman 1996 y de IA: un enfoque moderno]

Es de ascenso de cima si la función de evaluación de estado expresa calidad y se llama de disminución de gradiente si esta función es de costo.

Una popular metáfora para esta búsqueda es el canguro en la niebla. Suponga un canguro en un lugar desconocido con la tarea de encontrar la cima más alta. Como hay poca visibilidad por la niebla, él identifica el punto más alto que él ve y hacia allí salta. Desde esta nueva posición repite el proceso hasta que no haya un punto más alto. Por supuesto, no garantiza el óptimo; depende de las características del relieve concreto. Si el relieve es suave y existe un óptimo visible se llega a él. Pero si es suave y existen muchos puntos similares puede no llegarse. Lo mismo ocurre si existen muchos picos altos y el relieve es muy abrupto. En estos casos se llega a óptimos locales. Una solución es el paralelismo: colocar varios canguros que exploren el espacio de búsqueda. La posibilidad de que uno alcance el punto más alto aumenta.

El algoritmo hill-climbing es un algoritmo de mejoramiento iterativo. Ellos se caracterizan porque la misma descripción del estado contiene toda la información necesaria para encontrar una solución. Es irrelevante la ruta a través de la cual se obtiene la solución. La idea básica consiste en empezar con una configuración

completa y efectuar modificaciones para mejorar su calidad.

Algoritmo

1- Actual:= Estado inicial del problema

2- Siguiente:= sucesor de actual con mayor valor 3- Si valor(siguiente) < valor(actual) entonces Devuelve actual y TERMINAR

sino

Actual:= siguiente Ir al paso 2.

Este algoritmo termina cuando se llega a un punto donde no se puede obtener un mejor valor. Al implementarse se hace con un ascenso de cima con reinicio

Desventajas:

- Máximos locales: Es una cima cuya altura es inferior a la cima más alta de todo

el espacio de estados. Una vez que ha alcanzado un máximo local, el algoritmo para, aunque esta solución esté muy lejos de ser satisfactoria.

- Planicie: son áreas del espacio de estados en donde la función de evaluación

básicamente es plana. La búsqueda realizará un paseo al azar. En todos los estados la función de evaluación da un valor muy similar y entonces se escogerá cualquiera.

- Riscos: las laderas de algunos riscos tienen pendientes muy pronunciadas, por lo que es fácil para una búsqueda llegar a la cima del risco; sin embargo puede suceder que la pendiente de la cima se aproxime demasiado gradualmente a un pico. A menos que existan operadores que se desplacen directamente por la cima del risco, la búsqueda oscilará de un lado a otro obteniendo muy poco avance.

Por ejemplo: en el problema de las 8 reinas se empieza con 8 reinas situadas en el tablero y se procede, entonces a desplazar las reinas buscando disminuir la cantidad de posibles ataques. Los operadores serían mover las reinas a otra posición de su columna de manera que la cantidad de ataques sea mínima.

Related documents