Superior de Ensenada, Baja California
MR
Maestr´ıa en Ciencias
en Ciencias de la Computaci ´
on
An ´alisis de la factibilidad del dise ˜
no de algoritmos
auto-estabilizantes para el conjunto independiente fuerte con
peso m ´aximo en uniciclos
Tesis
para cubrir parcialmente los requisitos necesarios para obtener el grado de Maestro en Ciencias
Presenta: David Zhou Tan
David Zhou Tan
y aprobada por el siguiente Comit ´e
Dr. Jos ´e Alberto Fern ´andez Zepeda
Codirector del Comit ´e
Dr. Joel Antonio Trejo S ´anchez
Codirector del Comit ´e
Dr. Carlos Alberto Brizuela Rodr´ıguez
Dr. Ricardo Arturo Ch ´avez P ´erez
Dr. Jes ´us Favela Vara
Coordinador del Posgrado en Ciencias de la Computaci ´on
Dra. Rufina Hern ´andez Mart´ınez
Directora de Estudios de Posgrado
David Zhou Tan © 2018
Resumen de la tesis que presentaDavid Zhou Tan como requisito parcial para la obten-ci ´on del grado de Maestro en Cienobten-cias en Cienobten-cias de la Computaobten-ci ´on.
An ´alisis de la factibilidad del dise ˜no de algoritmos auto-estabilizantes para el conjunto independiente fuerte con peso m ´aximo en uniciclos
Resumen aprobado por:
Dr. Jos ´e Alberto Fern ´andez Zepeda
Codirector de Tesis
Dr. Joel Antonio Trejo S ´anchez
Codirector de Tesis
En este trabajo se estudia el problema de encontrar el conjunto independiente fuer-te (2-packing) con peso m ´aximo, que suele aparecer en problemas de exclusi ´on mutua, calendarizaci ´on, etiquetado de mapas, entre otros. Este problema en grafos generales es NP-dif´ıcil, pero para grafos restringidos como el ´arbol, el uniciclo y el cactus, se han encontrado soluciones eficientes. En esta investigaci ´on se trabaja en los casos del cactus y del uniciclo. Para el cactus se propone un algoritmo secuencial basado en un algoritmo reciente en la literatura que resuelve el mismo problema pero en cactus sin peso, y se implementa en un lenguaje de programaci ´on orientado a objetos (Java). Para el uniciclo se dise ˜na un algoritmo auto-estabilizante basado en la implementaci ´on anterior. Adem ´as se plantean los pasos para generalizar este ´ultimo para que funcione en un cactus. Los algoritmos auto-estabilizantes se utilizan en sistemas distribuidos donde se necesita ase-gurar estabilidad sin necesidad de que haya interacci ´on humana, incluso cuando ocurren fallos transitorios, tales como cortes de energ´ıa y p ´erdidas de memoria.
Abstract of the thesis presented byDavid Zhou Tan as a partial requirement to obtain the Master of Science degree in Computer Science.
Feasibility analysis of the design of self-stabilizing algorithms for the maximum weighted independent set problem in unicycles
Abstract approved by:
Dr. Jos ´e Alberto Fern ´andez Zepeda
Thesis Co-Director
Dr. Joel Antonio Trejo S ´anchez
Thesis Co-Director
In this thesis we study the problem of finding the strong independent set (2-packing) with maximum weight, usually appearing in problems of mutual exclusion, tasks schedu-ling, map labeschedu-ling, among others. The 2-packing problem in general graphs is NP-hard, but in restricted graphs such as trees, unicycles and cacti, efficient solutions have been found. In this research we work on cacti and unicycles. For the cacti, we propose a sequential algorithm based on a recent algorithm in the literature that solves the same problem in unweighted cacti. This new algorithm is implemented in a object oriented programming languaje (Java). For the unicycles we design a self-stabilizing algorithm based on the previous implementation. Also, we present the steps to generalize it for the cacti. Self-stabilizing algorithms are used in distribuited systems where it is necessary to ensure stability without human interaction, even when transient faults occur, such as energy cuts and memory leaks.
Dedicatoria
Agradecimientos
A mis directores de tesis: el Dr. Jos ´e Alberto Fern ´andez Zepeda y el Dr. Joel Antonio
Trejo S ´anchez, por el conocimiento y asesor´ıa durante todo este tiempo.
A los miembros de mi comit ´e: el Dr. Carlos Alberto Brizuela Rodr´ıguez y el Dr. Ricardo
Arturo Ch ´avez P ´erez, por sus observaciones y su valiosa retroalimentaci ´on durante el
desarrollo de la tesis.
A mis compa ˜neros de generaci ´on. Gracias por compartir tantas experiencias y apoyo
mutuo en estos dos a ˜nos.
A mis compa ˜neros del Laboratorio de Algoritmos, por los momentos de pl ´atica y
diver-si ´on, as´ı como los de seriedad y trabajo.
A los compa ˜neros del Departamento de Computaci ´on, por tantos momentos
excep-cionales.
A mi familia y amigos, por estar siempre conmigo.
Al Centro de Investigaci ´on Cient´ıfica y de Educaci ´on Superior de Ensenada.
Al Consejo Nacional de Ciencia y Tecnolog´ıa (CONACyT) por brindarme el apoyo
Tabla de contenido
P ´agina
Resumen en espa ˜nol ii
Resumen en ingl ´es iii
Dedicatoria iv
Agradecimientos v
Lista de figuras viii
Lista de tablas ix
1. Introducci ´on 1
1.1. Auto-estabilizaci ´on . . . 1
1.2. Conjuntos independientes . . . 2
1.2.1. Aplicaci ´on de los conjuntos independientes . . . 4
1.3. Antecedentes . . . 5
1.4. Objetivo general . . . 8
1.4.1. Objetivos espec´ıficos . . . 8
1.5. Organizaci ´on de la tesis . . . 8
2. 2-packing con peso m ´aximo en cactus 9 2.1. Esquema general del algoritmoF . . . 9
2.2. Pseudoc ´odigos . . . 10
2.3. Creaci ´on del ´arbol de bloques . . . 10
2.4. Inicializaci ´on de las tablas . . . 13
2.5. Procesar cliqu ´e . . . 14
2.6. Procesar ciclo . . . 15
2.6.1. Maximum-2-Pack-Tree . . . 15
2.6.2. Adapt-For-Unicycle . . . 16
2.6.3. Correct-Conflict . . . 16
2.6.4. Soluci ´on del ciclo . . . 19
2.7. Soluci ´on global . . . 19
2.8. Contribuci ´on al algoritmo . . . 19
2.8.1. Adaptaciones . . . 19
2.9. Implementaci ´on . . . 20
2.10. Pruebas . . . 21
2.10.1. Correcciones . . . 23
3. Algoritmo auto-estabilizante 24 3.1. Elecci ´on de l´ıder . . . 25
3.2. Identificaci ´on de puentes . . . 25
3.3. Maximum-2-Packing-SetZ . . . 26
3.3.1. Variables . . . 26
3.3.2. Funciones . . . 28
3.3.3. Reglas . . . 30
Tabla de contenido (continuaci ´
on)
3.4.1. Procesamiento de cliqu ´es . . . 33
3.4.2. Numeraci ´on del ciclo . . . 36
3.4.3. Procesamiento del ciclo . . . 37
3.4.3.1. Maximum 2-packing tree . . . 37
3.4.3.2. Adapt for unicycle . . . 38
3.5. Demostraci ´on . . . 50
3.6. Correcci ´on de errores . . . 61
3.7. Cerradura . . . 62
3.8. An ´alisis de complejidad . . . 63
3.8.1. Espacio . . . 63
3.8.2. Tiempo . . . 64
3.8.3. Recuperaci ´on de errores . . . 64
3.9. Generalizaci ´on a cactus . . . 65
4. Conclusiones 66 4.1. Limitaciones . . . 66
4.2. Trabajo futuro . . . 67
Literatura citada 69
A. Pseudoc ´odigos del algoritmo F 71
B. Funciones del algoritmoZ 78
Lista de figuras
Figura P ´agina
1. Ejemplo de aplicaci ´on de los conjuntos independientes. . . 5
2. Diagrama general del algoritmoF. . . 9
3. Transformaci ´on de cactus a ´arbol de bloques. . . 11
4. Ejemplo de numeraci ´on de los v ´ertices en un ciclo. . . 12
5. Ejemplo de una tablaTvi,j. . . 14
6. Los 5 diferentes conflictos, seg ´un el algoritmoF. . . 17
7. Ejemplo de correcci ´on de conflicto. . . 18
8. Ejemplo de la creaci ´on de un cactus aleatorio. . . 22
9. Ejemplo de las tablas de cliqu ´es. . . 27
10. Ejemplo de orden de bloques. . . 33
11. Ejemplo de procesamiento de cliqu ´es. . . 35
12. Ejemplo de secuencia del M2PT. . . 40
13. Casos general y especiales de corregir conflicto. . . 42
14. Ejemplo de correcci ´on de conflictos. . . 45
Lista de tablas
Tabla P ´agina
Cap´ıtulo 1.
Introducci ´
on
1.1 Auto-estabilizaci ´on
En el entorno de los sistemas distribuidos, se busca que el sistema mantenga un es-tado estable, es decir, evitar que se realicen pasos no permitidos que desestabilicen el entorno global. Si los miembros de un sistema distribuido tienen acceso a una memoria compartida, alcanzar el estado estable es sencillo. Pero cuando cada nodo solamente puede utilizar informaci ´on local, ya sea del mismo nodo o de los nodos vecinos, el proble-ma se complica.
Un sistema distribuido se puede modelar como un grafo G = (V, E), donde V es el conjunto de v ´ertices, los cuales representan a cada uno de los nodos en el sistema, yE
es el conjunto de aristas, que representan conexiones entre pares de v ´ertices, es decir, si dos nodos tienen comunicaci ´on directa en el sistema. Se le conoce como vecindario abierto de un v ´ertice i al conjunto de v ´ertices con arista incidente a i (Goddard et al., 2008). Si a este vecindario se agrega el v ´erticei, entonces se convierte en elvecindario cerradodei. En este trabajo, cada v ´ertice solamente tiene acceso a la informaci ´on dentro de su vecindario cerrado.
Se definen a los privilegios (Dijkstra, 1974) como las funciones booleanas de los esta-dos de los v ´ertices y sus vecinos. Si alguna de estas funciones es verdadera, se dice que el v ´ertice se encuentra privilegiado. Un calendarizador central es quien escoge uno de los v ´ertices privilegiados, y en su turno, dicho v ´ertice puede realizar un movimiento o cambio. Estas funciones y cambios tienen la forma: si (condici ´on) entonces (movimiento), y en ocasiones se les llamanreglas. Un sistema es auto-estabilizante si, independientemen-te del estado inicial que adopindependientemen-te, puede alcanzar un estado estable en un tiempo finito a trav ´es de los turnos elegidos por el calendarizador. A esta propiedad se le conoce como
para alcanzar un estado estable.
Existen diferentes tipos de calendarizadores (Tixeuil, 2010) adem ´as del central. Uno de ellos es el s´ıncrono, en el cual todos los v ´ertices privilegiados realizan un movimiento en el mismo instante. Otro tipo de calendarizador m ´as general es el distribuido, el cual puede elegir cualquier cantidad de v ´ertices privilegiados para mover en un instante. Si se elige uno solo, entonces es un calendarizador central; y si se eligen todos, es uno s´ıncrono. Por lo tanto, un calendarizador distribuido es mucho m ´as general que los otros.
El tiempo de ejecuci ´on de los algoritmos auto-estabilizantes se mide de forma diferen-te a los algoritmos secuenciales. En los algoritmos secuenciales el tiempo de ejecuci ´on es la cantidad m ´axima de operaciones que se necesitan realizar para proporcionar una soluci ´on, mientras que en los algoritmos auto-estabilizantes es la m ´axima cantidad de reglas que tienen que ejecutarse (movimientos) para llegar a un estado estable (Mjelde, 2004). Otra forma de calcular el tiempo de ejecuci ´on en algoritmos auto-estabilizantes es mediante las rondas. Una ronda es una secuencia de ejecuci ´on m´ınima para que cada v ´ertice privilegiado se ejecute al menos una vez.
Los algoritmos auto-estabilizantes (Dolev, 2000) se utilizan principalmente en sistemas aut ´onomos grandes, donde es dif´ıcil predecir cu ´ando o c ´omo ocurrir ´an fallas transitorias. Por ejemplo, en veh´ıculos aut ´onomos no es posible saber cu ´ando ocurrir ´a una falla que altere el sistema, por lo que debe estar preparado para estabilizarse por s´ı mismo antes de reanudar sus actividades.
1.2 Conjuntos independientes
El problema del conjunto independiente se define como sigue: dado un grafo G = (V, E), se dice que I ⊆ V es un conjunto independiente de Gsi no hay dos v ´ertices en
el de encontrar uno maximal se encuentra en la clase P, por lo que es mucho m ´as f ´acil resolver el ´ultimo. Adem ´as, no es posible encontrar un algoritmo de aproximaci ´on de factor constante al problema del conjunto independiente m ´aximo a menos de que P = NP (Arora
et al., 1998).
Una versi ´on m ´as general del problema anterior es el de encontrar el conjunto k -packing (Meir y Moon, 1975). Se dice que S ⊆ V es un conjunto k-packing de un grafo
G= (V, E)si la distancia, medida en aristas, entre cada par de v ´ertices enSes mayor ak. En este sentido, el problema de encontrar el conjunto independiente es equivalente a en-contrar el conjunto1-packing. Este trabajo se enfoca en encontrar el conjunto2-packing.
Un problema muy relacionado con los conjuntos independientes son los conjuntos do-minantes. Dado un grafoG= (V, E), se dice queD⊆V es un conjunto dominante si para todo v ´ertice deV no inclu´ıdo enD, es adyacente a un v ´ertice enD. Encontrar el conjunto dominante de menor cardinalidad es un problema NP-Completo (Garey y Johnson, 1990). Al igual que los conjuntos independientes, tambi ´en existen los conjuntos dominantes mi-nimales, que son los conjuntos dominantes tales que no existe alg ´un subconjunto propio de ellos que tambi ´en sea dominante. La relaci ´on con los conjuntos independientes es que todo conjunto independiente maximal es un conjunto dominante minimal.
Otro problema similar a los conjuntos independientes es el cubrimiento de v ´ertices. Un cubrimiento de v ´ertices de un grafoG= (V, E)es un subconjuntoC ⊆V, tal que toda aristae∈E es incidente a al menos un v ´ertice enC. Encontrar el subconjunto de menor tama ˜no es un problema NP-Dif´ıcil (Karp, 1972). Los v ´ertices que no se encuentran en un cubrimiento de v ´ertices forman un conjunto independiente.
En el caso del problema de cubrimiento de v ´ertices con peso, tambi ´en se le asignan pesos a los v ´ertices del grafo, y el problema consiste en encontrar el subconjunto de v ´ertices que cubra todas las aristas, pero cuya suma de pesos sea la menor. Para este problema se han propuesto soluciones con programaci ´on lineal, utilizando el esquema primal dual para aproximar el resultado ´optimo (Cormenet al., 2009), (Vazirani, 2001).
1.2.1. Aplicaci ´on de los conjuntos independientes
Una posible aplicaci ´on de los conjuntos independientes es la siguiente. Suponga que en una universidad se est ´a realizando un evento tipo olimpiada, donde cada estudiante se puede inscribir y participar en uno o m ´as deportes. Una vez inscritos los estudiantes, el comit ´e organizador calendariza los juegos o eventos de cada deporte, cuidando que no se programen dos juegos al mismo tiempo si existe alg ´un estudiante que participe en ambos. Sin embargo, hay una hora en la que varios cazatalentos llegar ´an a visualizar a los estudiantes con mayor potencial, por lo que la universidad quiere programar la mayor cantidad de eventos a dicha hora.
Este problema se puede modelar como un grafoG= (V, E), donde cada v ´erticev ∈V
representa a un evento, y cada aristae∈Econecta dos v ´ertices si existe alg ´un estudiante que participa en los eventos representados por ambos v ´ertices. Si dos v ´ertices comparten una arista, esos eventos contienen al menos un estudiante en com ´un y no se pueden programar al mismo tiempo, por lo que el 1-packing m ´aximo representa la mayor cantidad de eventos que se pueden programar sin que se violen las restricciones anteriores.
Por ejemplo, en la Tabla 1 se presenta el caso de cinco estudiantes y los deportes en los que participan. En la Figura 1a se muestra el grafo de estas relaciones. El v ´ertice A
tiene una arista a B porque Pedro participa en 100m y 200m, as´ı comoB se conecta a
100m (A) 200m (B) Salto de longitud (C)
Lanzamiento de bala (D)
Pedro X X
Jimena X
Juan X
Rodrigo X X
Karen X
Tabla 1: Tabla de participaci ´on de los estudiantes.
A
B C
D
(a)
A
B C
D
(b)
4
8 2
1
(c)
Figura 1: El v ´erticeAcorresponde al evento de 100 metros,Ba 200 metros,Ca salto de longitud yD
a lanzamiento de bala. (a) grafo con la representaci ´on de los eventos y participaci ´on de estudiantes, (b) los v ´ertices coloreados representan el conjunto 1-packing m ´aximo, y (c) los v ´ertices coloreados representan el conjunto 1-packing con peso m ´aximo.
Este problema se puede extender al conjunto 1-packing con peso m ´aximo si se le asignan pesos a los v ´ertices, dependiendo de la cantidad de cazatalentos que existan de cada tipo de deporte. En la Figura 1(c) se muestra el caso cuando hay un cazatalen-tos de lanzamiento de bala, cuatro de 100 metros, ocho de 200 metros y dos de salto de altura. En este caso el conjunto 1-packing con peso m ´aximo es el conjunto con los eventos de 200 metros y lanzamiento de bala, con un peso total de nueve. Note que el conjunto 1-packing con peso m ´aximo no necesariamente es el conjunto 1-packing con mayor cardinalidad. Los pesos asignados a cada evento pudieran ser otros, por ejemplo, la importancia o popularidad del deporte, o cualquier otro criterio.
1.3 Antecedentes
conjunto 2-packing. La idea general del algoritmo es meter o sacar v ´ertices del conjunto 2-packing dependiendo de los vecinos, que el tama ˜no de algunos grupos dentro del algo-ritmo nunca incrementan, y que ´estos decrezcan paulatinamente con una cantidad finita de movimientos entre cada decremento. El algoritmo utiliza el calendarizador adversario central, y la complejidad espacial es de orden logar´ıtmica en relaci ´on con el tama ˜no de los v ´ertices, ya que requieren utilizar apuntadores a los v ´ertices vecinos.
Para el conjunto k-packing maximal, Manne y Mjelde (2006) dise ˜naron un algoritmo auto-estabilizante, utilizando tambi ´en identificadores ´unicos ordenables y el calendariza-dor adversario. Cada v ´ertice tiene dos variables locales: la distancia y el identificacalendariza-dor del v ´ertice m ´as cercano perteneciente al conjuntok-packing, y la distancia y el identificador al segundo v ´ertice m ´as cercano en el conjuntok-packing. Usando una funci ´on de soporte, se pueden calcular los valores adecuados de cada uno de los valores anteriores, con-vergiendo a un estado estable en tiempo exponencial. Aunque su idea no parece que se pueda expandir a redes an ´onimas (donde los v ´ertices no tienen identificadores ´unicos), comienzan a explorar la compensaci ´on de la complejidad del tiempo contra el espacio.
A ´un para el problema del conjunto k-packing maximal, Goddard et al. (2008) hacen uso de ladistancia-k. A diferencia de los anteriores que utilizan informaci ´on de un v ´ertice y de sus vecinos inmediatos, en este caso se puede conocer la informaci ´on de todos los v ´ertices a una distanciak. Esta informaci ´on se guarda en forma de grafo en cada v ´ertice, as´ı como dos variables locales muy similares a las de Gairing. La idea de este algoritmo es realizar conversiones desde un conocimiento de distanciak a uno de distanciak/2, y luego a k/4, y as´ı sucesivamente. De esta manera, se puede llegar hasta la distancia 1, el cual es el esquema general del problema a tratar. Este algoritmo funciona en tiempo polinomial, ya que cada transformaci ´on tiene un costo polinomial en convertir de un mo-delo de distancia a otro. Pero su desventaja es que el espacio requerido en cada v ´ertice para almacenar la informaci ´on de sus vecinos a distanciak es del orden nO(logk), donde
n es la cantidad de v ´ertices. En dicho art´ıculo, ya existe una compensaci ´on de tiempo y espacio: se sacrifica almacenamiento de los v ´ertices para que el algoritmo funcione de manera m ´as r ´apida.
todos los v ´ertices privilegiados en el mismo momento, aunque tambi ´en realiza un an ´alisis con cualquier calendarizador, como el distribuido. Utilizando reglas sencillas con infor-maci ´on sobre los v ´ertices m ´as cercanos dentro del conjunto 2-packing, logra encontrar estabilidad enO(mn)movimientos para cualquier calendarizador, y O(n2)rondas para el calendarizador s´ıncrono, donde n y m son la cantidad de v ´ertices y aristas, respectiva-mente. Este algoritmo auto-estabilizante funciona solamente con identificadores ´unicos ordenables. La complejidad espacial es de orden logar´ıtmico.
Trejo-S ´anchez y Fern ´andez-Zepeda (2012) presentan un algoritmo para encontrar el conjunto 2-packing maximal en un grafo tipo cactus. El grafo tipo cactus es aquel en que cada arista a lo m ´as puede pertenecer a un ciclo. Su algoritmo hace uso de la elecci ´on de l´ıder para los grupos de v ´ertices dentro del grafo y de un retraso para poder actualizar los vecinos de un v ´ertice antes de cambiarlo, ya que el calendarizador utilizado es el s´ıncrono. Este algoritmo corre en O(D) rondas, donde D es el di ´ametro del cactus. El espacio requerido es de orden logar´ıtmico.
Ding et al.(2014) presentan un algoritmo con convergencia segura para encontrar el conjunto 2-packing maximal, el cual asegura que la estabilidad no se pierde durante el intervalo de convergencia. En su algoritmo se encuentra un conjunto 2-packing en tres rondas (utiliza el calendarizador s´ıncrono), pero no necesariamente maximal. Despu ´es de O(n) rondas, encuentra un conjunto 2-packing maximal, sin romper la estabilidad en ning ´un momento.
Para el caso del k-packing m ´aximo, Mjelde (2004) propone un algoritmo basado en programaci ´on din ´amica que resuelve este problema en ´arboles en tiempo lineal. Tambi ´en dise ˜na un algoritmo auto-estabilizante para el mismo problema, el cual se ejecuta en
O(n3)movimientos. Estos algoritmos pueden modificarse para generar la soluci ´on a una variante con pesos en los v ´ertices, y el tiempo de ejecuci ´on se mantiene.
1.4 Objetivo general
El objetivo general de este trabajo es analizar la factibilidad de dise ˜nar algoritmos auto-estabilizantes para resolver el problema del conjunto independiente fuerte con peso m ´aximo en uniciclos en tiempo polinomial.
1.4.1. Objetivos espec´ıficos
1. Analizar y dise ˜nar un algoritmo secuencial para resolver en tiempo polinomial el problema del conjunto independiente fuerte con peso m ´aximo en grafos cactus.
2. Implementar el algoritmo anterior en un lenguaje de programaci ´on.
3. Dise ˜nar un algoritmo auto-estabilizante para resolver el problema en uniciclos en tiempo polinomial o justificar su dificultad.
1.5 Organizaci ´on de la tesis
Cap´ıtulo 2.
2-packing con peso m ´aximo en cactus
A partir de este cap´ıtulo se har ´a referencia al algoritmo MAXIMUM-2-PACK-CACTUS
presentado en (Flores-Lamas et al., 2018) comoF, y al algoritmo con las adaptaciones para encontrar el conjunto 2-packing con peso m ´aximo en cactus comoG. A continuaci ´on se presenta un esquema del funcionamiento y una breve descripci ´on de cada uno de los pasos del algoritmoF. M ´as adelante se explica con detalle cada uno de ellos.
El algoritmoF toma como entrada un grafo cactusG= (V, E), dondeV es un conjunto de v ´ertices yE es un conjunto de aristas de la formae= (x, y), dondex, y ∈V. Adem ´as, el grafo G es un cactus, es decir, cumple la propiedad de que cada par de ciclos en G
comparten a lo m ´as un v ´ertice.
2.1 Esquema general del algoritmo F
Figura 2: Diagrama general del algoritmoF.N es la cantidad de bloques generados en el ´arbol de bloques.
Para cada uno de los bloquesBi,icomenzando desde 0hastaN −1, se inicializan
las tablas del bloque, y se procesa como cliqu ´e o como ciclo, dependiendo del tipo de bloque que sea (ver Figura 2). Cada uno de los v ´erticesvde un bloque tiene una tabla, en la que se guarda la mejor configuraci ´on hastav, es decir, la mejor soluci ´on si solamente existieran v y sus v ´ertices descendientes. Como el algoritmo funciona utilizando programaci ´on din ´amica, la tabla tiene informaci ´on de hasta distancia tres dev, lo que permite combinar soluciones actuales con las ´optimas hasta ese punto.
• Si el bloque es un cliqu ´e de tama ˜no dos, se procesan las tablas del v ´ertice m ´as alejado de la ra´ız y despu ´es del v ´ertice restante, en ese orden. El valor de las celdas de la tabla dependen de los bloques descendientes concurrentes a cada v ´ertice.
• Si el bloque no es cliqu ´e de tama ˜no dos, entonces es un ciclo, por lo que se realiza un procedimiento para calcular el mejor ´arbol posible, removiendo una a una las aristas del ciclo, y verificando que no haya conflictos al regresar la arista removida a su lugar.
Al terminar de procesar el bloque N −1 o bloque ra´ız, la soluci ´on al problema del conjunto 2-packing en el cactus se encuentra en el v ´ertice ra´ız del bloqueBN−1.
2.2 Pseudoc ´odigos
El algoritmoFse compone de 11 rutinas opseudoc ´odigos(ver Ap ´endice A). Cada uno de ellos contiene una rutina que realiza una tarea espec´ıfica en el algoritmo. Durante este trabajo se referencian dichos pseudoc ´odigos y rutinas para la explicaci ´on del algoritmo
G, as´ı como para el algoritmo auto-estabilizante, ya que muchas de las acciones son
semejantes. A continuaci ´on se detallan cada uno de los procesos mencionados.
2.3 Creaci ´on del ´arbol de bloques
corresponde a un bloque, y dos v ´ertices est ´an unidos por una arista si los dos bloques correspondientes comparten un v ´ertice en G. Por ello, cada v ´ertice puede aparecer en dos o m ´as bloques (ver Figura 3(c)).
(a) GrafoG (b) Bloques deG
(c) Grafo de bloquesG0 (d) ´Arbol de bloquesTB
Figura 3: Creaci ´on del ´arbol de bloques. (a) el grafo original; (b) se identifican los bloques, en rojo aparece el nombre que se les asigna, que es igual al orden en que fueron encontrados; (c) la creaci ´on del grafo de bloques; (d) el ´arbol de bloques donde se ve en azul la numeraci ´on de cada bloque.
Se escoge un bloque arbitrario BLy se genera un ´arbol de bloques TB enraizado en
enG0, donde el primer bloque recorrido esB0, el siguienteB1, etc., y la ra´ız del ´arbol de bloques esBN−1, dondeN es el n ´umero total de bloques (Figura 3(d)).
En cada bloqueBi se asigna un v ´ertice ra´ız. Este v ´ertice es el que se comparte con el
bloque padre deBi parai < N−1. Parai=N−1(el bloque ra´ız), el v ´ertice ra´ız es el que
tiene el identificador menor. Por ejemplo, en la Figura 3(b), el bloque BL6 se encuentra conformado por los v ´ertices 5y 9, BL4 por los v ´ertices 5 y 6, y BL9 por los v ´ertices 5 y
3. En la Figura 3(d), BL4 (B6) es el padre de BL6 (B5), por lo que el v ´ertice ra´ız de BL6 (B5) es el v ´ertice que tienen en com ´un, en este caso, el v ´ertice5. Asimismo,BL9 (B7) es padre de BL4 (B6), por lo que el v ´ertice en com ´un entre ambos bloques es5, el cual es el v ´ertice ra´ız deBL4 (B6).
Tambi ´en dentro de cada bloque se numeran los v ´ertices. Para un cliqu ´e, el v ´ertice ra´ız tiene numeraci ´on0, y 1para el v ´ertice restante; estos v ´ertices reciben el nombre de superior e inferior, respectivamente. Para un ciclo con k v ´ertices, ´estos se numeran en sucesi ´on comenzando en0con el v ´ertice ra´ız. Al vecino de la ra´ız en el ciclo con menor identificador se le asigna 1, y en esa direcci ´on se contin ´ua hasta terminar con el otro vecino de ciclo del v ´ertice ra´ız, el de identificador mayor, que se numerak−1. La Figura 4 contiene un ejemplo de esta numeraci ´on.
5
3
vertex number= 0
2
vertex number = 1
7
vertex number= 2
9
vertex number= 3
6
vertex number = 4
2.4 Inicializaci ´on de las tablas
Existe una tabla auxiliar para cada v ´ertice de cada bloque, de cuatro renglones y tres columnas para la ra´ız del bloque, y de tres renglones y dos columnas para los v ´ertices restantes. La nomenclaturaTvi,j[r][c]indica la celda en el rengl ´onry columnacen la tabla
del v ´ertice con numeraci ´onj dentro del bloquei, y en ella se mantiene la mejor soluci ´on posible hasta dicho v ´ertice. Cada celda contiene tres campos, llamadoskey,setydist. El primero indica la cardinalidad de la soluci ´on guardada, el segundo contiene el conjunto de v ´ertices de dicha soluci ´on, y el tercero la distancia m´ınima desde vi,j hacia el v ´ertice
m ´as cercano contenido en la soluci ´on.
En la celda Tvi,j[r][c], r corresponde al rengl ´on, que indica que la soluci ´on contenida
se encuentra a una distancia de al menosr aristas del v ´ertice vi,j. Por ejemplo, si r = 2,
los v ´ertices contenidos en la soluci ´on de la celda est ´an a distancia dos o m ´as de vi,j.
En cambio,ccorresponde a la columna de la tabla, que indica los descendientes que se toman en cuenta para la soluci ´on. La columna 0 considera al v ´ertice vi,j y a todos los
bloques descendientes devi,j. La columna1considera al v ´ertice vi,j, a todos los bloques
descendientes devi,j, as´ı como a los v ´ertices descendientes de vi,j en el bloqueiy sus
bloques descendientes. Finalmente, la columna2, que es exclusiva de las ra´ıces de los bloques, considera la mejor soluci ´on del bloque i y todos los bloques descendientes a
´este. En la Figura 5 se muestra un ejemplo de estas columnas y renglones.
vi,j+2
vi,j+1 vi,j
a b c
d
Bi
(a) Fragmento de grafo
0 1
0 {2,(c, d),1) {3,(a, c, d),1}
1 {2,(c, d),1) {3,(a, c, d),1}
2 {1,(d),2) {2,(a, d),2}
(b) TablaT del v ´erticevi,j
Figura 5: Ejemplo extra´ıdo de (Flores-Lamaset al., 2018); (a) en l´ıneas punteadas se encuentran los subgrafos considerados para las columnas 0 de cada v ´ertice en el cicloBi; (b) para el v ´erticevi,j, su
columna 0 considera avi,j,b,cyd, mientras que su columna1contiene avi,j+1,a, yvi,j+2 tambi ´en,
as´ı como a sus descendientes.
numeraci ´on menor, por lo que se asegura que sus tablas est ´en llenas en este momento.
2.5 Procesar cliqu ´e
El procedimiento PROCESS-CLIQUE-BLOCK (ver Pseudoc ´odigo 3 del Ap ´endice A) se encarga de procesar las columnas1de las tablas de los v ´ertices de un cliqu ´e, as´ı como la columna2del v ´ertice ra´ız.
La columna 1 del v ´ertice inferior es id ´entica a la columna 0, ya que ´este no tiene descendientes en el bloque. La columna1del v ´ertice superior se calcula combinando su columna0y la columna 1del v ´ertice inferior, de tal manera que las soluciones de ambas celdas no incurran en conflicto, es decir, que los v ´ertices mantengan una distancia m´ınima de tres entre ellos.
2.6 Procesar ciclo
El procedimiento PROCESS-CYCLIC-BLOCK (ver Pseudoc ´odigo 7 del Ap ´endice A) se
encarga de procesar las columnas1de las tablas de los v ´ertices de un ciclo, as´ı como la columna2del v ´ertice ra´ız.
Seak la cantidad de v ´ertices en el ciclo actuali; este n ´umero es igual a la cantidad de aristas en dicho bloque. Se enumeran las aristas de la siguiente manera: la arista entre los v ´ertices vi,j y vi,j+1 es la aristaj, y la arista entre los v ´erticesvi,k−1 y vi,0 es la arista
k−1.
Para llenar las tablas, es necesario realizar el procedimiento MAXIMUM-2-PACK-TREE
(ver Pseudoc ´odigo 4 del Ap ´endice A), el cual calcula el conjunto 2-packing para un ´arbol. Si se omite la existencia de una de las aristas, el ciclo se puede considerar como un ´arbol, y es posible utilizar el procedimiento mencionado. Sin embargo, este procedimiento puede encontrar una soluci ´on inv ´alida para el ciclo, ya que al reconsiderar la arista omitida puede existir un par de v ´ertices que se encuentren a distancia menor a tres. Lo anterior se arregla con otro procedimiento llamado CORRECT-CONFLICT(ver Pseudoc ´odigo 9 del Ap ´endice A), el cual se detalla m ´as adelante. Entonces, aplicar este m ´etodo a cada una de las aristas, y de todas las soluciones encontradas se conserva la mejor, encontrando as´ı la mejor soluci ´on al ciclo.
2.6.1. Maximum-2-Pack-Tree
Seah la arista que se omite durante este proceso. Al quitar esta arista, se puede ver al ciclo como un ´arbol con dos ramas, donde la ra´ız es el v ´ertice0, y la rama “izquierda” comprende desde el v ´ertice1al v ´erticeh, y la rama “derecha” desde el v ´erticek−1hasta el v ´ertice h + 1. Las excepciones son cuando h = 0, donde solamente existe la rama derecha, yh = k−1donde solamente existe la rama izquierda. Enfoque su atenci ´on en el caso0< h < k−1, donde existen dos ramas.
un v ´ertice sin descendientes dentro del mismo bloque. Esta hoja se puede considerar de la misma manera que al v ´ertice inferior de un cliqu ´e, por lo que calcular la columna 1
se realiza de manera similar, copiando la columna 0. Los dem ´as v ´ertices de las ramas, llamados v ´ertices internos, se pueden considerar como los v ´ertices superiores de un cliqu ´e, por lo que la columna1tambi ´en se calcula de forma parecida: utilizando su propia columna0y la columna1de su descendiente en el bloque. Cabe resaltar que si el v ´ertice interno i se encuentra en la rama izquierda, su descendiente es i+ 1, y es i−1 si se encuentra en la rama derecha.
Finalmente, el v ´ertice ra´ız calcula la mejor soluci ´on combinando ambas ramas y su propia columna0. Ahora, si se reconsideran los casos h= 0 yh = k−1donde s ´olo hay una rama, la ra´ız simplemente combina la rama existente y su columna0.
2.6.2. Adapt-For-Unicycle
El procedimiento ADAPT-FOR-UNICYCLE(ver Pseudoc ´odigo 8 del Ap ´endice A) verifica si la soluci ´on encontrada por la ra´ız contiene v ´ertices a distancia menor a tres entre ellos al considerar la aristah. Existen cinco tipos de conflictos, los cuales se muestran en la Figura 6.
Si existe alguno de estos casos, se utiliza la siguiente rutina, CORRECT-CONFLICT.
2.6.3. Correct-Conflict
vf
vg
vh
v0f
v0g
v0h
h Bi
(a) X1
vf
vg
vh
v0f
v0g
v0h
h Bi
(b) X2
vf
vg
vh
v0f
v0g
v0h
h Bi
(c) X3
vf
vg
vh
v0f
v0g
v0h
h Bi
(d) X4
vf
vg
vh
v0f
v0g
v0h
h Bi
(e) X5
Figura 6: Los 5 diferentes conflictos, seg ´un el algoritmoF.
vez que ambos casos se hayan resuelto, la mejor soluci ´on de ambas ramas se propone como soluci ´on a la recursi ´on anterior. La Figura 7 muestra un ejemplo de este proceso.
vf
vg
vh
v0f
v0g
v0h
h Bi
(a) ConflictoX1
vf
vg
vh
v0f
v0g
v0h
h Bi
(b) Sub ´arbol 1
vf
vg
vh
v0f
v0g
v0h
h Bi
(c) Sub ´arbol 2
vf
vg
vh
v0f
v0g
v0h
h Bi
(d) Soluci ´on sub ´arbol 1
vf
vg
vh
v0f
v0g
v0h
h Bi
(e) Soluci ´on sub ´arbol 2, con conflictoX3
Figura 7: Ejemplo de correcci ´on de conflicto.
2.6.4. Soluci ´on del ciclo
Una vez aplicado el procedimiento MAXIMUM-2-PACK-TREE a cada una de las aristas
del ciclo, as´ı como sus respectivas correcciones de conflicto, se tienenk soluciones dis-tintas almacenadas en la ra´ız del ciclo, cada una con cuatro renglones. Para cada uno de los renglones r, se calcula la mejor soluci ´on de todas y se guarda en la columna 2 del rengl ´onr, como la mejor soluci ´on hasta el ciclo actual, a distanciar de la ra´ız.
Esta columna2es la que se utiliza en el procedimiento de inicializaci ´on de tablas del padre del ciclo, en caso de existir.
2.7 Soluci ´on global
Al terminar de procesar todos los bloques, el v ´ertice ra´ız del ´ultimo bloque o bloque ra´ız contiene en su columna 2 del rengl ´on 0 la mejor soluci ´on encontrada en el cactus. Esta soluci ´on representa un conjunto 2-packing m ´aximo en este grafo. La ´ultima rutina del algoritmo F es distribuir la soluci ´on, que le indica a todos los v ´ertices su estado dentro de la mejor soluci ´on, ´esto es, si son parte del conjunto 2-packing o no.
2.8 Contribuci ´on al algoritmo
Al algoritmo F se le hicieron algunas modificaciones, algunas de ellas como correc-ciones que necesitaba para funcionar correctamente, y otras como adaptacorrec-ciones para resolver el problema del conjunto 2-packing con peso m ´aximo. Las adaptaciones se men-cionan a continuaci ´on:
2.8.1. Adaptaciones
El Pseudoc ´odigo 2 (ver ap ´endice A), INITIALIZE-BLOCK-TABLES, inicializa las tablas
de los bloques a una configuraci ´on predeterminada, dependiendo de los bloques descendientes a cada v ´ertice. Si el grafo de entrada tiene asignados pesos a los v ´ertices, se puede cambiar en la l´ınea 19 al1por el peso del v ´erticevi,j, por lo que
El campo conjunto de cada una de las celdas de las tablas contiene una lista de los v ´ertices que se encuentran en la soluci ´on para dicha celda. Esta lista se trans-mite de una celda a otra, por lo que realizar operaciones con las celdas puede ser costoso, y adem ´as utilizar memoria adicional. Una alternativa es tener un n ´umero constante de apuntadores para cada celda, que indiquen las celdas de las cuales se obtuvo la soluci ´on, as´ı como una variable booleana que indique si el v ´ertice ac-tual se encuentra contenido dentro de la soluci ´on. Esto permite reducir el orden del espacio de almacenamiento de O(n)aO(1). Para obtener la soluci ´on actual es ne-cesario recorrer todos los v ´ertices a trav ´es de los apuntadores, pero esta operaci ´on solamente se realiza en la rutina ADAPT-FOR-UNICYCLE, y los ´unicos v ´ertices que se necesitan son los que se encuentran dentro del ciclo, por lo que el n ´umero de operaciones es O(k), donde k es la cantidad de v ´ertices del ciclo. Este trabajo adi-cional no afecta el tiempo de ejecuci ´on, ya que esta rutina se ejecuta una vez por cada ejecuci ´on de MAXIMUM-2-PACK-TREE, el cual tambi ´en esO(k).
2.9 Implementaci ´on
Al algoritmoF con las adaptaciones anteriores se le denomina G. Este ´ultimo se im-plement ´o en el lenguaje de programaci ´on Java. Se utiliz ´o como base una versi ´on m´ınima construida por el autor, de la cual se rescataron las estructuras para almacenar los gra-fos, los v ´ertices y las aristas, as´ı como los m ´etodos de lectura de archivos y el formato de almacenamiento de archivos de entrada y soluciones. Tambi ´en se incluy ´o un m ´etodo para resolver el problema del conjunto 2-packing m ´aximo con b ´usqueda exhaustiva, es decir, revisando todas las soluciones posibles y rescatando la mejor de ellas. Este proce-dimiento realizaO(2n·n3)operaciones donde n es la cantidad de v ´ertices del grafo, por lo que s ´olo es adecuado para valores peque ˜nos den.
2.10 Pruebas
Se realizaron pruebas para verificar que el algoritmo funcionara de manera correcta. Para ello, se program ´o un algoritmo generador de cactus aleatorio, que crea los grafos pegando “pedazos” de grafo de la siguiente manera:
Se escoge n, la cantidad de v ´ertices que tendr ´a el cactus. Se crea un arreglo Ade
n elementos, numerados de1an.
Se genera un arregloW denenteros positivos, los pesos de los v ´ertices. El elemen-to en la posici ´on icorresponde al peso del v ´ertice i, suponiendo que los v ´ertices se numeran de1an. Cada uno de los pesos se genera aleatoriamente, con distribuci ´on uniforme e independiente de los dem ´as, en un intervalo entre 1y20.
Se particiona el arregloAenkdistintos segmentos, cada segmento con al menos un elemento. Cada segmento representa a un “pedazo”. Para cada pedazo se realizan las siguientes operaciones, en el orden de izquierda a derecha dentro del arreglo:
• A cada pedazo se le asigna un bit aleatoriamente y con la misma probabilidad. Si el bit es 0, entonces el pedazo es un ciclo del tama ˜no del segmento m ´as uno, de lo contrario es una cadena del tama ˜no del segmento. La excepci ´on a esta operaci ´on es cuando el pedazo solamente contiene un elemento, y s ´olo puede ser una cadena, ya que no puede formar un ciclo.
• Si el pedazo no es el primero, entonces se asigna i como el identificador del primer v ´ertice del pedazo. Se elige arbitrariamente un entero k en el intervalo cerrado[1, i−1]. El enterokindica el identificador del v ´ertice al que se adhiere el pedazo actual.
valor entre1 e i−1 = 4, en este caso k = 3, por lo que el ciclo se adjunta al v ´ertice3
(Figura 8(c)). Note que el ciclo contiene a todos los v ´ertices del segmento actual y el v ´ertice al que se adhieren. Por ´ultimo, el tercer segmento obtiene un bit1, por lo que es una cadena de tres v ´ertices que se adjunta al v ´ertice5(Figura 8(d)).
W [7,1,3,2,1,9,10,6,4,10]
A [1,2,3,4] [5,6,7] [8,9,10]
Bit 1 0 1
i - 5 8
k - 3 5
(a) Variables y valores asignados
1 2 3 4
(b) Primer pedazo
1 2 3 4
5 6
7
(c) Segundo pedazo
1 2 3 4
5 6
7 8
9 10
(d) Tercer pedazo
Figura 8: Ejemplo de la creaci ´on de un cactus aleatorio.
2.10.1. Correcciones
En el Pseudoc ´odigo 8, que contiene la rutina ADAPT-FOR-UNICYCLE, se revisa que
la soluci ´on encontrada en el rengl ´on 0 de la ra´ız est ´e libre de conflicto, pero esto se debe realizar para todos los renglones, comenzando desde el rengl ´on 3. Por lo tanto, la rutina completa debe estar en un ciclo desde r= 3→0.
En el Pseudoc ´odigo 9, CORRECT-CONFLICT, se remueve cada uno de los dos v
´erti-ces conflictivos, uno a la vez, y la mejor soluci ´on de ambos se regresa. Si el v ´ertice conflictivo no est ´a dentro del ´arbol, es decir, esvhov0h(conflictosX1yX2), primero se debe remover del rengl ´on 1 y se compara con el rengl ´on 2, y despu ´es se rea-liza la misma operaci ´on pero con el rengl ´on 0, comparando con el rengl ´on 1. Esta operaci ´on asegura que se remueva el v ´ertice conflictivo y agregue su padre, como forma derecorrer la soluci ´on una unidad.
Cap´ıtulo 3.
Algoritmo auto-estabilizante
En este cap´ıtulo se detalla el algoritmo auto-estabilizanteZ propuesto para encontrar un conjunto 2-packing con peso m ´aximo en uniciclos. Un uniciclo es un grafo conectado con n aristas, donde n es la cantidad de v ´ertices, es decir, es un ´arbol con una arista adicional que forma exactamente un ciclo. La entrada al algoritmo Z es un uniciclo G = (V, E), con las caracter´ısticas mencionadas.
El algoritmo Z se basa en el algoritmo G. El algoritmo Z se dise ˜n ´o para simular los pasos que se siguen en G, por lo que se necesitan hacer algunas adaptaciones en el enfoque auto-estabilizante. La estrategia general que sigueZ es la siguiente:
Se elige un v ´ertice l´ıder y se crea un ´arbol de expansi ´on con ra´ız en el l´ıder.
Se identifican las aristas puente del grafo, para saber si una arista es parte de un ciclo o forma un cliqu ´e.
Se numeran los v ´ertices de ciclo de manera similar aG.
A partir del ´arbol enraizado, se calculan las tablas de los v ´ertices de la siguiente manera:
• Si el v ´ertice es una hoja, es un v ´ertice inferior en un cliqu ´e, y se calcula la tabla del bloque al que pertenece.
• Si el v ´ertice no es hoja y tiene hijos, es un v ´ertice superior de un conjunto de cliqu ´es, y se calculan las tablas de dichos bloques.
◦ Si dicho v ´ertice tiene padre con arista puente, entonces tambi ´en es v ´ertice inferior de otro cliqu ´e, y se calcula la tabla de dicho bloque.
• Si el v ´ertice es parte de un ciclo, se calculan las tablas de los diferentes ´arboles que se obtienen al remover cada una de las aristas del ciclo.
3.1 Elecci ´on de l´ıder
La elecci ´on de l´ıder y la creaci ´on del ´arbol de expansi ´on se realiza utilizando el algo-ritmo de elecci ´on de l´ıder de Datta et al. (2011b). Cada v ´ertice tiene una variable l´ıder, que indica al posible v ´ertice ra´ız, y ´esta se actualiza a lo largo del algoritmo utilizando las reglas propuestas. Al principio, cada v ´ertice actualiza su variable l´ıder con el identifi-cador del v ´ertice con menor identifiidentifi-cador en todo su vecindario cerrado, que podr´ıa ser ´el mismo. Este proceso se repite progresivamente con algunas variantes, y al final del algoritmo, todos los v ´ertices terminan con el mismo l´ıder.
Este algoritmo de elecci ´on de l´ıder tiene como entrada un grafo arbitrario conectado, y la salida es un ´arbol enraizado, donde cada v ´erticev conoce el identificador de la ra´ız, adem ´as de tener un apuntador hacia su padre en dicho ´arbol (v.parent). Como rutina adicional al algoritmo, se realiza un paso al final que permite a cada v ´ertice tener una lista de sus v ´ertices hijo. La cantidad de movimientos realizados por el algoritmo son
O(n2)y la cantidad de rondas esO(n), dondenes la cantidad de v ´ertices del grafo.
Las reglas que utiliza este algoritmo tienen prioridad 1, lo que implica que si un v ´ertice se encuentra habilitado por alguna regla de este algoritmo y alguna otra regla de otro algoritmo, ejecutar ´a la primera. Esto evita que se ejecute el algoritmo posterior con infor-maci ´on err ´onea.
3.2 Identificaci ´on de puentes
El algoritmo utilizado para identificar puentes es el de Karaata y Chaudhuri (1999), cuya estrategia general es utilizar las aristas que no forman parte del ´arbol de expansi ´on, ya que ´estas forzosamente forman ciclos. Al encontrar dos v ´ertices unidos por dichas aristas, se propaga la informaci ´on de ambos hacia sus padres mediante sus conjuntos
S, donde se contienen los v ´ertices en el ciclo, de tal manera que la misma informaci ´on coincide en el ancestro com ´un m ´as bajo de ambos. As´ı, al final del algoritmo, dos v ´ertices
uyv se conectan por una arista puente si y solo si uno es padre del otro, y sus conjuntos
Este algoritmo de identificaci ´on de puentes tiene como entrada un grafo con un ´arbol de expansi ´on enraizado en alg ´un v ´erticer, y como salida, para cada v ´ertice, un conjunto
S. Aunque los puentes no se identifican directamente, es posible realizar un post procesa-miento que indique si alguna arista es puente o no sin realizar las operaciones anteriores. Si alg ´un v ´ertice contiene al menos una arista incidente que no es puente, entonces forma parte del ciclo, y se asigna una variable booleana en el v ´ertice llamadacycle vertexcon valor verdadero, de lo contrario se le da un valor falso. Tambi ´en se supone que existe una funci ´on llamadais bridge(u, v), que regresa un valor verdadero si la arista del v ´erticeual v ´erticev es un puente, y falso de lo contrario. Una vez realizado este procedimiento, se tiene av.children como una lista de v ´ertices hijos de v tal que la arista que los conecta es un puente, as´ı como una listav.cycle neighbors con los ids de los v ´ertices con arista puente haciav. La cantidad de movimientos requeridos esO(dn), y la cantidad de rondas que necesita el algoritmo es O(d), donde d es el di ´ametro del componente biconectado m ´as grande del grafo. En este casod=O(n).
Las reglas de este algoritmo tienen prioridad 2, por lo que se ejecutan siempre y cuando no haya reglas habilitadas al mismo tiempo del algoritmo de elecci ´on de l´ıder.
3.3 Maximum-2-Packing-SetZ
3.3.1. Variables
Para la ejecuci ´on del algoritmoZ, se necesitan algunas variables para cada v ´erticev, las cuales se describen a continuaci ´on:
v.error: Variable booleana que indica si existe alg ´un error en las tablas de v, o en alguno de los hijos de v.
v.children: Arreglo de tama ˜no r con apuntadores hacia los r hijos de v con arista puente.
v.table children {id}: Tabla auxiliar del v ´ertice superior del cliqu ´e conformado por los v ´erticesv yid, dondeides el identificador de uno de sus hijos. El v ´erticev tiene
v.last child completed: Entero que indica el ´ındice de la ´ultima tablav.table children id
llenada porv.
v.table up: Tabla auxiliar del v ´ertice inferior del cliqu ´e formado por los v ´erticesv y
v.parent.
v.completed: Variable booleana que indica si el v ´erticev ya est ´a procesado, es decir, ya tiene la soluci ´on de acuerdo a los v ´ertices adyacentes.
v.solution: Apuntador a la celda de la soluci ´on contemplada por el algoritmo.
Nota: los v ´ertices pueden ser v ´ertice superior de varios cliqu ´es y v ´ertice inferior de otro cliqu ´e distinto. La Figura 9 ilustra cinco v ´ertices, tres de ellos hoja(c, d, e). El v ´ertice
bes v ´ertice superior de tres cliqu ´es distintos (b-c,b-d,b-e), y v ´ertice inferior de otro cliqu ´e (a-b), donde el v ´erticea es v ´ertice superior.
a
a.table up
a.table children b
b
b.table up
b.table children c
b.table children d
b.table children e
c
c.table up
d
d.table up
e
e.table up
Figura 9: Ejemplo de las tablas de cliqu ´es.
Las siguientes variables son de utilidad s ´olo para los v ´ertices que pertenezcan a alg ´un ciclo:
v.cycle error {h}: Variable booleana que indica si existe alg ´un error en la tabla del ciclo en la recursi ´on h. Nota: el valor dehesO(n).
v.cycle number: Entero que indica la numeraci ´on, a nivel del bloque, del v ´ertice v
dentro del ciclo al que pertenece.
v.numeration error: Variable booleana que indica si existe alg ´un error en la nume-raci ´on del v ´ertice v en el ciclo.
v.cycle successor: Apuntador hacia el sucesor dev en el ciclo.
v.cycle antecessor: Apuntador hacia el antecesor dev en el ciclo.
v.current tree: Entero que indica la arista h que se est ´a removiendo actualmente en el ciclo para crear el ´arbol de expansi ´on durante la ejecuci ´on del procedimiento MAXIMUM-2-PACKING-TREE.
v.current h: Expresi ´on compuesta para indicar la recurrencia que se est ´a calculando al corregir los conflictos del ´arbol de expansi ´on durante el procedimiento ADAPT -FOR-UNICYCLE.
v.table cycle {h}: Tabla auxiliar del v ´erticeven el ´arbol de expansi ´on en la recurren-ciahde correcci ´on de conflictos.
v.{h} vg, v.{h} vf, v.{h} vh: Identificadores de los v ´ertices vg, vf yvh de la recu-rrenciahde correcci ´on de conflictos, como indica la Figura 6.
v.{h} v0g, v.{h} v0f, v.{h} v0h: Identificadores de los v ´ertices v0g, v0f y v0h de la recurrenciahde correcci ´on de conflictos, como indica la Figura 6.
v.{h} conf lict: Entero del0 al5 que indica el identificador del conflicto que se pre-sent ´o en la recurrencia h de correcci ´on de conflicto. El valor0 indica sin conflicto, del1al5son los mismos presentados en la Figura 6.
3.3.2. Funciones
una de ellas se encuentra en el Ap ´endice B.
error(v): Funci ´on que devuelve el valor verdadero si un v ´ertice v se encuentra en estado de error; falso de lo contrario.
cycle error(v, h): Funci ´on que devuelve el valor verdadero si el v ´erticev del ´arbol h
de ciclo se encuentra en estado de error.
is cycle root(v): Funci ´on que devuelve el valor verdadero si el v ´ertice v es ra´ız del ciclo; falso de lo contrario.
is leaf(v): Funci ´on que devuelve el valor verdadero si el v ´erticev es una hoja en el ´arbol de expansi ´on; falso de lo contrario.
table completed(v.table): devuelve el valor verdadero si una tabla del v ´ertice v se encuentra llenada correctamente, de acuerdo a las tablas de los v ´ertices de los que depende dicha tabla; falso de otra manera. Las instrucciones de esta funci ´on se omiten por la cantidad de condiciones con las que cuenta, ya que para cada tipo de tabla es una condici ´on distinta.
table enabled(v): Funci ´on que devuelve el valor verdadero si el v ´erticev puede llenar alguna tabla de v ´ertice superior de cliqu ´e.
children blocks completed(v): Funci ´on que devuelve el valor verdadero si todos los bloques hijo de v ya terminaron de calcular sus tablas; falso de otra manera.
correct numeration(v): Funci ´on que devuelve el valor verdadero si el v ´ertice v se encuentra numerado correctamente en el ciclo; falso de otra manera.
antecessor correct(v): Funci ´on que devuelve el valor verdadero si el v ´erticev tiene un antecesor en el ciclo correctamente numerado; falso de otra manera.
conf lictive vertices correct(v, h): Funci ´on que regresa el valor verdadero si para el v ´ertice v se encuentran correctamente indicados los identificadores de los v ´ertices
check conf lict lef t(v, h): Funci ´on que revisa si existe conflicto entre alguno de los v ´ertices vf,vgyvhcon alguno de los v ´ertices v0f,v0g yv0hdel v ´ertice adyacente al otro lado de la arista removida h. Regresa un entero del1al 5si existe alg ´un error, conforme al algoritmoG; regresa0en caso de que no exista error.
check conf lict right(v, h): Funci ´on que revisa si existe conflicto entre alguno de los v ´ertices v0f,v0g yv0hcon alguno de los v ´erticesvf,vgyvhdel v ´ertice adyacente al otro lado de la arista removida h. Regresa un entero del1al 5si existe alg ´un error, conforme al algoritmoG; regresa0en caso de que no exista error.
vertex conf lict(v, h): Funci ´on que regresa el n ´umero del conflicto, dependiendo de la ubicaci ´on dev en el ´arbol.
special case(v, h, conf lict): Funci ´on que revisa si existe un caso especial al corregir el conflicto, en cuyo caso devuelve el valor verdadero; falso de lo contrario.
has to deactivate(v, h, conf lict): Funci ´on que devuelve el valor verdadero si el v ´erti-ce v debe desactivar alg ´un v ´ertice dependiendo del conflicto y lah actual; falso de lo contrario.
vertex deactivated(v, h, conf lict): Funci ´on que devuelve el valor verdadero si el v ´erti-cev ya se desactiv ´o en el conflicto yhactual; falso de lo contrario.
conf lict correct(v): Funci ´on que devuelve el valor verdadero si el v ´ertice v se en-cuentra habilitado para calcular la tabla de su conflicto correspondiente; falso de lo contrario.
3.3.3. Reglas
Regla E. Regla de error: permite detectar errores de las tablas y de numeraci ´on de los v ´ertices de ciclo, y restablece variables para su correcci ´on. Considera los casos para errores en el ciclo, que propaga el error en el ciclo en caso de que exista; el caso de errores en las tablas, que propaga el error en alguno de los hijos del v ´erticev; y error en la numeraci ´on, en caso de que el v ´ertice no se encuentre correctamente numerado.
Regla PC. Regla para procesar cliqu ´e: calcula las tablas de los v ´ertices inferior y superior de cliqu ´es. Considera los casos cuando el v ´ertice es una hoja, donde se calcula la tablatable up; cuando el v ´ertice es un v ´ertice inferior de cliqu ´e y no es hoja, donde se calcula la tabla table up; y cuando es v ´ertice superior de cliqu ´e, donde se calculan las tablastable children {id}.
Regla NC. Regla de numeraci ´on de ciclo: asigna la numeraci ´on a los v ´ertices que forman parte del ciclo. Considera el caso cuando el v ´ertice es la ra´ız del ciclo, donde se le asigna el n ´umero0y se asignan el sucesor y antecesor del ciclo; y el caso de los dem ´as v ´ertices del ciclo, donde se asigna la numeraci ´on correspondiente, el sucesor y antecesor del ciclo.
Regla IC. Regla de inicializaci ´on de ciclo: calcula la primera columna de los v ´ertices de ciclo, de forma similar a los v ´ertices de cliqu ´es.
Regla M2PT. Regla del MAXIMUM-2-PACKING-TREE: calcula la columna1de los v ´erti-ces de ciclo, para los distintos ´arboles de expansi ´on al omitir una arista. Considera los casos cuandov es la hoja de la rama izquierda (cuando h =v.cycle number); cuando es la hoja de la rama derecha (h = v.cycle number −1); cuando es un v ´ertice interno de la rama izquierda (h > v.cycle number); y cuando es v ´ertice interno de la rama derecha (h < v.cycle number−1)
Regla PR. Regla de procesamiento de ra´ız: combina las soluciones de ambas ramas del ´arbol de expansi ´on de la rutina MAXIMUM-2-PACKING-TREEy calcula la columna1del v ´ertice ra´ız del ciclo.
rama izquierda y cuando se encuentra en la rama derecha. En ambos casos se propaga la soluci ´on encontrada en la ra´ız hacia las hojas para revisar si existe conflicto.
Regla AVC. Regla de asignaci ´on de v ´ertices conflictivos: asigna los v ´ertices conflicti-vosvf,vg,vh,v0f,v0g yv0hcorrespondientes ah.
Regla AC. Regla de asignaci ´on de conflicto: asigna el conflicto correspondiente a las hojas de las ramas. Considera los casos para la hoja izquierda y para la hoja derecha, de acuerdo a la Figura 6.
Regla DV. Regla de desactivaci ´on de v ´ertice: desactiva uno de los v ´ertices conflictivos para encontrar una soluci ´on al conflicto.
Regla CC. Regla de correcci ´on de conflicto: calcula las columnas 1 de los v ´ertices de ambas ramas de manera similar a las regla M2P T, pero revisando los conflictos. Considera los casos cuando el v ´erticev es la hoja izquierda; cuando es la hoja derecha; cuando es un v ´ertice interno de la rama izquierda; y cuando es un v ´ertice interno de la rama derecha.
Regla PRC. Regla de procesamiento de ra´ız con conflicto: combina las soluciones de ambas ramas dependiendo del conflicto encontrado, de forma similar a la regla P R. Considera el caso cuando no existe conflicto; cuando existe un conflicto de caso general; cuando existe el conflicto especial1; y cuando existe el conflicto especial 2 (ver secci ´on 3.4.3.2).
Regla S. Regla de soluci ´on: propaga la soluci ´on encontrada por la ra´ız del ´arbol de expansi ´on del grafo original a los dem ´as v ´ertices y les indica si son parte del conjunto 2-packing. Considera el caso cuando el v ´ertice v es la ra´ız del ´arbol de expansi ´on del grafo original y cuando no lo es.
3.4 Explicaci ´on del algoritmo Z
este procedimiento se omite, aprovechando las caracter´ısticas del grafo obtenido a partir de los algoritmos de elecci ´on de l´ıder y de identificaci ´on de puentes:
Utilizando las aristas puente, se sabe si la arista es parte de un ciclo o de un cliqu ´e. De esta forma todos los bloques (el ciclo y los cliqu ´es) ya se encuentran definidos.
La numeraci ´on de los bloques del grafo sirve para indicar el orden en que se proce-san. La numeraci ´on ya est ´a impl´ıcita, dependiendo de c ´omo se tengan almacenados los hijos dentro de un v ´ertice. Por ejemplo, suponiendo que el v ´ertice 7tiene a sus hijos ordenados como 9,1,4en la Figura 10(a), el cliqu ´e de los v ´ertices7-9se tiene que procesar primero, despu ´es el cliqu ´e 7-1, y despu ´es el cliqu ´e 7-4, y por ´ultimo el cliqu ´e 5-7. En la Figura 10(b) se muestra la equivalencia del grafo anterior en un grafo de bloques.
5
7
9 1 4
(a)
5
7
7
4 7
1
7
9
(b)
Figura 10: Ejemplo de orden de bloques.
3.4.1. Procesamiento de cliqu ´es
a
a.table up
a.table children b
a.last children completed= 0
b
b.table up
b.table children c
b.table children d
b.table children e b.last children completed= 0
c
c.table upd
d.table upe
e.table up (a)a
a.table upa.table children b
a.last children completed= 0
b
b.table up
b.table children c
b.table children d
b.table children e b.last children completed= 0
c
c.table upd
d.table upe
e.table up (b)a
a.table upa.table children b
a.last children completed= 0
b
b.table up
b.table children c
b.table children d
b.table children e b.last children completed= 1
c
c.table upd
d.table upe
e.table up (c)a
a.table upa.table children b
a.last children completed= 0
b
b.table up
b.table children c
b.table children d
b.table children e b.last children completed= 1
c
c.table upd
d.table upe
e.table up (d)a
a.table upa.table children b
a.last children completed= 0
b
b.table up
b.table children c
b.table children d
b.table children e b.last children completed= 1
c
c.table upd
d.table upe
e.table up (e)a
a.table upa.table children b
a.last children completed= 0
b
b.table up
b.table children c
b.table children d
b.table children e b.last children completed= 2
a
a.table up
a.table children b
a.last children completed= 0
b
b.table up
b.table children c
b.table children d
b.table children e
b.last children completed= 3
c
c.table upd
d.table upe
e.table up (g)a
a.table upa.table children b
a.last children completed= 0
b
b.table up
b.table children c
b.table children d
b.table children e
b.last children completed= 3
c
c.table upd
d.table upe
e.table up (h)a
a.table upa.table children b
a.last children completed= 1
b
b.table up
b.table children c
b.table children d
b.table children e
b.last children completed= 3
c
c.table upd
d.table upe
e.table up (i)a
a.table upa.table children b
a.last children completed= 1
b
b.table up
b.table children c
b.table children d
b.table children e
b.last children completed= 3
c
c.table upd
d.table upe
e.table up (j)Figura 11: Ejemplo de procesamiento de cliqu ´es.
La regla P C contempla tres casos: en el primer caso se encarga de las tablas de los v ´ertices hoja, y se calculan todas las columnas con la configuraci ´on nula que se presenta enG. El segundo caso calcula las tablas de los v ´ertices inferiores no hoja, con instruccio-nes similares a las mostradas en el Pseudoc ´odigo 2 (ver Ap ´endice A). En ambos casos, las tablas que se calculan sonv.table up. El tercer caso calcula las tablas de los v ´ertices superiores, una tabla a la vez, de todas las que forman parte dev.table children {id}. Uti-liza la funci ´ontable enabled, que permite saber si la ´ultima tabla ya se ha calculado para continuar con la siguiente.
tablab.table children c con el tercer caso de la regla P C, ya que su primer hijo ya llen ´o su tabla table up. De 11c) a 11(d) se llena e.table up con el primer caso de la regla P C. La tablab.table children dno se puede llenar porqued.table upa ´un no se ha llenado. De 11(d) a 11(e) se llena d.table up con el primer caso de la regla P C. De 11(e) a 11(f) ya es posible llenarb.table children d, lo cual se hace con el tercer caso de la reglaP C. De 11(f) a 11(g) se llena de manera similarb.table children e. En 11(h) ya est ´an llenas todas las tablas de b como v ´ertice superior de cliqu ´e, por lo que se llena su tabla de v ´ertice inferior en el cliqu ´e a-b, la tabla b.table up, con el segundo caso de la regla P C. En 11(i) se llena la tabla a.table children bcon el tercer caso de la regla P C. Por ´ultimo, en 11(j) se llenaa.table upcon el segundo caso de la regla P C.
3.4.2. Numeraci ´on del ciclo
Los v ´ertices que se encuentran en el ciclo deben estar numerados para poder calcular las tablas de los distintos ´arboles. Esta numeraci ´on se realiza de manera similar al men-cionado en G, asignando un entero no negativo a la variable cycle number cada uno de los v ´ertices, comenzando en cero para la ra´ız del ciclo, e incrementando hacia el lado del vecino del ciclo con el menor identificador, terminando con el otro vecino.
La ra´ız del ciclo se encuentra con la funci ´on is cycle root(v). Un v ´ertice es ra´ız del ciclo si pertenece a un ciclo, y la arista a su padre es un puente (es el v ´ertice de mayor altura en el ´arbol) o si no tiene padre, en cuyo caso tal v ´ertice tambi ´en es la ra´ız del ´arbol de expansi ´on del grafo original.
La numeraci ´on se realiza con la regla N C, que contempla dos casos. El primer caso numera al v ´ertice ra´ız del ciclo, mientras que el segundo caso numera a los restantes. Estos dos casos utilizan la funci ´oncorrect numeration, que verifica que un v ´ertice se en-cuentre correctamente numerado; el segundo caso utiliza una funci ´on adicional llamada
3.4.3. Procesamiento del ciclo
Las columnas0de los v ´ertices pertenecientes al ciclo se calculan usando la reglaIC, la cual es muy parecida al segundo caso de la reglaP C, pero adaptada para v ´ertices de ciclo.
Como se menciona enG, el algoritmo remueve cada arista del ciclo una a la vez, ge-nerando un ´arbol, y calculando la mejor soluci ´on de dicho ´arbol. Despu ´es se verifica que no existan conflictos al conectar el ´arbol, en cuyo caso se resuelve recorriendo los v ´erti-ces. El algoritmoZ funciona de una manera similar. Los diferentes ´arboles se calculan de manera secuencial, es decir, primero cuando se remueve la primera arista, se corrigen los errores en caso de que existan, se calcula la mejor soluci ´on, y despu ´es prosigue a remover la segunda arista y repetir el proceso hasta la ´ultima arista.
3.4.3.1. Maximum 2-packing tree
Seahel ´ındice de la arista que se remueve, siendo0la arista entre la ra´ız del ciclo y el v ´ertice con numeraci ´on1en el ciclo, la arista1entre los v ´ertices1y2, y as´ı sucesivamente hasta terminar con la aristak−1 entre el ´ultimo v ´ertice y la ra´ız del ciclo, dondek es el n ´umero de v ´ertices en el ciclo. Cuando se remueve la arista h, se llama rama izquierda
a los v ´ertices 0,1,2, ..., h, con sus respectivas aristas intermedias, y rama derecha a los v ´erticesh+ 1, h+ 2, ..., k−1,0, tambi ´en incluyendo las aristas entre dichos v ´ertices.
El c ´alculo del ´arbol, al remover la aristah, se realiza con la reglaM2P T, mientras que la reglaP R procesa al v ´ertice ra´ız para combinar las soluciones de ambas ramas.
La reglaM2P T contempla cuatro casos. El primer caso realiza el c ´alculo de los v ´erti-ces internos de la rama izquierda; el segundo caso pro´erti-cesa el v ´ertice hoja de la rama izquierda; el tercer caso procesa el v ´ertice hoja de la rama derecha; el cuarto caso reali-za el c ´alculo de los v ´ertices internos de la rama derecha.
Una vez que todos los v ´ertices, excepto la ra´ız, hayan calculado su columna 1, es el turno del ´ultimo v ´ertice de procesar ambas ramas. Esta operaci ´on se realiza con la regla
P R, calculando el mejor ´arbol con operaciones similares a las del Pseudoc ´odigo 5 deF.
En la Figura 12 se muestra el proceso para un ciclo con seis v ´ertices y removiendo la arista h = 3. Para facilitar la explicaci ´on, los n ´umeros dentro de los v ´ertices indican la numeraci ´onvertex number dentro del ciclo, no son los identificadores de los v ´ertices. Se supone que la columna0de cada v ´ertice ya se calcul ´o, as´ı como las tablas de todos los dem ´as v ´ertices descendientes de ellos. Un v ´ertice coloreado verde indica que ya se calcul ´o su tabla en la columna 1, un v ´ertice amarillo indica que est ´a habilitado para calcularse, y un v ´ertice rojo indica que no est ´a habilitado por ninguna regla del c ´alculo del mejor ´arbol y no se ha procesado. Cuando un v ´ertice est ´a amarillo, se indica la regla que lo habilita, con un n ´umero que indica el caso. El orden en que se procesan los v ´ertices en este caso es:4,3,2,1,5,0, pero es posible cualquier otro orden donde se procesen los v ´ertices de las hojas hacia arriba.
3.4.3.2. Adapt for unicycle
Una vez calculado el mejor ´arbol, se debe asegurar que no exista conflicto al colocar la aristahde vuelta al ciclo. La mejor soluci ´on hasta el momento se encuentra en la ra´ız, por lo que se debe de distribuir a los v ´ertices restantes del ciclo, para que los v ´ertices incidentes a la arista h puedan identificar si existe conflicto. Como se menciona en G, la rutina de adaptar para el uniciclo puede tener algunos niveles de recursi ´on, pero la cantidad siempre es de orden constante O(1) para cada arista h removida. En el caso del algoritmoZ es necesario tener una tabla en cada v ´ertice por cada nivel de recursi ´on con el fin de mantener la informaci ´on requerida para calcular la soluci ´on. Dichas tablas utilizan una nomenclatura especial, la cual se explica a continuaci ´on:
Las tablas del mejor ´arbol hasta el momento, propagadas por la ra´ız del ciclo hacia los dem ´as v ´ertices sin conocimiento de haber conflicto o no, se denotan con termi-naci ´on “ rx”, donde xes un entero del0al 3. Por ejemplo, cuando se calculah = 3