5 Teoría de Grafos
5.3 Algoritmos de Recorridos y Búsqueda
ALGORITMOS DE RECORRIDOS Y BÚSQUEDA.
A* es un algoritmo informático que se utiliza en la búsqueda de caminos y el recorrido del grafo, proceso de trazar un camino transitable de manera eficiente entre los dos puntos, llamados nodos.
5.3.1 ALGORITMOS DE RECORRIDO Y BÚSQUEDA EL CAMINO MAS CORTO
El problema del camino más corto es encontrar un camino entre dos vértices de tal manera que la suma de los pesos de las aristas sea mínima, para esto se utilizara el algoritmo de DIJKSTRA que es el siguiente:
1. Inicializar todas las distancias en D con un valor infinito relativo ya que son desconocidas al principio, exceptuando la de x que se debe colocar en 0 debido a que la distancia de x a x sería 0.
2. Sea a = x (tomamos a como nodo actual).
3. Recorremos todos los nodos adyacentes de a, excepto los nodos marcados, llamaremos a estos vi
4. Si la distancia desde x hasta va guardada en D es mayor que la distancia desde x hasta a, sumada a la distancia desde a hasta vi; esta se sustituye con la segunda nombrada.
5. Marcamos como completo el nodo a.
6. Tomamos como próximo nodo actual el de menor valor en D (puede hacerse almacenando los valores en una cola de prioridad) y volvemos al paso 3 mientras existan nodos no marcados.
5.3.2 ALGORITMOS DE RECORRIDO Y BÚSQUEDA A LO ANCHO
La búsqueda en anchura es otro procedimiento para visitar sistemáticamente todos los
vértices de un grafo. Es adecuado especialmente para resolver problemas de
optimización, en los que se deba elegir la mejor solución entre varias posibles. Al igual
que en la búsqueda en profundidad se comienza en un vértice v (la raíz) que es el primer
vértice activo. En el siguiente paso se etiquetan como visitados todos los vecinos del
vértice activo que no han sido etiquetados. Se continúa etiquetando todos los vecinos de
los hijos de v (que no hayan sido visitados aún). En este proceso nunca se visita un
vértice dos veces por lo que se construye un grafo sin ciclos, que será un árbol
generador de la componente conexa que contiene a v.
Sea G(V, E) un grafo conexo y v un vértice de V. El algoritmo de búsqueda en anchura
puede detallarse así:
1. Designamos a v como vértice activo y como raíz del árbol generador T que se
construirá. Se le asigna a v la etiqueta 0.
2. Sea i=0 y S={v}.
3. Hallar el conjunto M de todos los vértices no etiquetados que son adyacentes a algún
vértice de S.
4. Si M es vacío el algoritmo termina. En caso contrario, se etiquetan todos los vértices
de M con i+1, se añaden a T las aristas entre cada vértice de S y su vecino en M y se
hace S=M.
5. i=i+1 y volver al paso 3.
Al terminar el proceso se habrá construido un árbol generador del grafo inicial. En caso
de G no ser conexo, habría que modificar el algoritmo para encontrar un árbol
generador de cada componente conexa de G. La complejidad de este algoritmo es
O(max{n, m}).
Como podemos observar tanto el algoritmo de búsqueda en profundidad como el
algoritmo de búsqueda en anchura pueden ser utilizados para verificar si un grafo
simple es o no conexo. El problema de decisión consistente en determinar si un grafo
simple es o no conexo, es entonces un problema de la clase P, pues hemos encontrado
dos algoritmos de tiempo polinomial que resuelven este problema.
5.3.3 ALGORITMOS DE RECORRIDO Y BÚSQUEDA EN PROFUNDIDAD
En esta búsqueda se va marcando cada vértice visitado. La búsqueda siempre avanza hacia un vértice no marcado sin repetir ningún vértice.
Muchos algoritmos de grafos necesitan visitar de un modo sistemático todos los vértices
de un grafo. En la búsqueda en profundidad se avanza de vértice en vértice, marcando
cada vértice visitado. La búsqueda siempre avanza hacia un vértice no marcado,
internándose “profundamente” en el grafo sin repetir ningún vértice. Cuando se alcanza
un vértice cuyos vecinos han sido marcados, se retrocede al anterior vértice visitado y
se avanza desde éste.
Si dado un grafo simple G, escogemos un vértice v para iniciar la exploración del grafo
utilizando la búsqueda en profundidad, el árbol que se construye es un árbol generador
de la componente conexa del grafo que contiene a v.
Sea G(V, E) un grafo conexo y v un vértice de V. El algoritmo de búsqueda en
profundidad puede detallarse así:
1. Se comienza en un vértice v (vértice activo) y se toma como la raíz del árbol
generador T que se construirá. Se marca el vértice v.
2. Se elige un vértice u, no marcado, entre los vecinos del vértice activo. Si no existe
tal vértice, ir a 4.
3. Se añade la arista (v, u) al árbol T. Se marca el vértice u y se toma como activo. Ir al
paso 2.
4. Si se han alcanzado todos los vértices de G el algoritmo termina. En caso contrario,
se toma el vértice padre del vértice activo como nuevo vértice activo y se vuelve al
paso 2.
La complejidad de este algoritmo es O(max{n, m})
Referencias
Cruz, E. G. (4 de julio de 2016). Udea. Obtenido
de
http://docencia.udea.edu.co/regionalizacion/teoriaderedes/informaci%F3n/C3_Profundidad.pdf
Leyva, M. A. (23 de
febrero de 2015). sites.google.com. Obtenido de
https://sites.google.com/site/matemaicasdiscretas/6-3-algoritmos-de-recorridos-y- búsqueda
Comentarios
Publicar un comentario