Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arbol y Grafos PDF
Arbol y Grafos PDF
INVESTIGACIÓN:
ÁRBOLES Y GRAFOS
MATERIA:
PROGRAMACIÒN
DOCENTE:
CUENCA - ECUADOR
Julio- 2019
OBJETIVO GENERAL:
Conocer la teoría sobre árboles y grafos mediante investigación con respecto a temas como
estructura y exploración de un grafo, búsqueda por Anchura y profundidad del árbol, algoritmos
voraces y árbol de mínima expansión métodos Heurísticos para búsqueda y exploración,
métricas de rendimiento de un grafo para la adquisición de conocimiento y fortalecimiento de
la enseñanza por parte del estudiante.
OBJETIVO ESPECÍFICO:
Conocer por medio de investigación como definir grafos, hacer sus representaciones gráficas y
solicitar información relevante sobre los vértices.
Comprender los temas señalados acerca de árboles y grafos.
Analizar la visualización de grafica para organizar y relacionar datos en una base de datos.
1. INTRODUCCIÓN:
Los árboles corresponden a una de las subclases de grafos de uso más amplio, particularmente en
computación. Los grafos se pueden clasificar en dos grupos: dirigidos y no dirigidos. Los arboles
forman parte de los no dirigidos.
Estructura:
Es una estructura de datos que consiste en un conjunto de nodos y un conjunto de arcos que
establecen relaciones entre los nodos. Cada arco en un grafo se especifica por medio de un par de
nodos.
Exploración de un grafo:
A la hora de explorar un grafo, nos encontramos con dos métodos distintos. Ambos conducen al
mismo destino (la exploración de todos los vértices o hasta que se encuentra uno determinado), si
bien el orden en que éstos son "visitados" decide radicalmente el tiempo de ejecución de un
algoritmo, como se verá posteriormente.
Un Grafo (o grafo no dirigido) es un conjunto V de vértices y un conjunto E de aristas tales que cada
arista e, E (queda asociada a un par no ordenado de vértices. Si existe una única arista e asociada
con los vértices v y w, escribimos e = (v,w). En este contexto (v,w) denota una arista en un grafo no
dirigido y no un par ordenado.
Grafo conexo: un grafo G es conexo si dados cualesquiera dos vértices v y w en G, existe un camino
de v a w.
a) V" (V y E” (E).
b) Para cada arista e" (E", si e" es incidente en v" y w", entonces v", w" (V).
Grafo con pesos (o poderado): es un grafo en el cual se le asignan valores a las aristas y la longitud
del camino de un grafo con pesos es la suma de todos los pesos de las aristas en la ruta (camino).
Árbol: es un grafo en el que cualesquiera dos vértices están conectados por exactamente
un camino.
Al definir un grafo. MatLab nos permite definir grafos de dos maneras, de forma matricial y de forma
vectorial. A continuación, explicamos cómo hacerlo en cada uno de los casos.
Comenzamos definiendo una matriz cuadrada A, de manera que su dimensión coincida con el
número de vértices del grafo. Si queremos definir simplemente un grafo y no una red, la matriz A es
justamente la matriz de adyacencia asociada al grafo, de manera que para cada par de vértices.
0 𝑠𝑖 → 𝑗.
𝑖, 𝑗: 𝑎𝑖𝑗 = {
1 𝑠𝑖 ↛ 𝑗.
Ahora bien, si queremos definir una red, esto es, un grafo de manera que cada arco tenga asignado
un valor numérico, la matriz A será la matriz de adyacencia con pesos. Esto significa que el valor 𝑎𝑖𝑗
será 0, si el arco 𝑖 → 𝑗 no existe, y tomara un valor real no nulo, si el arco existe y tiene asignado
dicho peso.
Una vez definida la matriz de adyacencia con pesos, tenemos que tener en cuenta si el grafo es
orientado o no orientado.
>> G=digraph(A)
Por otra parte, si el grafo es no orientado, la matriz de incidencia A deberá de ser simétrica (𝑎𝑖𝑗
= 𝑎𝑗𝑖 ).
>> G=graph(A)
Ejemplo 5.1. Consideremos el grafo orientado G y su grafo no orientado asociado que denotaremos
por F, definidos en la Figura 5.1. Como podemos ver, cada arco tiene asociado un peso. En el caso
de los arcos 2 → 3 𝑦 3 → 2, ambos tienen asociado el mismo peso 2.
>> G = digraph(A1) G =
F=
Como vemos, la salida nos informa de que el grafo orientado G tiene 5 arcos y 5 nodos, mientras
que el grafo no orientado F sigue teniendo 5 vértices pero solamente 4 aristas (los arcos 2 →
3 𝑦 3 → 2 dan lugar a la misma arista).
A la hora de definir un grafo, podemos le podemos dar un nombre: Para un grafo con tres nodos la
instrucción seria:
>> G. Nodes
>> G. Edges
Se puede representar de manera matricial de varias formas. Las representaciones matriciales son
muy útiles porque nos permiten simplificar los cálculos. Con Matlab podemos calcular las matrices
de adyacencia y de incidencia vértice-arco:
a) Matriz de adyacencia: es la matriz cuadrada que tiene tantas filas y columnas como vértices hay
en el grafo, y definida por 𝑎𝑖𝑗 = 1 si 𝑖 → 𝑗 es un arco o 𝑎𝑖𝑗 = 0 en otro caso. Para calcular la
matriz de adyacencia, usaremos el comando adjacency:
>> adjacency(G)
Usando esta expresión nos indicara los arcos que tiene el grafo. Si queremos que nos muestre la
matriz completa, debemos añadir el comando full:
>> full(adjacency(G))
b) Matriz de incidencia vértice-arco. Esta matriz solamente se puede calcular para los grafos
orientados. Esta matriz tiene tantas columnas como vértices y tantas filas como arcos, y en el
elemento 𝑚𝑖𝑒 toma el valor 1, si 𝑖 es el vértice inicial del arco 𝑒; 𝑚𝑖𝑒 toma el valor -1 si 𝑖 es el vértice
final del arco 𝑒, y toma el valor 0 en otro caso. Para calcularla, utilizaremos el comando incidence:
>> incidence(G)
Al igual que en el apartado anterior, por pantalla nos mostrara una lista con los arcos (𝑖, 𝑗) y nos
indicara el valor 1 o -1 según el vértice inicial sea 𝑖 𝑜 𝑗, respectivamente. Una vez más, si queremos
la matriz completa debemos utilizar la instrucción full:
>> full(incidence(G))
Ejemplo 5.7. Continuemos con el grafo. Vamos a calcular sus matrices de adyacencia y de incidencia
vértice-arco:
>> adjacency(G5)
ans =
(5,1) 1
(3,2) 1
(1,3) 1
(2,3) 1
(2,4) 1
(1,5) 1
>> incidence(G5)
ans =
(1,1) -1
(3,1) 1
(1,2) -1
(5,2) 1
(2,3) -1
(3,3) 1
(2,4) -1
(4,4) 1
(2,5) 1
(3,5) -1
(1,6) 1
(5,6) -1
Dado un grafo G = (V, E), un árbol generador de G, es un subgrafo que es árbol y contiene a todos
los vértices del grafo.
Todo grafo conexo posee un árbol generador. El grafo completo 𝐾𝑛 tiene 𝑛𝑛−2 árboles generadores
diferentes.
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.
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.
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}). [1]
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.
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.
Si no se tuviera la certeza de que el grafo G es conexo, se necesita modificar el paso 4 para permitir
la búsqueda en las componentes conexas que no contienen a v. Entonces este algoritmo servirá
también para hallar todas las componentes conexas del grafo G, mediante la construcción de un
árbol generador de cada componente conexa de G.
Algoritmos voraces:
Es una estrategia de búsqueda por la cual se sigue una heurística consistente en elegir la opción
óptima en cada paso local con la esperanza de llegar a una solución general óptima. Este esquema
algorítmico es el que menos dificultades plantea a la hora de diseñar y comprobar su
funcionamiento. Normalmente se aplica a los problemas de optimización.
Árboles de expansión:
Prim: Consiste en ir borrando las aristas de mayor peso posible y que no sean aristas de
separación.
Kruskal: Se van escogiendo las aristas de menor peso hasta conseguir un árbol de peso mínimo
Algoritmo de Prim: Este algoritmo determina un árbol de expansión mínimo en un grafo conexo
con pesos.
El algoritmo encuentra un subconjunto de aristas que forman un árbol con todos los vértices,
donde el peso total de todas las aristas en el árbol es el mínimo posible.
3. Repetir el paso 2 siempre que la arista elegida enlace un nodo y otro que no lo esté.
4. El proceso termina cuando tenemos todos los nodos del grafo marcados.
Al concluir el algoritmo, T es un árbol de expansión mínimo.
Las heurísticas son formalizadas como reglas para elegir (buscar) las ramas en el espacio de estados
que son más probables de llegar a una solución aceptable del problema.
Las Heurísticas
Tipos:
Estrategias tentativas: aquellas en las que se puede abandonar la exploración de una rama y
pasar a explorar otra en cualquier momento del problema.
Estrategias irrevocables: aquellas en las que no se puede abandonar la exploración de la rama
por la que se comenzó.
Métodos:
Gradiente
Primero el mejor
Búsqueda en haz
Algoritmo A
Gradiente:
Tipo: irrevocable.
Ventajas: se llega a la solución con poco coste computacional.
Inconvenientes: puede ser que el problema no sea compatible con este método, y, por lo tanto,
no conseguiremos obtener la solución.
Primero el mejor:
Metodología: elegir como siguiente nodo aquel con mayor función de evaluación.
Tipo: tentativo.
Ventajas: no depende en exceso de la función de evaluación.
Inconvenientes: excesiva complejidad espacial, pues se deben guardar todos los nodos abiertos.
Búsqueda en haz:
Metodología: elegir un conjunto de nodos como los siguientes a expandir, y hacerlo de forma
irrevocable.
Tipo: irrevocable/tentativo.
Ventajas: más permisible. Inconvenientes: en caso de que el sistema sea irrevocable, este
método no actúa con eficacia
Algoritmo A:
Metodología: Ponderar a la vez lo cerca que estamos del nodo meta y lo lejos que estamos del
nodo inicial.
Tipo: tentativo.
Ventajas: soluciones más cercanas a la raíz.
Dimensión métrica
En el contexto actual, uno de los dilemas de mayor interés en estas materias de estudio reside aún
en determinar que nodos son los auténticamente relevantes, o centrales, dentro de una red. Se
entiende que en base a la centralidad se deben de poder analizar y sintetizar los diferentes
fenómenos que se reproducen en una red cualquiera.
Se han propuesto toda una serie de diferentes medidas de la misma, cada una respondiendo a un
enfoque particular de definición. Las referencias clásicas en este tema acostumbran a ser: el grado,
la distancia media, y la betweenness centrality. Sin embargo, todavía no se ha llegado a un consenso
final sobre la propia definición de centralidad. Cada cual apuesta por criterios que acentúan un
cierto tipo de cualidades en detrimento de otras, he incluso los hay que no creen la posible
definición de un concepto general de centralidad, y se centran únicamente en emplear aquella que
enfatice el matiz deseado.
En el tipo de casos como el de los servidores, se reproducirán también el mismo tipo de situaciones.
A número de servidores que me hacen falta para este propósito es lo que denominamos dimensión
métrica conjunto de los mismos, es lo que denominamos base métrica
Enlazando con el inicio de este apartado, podríamos extrapolar que los elementos de la base métrica
ocupan un determinado papel de centralidad como mínimo desde el punto de vista de su capacidad
de identificación unívoca del conjunto de todos los nodos del grafo.
EJEMPLO GRAFO 1
A su vez, es obvio observar que ningún nodo de forma aislada puede resolver G1
EJEMPLO GRAFO 2
El conjunto S1 = {A, B, C, D} es un conjunto que resuelve G2 puesto que las coordenadas de los
distintos nodos de G2 sobre S1 son:
Podríamos comprobar que no existe ningún conjunto de cardinalidad inferior a 3 que pueda resolver
G2
Al realizar este trabajo aprendí algoritmos útiles para encontrar un árbol de expansión mínimo,
que es el más adecuado para comunicar n nodos utilizando una red de interconexión que tenga
el menor número posible de enlaces, por ejemplo al saber también que son muy útiles los
árboles para la toma de decisiones.
BIBLIOGRAFIA: