Vous êtes sur la page 1sur 12

Grafos en el Mundo Real

Existen muchos ejemplos de grafos en el mundo real. Tu puedes estar usando precisamente ahora, uno de estos ejemplos, Internet. Las redes interconectadas que forman Internet son ejemplos comunes de un grafo. Las computadoras forman los nodos del grafo. Como no toda mquina est conectada a cualquier otra mquina, estas ligas entre mquinas tambin son parte del grafo. Cada liga entre un par de computadoras puede ser directa o indirecta, dependiendo de si los mensajes pueden ser enviados solamente en una direccin o en ambas. Un ejemplo similar son las redes de trfico, como las ligas de un ferrocarril entre estaciones, o los vuelos de un avin conectando ciudades. Los nodos aqu son las ciudades y estaciones del ferrocarril, y las ligas son provistas por las vas y los vuelos.

Figura 1 Vuelos conectado ciudades, como un grafo Por ltimo, considera el organigrama de una compaa. En este caso, los nodos son los empleados, y las ligas indican la relacin supervisor-subordinado. Puedes estar tentado a pensar que este tipo de jerarqua es en realidad un rbol, pero tenemos que considerar el hecho de que un empleado puede tener ms de un supervisor. Por ejemplo, en el siguiente organigrama, el "Director de Aseguramiento de Calidad" reporta tanto al "Vicepresidente de Ventas" y al "Vicepresidente de Tecnologa." Esto prohbe una representacin basada en un rbol.

Figura 2 Un organigrama organizacional como un grafo.

Definicin de Grafos
Un grafo dirigido consiste en un conjunto V de vrtices o nodos y un conjunto E de aristas(edges). Cada arista tiene un nodo origen y un nodo destino, y la arista puede ser recorrida solamente de origen al destino.

Figura 3 Un grafo dirigido Muchas de las operaciones bsicas de un grafo, giran alrededor de la existencia de una ruta (path). Una ruta es cualquier secuencia de nodos conectados por las aristas. El nmero de aristas en una ruta es la longitud de la ruta. Dados dos nodos s y t (el origen y el destino), nos gustara determinar si existe una ruta de s a t. Este es el problema de alcance de un solo par (single pair reachability problem). Muy relacionado est el problema de alcance de todos los pares (all pairs reachability problem), el cual pregunta si existe o no una ruta entre dos nodos cualquiera del grafo. En trminos de redes de computadoras, esto se traduce en la capacidad de enviar un mensaje desde cualquier mquina a cualquier otra mquina (asumiendo algn mecanismo apropiado de reenvo). Por lo general, uno se enfrenta con grafos no dirigidos en donde cada arista puede ser recorrida en cualquier direccin. Una arista no dirigida puede ser vista como un par de aristas dirigidas, por lo que nos enfocaremos en el caso dirigido.

Figura 4 Un grafo no dirigido Tal vez la caracterstica ms atractiva de los grafos es que stos pueden ser identificados visualmente, y las imgenes de grafos son a menudo tiles para motivar y describir propiedades importantes. Los algoritmos de grafos usualmente se entienden mejor junto con algn dibujo que muestra lo que el algoritmo realiza.

Algoritmos Fundamentales de Grafos

Bsqueda por Niveles (Breadth-First Search) o Concepto o Implantacin Bsqueda por Profundidad (Depth-First Search) o Concepto o Implantacin Clculo de la Ruta Ms Corta

Bsqueda por Niveles (Breadth-First Search)


Concepto

Un algoritmo bsqueda por niveles, tambin conocido como bsqueda por anchura (breadth-first search) es un algoritmo que explora los nodos en un grafo en el orden de la distancia de aumento desde el nodo inicial. Un algoritmo bsqueda por niveles, puede ser usado para responder preguntas sobre el alcance. En otras palabras, podemos desarrollar una bsqueda por niveles para determinar qu nodos pueden ser alcanzados desde un nodo inicial. Esta es una aplicacin importante debido a que los grafos pueden contener nodos que estn desconectados de otros nodos. Las Figuras 1 a la 7 muestran una bsqueda por niveles de un grafo sencillo.

Figura 1 El inicio de una bsqueda por niveles

El nodo inicial en la exploracin por niveles se resalta en la Figura 1. El algoritmo inicia examinando cada una de las aristas salientes de este nodo inicial. Se van descubriendo nuevos nodos cuando el algoritmo examina estas aristas salientes. Estos nodos "descubiertos" son colocados dentro de una cola. Luego el algoritmo de bsqueda por niveles, examina cada nodo descubierto para determinar si se pueden alcanzar nuevos nodos desde el nodo descubierto.

Figura 2 Nodo 2 descubierto

En la figura anterior, podemos observar que el algoritmo ha descubierto el nodo 2, examinando una de las aristas conectadas al nodo 0. La figura resalta el nodo 2 para denotar que el nodo ha sido descubierto. Una vez que un nodo ha sido descubierto, ste es colocado dentro de una cola de nodos que han sido descubiertos, pero no explorados. Luego el algoritmo termina de explorar el nodo inicial, examinando su arista restante. Esta arista conduce al nodo 1.

Figura 3 Nodo 1 descubierto

Un nodo est completamente explorado cuando todas sus aristas han sido examinadas. Cuando la exploracin de un nodo se completa, el algoritmo selecciona otro nodo para ser explorado. Esta seleccin no es arbitraria. El nodo seleccionado es el nodo al frente de la cola de nodos descubiertos, pero no explorados. En este punto en este algoritmo, esto significa que el algoritmo considera el nodo 2. En las Figuras 4 y 5, podemos ver que el algoritmo explora las aristas de este nodo.

Figura 4 Nodo 4 descubierto

Figura 5 Nodo 3 descubierto

Despus de examinar todas las aristas del nodo 2, el algoritmo considera las aristas del nodo 1. Las aristas conectadas al nodo 1, de cualquier forma, todas dirigen a nodos que ya han sido descubiertos. El algoritmo se mueve y considera las aristas conectadas al nodo 4.

El nodo 4 est conectado a cuatro aristas. Dos de estas aristas dirigen a nodos que ya han sido descubiertos. Las otras dos aristas dirigen a los nodos 5 y 6. Ambos nodos son marcados como "descubiertos" y colocados dentro de la cola. El algoritmo se mueve para examinar las aristas conectadas al nodo 3.

Figura 6 Nodo 5 descubierto

Figura 7 Nodo 6 descubierto

En este punto, el algoritmo ha descubierto todos los nodos del grafo. Podemos observarlo porque todos los nodos de la Figura 7 estn sombrados. El algoritmo, sin embargo, no lo sabe. Este contina y examina las aristas conectadas a los nodos 3, 5, y 6. Todas estas aristas dirigen a nodos previamente descubiertos. El algoritmo finalmente termina cuando se queda sin nodos que requieran ser explorados.
Implantacin

Una implantacin del algoritmo de bsqueda por niveles se muestra en el Listado 1. Este programa explora el grafo en las Figuras 1 a 7. Debido a que los nodos en este grafo son referenciados a travs de enteros, podemos usar un vector de listas de tipo int para mantener listas de adyacencias.
1: void bfs(vector< list<int> >& adj_lists, int start_node) { 2: queue<int> not_yet_explored; 3: 4: set<int> discovered; 5: 6: // Mark the start node as being discovered,

7: // and place it in the queue of nodes to explore not_yet_explored.push(start_node); 8: 9: discovered.insert(start_node); 10: 11: while (! not_yet_explored.empty()) { 12: 13: // Get a node to explore. int node_to_explore = not_yet_explored.front(); 14: not_yet_explored.pop(); 15: 16: // Examine all the edges of the node 17: list<int>::iterator edges = 18: adj_lists[node_to_explore].begin(); 19: 20: for ( ; edges != adj_lists[node_to_explore].end(); edges++) { 21: // See if the edge leads to a node that we 22: // have not yet discovered 23: 24: if (discovered.count(*edges) == 0) { 25: 26: // We have discovered a new node! 27: // Add this node to the queue of nodes // to explore. 28: discovered.insert(*edges); 29: not_yet_explored.push(*edges); 30: 31: cout << "Found " << *edges << 32: " from " << node_to_explore << endl; 33: } 34: } 35: } 36: 37: } 38: 39: 40: 41: 42: 43:

Listing 1 Implantacin de un algoritmo bsqueda por niveles

Bsqueda por Profundidad


Concepto

Un algoritmo bsqueda por profundidad (depth-first search) es un algoritmo que explora los nodos en un grafo, en orden inverso de la distancia de aumento desde el nodo inicial. Un algoritmo de bsqueda por profundidad explora los nodos ms profundos del grafo y luego trabaja de regreso hacia los nodos que estn ms cercanos al nodo inicial.

Para buscar profundamente en un laberinto, primero, el algoritmo de bsqueda por profundidad mantiene un registro de los nodos a ser explorados en una pila, en vez de una cola. Esto causa que los nodos descubiertos ms recientemente sean explorados antes que los nodos previamente descubiertos. En una bsqueda por niveles, exploramos los nodos en el orden en que los descubrimos. En una bsqueda por profundidad, exploramos los nodos conforme los vamos descubriendo. Las Figuras 8 a 14 ilustran un algoritmo de bsqueda por profundidad del mismo grafo que en el ejemplo de la bsqueda por niveles.

Figura 8 Primer paso de una bsqueda por profundidad

Figura 9 Segundo paso de una bsqueda por profundidad

Figura 10 Tercer paso de una bsqueda por profundidad

Figura 11 Cuarto paso de una bsqueda por profundidad

Figura 12 Quinto paso de una bsqueda por profundidad

Figura 13 Sexto paso de una bsqueda por profundidad

Figura 14 ltimo paso de una bsqueda por profundidad

Implantacin

La implantacin de un algoritmo de bsqueda por profundidad difiere de la implantacin de uno de bsqueda por niveles solamente en el contenedor usado para almacenar los nodos que no han sido explorados. En una bsqueda por niveles, exploramos los nodos en el orden que stos son descubiertos. Por lo tanto, se utiliza una cola para almacenar los nodos que no han sido explorados. Un algoritmo de bsqueda por profundidad siempre explora el nodo descubierto ms recientemente. Para facilitar esto, los elementos que no han sido explorados se almacenan en una pila en vez de una cola. En realidad, podemos apoyarnos del hecho de que el sistema de ejecucin mantiene las llamadas a la funcin en una pila, y codifica la rutina recursivamente. Esto elimina la necesidad de usar un contenedor para almacenar los nodos no explorados.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: void dfs_helper(vector< list<int> >& adj_lists, set<int>& discovered, int node) { // Examine all the edges of the node list<int>::iterator edges = adj_lists[node].begin(); for ( ; edges != adj_lists[node].end(); edges++) { // See if the edge leads to a node that we // have not yet discovered if (discovered.count(*edges) == 0) { // We have discovered a new node! // Add this node to the queue of nodes // to explore. discovered.insert(*edges); cout << "Found " << *edges << " from " << node << endl; dfs_helper(adj_lists, discovered, *edges); } } } void dfs(vector< list<int> >& adj_lists, int start_node) { // Mark the start node as being discovered set<int> discovered; discovered.insert(start_node); dfs_helper(adj_lists, discovered, start_node); }

Listing 2 Implantacin del algoritmo de bsqueda por profundidad

Clculo de la Ruta Ms Corta


Los clculos de la ruta ms corta son una familia de algoritmos que determinan la distancia ms corta entre nodos de un grafo. Existen diferentes algoritmos de ruta ms corta, debido a que diferentes tipos de grafos requieren enfoques un poco diferentes. En un grafo no ponderado, por ejemplo, se puede usar simplemente una bsqueda por niveles para calcular la distancia ms corta entre nodos. Para grafos ponderados, se deben utilizar algoritmos diferentes y un poco ms complejos. Podemos usar el algoritmo Dijkstra si todos los pesos o valores en un grafo ponderado son positivos. Un algoritmo conocido como Bellman-Ford resuelve el problema de la ruta ms corta para grafos que contienen aristas con valores negativos.

http://www.youtube.com/watch?v=O8XEOz8FCDQ : grafos http://www.youtube.com/watch?v=iMJXWYz9vE0 grafos : camino ms corto Tablas hash: http://www.youtube.com/watch?v=WnLdu8OHA3Q

Vous aimerez peut-être aussi