Вы находитесь на странице: 1из 15

UNIVERSIDAD NACIONAL DE SAN CRISTÓBAL DE HUAMANGA

FACULTAD DE INGENIERÍA DE MINAS, GEOLOGÍA Y CIVIL

ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS

“IDENTIFICACIÓN DE UN PROCESO”

INTEGRANTES : SINCHITULLO ORELLANA, Bryan

CURSO : INVESTIGACION DE OPERACIONES II

SIGLA : IS – 347

FECHA : 25 – 04 - 2018

AYACUCHO – PERÚ

2018
EJERCICIOS PROPUESTOS

Se tomaron fotos de los ejercicios realizados, se mostraran a continuación:


ÁRBOL DE EXPANSIÓN MÍNIMA: ALGORITMO DE KRUSKAL

Antes de explicar directamente el algoritmo de Kruskal, comenzaré dando


conceptos sobre que es un árbol de expansión mínima para entender mejor el
problema.

Árbol de Expansión
Dado un grafo conexo, no dirigido G. Un árbol de expansión es un árbol
compuesto por todos los vértices y algunas (posiblemente todas) de las aristas
de G. Al ser creado un árbol no existirán ciclos, además debe existir una ruta
entre cada par de vértices.

Un grafo puede tener muchos arboles de expansión, veamos un ejemplo


con el siguiente grafo:

En la imagen anterior se puede observar que el grafo dado posee 3 arboles de


expansión, dichos arboles cumplen con las propiedades antes mencionadas
como son unir todos los vértices usando algunas aristas.

Árbol de Expansión Mínima


Dado un grafo conexo, no dirigido y con pesos en las aristas, un árbol de
expansión mínima es un árbol compuesto por todos los vértices y cuya suma
de sus aristas es la de menor peso. Al ejemplo anterior le agregamos pesos a
sus aristas y obtenemos los arboles de expansiones siguientes:
De la imagen anterior el árbol de expansión mínima seria el primer árbol de
expansión cuyo peso total es 6.

El problema de hallar el Árbol de Expansión Mínima (MST) puede ser resuelto


con varios algoritmos, los mas conocidos con Prim y Kruskal ambos usan
técnicas voraces (greedy).

Algoritmo de Kruskal
Para poder comprender el algoritmo de kruskal será necesario revisar primer el
tutorial de Union-Find.
Como trabaja:
Primeramente ordenaremos las aristas del grafo por su peso de menor a
mayor. Mediante la técnica greedy Kruskal intentara unir cada arista siempre y
cuando no se forme un ciclo, ello se realizará

mediante Union-Find. Como hemos


ordenado las aristas por peso comenzaremos con la arista de menor peso, si
los vértices que contienen dicha arista no están en la misma componente
conexa entonces los unimos para formar una sola componente mediante
Union(x , y), para revisar si están o no en la misma componente conexa
usamos la función SameComponent(x , y) al hacer esto estamos evitando que
se creen ciclos y que la arista que une dos vértices siempre sea la mínima
posible.
Algoritmo en Pseudocódigo
1 método Kruskal(Grafo):
2 inicializamos MST como vacío
3 inicializamos estructura unión-find
4 ordenamos las aristas del grafo por peso de menor a mayor.
5 para cada arista e que une los vértices u y v
6 si u y v no están en la misma componente
7 agregamos la arista e al MST
8 realizamos la unión de las componentes de u y v
Ejemplo y código paso a paso
Tengamos el siguiente grafo no dirigido:

Como podemos ver en la imagen anterior la definición de nuestro grafo en


código sería:

struct Edge{

int origen; //Vértice origen

int destino; //Vértice destino

int peso; //Peso entre el vértice origen y destino

Edge(){}

}arista[ MAX ]; //Arreglo de aristas para el uso en kruskal

Primeramente usaremos el método MakeSet de unión-find para inicializar cada


componente, obteniendo las siguientes componentes conexas iniciales:
Ahora el siguiente paso es ordenar las aristas del grafo en orden ascendente:

Para el ordenamiento podemos usar las librerías predefinidas de Java y C++


como estamos ordenando estructuras necesitamos un comparador, en este
caso estamos ordenando por peso por lo tanto dentro de la estructura antes
definida agregamos:

struct Edge{

//Comparador por peso, me servira al momento de ordenar lo realizara en


orden ascendente
//Cambiar signo a > para obtener el arbol de expansion maxima

bool operator<( const Edge &e ) const {

return peso < e.peso;

}arista[ MAX ]; //Arreglo de aristas para el uso en kruskal

Ordenamos el arreglo de aristas mediante lo siguiente:

std::sort( arista , arista + E ); //Ordenamos las aristas por su comparador

Lo siguiente será recorrer todas las aristas ya ordenadas y verificar si sus


vértices están o no en la misma componente.

La primera arista a verificar es la que une a los vértices 8 y 7, verificamos si


están en la misma componente, para ello hacemos Find(8) , Find(7):

Como podemos observar en la tabla y en la misma imagen no están en la


misma componente conexa, por tanto esta arista es valida para el MST así que
unimos los vértices por el método de Union( 8 , 7 ).
Continuamos con la siguiente arista:

Observamos la tabla de Union-Find y vemos que Find(3) != Find(9). Entonces


es posible realizar la unión de ambas componentes:

Continuamos con la siguiente arista:


En la
imagen podemos observar que ambos vértices no están en la misma
componente, por tanto realizamos la Union( 6 , 7 ):

Continuamos con la siguiente arista, los vértices 1 y 2 no están en la misma


componente conexa:

Realizamos la Union(1,2):
Continuamos con la siguiente arista:

Al observar la imagen los vértices 3 y 6 están en distinta componentes


conexas. Entonces realizamos la Union(3,6) y actualizamos la tabla de Union-
Find.

Continuamos con la siguiente arista:


En este
caso si observamos la imagen los vértices 7 y 9 están en la misma componente
conexa; asimismo en la tabla de Union-Find el elemento raíz del vértice 7 es el
mismo que el del vértice 9 por ello afirmamos que están el a misma
componente conexa, por lo tanto no habrá que realizar la unión de ambos
vértices. Con esto evitamos tener ciclos en el árbol de expansión mínima.
Continuamos con la siguiente arista:

Al
observar la imagen los vértices 3 y 4 no están en la misma componente conexa
por lo tanto realizamos la Union(3,4) en el grafo:

Continuamos con la siguiente arista:


Los
vértices 8 y 9 están en la misma componente conexa por lo tanto no realizamos
Unión de vértices. Continuemos con la siguiente arista:

Los
vértices 1 y 8 están diferentes componentes. Realizamos la Union(1,8) en el
grafo:

Continuamos con la siguiente arista:


Los
vértices 2 y 3 están en la misma componente conexa por lo tanto no realizamos
Union de componentes. Continuamos con la siguiente arista:

Los vértices 4 y 7 no están en la misma componente conexa, realizamos


Union(4,5) en el grafo:

Como podemos observar ya están todos los vértices del grafo conectados así
que al momento de continuar viendo las demás aristas ordenadas siempre
tendremos e l caso de que ya están en la misma componente conexa por lo
tanto el Árbol de Expansión Mínima para el grafo es el siguiente:
El peso total del árbol de expansión mínima para el grafo mostrado es 39.

Вам также может понравиться