Post on 01-Oct-2020
Universidad de ConcepcionFacultad de Ingenierıa
Departamento Ingenierıa Informaticay Ciencias de la Computacion
Laboratorio de Hipergrafos
Memoria de Tıtulo
Autor:
Fabian Riquelme Csori
Profesor Patrocinante:
Andreas Polymeris Paravicini
Concepcion, Marzo de 2008
A mi familiay muy en particular
...a mis padres
Agradecimientos
Quiero agradecer a mi profesor patrocinante, Andreas Polymeris, por su
guıa indispensable y constante a lo largo de todo este trabajo; al profesor
Pablo Saez, por sus valiosos comentarios sobre la estructuracion del Informe;
a mis amigos, por brindarme agradables momentos de ocio cuando la in-
spiracion no llegaba; y a mi familia, por su enorme paciencia cuando la
Memoria no avanzaba, y su respetuoso silencio, cuando sı lo hacıa.
II
Cuando el agua te llega al cuello, no te preocupes si no es potable.Stanislaw Jerzy Lec
Resumen
En esta Memoria de Tıtulo se describe todo el proceso de desarrollo de
HiperLab, un software que implementa, por un lado, los operadores y algo-
ritmos basicos para la definicion del Problema de Dualidad de Hipergrafos
(el cual sabemos es sub-exponencial y CoNP , pero se desconoce hasta ahora
si es P o incluso NP ); y por el otro, ineditos Generadores de estructuras
de hipergrafos duales, las cuales, almacenadas como archivos de texto plano,
corresponden a inputs no triviales para la ejecucion de planes de testing sobre
los nuevos algoritmos creados.
HiperLab facilita el diseno e implementacion de nuevos algoritmos orien-
tados a la resolucion del Problema de Dualidad, ası como de otros problemas
relacionados. En efecto, los mismos Generadores fueron construidos utilizan-
do unicamente las herramientas proporcionadas por HiperLab, por lo que se
constituyen ası como una prueba exitosa de los alcances de las funcionali-
dades del software.
Palabras clave: Estructuras de hipergrafos; Problema de dualidad;
Complejidad computacional.
IV
Summary
This report describes the entire development process of HyperLab, a soft-
ware that implements, on the one hand, the basic operators and algorithms
for the definition of Hypergraph Duality Problem (which we know is sub-
exponential and CoNP , but it is unknown so far if it is P or NP ); on the
other hand, unpublished dual hypergraph structures Generators, which ones,
recorded as textfiles, are not trivial inputs for the execution of testing plans
about the new created algorithms.
HyperLab facilitates the design and implementation of new algorithms
aimed to resolving the Duality Problem, as well as other issues. In fact,
the generators were constructed using only the tools provided by HyperLab,
there for it is constituted a successful test of the scope of the features of the
software.
Keywords: Hypergraph structures; Duality problem; Computational
complexity
V
Indice general
Indice de Figuras VIII
Indice de Tablas IX
Lista de Sımbolos X
Introduccion XI
1. Dualidad de Hipergrafos 11.1. Complejidad algorıtmica . . . . . . . . . . . . . . . . . . . . . 11.2. Estructuras de Hipergrafos . . . . . . . . . . . . . . . . . . . . 21.3. Operadores basicos . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.1. El clutter de H: ν(H) . . . . . . . . . . . . . . . . . . . 51.3.2. El blocker de H: τ(H) . . . . . . . . . . . . . . . . . . 61.3.3. El minimal de H: µ(H) . . . . . . . . . . . . . . . . . . 71.3.4. El critical de H: σ(H) . . . . . . . . . . . . . . . . . . 81.3.5. Los slices de H: λ(H) . . . . . . . . . . . . . . . . . . . 91.3.6. Otros operadores . . . . . . . . . . . . . . . . . . . . . 10
1.4. El Problema de Dualidad . . . . . . . . . . . . . . . . . . . . . 101.4.1. Coherencia . . . . . . . . . . . . . . . . . . . . . . . . 111.4.2. Completitud . . . . . . . . . . . . . . . . . . . . . . . . 111.4.3. Dualidad . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5. El Laboratorio de Hipergrafos . . . . . . . . . . . . . . . . . . 13
2. Especificacion de Requisitos 152.1. Requerimientos funcionales . . . . . . . . . . . . . . . . . . . . 152.2. Creacion y manipulacion de estructuras . . . . . . . . . . . . . 162.3. Operadores a implementar . . . . . . . . . . . . . . . . . . . . 162.4. Algoritmos a implementar . . . . . . . . . . . . . . . . . . . . 17
VI
2.4.1. Coherencia . . . . . . . . . . . . . . . . . . . . . . . . 172.4.2. Completitud . . . . . . . . . . . . . . . . . . . . . . . . 172.4.3. Semi-completitud . . . . . . . . . . . . . . . . . . . . . 182.4.4. Lema de Chvatal . . . . . . . . . . . . . . . . . . . . . 182.4.5. Algoritmo de Khachiyan . . . . . . . . . . . . . . . . . 19
2.5. Generacion de estructuras duales . . . . . . . . . . . . . . . . 202.6. Requerimientos de HW y SW . . . . . . . . . . . . . . . . . . 212.7. Entorno de programacion . . . . . . . . . . . . . . . . . . . . . 21
3. Diseno de HiperLab 233.1. Clases del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1. La clase Harista . . . . . . . . . . . . . . . . . . . . . . 233.1.2. La clase ParHarista . . . . . . . . . . . . . . . . . . . . 243.1.3. La clase Hgrafo . . . . . . . . . . . . . . . . . . . . . . 253.1.4. La clase Estruct . . . . . . . . . . . . . . . . . . . . . . 263.1.5. Diagrama de Clases . . . . . . . . . . . . . . . . . . . . 28
3.2. Operadores implementados . . . . . . . . . . . . . . . . . . . . 283.3. Algoritmos implementados . . . . . . . . . . . . . . . . . . . . 403.4. Generadores de Estructuras Duales . . . . . . . . . . . . . . . 45
3.4.1. Generador-A . . . . . . . . . . . . . . . . . . . . . . . 463.4.2. Generador-B . . . . . . . . . . . . . . . . . . . . . . . . 49
4. Metodologıa de desarrollo 524.1. Organizacion de HiperLab . . . . . . . . . . . . . . . . . . . . 52
4.1.1. Organizacion general . . . . . . . . . . . . . . . . . . . 524.1.2. Organizacion del codigo fuente . . . . . . . . . . . . . . 53
4.2. Gestion y configuracion de cambios . . . . . . . . . . . . . . . 554.3. Plan de Testing . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.3.1. Plan de Testing General . . . . . . . . . . . . . . . . . 564.3.2. Plan de Testing de Generadores . . . . . . . . . . . . . 58
5. Testing 605.1. Testing General . . . . . . . . . . . . . . . . . . . . . . . . . . 605.2. Testing de Generadores . . . . . . . . . . . . . . . . . . . . . . 60
6. Conclusiones 70
Bibliografıa 75
A. Manual de usuario 77A.1. Como utilizar HiperLab . . . . . . . . . . . . . . . . . . . . . 77A.2. Algoritmos y Operadores de HiperLab . . . . . . . . . . . . . 78
Indice de Figuras
1.1. Diagrama de Hasse (P(A),⊆) e hipergrafo H′. . . . . . . . . . 31.2. Diagrama de Venn para H′. . . . . . . . . . . . . . . . . . . . 3
3.1. Diagrama de clases de HiperLab. . . . . . . . . . . . . . . . . 28
4.1. Arbol de directorios de HiperLab. . . . . . . . . . . . . . . . . 534.2. Prueba de ejecucion del Algoritmo de Khachiyan. . . . . . . . 574.3. Captura de pantalla de una generacion de estructura dual. . . 58
5.1. Comparacion de distribuciones de frecuencia. . . . . . . . . . . 615.2. Eficiencia algorıtmica. . . . . . . . . . . . . . . . . . . . . . . 64
VIII
Indice de Tablas
3.1. Operadores implementados en Estruct. . . . . . . . . . . . . . 313.2. Operadores implementados en Hgrafo. . . . . . . . . . . . . . 353.3. Operadores implementados en ParHarista. . . . . . . . . . . . 363.4. Operadores implementados en Harista. . . . . . . . . . . . . . 403.5. Algoritmos implementados en HiperLab. . . . . . . . . . . . . 45
5.1. Resultados promedio para ambos Generadores. . . . . . . . . . 645.2. Testing de Generador-A para |A| = 3, 5, 7. . . . . . . . . . . 665.3. Testing de Generador-A para |A| = 9, 11. . . . . . . . . . . . 675.4. Testing de Generador-B para |A| = 3, 5, 7. . . . . . . . . . . 685.5. Testing de Generador-B para |A| = 9, 11. . . . . . . . . . . . 69
IX
Lista de Sımbolos
| · | Cardinalidad de · Composicion[ · ] Conjunto de atomos de ·∅ Conjunto vacıoA Conjunto baseP(A) Conjunto potencia de A(P(A),⊆) Conjunto potencia ordenado segun la inclusionDom Dominioa, b, c Elementos del conjunto baseW , Z Elementos del conjunto potenciaxij Elemento de una matriz ubicado en fila i y columna jG Estructura generica de hipergrafos H y KH, K Hipergrafos genericosX, Y Hiperaristas de hipergrafos H y K, respectivamente0|A| Hiperarista vacıa1|A| Hiperarista igual a A=, 6= Igualdad; desigualdadν, τ , µ, σ, λ Operadores basicos: clutter, blocker, minimal, critical y
slice, respectivamente∃ Operador existencial “existe”@ Operador existencial negado “no existe”∀ Operador universal “para todo”∈, /∈ Pertenencia; no pertenencia× Producto cartesianoκ Tamano de un hipergrafo o estructura∪, ∩ Union; interseccion (de conjuntos)t, u Union; interseccion (de hipergrafos y estructuras)⊇, ⊃ “Contiene a”; “contiene estrictamente a” (conjuntos)w, A “Contiene a”; “contiene estrictamente a” (hipergrafos)⊆, ⊂ “Incluye a”; “incluye estrictamente a” (conjuntos)v, @ “Incluye a”; “incluye estrictamente a” (hipergrafos)6⊇, 6⊃ “No contiene a”; “no contiene estrictamente a”6⊆, 6⊂ “No incluye a”; “no incluye estrictamente a”ssi “si y solo si”
X
Introduccion
Un hipergrafo es un objeto matematico que puede entenderse como ungrafo cuyas aristas (aquı llamadas hiperaristas) pueden relacionar a mas dedos nodos. Su nombre fue acunado por el matematico frances Claude Berge[1], y desde entonces se ha desarrollado una extensa teorıa sobre ellos, apli-cada en distintas areas como la logica, optimizacion, teorıa de juegos, basesde datos, inteligencia artificial, entre otras [17].
Algunos problemas de hipergrafos se asemejan mucho a los de la teorıade grafos. Los problemas de coloracion, camino mas corto, cobertura, pornombrar algunos, tambien son aplicables a este contexto. Sin embargo, estamemoria esta orientada especıficamente a apoyar los intentos por resolverel llamado Problema de Dualidad de Hipergrafos, para el cual no existe unaanalogıa con la teorıa de grafos, por lo cual nos distanciaremos de los op-eradores y notaciones de esta. En [4] se demostro que este problema puederesolverse en tiempo sub-exponencial, pero se desconoce hasta ahora algunalgoritmo que pueda resolverlo en tiempo polinomial. De hecho, del punto devista de la complejidad, lo unico que se sabe es que este problema pertenecea la clase CoNP . Esto, sumado a algunas reducciones polinomiales que lohan relacionado con otros problemas interesantes, lo convierten en un desafıoimportante en la ciencia de la computacion.
Esta memoria de tıtulo describe todo el proceso de desarrollo para laobtencion del Laboratorio de Hipergrafos llamado HiperLab, un softwareque, mediante la implementacion de algoritmos y operadores matematicosrelacionados con el Problema de Dualidad, permite a los investigadores-programadores tanto la reproduccion de los algoritmos ya existentes en elarea, como el diseno de otros nuevos, concibiendo estas funcionalidades pro-porcionadas por el Software como cajas negras. Ademas, como aporte teorico-practico, incluye dos ineditos generadores de inputs para la elaboracion deplanes de testing no triviales.
XI
La estructura del informe es la siguiente: el Capıtulo 1 define formalmenteel Problema de Dualidad, los objetos matematicos y operadores basicos rela-cionados con este, y explica ademas concretamente la finalidad del Labo-ratorio y lo que se espera de el; los Capıtulos 2 y 3 describen, respectiva-mente, la especificacion de requisitos y el diseno del Software; el Capıtulo 4,la metodologıa de desarrollo utilizada; y el Capıtulo 5, la etapa de Testingen detalle. Por ultimo, se presentan las conclusiones finales de este trabajo.
Capıtulo 1Dualidad de Hipergrafos
1.1. Complejidad algorıtmica
Todos los algoritmos se pueden clasificar segun su eficiencia. Una sub-
rama de la informatica teorica, la de complejidad computacional, se encarga
de analizar el comportamiento global de cada algoritmo, para representar su
eficiencia en funcion del tamano del input con que se ejecute, y ası poder
asociarlo a una o mas clases de complejidad.
Definicion. Una clase de complejidad es un conjunto de problemas com-
putacionales cuyos tiempos de ejecucion estan acotados superiormente por
una misma funcion. Las clases mas conocidas son P y NP , conformadas por
los problemas de decision que pueden ser verificados en tiempo polinomial,
respectivamente, por maquinas de Turing deterministas y no-deterministas.
Definicion. Un problema pertenece a la clase NP -completa si es NP y
ademas NP -hard o NP -difıcil, es decir, todo problema NP es reducible a
el, o bien otro problema NP -completo lo es. La clase CoNP -completa es la
clase complementaria a la NP -completa; un problema de decision pertenece
a ella si todos los problemas CoNP son reducibles a el, y ademas si su prob-
lema planteado negativamente (con sus instancias positivas ahora negativas,
y viceversa) pertenece a NP .
El problema NP -completo por antonomasia es el Problema de Satisfabil-
1
Capıtulo 1. Dualidad de Hipergrafos 2
idad de Formulas Booleanas o SAT, para el cual no se sabe si exista algun
algoritmo capaz de resolverlo en tiempo polinomial (en efecto, aun no se
sabe si P = NP ). Actualmente, los algoritmos mas eficientes conocidos para
resolver este problema son los llamados SAT-solvers1, los cuales son todos
exponenciales, o bien solo devuelven respuestas parciales.
Definicion. Un algoritmo es exponencial si su tiempo de ejecucion esta aco-
tado por una funcion exponencial, y es sub-exponencial, si la funcion que
lo acota tiene un crecimiento menor al exponencial. Comunmente, se llama
algoritmo sub-exponencial a uno que ademas es super-polinomial.
Para resolver determinısticamente los problemas NP -completos solo se
conocen algoritmos exponenciales. De encontrarse al menos un algoritmo sub-
exponencial que resuelva un problema NP -completo, todos los demas NP -
completos pasarıan automaticamente a poder ser resueltos por algoritmos
sub-exponenciales. Sin embargo, sı existen algoritmos sub-exponenciales para
resolver problemas NP que no son NP -completos. Es por esto que a los NP -
completos se les considera los problemas mas difıciles de los NP .
Es importante senalar que el problema en el cual se basa esta Memoria
de Tıtulo pertenece a la clase CoNP y que, aunque se conoce un algoritmo
que lo resuelve en tiempo sub-exponencial, no se ha podido aun demostrar
si es NP (ni menos si es P ). Todo esto sera explicado con mas detencion en
lo que sigue.
1.2. Estructuras de Hipergrafos
Definicion. Dado un conjunto finito A, que llamaremos conjunto base, un
hipergrafo H es una familia de subconjuntos de A, de manera que H ⊆ P(A),
donde P(A) es el conjunto potencia de A. Los elementos X ∈ H se llaman
hiperaristas. El tamano de H es κ(H) := |A| · |H| ∈ N.
Segun la definicion original de [1], un hipergrafo H debe cumplir estas dos
caracterısticas:
1http://www.satlive.org
Capıtulo 1. Dualidad de Hipergrafos 3
1. Ser propio: H 6= ∅ y ∅ /∈ H.
2. Tener dominio total: Dom(H) = ∪X ∈ H = A.
Sin embargo, para efectos de este trabajo no exigiremos necesariamente
estas restricciones.
Ejemplo. Sea A = a, b, c, podemos representar el conjunto P(A) como
un grafo dirigido o Diagrama de Hasse ordenado segun la inclusion [15], y al
hipergrafo H′ = c, b, c, a, b como la familia destacada en la figura:
Figura 1.1: Diagrama de Hasse (P(A),⊆) e hipergrafo H′.
Otra representacion mas simple es mediante Diagramas de Venn, como se
muestra a continuacion:
Figura 1.2: Diagrama de Venn para H′.
Capıtulo 1. Dualidad de Hipergrafos 4
Sin embargo, una forma mas conveniente para representar hipergrafos
(pensando en su eventual manipulacion computacional) es utilizando una
matriz [2]:
H′ =
a b c∣∣∣∣∣∣∣0 0 1
0 1 1
1 1 0
∣∣∣∣∣∣∣donde cada fila corresponde a una hiperarista Xi ∈ H′ definida sobre el
conjunto base A := a1, ..., a|A|, tal que ∀i = 1, ..., |H′| y ∀j = 1, ..., |A|:
xij =
0 si aj /∈ Xi
1 si aj ∈ Xi
Definicion. Dado un conjunto base A, una estructura (de hipergrafos) es un
par ordenado G := (H,K) de dos hipergrafos H y K bajo el mismo conjunto
A [2]. G es propio si H y K son propios. G tiene dominio unico [4] y total si
Dom(H) = ∪X ∈ H = A = ∪Y ∈ K = Dom(K). El tamano de G es
κ(G) := |A| · (|H|+ |K|) ∈ N.
Ejemplo. Si del ejemplo anterior tomamos ahora K′ = b, c, a, c, A,entonces la estructura G ′ = (H′,K′) queda:
H′ =
a b c∣∣∣∣∣∣∣0 0 1
0 1 1
1 1 0
∣∣∣∣∣∣∣K′ =
∣∣∣∣∣∣∣0 1 1
1 0 1
1 1 1
∣∣∣∣∣∣∣Estas estructuras son muy utiles para comparar realidades o instancias en
paradigmas dinamicos, bajo un mismo dominio discreto de aplicacion (vease,
por ejemplo, en teorıa de juegos [2]). Ademas, sobre ellas se centra el problema
de dualidad de hipergrafos, que veremos mas adelante y que constituye la
Capıtulo 1. Dualidad de Hipergrafos 5
principal motivacion de este trabajo.
1.3. Operadores basicos
Para manipular estos objetos matematicos, se han definido diversos op-
eradores, que ayudan en la obtencion de resultados interesantes, y en la
simplificacion de definiciones y notaciones.
Definicion. Llamaremos operador a una transformacion matematica que
puede implementarse (utilizando algun lenguaje de programacion) como un
metodo que actua sobre una o mas estructuras, hipergrafos y/o hiperaristas.
Tecnicamente, para todos los operadores que seran definidos en este tra-
bajo se conocen algoritmos que pueden mecanizarlos (en algunos casos, no
polinomialmente). Sin embargo, distinguiremos estos conceptos de aquı en
adelante, refiriendonos a los algoritmos solo como procedimientos mas com-
plejos, no definibles como transformaciones matematicas.
Existen muchısimos operadores relacionados con la teorıa de hipergrafos,
no obstante, para el problema particular al que estamos abocados, destacan
cinco operadores basicos, que a continuacion explicaremos en detalle y que
podemos denotar con las letras griegas ν, τ , µ, σ y λ [2].
Considere de aquı en adelante, que G := (H,K) es una estructura de
hipergrafos H y K, sobre un conjunto base A.
1.3.1. El clutter de H: ν(H)
Definicion. El operador ν es el que aplicado sobre un hipergrafo H, genera
como salida el hipergrafo que es respondido [3] por las hiperaristas de H; es
decir:
ν(H) := W ⊆ A; ∃X ∈ H, X ⊆ W (1.1)
Capıtulo 1. Dualidad de Hipergrafos 6
Ejemplo.
a b c a b c
Sea H′ =
∣∣∣∣∣∣∣0 0 1
0 1 1
1 1 0
∣∣∣∣∣∣∣ entonces ν(H′) =
∣∣∣∣∣∣∣∣∣∣∣∣
0 0 1
0 1 1
1 1 0
1 0 1
1 1 1
∣∣∣∣∣∣∣∣∣∣∣∣Note que H ⊆ ν(H) ⊆ P(A) y que siempre A ∈ ν(H). Por otra parte,
de la matriz de H′ puede obtenerse (informal y nemotecnicamente) ν(H′),anadiendo a H′ las hiperaristas obtenidas de ir cambiando todos los 0’s por
1’s, de uno en vez y consumando todas las posibilidades hasta alcanzar la
hiperarista A.
De esto ultimo se deduce que este operador no es polinomialmente
acotable, pues en el peor caso, es decir, cuando H no es propio y ∅ ∈ H,
a partir de la hiperarista vacıa 0A es necesario anadir un numero de
hiperaristas para alcanzar el clutter que crece exponencialmente en funcion
de κ(H).
Definicion. Sean dos hipergrafos H y K, se dice que H es respondido por
K, lo que se denota H v K, si H ⊆ ν(K).
Definicion. Dada una estructura G := (H,K), se define la estructura que es
respondida por G como ν(G) := (ν(H), ν(K)).
Definicion. Sean dos estructuras G := (H,K) y G ′ := (H′,K′), se dice que
G es respondida por G ′, lo que se denota G v G ′, si H v H′ y K w K′.
1.3.2. El blocker de H: τ(H)
Definicion. El operador τ es el que aplicado sobre un hipergrafo H, genera
como salida el hipergrafo transversal a las hiperaristas de H; es decir:
τ(H) := Z ⊆ A; ∀X ∈ H, X ∩ Z 6= ∅ (1.2)
Capıtulo 1. Dualidad de Hipergrafos 7
Ejemplo.
a b c a b c
Sea H′ =
∣∣∣∣∣∣∣0 0 1
0 1 1
1 1 0
∣∣∣∣∣∣∣ entonces τ(H′) =
∣∣∣∣∣∣∣0 1 1
1 0 1
1 1 1
∣∣∣∣∣∣∣Note que τ(H) ⊆ P(A) y que, siempre y cuando H sea propio, A ∈ τ(H),
pues A es el maximo de (P(A),⊆).
Este operador tampoco es polinomialmente acotable, pues el numero de
comparaciones que el operador debe hacer para obtener todos los Z ∈ P(A)
que pertenecen a τ(H), crece exponencialmente en funcion de κ(H).
Definicion. Dada una estructura G := (H,K), se define la estructura
transversal a los hipergrafos de G como τ(G) := (τ(K), τ(H)) (y no
(τ(H), τ(K)), para favorecer la propiedad de antitonıa de τ , que no
detallaremos aquı).
1.3.3. El minimal de H: µ(H)
Definicion. El operador µ es aquel que aplicado sobre un hipergrafo H, gen-
era como salida un hipergrafo con las hiperaristas minimales o irredundantes
de H; es decir:
µ(H) := X ∈ H; ∀X ′ ∈ H, X ′ 6⊂ X (1.3)
Ejemplo.
a b c a b c
Sea H′ =
∣∣∣∣∣∣∣0 0 1
0 1 1
1 1 0
∣∣∣∣∣∣∣ entonces µ(H′) =
∣∣∣∣∣ 0 0 1
1 1 0
∣∣∣∣∣Note que µ(H) ⊆ H, y que A ∈ µ(H) ssi H = A. Por definicion, este
operador se limita a minimizar el hipergrafo H sobre el cual se aplica, sin
Capıtulo 1. Dualidad de Hipergrafos 8
interesarse (al contrario de los demas operadores de esta seccion) en los demas
W ⊆ A distintos de sus hiperaristas.
µ(H′) corresponde a los X ∈ H′ minimales de H′, segun (P(A),⊆). Ev-
identemente, µ se puede calcular con un algoritmo eficiente; en efecto, es el
unico operador basico polinomialmente acotable que se implementara.
Definicion. Dada una estructura G := (H,K), se conoce como el kernel o
nucleo minimal de G a la estructura µ(G) := (µ(H), µ(K)).
Este operador es muy util, por su polinomialidad y porque las propiedades
estructurales que nos ocuparan en la siguiente seccion se comportan de igual
manera tanto para la estructura G original como para su kernel minimal µ(G).
Definicion. Dado un hipergrafo H, si µ(H) ⊂ H, entonces decimos que Hes no-minimal o redundante.
1.3.4. El critical de H: σ(H)
Definicion. El operador σ es el que aplicado sobre un hipergrafo H, genera
como salida el hipergrafo crıtico sujeto a las hiperaristas de H; es decir:
σ(H) := Z ⊆ A; ∀a ∈ Z, ∃X ∈ H con X ∩ Z = a (1.4)
Ejemplo.
a b c a b c
Sea H′ =
∣∣∣∣∣∣∣0 0 1
0 1 1
1 1 0
∣∣∣∣∣∣∣ entonces σ(H′) =
∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣Note que σ(H) ⊆ P(A), y que siempre ∅ ∈ σ(H′), pues como ∅ carece de
elementos, no se requiere verificar el operador universal de la definicion (1.4).
Ademas, si ∪X ∈ H = Z ⊆ A, entonces ∀Y ⊆ Z, con |Y | = 1, Y ∈ σ(H);
Capıtulo 1. Dualidad de Hipergrafos 9
ası como tambien ∀Z ∈ σ(H), si Y ⊆ Z, entonces Y ∈ σ(H). Esto ultimo,
porque ∀Z ∈ σ(H), si a ∈ Z, entonces Z ′ := Z\a ∈ σ(H).
Este operador tampoco es polinomial, y al igual que τ , es un operador
antıtono.
Definicion. Dada una estructura G := (H,K), se define la estructura crıtica,
sujeta a los hipergrafos de G, como σ(G) := (σ(K), σ(H)).
1.3.5. Los slices de H: λ(H)
Definicion. El operador λ es aquel que aplicado sobre un hipergrafo H,
genera como salida el hipergrafo de slices o transversales minimales de H; es
decir:
λ(H) := (τ µ)(H) := µ(τ(H)) (1.5)
Ejemplo.
a b c a b c
Sea H′ =
∣∣∣∣∣∣∣0 0 1
0 1 1
1 1 0
∣∣∣∣∣∣∣ entonces λ(H′) =
∣∣∣∣∣ 0 1 1
1 0 1
∣∣∣∣∣Note que λ(H) ⊆ τ(H) ⊆ P(A). Este operador devuelve las hiperaristas
mınimas que tienen interseccion no vacıa con cada X ∈ H, entendiendo por
mınimas a que ∀(Z ∈ λ(H)), @Y ⊂ Z tal que Y ∈ τ(H).
Existen algoritmos no-deterministas que calculan este operador en tiem-
po polinomial. En [2], por ejemplo, se menciona uno de ellos, basado en la
asignacion de ordenes a los a ∈ A.
Definicion. Dada una estructura G := (H,K), se define la estructura de
slices o transversales minimales de G, como λ(G) := (λ(K), λ(H)).
Capıtulo 1. Dualidad de Hipergrafos 10
1.3.6. Otros operadores
Todos estos operadores pueden ser implementados mediante algoritmos
con distintas complejidades especıficas. Lo mismo ocurre con otros operadores
como v, t, u, o los atomos de una hiperarista.
Definicion. Dadas dos estructuras G := (H,K) y G ′ := (H′,K′), se define el
join o union H y K como H t K := µ(ν(H) ∪ ν(K)) := µ(H ∪ K), y el join
de G y G ′, como G t G ′ := (H tH′,K u K′) [20].
Definicion. Dadas dos estructuras G := (H,K) y G ′ := (H′,K′), se define
el meet o interseccion de H y K como H u K := µ(ν(H) ∩ ν(K)) := µ(X ∪Y ; (X, Y ) ∈ H ×K), y el meet de G y G ′, como G u G ′ := (H uH′,K t K′)[20].
Definicion. Dada una hiperarista Z ⊆ A, se definen sus atomos como el
conjunto [Z] := a; a ∈ Z. Si Z = [Z], entonces Z es atomico.
Es preciso aclarar, sin embargo, que a pesar de la no polinomialidad de ν,
τ , σ y λ, el decidir si una hiperarista pertenece o no al hipergrafo resultante
de la aplicacion de cualquiera de ellos, sı resulta polinomial. Por ejemplo,
para decidir si un Z ∈ σ(H), basta ∀a ∈ Z, recorrer linealmente H (y no
P(A)) buscando algun X ∈ H que intersecte a Z solo en a.
Estos problemas de decision tambien seran considerados operadores, ya
que cumplen la definicion dada al comienzo de la seccion.
1.4. El Problema de Dualidad
Definicion. El hypergraph duality decision problem [2] [4] [10] es un problema
de decision que consiste en verificar si dada una estructura G, esta es o no
dual. Una estructura es dual ssi es coherente y completa.
A continuacion explicaremos en detalle cada uno de estos conceptos.
Capıtulo 1. Dualidad de Hipergrafos 11
1.4.1. Coherencia
Definicion. Una estructura G es coherente si ∀(X, Y ) ∈ H×K, X ∩ Y 6= ∅;es decir, si todas las hiperaristas de H se intersectan con todas las de K.
Evidentemente, esta propiedad es polinomialmente decidible, pues basta
recorrer linealmente cada X ∈ H e ir verificando inmediatamente su inter-
seccion con cada Y ∈ K.
Ejemplo. La estructura G ′ del ejemplo de la seccion 1.2 es coherente.
Definicion. Dado un conjunto A, se define una particion sobre A como un
par (W,Z) de subconjuntos de A, tal que W ∪ Z = A y W ∩ Z = ∅.
Existen adicionalmente varias definiciones equivalentes [2], que utilizan
los operadores basicos vistos en el apartado anterior; a saber, G tambien es
coherente, ssi:
– ∀ particion (W,Z) de A, W /∈ ν(H) ∨ Z /∈ ν(K).
– ∀ particion (W,Z) de A, W ∈ τ(K) ∨ Z ∈ τ(H).
– τ(H) ⊇ ν(K), o bien ν(H) ⊆ τ(K).
– G ⊆ τ(G), o bien µ(G) ⊆ τ(G).
Por ultimo, tambien se sabe que G es coherente ssi ν(G) es coherente ssi
µ(G) es coherente.
1.4.2. Completitud
Definicion. Una estructura G es completa [2], si para toda particion (W,Z)
de A, W ∈ ν(H) ∨ Z ∈ ν(K); es decir, si al menos el W o el Z contienen
hiperaristas de G.
Este problema de decision —dado un G, ¿G es completa?— es CoNP-
completo [3] pues todos los problemas CoNP son reducibles a el, y el prob-
lema de decision de incompletitud de hipergrafos pertenece a la clase NP.
Este es el mayor obstaculo del problema de dualidad, sin embargo, como
veremos en la siguiente sub-seccion, el restringirnos a estructuras coherentes
Capıtulo 1. Dualidad de Hipergrafos 12
proporciona una ayuda importante, que mantiene hasta ahora el problema
vigente y en boga para los investigadores.
Ejemplo. La estructura G ′ del ejemplo visto en la seccion 1.2 es completa.
Decimos que G tambien es completa ssi [2] (note las semejanzas con la
propiedad anterior):
– ∀ particion (W,Z) de A, W /∈ τ(K) ∨ Z /∈ τ(H).
– τ(H) ⊆ ν(K), o bien ν(H) ⊇ τ(K).
– ν(G) ⊇ λ(G).
Ademas, tambien se sabe que G es completa ssi ν(G) es completa ssi µ(G)
es completa ssi τ(G) es coherente ssi λ(G) es coherente.
Muchos esfuerzos se han puesto en esta ultima equivalencia: en el trabajo
con las transversales minimales de las estructuras coherentes.
1.4.3. Dualidad
Como dijimos anteriormente, una estructura es dual ssi es coherente y
completa; luego, las definiciones anteriores pueden juntarse, para referirnos
a una estructura G := (H,K) como dual, ssi [1]:
– ∀ particion (W,Z) de A, W ∈ ν(H) o (exclusivo) Z ∈ ν(K).
– ∀ particion (W,Z) de A, W ∈ τ(K) o (exclusivo) Z ∈ τ(H).
– τ(G) = ν(G) (ν(H) = τ(K) y τ(H) = ν(K)).
– µ(G) = λ(G) (λ(H) = µ(K) y µ(H) = λ(K)).
Ademas, G sera dual ssi ν(G) (µ(G), τ(G), λ(G)) es dual.
De estos resultados quizas lo primero que salta a la vista es la ventaja de
trabajar con estructuras minimales, que evidentemente resultan mas sencil-
las de manipular que las originales, pueden determinarse siempre en tiempo
polinomial, y para efectos del problema, este se mantiene inalterable.
Capıtulo 1. Dualidad de Hipergrafos 13
Ejemplo. La estructura G ′ del ejemplo visto en la seccion 1.2 es coherente
y completa. Luego, es dual, y bastarıa quitar cualquier hiperarista de H o Kpara que dejara de serlo (pues dejarıa de ser completa).
En [4] se demostro que este problema es resoluble en tiempo sub-
exponencial. El desafıo actual consiste en demostrar si el problema pertenece
a la clase P, o al menos a la clase NP, lo cual tambien se desconoce.
1.5. El Laboratorio de Hipergrafos
Pero el objetivo de esta Memoria de Tıtulo no es intentar resolver el Prob-
lema de Dualidad, sino construir un Laboratorio de Hipergrafos que apoye
su investigacion.
Definicion. Entenderemos por Laboratorio a una herramienta-software que
implementa los operadores fundamentales que giran en torno a un problema
u objeto matematico particular, para a partir de ellos construir, ejecutar y
testear tanto algoritmos nuevos como otros ya existentes, que pueden o no
estar relacionados con dicho problema u objeto.
En este sentido, MATLAB1, por ejemplo, el famoso software cuyo nombre
significa justamente Matrix Laboratory (Laboratorio de Matrices), tiene como
objeto matematico particular las matrices, y sus operadores son las opera-
ciones basicas sobre estas matrices, que proporcionan el poder computacional
necesario para la resolucion de problemas, que en su caso, escapan al contexto
matricial.
HiperLab, el Laboratorio de Hipergrafos que aquı se propone, implementa
operadores que toman como objeto matematico a las estructuras de hiper-
grafos, pero intentando apoyar exclusivamente el problema particular de Du-
alidad de Hipergrafos. En efecto, los operadores del Capıtulo 1 no han sido
pensados para definir otros conocidos problemas que escapan al tema de es-
ta Memoria, como la cobertura o coloracion de hipergrafos, por mencionar
1The MathWorks - MATLABrThe Language of Technical Computing. http://www.mathworks.com/products/matlab
Capıtulo 1. Dualidad de Hipergrafos 14
algunos.
Capıtulo 2Especificacion de Requisitos
2.1. Requerimientos funcionales
El Laboratorio debera hacer lo siguiente:
1. Permitir la creacion y manipulacion de hipergrafos y estructuras.
2. Permitir la aplicacion de los operadores vistos en la seccion 1.3 tanto a
hipergrafos como a estructuras de hipergrafos.1
3. Permitir la ejecucion de algoritmos importantes para el Problema de
Dualidad, desplegando sus resultados en pantalla. Estos se describen
en detalle en la seccion 2.4.
4. Permitir la generacion de estructuras duales, que sirvan como inputs
no triviales para los algoritmos ya implementados y aquellos que even-
tualmente se implementaran. Este punto, como veremos mas adelante,
constituye un aporte teorico nuevo en el area.
Profundizaremos estos puntos en los siguientes apartados.
1Excluiremos de aquı solo al operador λ, por estar basado actualmente en el Algoritmode Khachiyan, que es el que justamente se desea mejorar.
15
Capıtulo 2. Especificacion de Requisitos 16
2.2. Creacion y manipulacion de estructuras
HiperLab debe permitir la creacion de estructuras de hipergrafos ingre-
sadas como inputs a partir de archivos de texto plano. Otras formas de
creacion con intervencion del usuario son prescindibles, dada la naturaleza
batch del sistema (ver seccion 2.6).
Esta creacion de estructuras, no obstante, implica la necesidad de crear
otros objetos matematicos mas elementales, como son los hipergrafos y las
hiperaristas. Ademas, sera necesario para el diseno de algunos algoritmos
y operadores la creacion de pares de hiperaristas que, como veremos mas
adelante, podran utilizarse tambien como particiones del conjunto base A.
Los archivos de entrada deberan tener una extension distinguible que los
diferencie de un archivo de texto cualquiera, y cada uno de ellos debera con-
tener una y solo una estructura de hipergrafos, codificada de alguna manera
analoga a la notacion matricial descrita en la seccion 1.2.
2.3. Operadores a implementar
Se implementaran los mismos operadores descritos en la seccion 1.3, en
sus versiones para hipergrafos y estructuras; es decir, µ, ν, σ, τ y λ. Adi-
cionalmente, como apoyo a estos cinco operadores, se deberan implemen-
tar otros operadores elementales, como por ejemplo, aquellos que permitan
el despliegue en pantalla de cada objeto, la comparacion entre hiperaristas
comparables, y determinar el complemento de una hiperarista.
Definicion. Dos hiperaristas X e Y bajo un mismo conjunto base A, son
comparables ssi X ⊆ Y o bien X ⊇ Y .
Definicion. Sean X e Y dos hiperaristas comparables, diremos que X ≤ Y
ssi X ⊆ Y , y que X = Y ssi X ⊆ Y y ademas X ⊇ Y .
Definicion. Dada una hiperarista X bajo un conjunto base A, el comple-
mento de X esta definido como ∼X := A\X.
Es importante recordar que cada uno de estos operadores responde a un
Capıtulo 2. Especificacion de Requisitos 17
algoritmo con una complejidad temporal especıfica, las cuales fueron expli-
citadas en la seccion 1.3.
Un requisito primordial es que la complejidad de cada operador imple-
mentado responda a su verdadera complejidad teorica. Ası, por ejemplo, el
operador µ debe ejecutarse en tiempo polinomial, y ademas lo mas eficiente-
mente posible; lo mismo que los operadores de despliegue, y de comparacion
y complemento para las hiperaristas. Los operadores ν, σ y τ , en cambio,
responden a algoritmos cuyo tiempo de ejecucion es exponencial, por lo que
es mejor optar con ellos por una implementacion clara a una que busque
ser un poco mas eficiente, ya que en estos casos cualquier pequena mejora,
para efectos de investigacion, sera despreciable. El operador λ corresponde
a un caso muy particular que esta estrechamente relacionado con el algorit-
mo sub-exponencial de Khachiyan [4] y el Problema de Dualidad, para el
cual no se sabe si exista una cota polinomial; por lo tanto, en estos casos
nos remitiremos a la mejor solucion conocida hasta ahora, y de ser posible,
procuraremos mejorarla.
2.4. Algoritmos a implementar
2.4.1. Coherencia
Ya vimos que verificar la coherencia de una estructura es un problema
que pertenece a la clase P (ver seccion 1.4.1); por lo tanto, este algoritmo
se intentara implementar de la forma mas eficiente posible. No obstante, no
bastara con retornar un SI o un NO, como se espera de cualquier problema
de decision. A los investigadores les interesa ademas que el algoritmo retorne,
en caso que la estructura NO sea coherente, cual es el par de hiperaristas
cuya interseccion es vacıa, y a que hipergrafos pertenece cada una de ellas.
2.4.2. Completitud
Verificar la completitud de una estructura, en cambio, es un problema
CoNP -completo (ver seccion 1.4.2), ası que se buscara en este caso sobre todo
una implementacion clara y lo mas analoga posible a la definicion teorica.
Capıtulo 2. Especificacion de Requisitos 18
Al igual que con la coherencia, el algoritmo debera retornar informacion
adicional, cuando la estructura NO sea completa; en este caso, cual es la
particion (W,Z) del conjunto base que no es respondida por la estructura
G := (H,K), es decir, tal que W /∈ ν(H) y Z /∈ ν(K).
2.4.3. Semi-completitud
La semi-completitud [20] es condicion necesaria (pero no suficiente) para la
completitud. Puede determinarse en tiempo polinomial, por lo que es de gran
ayuda para la construccion de algoritmos que buscan resolver el Problema
de Dualidad.
Definicion. Una estructura G := (H,K) es semi-completa ssi µ(G) ∩ τ(G)
⊆ λ(G), es decir, si µ(H)∩ τ(K) ⊆ λ(K), y ademas µ(K)∩ τ(H) ⊆ λ(H). En
una estructura completa, en cambio, µ(G) ∩ τ(G) = λ(G).
Ademas, de [20] sabemos que si G es una estructura coherente y minimal,
entonces el problema de semi-completitud para G se reduce a verificar si
G ⊆ λ(G), y puesto que λ(G) = σ(G) ∩ τ(G) (ver seccion 1.3.5), esto es
equivalente a G ⊆ σ(G), es decir, H ⊆ σ(K) y K ⊆ σ(H).
En resumen, entonces, una forma de decidir polinomialmente la semi-
completitud de una estructura, es verificando primero su minimalidad y co-
herencia, y luego si cada uno de sus hipergrafos esta contenido en el crıtico
del otro. En caso de que la respuesta sea NO, sera necesario conocer cual es
el par de hiperaristas que impide que se cumpla alguna de las condiciones
expuestas en el parrafo anterior.
2.4.4. Lema de Chvatal
Otra condicion necesaria (pero no suficiente) para la completitud es la del
Lema de Chvatal [4], que afirma que en toda estructura G := (H,K) com-
pleta, debe existir por lo menos una hiperarista X ∈ H∪K con cardinalidad
suficientemente pequena, esto es, tal que |X| ≤ Log(|H|+ |K|).Este Lema evidentemente puede ser implementado como un algoritmo
polinomial, y en caso que tal hiperarista exista, puede resultar interesante
Capıtulo 2. Especificacion de Requisitos 19
conocerla, y saber a que hipergrafo pertenece.
2.4.5. Algoritmo de Khachiyan
El Algoritmo de Descomposicion de Khachiyan, descrito en [4] y explici-
tado en [20], desde el punto de vista de la complejidad teorica, constituye la
mejor solucion hasta ahora conocida para resolver el Problema de Dualidad.
Es un algoritmo sub-exponencial, pero super-polinomial, basado en la
construccion de un arbol binario, cuyos nodos representan estructuras de
hipergrafos coherentes. El nodo raız es la estructura original, y cada par
de nodos intermedios son estructuras mas pequenas (tambien coherentes)
formadas a partir de una descomposicion de la estructura de su respectivo
nodo padre. Si en algun momento se verifica que todas las hojas del arbol
actual son completas, entonces la estructura original tambien es completa.
Si en algun momento se verifica que al menos una hoja del arbol actual es
incompleta, entonces la estructura original tambien es incompleta.
Para descomponer cada estructura, se debe elegir un a ∈ A, que cumpla
con alguna caracterıstica particular que la haga mas provechosa que las
demas. Por ejemplo, se puede elegir un a que este presente en una hiper-
arista X de cardinalidad pequena. Por el Lema de Chvatal, sabemos que si
la estructura es completa, tal X existe (de no existir, automaticamente la
estructura original es incompleta). Una vez hecha la descomposicion de un
nodo, se debe aplicar µ a las nuevas estructuras.
Las condiciones de parada del algoritmo, vale decir, de la construccion
del arbol binario (que puede hacerse recursivamente recorriendolo en profun-
didad), pueden ser variadas. Por ejemplo, la condicion de semi-completitud
puede ser suficiente para verificar incompletitud, y cuando la cardinalidad de
alguna hiperarista es igual a 1 o 0, resulta sencillo (polinomial) verificar la
completitud.
Al igual que con los algoritmos anteriores, no nos bastara con averiguar
si una estructura dada es o no dual, sino que ademas querremos saber, en
caso de una respuesta negativa, que impide que ella lo sea; esto es, querremos
conocer el par de hiperaristas que la hace incoherente, o bien la particion del
conjunto base que la hace incompleta.
Capıtulo 2. Especificacion de Requisitos 20
2.5. Generacion de estructuras duales
Actualmente no existen algoritmos polinomiales para la generacion de
estructuras de hipergrafos duales. De hecho, de existir un algoritmo tal, serıa
facil probar que el Problema de Dualidad pertenece a NP , puesto que dada
una estructura cualquiera, esta serıa siempre polinomialmente verificable.
El mejor generador de estructuras duales conocido hasta ahora, es uno
que utilizando el operador µ genera aleatoriamente hipergrafos H minimales,
para luego, mediante el Algoritmo de Khachiyan, generar un K = λ(H), de
manera que G := (H,K) sea dual.
Por una parte, la complejidad temporal de este algoritmo (que se cree
es sub-exponencial, aunque nunca polinomial) no es un problema crıtico,
pues no tiene que ver con el Problema de Dualidad propiamente tal, sino
solo con una forma de generar los inputs que despues seran utilizados por
otros algoritmos, que sı estaran destinados a esa finalidad. Por otro lado, sin
embargo, este metodo carece de parametros de control en la generacion, y no
garantiza en ningun caso la obtencion, en un tiempo acotado, de todas las
estructuras duales posibles para un conjunto base dado.
Necesitamos, entonces, de un Generador Aleatorio de Estructuras Duales
(en adelante, simplemente Generador), que garantice la obtencion de todas
las estructuras duales posibles, con una probabilidad (estrictamente) positiva,
para un conjunto base dado.
Especıficamente, nuestro Generador ideal deberıa poseer las siguientes car-
acterısticas:
Dado un conjunto base A ingresado como input, el Generador debe
devolver como output una estructura dual generada al azar, definida
sobre A (no necesariamente con dominio total) y almacenada en un
archivo de texto plano, que sirva como entrada para los operadores y
algoritmos de HiperLab.
Toda estructura dual existente debe tener una probabilidad positiva de
ser obtenida mediante el Generador.
Mientras mas homogenea sea la probabilidad de obtencion de las dis-
tintas estructuras, se considerara mejor el Generador implementado.
Capıtulo 2. Especificacion de Requisitos 21
Esta distribucion de probabilidades sera, entonces, el principal factor
de calidad del Generador.
Aunque la complejidad temporal, como ya se menciono, no es clave en
este contexto, es deseable que el Generador no tenga un comportamien-
to marcadamente ineficiente; mas aun, serıa deseable que su comple-
jidad fuera igual o mejor a la del algoritmo sub-exponencial descrito
anteriormente.
2.6. Requerimientos de HW y SW
HiperLab es un software orientado exclusivamente a la investigacion, por
lo que no tiene fines comerciales. Por lo mismo, se ha desarrollado como un
software libre2 que debe funcionar bajo el sistema operativo Linux (gratuito
y preferido por los investigadores), y sin restricciones de permisos para sus
usuarios.
Dado que la informacion mas valiosa que queremos obtener corresponde a
los tiempos de ejecucion de los algoritmos que mas tarde se implementen, el
sistema debera ejecutarse como sistema batch o por lotes, es decir, de manera
que durante toda la ejecucion del programa, este no tenga interaccion alguna
con el usuario. Solo ası es posible medir experimentalmente cuanto tarda
cada algoritmo en ejecutarse.
Por esta misma razon, tanto la ejecucion de los algoritmos como la visu-
alizacion de los resultados deberan realizarse a traves de la Shell3 de Linux,
haciendose innecesario el uso de algun otro programa de visualizacion.
2.7. Entorno de programacion
HiperLab se implementara utilizando el lenguaje de programacion C++,
por las siguientes razones:
Su paradigma de orientacion a objetos favorece el trabajo modular,
2De libre uso, estudio, distribucion y posibilidad de mejoras por parte de terceros.3Shell: interprete de comandos, terminal o consola
Capıtulo 2. Especificacion de Requisitos 22
permitiendo encapsular los operadores en metodos que se pueden rela-
cionar entre sı.
Permite trabajar con la STL (Standard Template Library)4, un conjunto
de clases parametrizadas que contienen las estructuras de datos mas
utilizadas en programacion (vectores, listas enlazadas, strings, entre
otros), junto con sus principales metodos de manipulacion, lo que nos
significa un ahorro de esfuerzos de programacion.
Al no depender de una maquina virtual como la del lenguaje Java, los
tiempos de ejecucion de los algoritmos implementados en general son
menores a los de este.
Existen muchos IDE’s (Entorno Integrado de Desarrollo) para C++, y
varios de ellos comparten el paradigma de desarrollo OpenSource que
buscamos. De todos ellos, nos hemos decidido por Code::Blocks5, por
su interfaz comoda, por ser multiplataforma y por poseer el compilador
GCC en sus versiones para Linux y Windows.
4Standard Template Library Programmer’s Guide. http://www.sgi.com/tech/stl5The Open Source, Cross-platform, Free C/C++ IDE. http://www.codeblocks.org
Capıtulo 3Diseno de HiperLab
3.1. Clases del sistema
El diseno de HiperLab consta de las siguientes cuatro clases: Estruct,
Hgrafo, ParHarista y Harista, las que se relacionan segun el diagrama de
clases de la seccion 3.1.5.
3.1.1. La clase Harista
En esta clase se implementan todos los metodos (operadores y algoritmos)
relacionados con las hiperaristas. Corresponde a la clase de mas bajo nivel
del sistema, en el sentido que no incluye a ninguna de las demas clases y, en
cambio, todas ellas pueden utilizarla, directa o indirectamente.
Cada objeto1 de esta clase posee un unico atributo privado: un vector de
valores booleanos, cuyas posiciones corresponden a cada elemento del conjun-
to base con el que estemos trabajando. Esta estructura vector esta definida
en la STL2 ası que posee metodos personales para manipularla.
Ası, de forma analoga a la notacion matricial de hipergrafos descrita en
la seccion 1.2, una estructura vector definida sobre un conjunto base A :=
a0, ..., an−1 poseera los siguientes valores xi, ∀i = 0, ..., n− 1:1Instancia de una clase.2Standard Template Library.
23
Capıtulo 3. Diseno de HiperLab 24
xi =
false(0) , si ai /∈ Atrue (1) , si ai ∈ A
Existen cuatro tipos de constructores de hiperaristas, uno de los cuales
solo sirve como apoyo para la creacion de estructuras de hipergrafos, que
veremos mas adelante.
Los tres constructores restantes son los siguientes:
1. Constructor basico: es el constructor por defecto, que simplemente
crea un objeto de la clase Harista, sin ningun valor para su atributo
privado de tipo vector.
2. Constructor seteado: crea un objeto con un vector booleano ingre-
sado como parametro.
3. Constructor de hiperarista vacıa o llena: crea un objeto con un
vector de un cierto tamano ingresado como parametro. Este vector
podra ser solo de 0’s (hiperarista vacıa) o solo de 1’s (hiperarista igual
al conjunto base), segun se ingrese el valor 0 o 1, respectivamente, como
segundo parametro. Por defecto, la hiperarista construida sera la vacıa.
3.1.2. La clase ParHarista
A esta clase conciernen los metodos relacionados con los pares de hiper-
aristas, una estructura de datos artificial utilizada para representar ademas
particiones3 del conjunto base, que como veremos en la seccion 3.3, son out-
puts usuales en la implementacion de algoritmos.
ParHarista es una clase que incluye a la clase Harista, y que es utilizada
directamente por la clase Hgrafo.
Cada uno de sus objetos posee tambien un unico atributo privado: un
par de punteros a hiperaristas, representado mediante el par ordenado
pair<Harista*, Harista*>. Esta estructura de datos tambien esta defini-
da en la STL, y en nuestro contexto puede representar dos cosas: dos
3Particion: division de un conjunto en dos conjuntos disjuntos.
Capıtulo 3. Diseno de HiperLab 25
hiperaristas de los hipergrafos H y K, respectivamente; o bien una particion
(W,Z) de un conjunto base A.
El unico constructor de esta clase toma como parametros dos punteros
a objetos de la clase Harista y los situa, respectivamente, en la primera y
segunda ubicacion del par.
El destructor, por su parte, elimina los punteros que apuntan a cada
hiperarista, para ası liberar el espacio de memoria utilizado.
3.1.3. La clase Hgrafo
Esta clase esta destinada a los hipergrafos. Incluye a la clase ParHarista,
utiliza indirectamente a traves de esta ultima a la clase Harista, y es uti-
lizada directamente por la clase Estruct. Constituye el engranaje principal
de las clases de HiperLab, pues ademas de sus propios metodos, aquı se im-
plementan metodos de apoyo para los operadores y algoritmos de la clase
Estruct.
Los objetos de Hgrafo poseen un unico atributo privado: una lista de
punteros a hiperaristas, es decir, una estructura de datos list<Harista*>,
que esta definida en la STL y permite ingresar y eliminar dinamicamente los
elementos, de manera mas eficiente que la estructura vector. Esta distincion
con respecto a la estructura de datos usada para las hiperaristas, se debe a
que aquellas se definen sobre un conjunto base fijo, en cambio, el tamano de
los hipergrafos es variable.
Existen cuatro constructores de hipergrafos, pero uno de ellos solo sirve
de apoyo en la creacion de estructuras de hipergrafos. Los otros tres con-
structores son los siguientes:
1. Constructor basico: constructor por defecto, que simplemente crea
un objeto de la clase Hgrafo, sin ningun valor para su atributo privado.
2. Constructor seteado: crea un objeto con una lista de punteros a
hiperaristas ingresada como parametro.
3. Constructor seteado con una Harista: hace que la lista del atributo
privado apunte a una unica hiperarista, ingresada como parametro.
Capıtulo 3. Diseno de HiperLab 26
El destructor de esta clase elimina todos los punteros que apuntan a las
hiperaristas ligadas a la lista, para ası liberar el espacio de memoria utilizado.
3.1.4. La clase Estruct
Esta es la clase destinada a las estructuras de hipergrafos. Es la clase de
mas alto nivel del sistema, pues incluye a la clase Hgrafo, y utiliza indirec-
tamente a traves de ella a las otras dos. Se comporta de manera similar a
ParHarista, en la medida que su unico atributo privado es un par de punteros
a hipergrafos, es decir, una estructura de datos pair<Hgrafo*,Hgrafo*>.
Los constructores de esta clase son los siguientes:
1. Constructor basico: constructor por defecto, analogo a todos los an-
teriores.
2. Constructor seteado: crea un objeto con un par de punteros a hiper-
grafos ingresado como parametro.
3. Constructor seteado con dos Hgrafo: hace que ambas componentes
del par ordenado que conforma el atributo privado apunten, respecti-
vamente, a dos hipergrafos ingresados como parametros.
4. Constructor desde archivo: recibe como input una estructura de
hipergrafos codificada, en un archivo de texto plano, de manera analoga
a la representacion matricial indicada en la seccion 1.2. Este constructor
se apoya, como ya se menciono, en algunos pertenecientes a otras clases.
Ejemplo. Codificacion de un archivo de entrada.
Estructura de ejemplo
3
001
011
110
#
010
101
Capıtulo 3. Diseno de HiperLab 27
111
#
La primera lınea del archivo corresponde al tıtulo de la estructura,
que es desplegado en pantalla por el constructor; la segunda, es el
tamano del conjunto base, |A|; y las lıneas siguientes, corresponden
a las hiperaristas de los hipergrafos H y K, respectivamente, los cuales
se diferencian mediante los separadores #.
El constructor va leyendo secuencialmente cada una de estas lıneas:
entre la tercera y el primer #, construye el primer hipergrafo del par,
llamando al constructor correspondiente de la clase Hgrafo, el cual a
su vez llama en cada nueva lınea al constructor de Harista. Se procede
de la misma manera para el hipergrafo siguiente.
El destructor de esta clase, por su parte, elimina los punteros que apuntan
a cada hipergrafo, liberando ası el espacio de memoria utilizado.
Capıtulo 3. Diseno de HiperLab 28
3.1.5. Diagrama de Clases
Figura 3.1: Diagrama de clases de HiperLab.
3.2. Operadores implementados
A continuacion se describen los operadores que se implementaron para
HiperLab, clasificados por clase, y excluyendo a aquellos metodos que no
Capıtulo 3. Diseno de HiperLab 29
fueron disenados para ser utilizados por los usuarios finales del sistema, sino
solo como apoyo a otros metodos.
En los apendices de este informe, y como parte del Manual de Usuario
de HiperLab que se proporcionara como parte del Software, se puede ver
una lista resumida con todas las funcionalidades presentes en el sistema, que
contiene tanto estos operadores, como los algoritmos que se describiran en la
seccion siguiente.
Clase Estruct
1. GetE() : pair<Hgrafo*,Hgrafo*>
Descripcion Retorna el atributo privado del objeto que llama al
metodo.
Pseudocodigo Retornar “estruct”
Complejidad O(|A|) := k (constante)
2. GetH(bool b) : Hgrafo*
Descripcion Si b es falso, retorna el primer hipergrafo de la es-
tructura que llama al metodo; sino, retorna el se-
gundo.
Pseudocodigo Dada G := (H,K)
Si b=false, retornar HSino retornar K
Complejidad O(|A|) := k (constante)
3. Mu() : Estruct* 4
Descripcion Retorna la estructura minimal µ(G) de la estruc-
tura G que llama al metodo.
Pseudocodigo Dada G := (H,K)
Redefinir H := µ(H)
Redefinir K := µ(K)
Retornar G := (H,K)
Complejidad O(|A|) := κ(H2 +K2) (polinomial)
4. Nu() : Estruct* 4
Descripcion Retorna la estructura ν(G) respondida por los
hipergrafos de la estructura G que llama al metodo.
Pseudocodigo Dada G := (H,K)
Capıtulo 3. Diseno de HiperLab 30
Redefinir H := ν(H)
Redefinir K := ν(K)
Retornar G := (H,K)
Complejidad O(|A|) := 2|A| (exponencial)
5. Sigma() : Estruct* 4
Descripcion Retorna la estructura crıtica σ(G), sujeta a los
hipergrafos de la estructura G que llama al metodo.
Pseudocodigo Dada G := (H,K)
Redefinir H := σ(H)
Redefinir K := σ(K)
Retornar G := (H,K)
Complejidad O(|A|) := 2|A| (exponencial)
6. swap(pair<Hgrafo*,Hgrafo*> est) : Estruct*
Descripcion Cambia el atributo privado del objeto que llama al
metodo.
Pseudocodigo Redefinir “estruct” = est
Complejidad O(|A|) := k (constante)
7. Tau() : Estruct* 4
Descripcion Retorna la estructura τ(G), transversal a los hiper-
grafos de la estructura G que llama al metodo.
Pseudocodigo Dada G := (H,K)
Redefinir H := τ(H)
Redefinir K := τ(K)
Retornar G := (H,K)
Complejidad O(|A|) := 2|A| (exponencial)
8. <<(ostream& output, Estruct& G) : ostream& 4 5
Descripcion Despliega la estructura en pantalla.
Pseudocodigo Dada G := (H,K)
Escribir “H= ” + H + “K= ” + KComplejidad O(|A|) := κ(H +K) (polinomial)
9. +(Estruct& G1, Estruct& G2) : Estruct& 4 5
Descripcion Retorna el join o union G ′ t G ′′ de dos estructuras
G ′ y G ′′ ingresadas como parametro.
Capıtulo 3. Diseno de HiperLab 31
Pseudocodigo Dadas G ′ := (H′,K′) y G ′′ := (H′′,K′′)Definir H := H′ tH′′
Definir K := K′ u K′′
Retornar G := (H,K)
Complejidad O(|A|) := κ((H +K)2) (polinomial)
10. *(Estruct& G1, Estruct& G2) : Estruct& 4 5
Descripcion Retorna el meet o interseccion G ′ u G ′′ de dos es-
tructuras G ′ y G ′′ ingresadas como parametro.
Pseudocodigo Dadas G ′ := (H′,K′) y G ′′ := (H′′,K′′)Definir H := H′ uH′′
Definir K := K′ t K′′
Retornar G := (H,K)
Complejidad O(|A|) := κ((H +K)2) (polinomial)
Tabla 3.1: Operadores implementados en Estruct.
Clase Hgrafo
1. GetH() : list<Harista*>
Descripcion Retorna el atributo privado del objeto que llama al
metodo.
Pseudocodigo Retornar “hgrafo”
Complejidad O(|A|) := k (constante)
2. is in(Harista* Z) : bool 6
Descripcion Retorna true si la hiperarista Z ingresada como
parametro pertenece al hipergrafo H que llama al
metodo (es decir, si Z ∈ H); en caso contrario,
retorna false.
Pseudocodigo Dados H, Z ⊆ A
∀X ∈ HSi X = Z
Retornar true
4Estos operadores utilizan operadores de la clase Hgrafo.5Estos son operadores sobrecargados de la clase Estruct.
Capıtulo 3. Diseno de HiperLab 32
Retornar false
Complejidad O(|A|) := κ(H) (polinomial)
3. is in nu(Harista* Z) : bool 6
Descripcion Retorna true si la hiperarista Z ingresada como
parametro es respondida por el hipergrafo H que
llama al metodo (es decir, si Z ∈ ν(H)); en caso
contrario, retorna false.
Pseudocodigo Dados H, Z ⊆ A
∀X ∈ HSi X ≤ Z
Retornar true
Retornar false
Complejidad O(|A|) := κ(H) (polinomial)
4. is in sigma(Harista* Z) : bool 6
Descripcion Retorna true si la hiperarista Z ingresada como
parametro es crıtica con respecto al hipergrafo Hque llama al metodo (es decir, si Z ∈ σ(H)); en
caso contrario, retorna false.
Pseudocodigo Dados H, Z ⊆ A
Definir Z ′ = Z
(∀X ∈ H)(∀a ∈ A)
Si a ∈ Z y a′ ∈ X; a′ ∈ Z = aRedefinir Z := Z\a
Si |Z ′| = 0, Retornar true
Sino Retornar false
Complejidad O(|A|) := κ(H) (polinomial)
5. is in sigma(Harista* Z, bool b) : int 6
Descripcion Retorna −1 si la hiperarista Z ingresada como
parametro es crıtica con respecto al hipergrafo Hque llama al metodo (es decir, si Z ∈ σ(H)); en
caso contrario, retorna a ∈ Z tal que (Z\a) ∈σ(H).
Pseudocodigo Dados H, Z ⊆ A
Capıtulo 3. Diseno de HiperLab 33
Definir Z ′ = Z
(∀X ∈ H)(∀a ∈ A)
Si a ∈ Z y a′ ∈ X; a′ ∈ Z = aRedefinir Z := Z\a
Si |Z ′| = 0, Retornar −1
Sino Retornar a ∈ Z ′
Complejidad O(|A|) := κ(H) (polinomial)
6. is in tau(Harista* Z) : bool 6
Descripcion Retorna true si la hiperarista Z ingresada como
parametro es transversal del hipergrafo H que lla-
ma al metodo (es decir, si Z ∈ τ(H)); en caso con-
trario, retorna false.
Pseudocodigo Dados H, Z ⊆ A
∀X ∈ HSi (X ∩ Z) = ∅
Retornar false
Retornar true
Complejidad O(|A|) := κ(H) (polinomial)
7. Mu() : Estruct* 6
Descripcion Retorna el hipergrafo minimal µ(H) del hipergrafo
H que llama al metodo.
Pseudocodigo Dado H∀(X, Y ) ∈ H
Si X ≤ Y
Redefinir H := H\Y Retornar H
Complejidad O(|A|) := κ(H2) (polinomial)
8. Nu() : Estruct* 6 7
Descripcion Retorna el hipergrafo ν(H) respondido por las
hiperaristas del hipergrafo H que llama al meto-
do.
Pseudocodigo Dado HDefinir Hν := ∅
Capıtulo 3. Diseno de HiperLab 34
∀Z ∈ P(A)
Si Z ∈ ν(H)
Redefinir Hν := Hν ∪ ZRetornar Hν
Complejidad O(|A|) := 2|A| (exponencial)
9. Sigma() : Estruct* 6 7
Descripcion Retorna el hipergrafo crıtico σ(H), sujeto a las
hiperaristas del hipergrafo H que llama al meto-
do.
Pseudocodigo Dado HDefinir Hσ := ∅∀Z ∈ P(A)
Si Z ∈ σ(H)
Redefinir Hσ := Hσ ∪ ZRetornar Hσ
Complejidad O(|A|) := 2|A| (exponencial)
10. swap(list<Harista*> hg) : Hgrafo*
Descripcion Cambia el atributo privado del objeto que llama al
metodo.
Pseudocodigo Redefinir “hgrafo” = hg
Complejidad O(|A|) := k (constante)
11. Tau() : Estruct* 6 7
Descripcion Retorna el hipergrafo τ(H), transversal a las hiper-
aristas del hipergrafo H que llama al metodo.
Pseudocodigo Dado HDefinir Hτ := ∅∀Z ∈ P(A)
Si Z ∈ τ(H)
Redefinir Hτ := Hτ ∪ ZRetornar Hτ
Complejidad O(|A|) := 2|A| (exponencial)
12. <<(ostream& output, Hgrafo& H) : ostream& 6 8
Descripcion Despliega el hipergrafo en pantalla.
Capıtulo 3. Diseno de HiperLab 35
Pseudocodigo Dado H∀X ∈ H
Escribir X
Complejidad O(|A|) := κ(H) (polinomial)
13. +(Hgrafo& H, Hgrafo& K) : Hgrafo& 7 8
Descripcion Retorna el join o union H t K de dos hipergrafos
H y K ingresados como parametro.
Pseudocodigo Dados H y KRedefinir H := H ∪KRetornar µ(H)
Complejidad O(|A|) := κ((H +K)2) (polinomial)
14. *(Hgrafo& H, Hgrafo& K) : Hgrafo& 6 7 8
Descripcion Retorna el meet o interseccion HuK de dos hiper-
grafos H y K ingresados como parametro.
Pseudocodigo Dados H y KDefinir J ⊆ P(A), con J := ∅∀X ∈ H∀Y ∈ K
Definir Z ⊆ A, con Z := X ∪ YRedefinir J := J ∪ Z
Retornar µ(J )
Complejidad O(|A|) := κ((H · K)2) (polinomial)
Tabla 3.2: Operadores implementados en Hgrafo.
Clase ParHarista
1. GetHa(bool b) : Harista*
Descripcion Si b es falso, retorna la primera hiperarista del par
de hiperaristas que llama al metodo; sino, retorna
el segundo.
6Estos operadores utilizan operadores de la clase Harista.7Estos operadores utilizan otros operadores de su misma clase.8Estos son operadores sobrecargados de la clase Hgrafo.
Capıtulo 3. Diseno de HiperLab 36
Pseudocodigo Dado (W,Z) ⊆ A× ASi b=false, retornar W
Sino retornar Z
Complejidad O(|A|) := k (constante)
2. <<(ostream& output, ParHarista& W Z) : ostream& 9 10
Descripcion Despliega el par de hiperaristas en pantalla.
Pseudocodigo Dado (W,Z) ⊆ A× ASi (W 6= ∅)
Si (Z 6= ∅)Escribir “H= (W=)” + W + “K= (Z=)” + Z
Sino Escribir “H= ” + W
Sino si (Z 6= ∅)Escribir “K= ” + Z
Complejidad O(|A|) := |A| (lineal)
Tabla 3.3: Operadores implementados en ParHarista.
Clase Harista
1. Atomos() : list<Harista*> 11
Descripcion Retorna la lista de hiperaristas (atributo privado
de un objeto Hgrafo) correspondientes a los atomos
de la hiperarista Z que llama al metodo, es decir,
retorna [Z] := a; a ∈ ZPseudocodigo Dada Z ⊆ A
Definir [Z] := ∅∀a ∈ A
Si a ∈ ZDefinir W ⊆ A, con W := ∅Redefinir W := W ∪ aRedefinir [Z] := [Z] ∪W
Retornar [Z]
9Este operador utiliza operadores de la clase Harista.10Este es un operador sobrecargado de la clase ParHarista.
Capıtulo 3. Diseno de HiperLab 37
Complejidad O(|A|) := |A| (lineal)
2. Card() : int
Descripcion Retorna la cardinalidad de la hiperarista que llama
al metodo, vale decir, el numero de 1’s en el vector
de su atributo privado.
Pseudocodigo Dada Z ⊆ A
Definir i := 0
∀a ∈ ASi a ∈ Z Redefinir i := i+ 1
Retornar i
Complejidad O(|A|) := |A| (lineal)
3. GetHa() : list<Harista*>
Descripcion Retorna el atributo privado del objeto que llama al
metodo.
Pseudocodigo Retornar “harista”
Complejidad O(|A|) := k (constante)
4. Intersecta(Harista* Z) : bool 11
Descripcion Verifica si la hiperarista W que llama al metodo se
intersecta o no con la hiperarista Z ingresada como
parametro. Si W ∩ Z = ∅, retorna false; en caso
contrario, retorna true.
Pseudocodigo Dadas (W,Z) ⊆ A× A∀a ∈ A
Si a ∈ W y a ∈ ZRetornar true
Retornar false
Complejidad O(|A|) := |A| (lineal)
5. Neg(int a) : Harista*
Descripcion Incluye o elimina un elemento de la hiperarista X.
Si a ∈ X, entonces el metodo hace a /∈ X; y vicev-
ersa.
Pseudocodigo Dados a ∈ A y X ⊆ A
Si a ∈ X
Capıtulo 3. Diseno de HiperLab 38
Redefinir X := X\aSino Redefinir X := X ∪ a
Complejidad O(|A|) := k (constante)
6. swap(vector<bool> ha) : Harista*
Descripcion Cambia el atributo privado del objeto que llama al
metodo.
Pseudocodigo Redefinir “harista” = ha
Complejidad O(|A|) := k (constante)
7. swap(int a) : Harista*
Descripcion Cambia el atributo privado del objeto que llama
al metodo, por otro seteado aleatoriamente. Op-
cionalmente, puede setearse aleatoriamente hasta
la posicion a del vector, y lo restante, con 0’s.
Pseudocodigo Dados Z := (x0, x1, ..., xn−1) y a ∈ A∀xi ∈ Z, 0 ≤ xi < a
Si P1/2(xi) = 0 Redefinir xi = 0
Sino Redefinir xi = 1
∀xi ∈ Z, a ≤ xi ≤ n− 1
Redefinir xi = 0
Complejidad O(|A|) := |A| (lineal)
8. <<(ostream& output, Harista& Z) : ostream& 11 12
Descripcion Despliega la hiperarista en pantalla.
Pseudocodigo Dada Z ⊆ A
∀a ∈ AEscribir a
Complejidad O(|A|) := |A| (lineal)
9. <=(Harista& W, Harista& Z) : bool 11 12
Descripcion Verificador de relacion “menor o igual” entre dos
hiperaristas W y Z ingresadas como parametro, en
funcion del orden usual del conjunto base A (de
menor a mayor). Si W ≤ Z, retorna true; en caso
contrario, retorna false.
Pseudocodigo Dadas (W,Z) ⊆ A× A
Capıtulo 3. Diseno de HiperLab 39
∀a ∈ ASi a ∈ W y a /∈ Z
Retornar false
Retornar true
Complejidad O(|A|) := |A| (lineal)
10. ==(Harista& W, Harista& Z) : bool 11 12
Descripcion Verificador de relacion “igualdad” entre dos hiper-
aristas W y Z ingresadas como parametro. Si W =
Z, retorna true; en caso contrario, retorna false.
Pseudocodigo Dadas (W,Z) ⊆ A× A∀a ∈ A
Si (a ∈ W y a /∈ Z) o (a /∈ W y a ∈ Z)
Retornar false
Retornar true
Complejidad O(|A|) := |A| (lineal)
11. !=(Harista& W, Harista& Z) : bool 11 12
Descripcion Verificador de relacion “desigualdad” entre dos
hiperaristas W y Z ingresadas como parametro. Si
W 6= Z, retorna true; en caso contrario, retorna
false.
Pseudocodigo Dadas (W,Z) ⊆ A× ASi (W == Z) Retornar false
Sino Retornar true
Complejidad O(|A|) := |A| (lineal)
12. ++(Harista& Z) : Harista& 11 12
Descripcion Incrementa en 1 la codificacion numerica del vec-
tor binario que conforma el atributo privado de la
hiperarista que llama al metodo.
Pseudocodigo Dada Z := (x0, x1, ..., xn−1), con |A| = n
∀i := n− 2, n− 3, ..., 1, 0Si xi = 0
Redefinir xi = 1
break
Capıtulo 3. Diseno de HiperLab 40
Sino Redefinir xi = 0
Retornar Z
Complejidad O(|A|) := |A| (lineal)
13. (Harista& Z) : Harista& 11 12
Descripcion Retorna el complemento de la hiperarista Z que
llama al metodo; esto es, la hiperarista A\Z.Pseudocodigo Dada Z ⊆ A
∀a ∈ ASi a ∈ Z Redefinir Z := Z\aSino Redefinir Z := Z ∪ a
Retornar Z
Complejidad O(|A|) := |A| (lineal)
14. +(Harista& W, Harista& Z) : Harista& 11 12
Descripcion Retorna la union de las dos hiperaristas W y Z
que llaman al metodo; esto es, la hiperarista X :=
W ∪ Z.
Pseudocodigo Dadas (W,Z) ⊆ A× ADefinir X ⊆ A, con X := ∅∀a ∈ A
Si (a ∈ W ) o (a ∈ Z)
Redefinir X := X ∪ aRetornar X
Complejidad O(|A|) := |A| (lineal)
Tabla 3.4: Operadores implementados en Harista.
3.3. Algoritmos implementados
En esta seccion se describen los algoritmos (no operadores) que se imple-
mentaron para HiperLab, clasificados por orden alfabetico, y excluyendo a
11Estos operadores utilizan operadores de su misma clase.12Estos son operadores sobrecargados de la clase Harista.
Capıtulo 3. Diseno de HiperLab 41
aquellos metodos que no fueron disenados para ser utilizados por los usuar-
ios finales del sistema, sino solo como apoyo a otros metodos. Todos estos
algoritmos fueron disenados para ser llamados como metodos desde la clase
Estruct, sin argumentos, apoyados directamente por la clase Hgrafo y los
operadores existentes, y retornando objetos de la clase ParHarista.
Tal como se dijo en la seccion anterior, en los apendices de este informe,
y como parte del Manual de Usuario de HiperLab que se proporcionara como
parte del Software, figura una lista resumida con todos los operadores ya
mencionados, mas estos algoritmos.
Algoritmos de HiperLab
1. Chvatal() : ParHarista*
Descripcion Verificador del Lema de Chvatal (ver seccion
2.4.4), para la estructura G := (H,K) que llama
al metodo. Si ∃X ∈ (H∪K), con |X| ≤ Log(|H|+|K|), retorna el par de hiperaristas (X,NULL) o
(NULL,X), segun X ∈ H o X ∈ K, respectiva-
mente; en caso contrario, retorna NULL.
Pseudocodigo Dado G := (H,K)
Definir (W,Z) ⊆ A× ADefinir m := Log(|H|+ |K|)∀X ∈ H
Si |X| ≤ m
Definir W := X
Definir Z := NULL
Retornar (W,Z)
∀Y ∈ KSi |Y | ≤ m
Definir W := NULL
Definir Z := Y
Retornar (W,Z)
Retornar NULL
Complejidad O(|A|) := κ(H +K) (polinomial)
2. Coherencia() : ParHarista*
Capıtulo 3. Diseno de HiperLab 42
Descripcion Verificador de coherencia (ver seccion 1.4.1), para
la estructura G := (H,K) que llama al metodo. Si
G es coherente, retorna NULL; en caso contrario,
retorna un par (X, Y ) ∈ (H,K) tal que X ∩Y = ∅.Pseudocodigo Dado G := (H,K)
∀X ∈ H∀Y ∈ K
Si X ∩ Y = ∅Retornar (X, Y )
Retornar NULL
Complejidad O(|A|) := κ(H · K) (polinomial)
3. Completitud() : ParHarista*
Descripcion Verificador de completitud (ver seccion 1.4.2),
para la estructura G := (H,K) que llama al meto-
do. Si G es completa, retorna NULL; en caso con-
trario, retorna una particion (W,Z) de A, tal que
W /∈ ν(H) y Z /∈ ν(K).
Pseudocodigo Dado G := (H,K)
Si H = ∅ y K = ∅Retornar (∅, ∅)
∀Z ∈ P(A)
Definir W := A\ZSi W /∈ ν(H) y Z /∈ ν(H)
Retornar (W,Z)
Retornar NULL
Complejidad O(|A|) := 2|A| (exponencial)
4. Dualidad() : ParHarista*
Capıtulo 3. Diseno de HiperLab 43
Descripcion Verificador de dualidad (ver seccion 1.4.3), para la
estructura G := (H,K) que llama al metodo. Cor-
responde a la implementacion del Algoritmo de
Descomposicion de Khachiyan (seccion 2.4.5),
la mejor solucion a la fecha conocida para resolver
el Problema de Dualidad de Hipergrafos. Si G es
dual, retorna NULL; en caso contrario, retorna
una particion (W,Z) de A que hace a G incom-
pleta (no semi-completa), o el par de hiperaristas
(X, Y ) ∈ (H,K) que la hace incoherente.
Pseudocodigo Dado G := (H,K)
Redefinir G := µ(G)
Si G = ∅Retornar (∅, ∅)
Si ((H = ∅ y ∅ ∈ K) || (K = ∅ y ∅ ∈ H))
Retornar NULL
Definir (X, Y ) := G →Coherencia()
Si (X, Y ) 6= NULL
Retornar (X, Y )
Retornar G →is completa(A)
ParHarista is completa(set A)
Definir (W,Z) := G →Semi completa()
Si (W,Z) 6= NULL
Retornar (W,Z)
Si (H = ∅ || K = ∅)Retornar NULL
Definir A′ := A\aElegir b ∈ 0, 1Definir G ′ := G →ProyRest(a, b)
Definir (W,Z) := G ′ →is completa(A′)
Si (W,Z) 6= NULL
Retornar (W,Z)
Capıtulo 3. Diseno de HiperLab 44
Redefinir b := ¬bDefinir G ′ := G →ProyRest(a, b)
Definir (W,Z) := G ′ →is completa(A′)
Si (W,Z) 6= NULL
Retornar (W,Z)
Retornar NULL
estructura ProyRest(elem a, bool b)
Dado G := (H,K)
Si (b = 1)
Definir H′ := X ∈ H; a /∈ XDefinir K′ := Y \a; a ∈ Y ∈ KDefinir K′′ := Y ; a /∈ Y ∈ KRedefinir K′′ := K′′\ν(K′)Redefinir K′ := K′ ∪ K′′
Sino
Definir K′ := Y ∈ K; a /∈ Y Definir H′ := X\a; a ∈ X ∈ HDefinir H′′ := X; a /∈ X ∈ HRedefinir H′′ := H′′\ν(H′)Redefinir H′ := H′ ∪H′′
Retornar G ′ := (H′,K′)Complejidad O(|A|) := 2Log|A| (sub-exponencial)
5. Semi completitud() : ParHarista*
Descripcion Verificador de semi-completitud (ver seccion
2.4.3), para la estructura G := (H,K) (minimal
y coherente) que llama al metodo. Si G es semi-
completa, retorna NULL; en caso contrario, retor-
na una particion (W,Z) de A, con W := X\atal que X /∈ σ(K), o bien Z := Y \a tal que
Y /∈ σ(H).
Pseudocodigo Dado G := (H,K)
∀X ∈ H
Capıtulo 3. Diseno de HiperLab 45
Si ∃a ∈ X tal que X /∈ σ(K)
Definir W := X\aDefinir Z := A\WRetornar (W,Z)
∀Y ∈ KSi ∃a ∈ Y tal que Y /∈ σ(H)
Definir Z := Y \aDefinir W := A\ZRetornar (W,Z)
Retornar NULL
Complejidad O(|A|) := κ(H2 +K2) (polinomial)
Tabla 3.5: Algoritmos implementados en HiperLab.
3.4. Generadores de Estructuras Duales
Se proponen para este Laboratorio dos metodos de generacion ineditos
hasta ahora, que basados en las ideas de [19], pretenden obtener aleatoria-
mente todas las estructuras duales existentes sobre un conjunto base dado.
En general, ambos metodos se basan en el siguiente algoritmo polinomial
de composicion, el cual, dadas dos estructuras duales G ′ y G ′′ tales que una
responde a la otra, previamente generadas y definidas sobre un conjunto base
A, las compone en una nueva estructura dual G, definida sobre un conjunto
base A ∪ a superior al original, con a /∈ A:
1. Componer(G ′, G ′′, A, a)
2. 3. Dadas G ′ y G ′′ duales
4. Definir H := (H′′ u Ta) tH′; con Ta := a, a /∈ A5. Definir K := (K′′ t Ta) u K′
6. Retornar G := (H,K)
7.
Note que las lıneas 4, 5 y 6 se pueden reemplazar por la siguiente:
Capıtulo 3. Diseno de HiperLab 46
?. Retornar G := (G ′′ u (Ta, Ta)) t G ′
Lema 1. Sean G ′ y G ′′ estructuras duales, entonces la estructura G retornada
por Componer(G ′,G ′′, A, a) es dual.
Demostracion. Sabemos del Lema 1 de [18], que si dos estructuras G y G ′
son duales (coherentes, completas), entonces G u G ′ y G t G ′ tambien son
duales (coherentes, completas). Luego, sean G := (Ta, Ta), G ′ := (H′,K′) y
G ′′ := (H′′,K′′) todas duales, entonces G ′′uG := (H′′uTa,K′′tTa) es dual, y
el retorno G := (G ′′ u G) t G ′ := ((H′′ u Ta) tH′, (K′′ t Ta) uK′) tambien.
Lema 2. Dada una estructura dual G sobre A ∪ a, con a /∈ A, siempre
existe un par de estructuras duales (G ′,G ′′) definidas sobre A, con G ′ v G ′′,tal que G esta compuesto por G ′ y G ′′.
Demostracion. En efecto, toda estructura G := (H,K) definida sobre un
A∪a, dado a /∈ A, puede componerse mediante dos estructuras duales G ′ :=(H′,K′) y G ′′ := (H′′,K′′) definidas sobre A, haciendoH′ := X; a 6∈ X ∈ H,K′ := Y \a;Y ∈ K, H′′ := X\a;X ∈ H y K′′ := Y ; a 6∈ Y ∈ K;esto porque (H′′ u Ta) t H′ = X ∪ a;X ∈ H t X; a /∈ X ∈ H = H, y
lo mismo para K.
A continuacion se describen en detalle los dos Generadores que se imple-
mentaron, los cuales se diferencian principalmente en la obtencion de cada
par de estructuras duales, que posteriormente compondran una nueva es-
tructura dual. El primer Generador, por su parte, a partir de una estructura
dual produce otra para conformar el par; el segundo Generador, en cambio,
produce independientemente cada estructura que conformara cada par.
3.4.1. Generador-A
Es posible identificar al menos tres variantes para un Generador de este
tipo, las cuales se diferencian unicamente en la manera que tienen de obten-
er cada par de estructuras duales (G ′,G ′′) que compondran la estructura Gsiguiente:
Capıtulo 3. Diseno de HiperLab 47
1. Fortaleciendo un G ′ dado para obtener G ′′: la dualidad se mantiene
incrementando paulatinamente G ′, hasta obtener un G ′′ que lo contiene,
en el sentido que G ′ v G ′′.
2. Debilitando un G ′′ dado para obtener G ′: la dualidad se mantiene decre-
mentando paulatinamente G ′′, hasta obtener un G ′ contenido en el, en
el sentido que G ′′ w G ′.
3. Generacion mixta: fortaleciendo y debilitando un G, para obtener, re-
spectivamente, G ′ y G ′′ tal que G ′ v G v G ′′, a partir de las cuales se
compondra un nuevo G, distinto al original.
Para HiperLab solo se construyo la variante del punto 1. Las otras dos no
fueron consideradas para este trabajo, por no aportar un gran aporte teorico
adicional en el tema. En particular, la segunda variante por debilitamiento
se trata de un caso totalmente equivalente al primero.
El algoritmo para este Generador es el siguiente:
1. Dado A
2. Definir A′ := ∅3. Definir G ′ := (∅, ∅)4. ∀a ∈ A5. 6. Definir G ′′ := G ′ →Mantener dualidad()
7. Redefinir G ′ :=Componer(G ′,G ′′, A′, a)
8. Redefinir A′ := A′ ∪ a9.
10. Redefinir G := G ′
11. Retornar G
La funcion Mantener dualidad() que permite obtener, a partir de una
estructura dual G ′ := (H′,K′) sobre A, otra estructura dual G ′′ := (H′′,K′′),tal que G ′ v G ′′, esta dada por:
1. Mantener dualidad()
2.
Capıtulo 3. Diseno de HiperLab 48
3. Dadas G ′, p4. Determinar x al azar en intervalo [0, 1]
5. Si (x ≥ p)
6. 7. Determinar Z ⊆ A al azar
8. Mientras Z /∈ ν(H′), repetir:
9. 10. Redefinir H′ := H′ t Z11. Redefinir K′ := K′ u [Z]
12. Determinar Z ⊆ A al azar
13. 14. 15. Retornar G ′′ := G ′
16.
La variable x (lıneas 4 y 5) corresponde a un valor aleatorio en el intervalo
[0, 1], el cual, de ser menor a un valor fijo p definido de antemano, impide
la eleccion de Z’s en esa iteracion. Esto es necesario para que todas las
estructuras duales tengan alguna posibilidad de ser generadas.
Lema 3. Toda estructura obtenida por el Generador-A es dual.
Demostracion. Es claro que ∀Z ⊆ A, GZ := (Z, [Z]) es dual. Luego,
como G ′ := (H′,K′) es dual, entonces por el Lema 1 de [18], el retorno de la
forma G ′ t GZ := (H′ t Z,K′ u [Z]) tambien es siempre dual.
Lema 4. Toda estructura dual tiene alguna probabilidad de poder obtenerse
mediante el Generador-A.
Demostracion. Dada G dual sobre A′ := A∪a, por Lema 2 sabemos que
existen G ′, G ′′ duales sobre A que la componen, y tal que G ′ v G ′′. Luego,
por induccion, podemos suponer que G ′ puede a su vez obtenerse mediante
el Generador-A, y dado el caso, tambien se puede, a partir de G ′, obtener G ′′
mediante Mantener dualidad; porque basta que en algun orden se produzcan
los Z’s deH′′\H′ (y solo ellos), lo que se dara siempre con alguna probabilidad
(aunque sea muy baja).
Capıtulo 3. Diseno de HiperLab 49
Note que si el algoritmo de generacion comenzara con la otra estructura
dual definida sobre A := ∅, es decir, (∅, ∅), independientemente del Z
elegido, esta estructura jamas cambiarıa. Por ello, se trata de un caso extremo
muy particular, que aunque sea demasiado trivial, existe y por tanto hay que
tener mentalmente en cuenta. Esta ultima estructura serıa la que deberıamos
elegir inicialmente para trabajar con la segunda variante del Generador, pues
es la unica definida sobre A := ∅ que puede debilitarse.
Lema 5. La complejidad computacional del Generador-A, a pesar que to-
davıa se desconoce, es super-polinomial.
Demostracion. En efecto, en [21] se demuestra que para cualquier A dado,
siempre existe un G ′′ dual que se puede obtener mediante las lıneas 10 y
11 de la funcion Mantener dualidad, a partir de un G ′ := (∅, ∅) y de una
secuencia de Z’s generados al azar; pero se demuestra ademas, que a pesar que
el tamano κ(K′′) de K′′ estara acotado por κ(H′′) (es decir, sera tan pequeno
como aquel), siempre existiran, independientemente de la sucesion de los
Z’s, estructuras G ′ := (H′, K′) intermedias con κ(K′) = κ(H′)Ω(loglogκ(H′)), es
decir, de tamanos super-polinomiales.
A pesar de lo anterior, como veremos mas adelante, este algoritmo se com-
porta en la practica al menos tan eficientemente como el Generador tradi-
cional (aquel descrito al comienzo de la seccion 2.5).
Finalmente, note que el Generador-A requirio de la definicion de oper-
adores adicionales. Todos ellos son claramente polinomiales, y fueron tambien
implementados en sus respectivas clases (ver seccion 3.2).
3.4.2. Generador-B
El algoritmo para este Generador es el siguiente:
1. Dado A
2. Genera(A)
3. 4. Si A = ∅5.
Capıtulo 3. Diseno de HiperLab 50
6. Elegir b ∈ 0, 1 al azar
7. Si b = 0 Retornar (∅, ∅)8. Sino Retornar (∅, ∅)9.
10. Elegir a ∈ A11. Definir G ′ :=Genera(A\a)12. Definir G ′′ :=Genera(A\a)13. Componer(G ′ u G ′′,G ′ t G ′′, A, a)
14.
Note que la lınea 13 se puede reemplazar por la siguiente:
?. Retornar G := (G ′ u G ′′) t ((Ta, Ta) u (G ′ t G ′′))
Lema 6. Toda estructura obtenida por el Generador-B es dual.
Demostracion. Dado el caso A := ∅, es evidente que siempre se retorna una
estructura dual. Luego, por induccion, suponiendo G ′ y G ′′ duales, entonces,
por Lema 1 de [18], G ′ u G ′′ y G ′ t G ′′ seran duales, y su composicion, por
Lema 1, retornara una nueva estructura dual.
Lema 7. Toda estructura dual tiene alguna probabilidad de poder obtenerse
mediante el Generador-B.
Demostracion. Es evidente que toda estructura dual sobre A := ∅ es
obtenible mediante el Generador-B. Luego, por induccion, podemos suponer
que dada una estructura dual G definida sobre A′ := A ∪ a, esta puede
obtenerse tambien mediante el Generador-B; porque por el Lema 2 sabemos
que existen G ′, G ′′ duales sobre A que la componen, de manera que G ′ v G ′′,y tal que por hipotesis de induccion, tambien son obtenibles mediante el
Generador-B.
Este algoritmo llama recursivamente al metodo Genera, y su condicion
de parada corresponde a la lınea 4. Al igual que el Generador-A, comienza
con estructuras pequenas definidas en A := ∅, las cuales se van incremen-
tando hasta llegar a una estructura final, definida en el A ingresado como
parametro.
Capıtulo 3. Diseno de HiperLab 51
En este caso, sin embargo, se construye virtualmente un arbol binario de
recursion completo, donde cada nodo esta determinado determinısticamente
por sus dos nodos hijos. Ası se generan, para un conjunto base A, 2|A| estruc-
turas para el primer nivel, con A := ∅. Recordemos que en el Generador-A,
en cambio, solo se generaban dos estructuras para cada nivel del conjunto
base.
Esto, por un lado, afecta enormemente la complejidad algorıtmica del
problema. En efecto, el Generador-B posee claramente un comportamiento
exponencial. Sin embargo, como veremos en el Capıtulo 5, donde compara-
remos ambos generadores, la distribucion de probabilidades de las estructuras
que produce el Generador-B es mucho mas homogenea que la del Generador-
A; y esto, como dijimos en la seccion 2.5, fue nuestro principal objetivo.
Quedara, no obstante, como trabajo futuro la mejora en la eficiencia y
homogeneidad de estos Generadores.
Capıtulo 4Metodologıa de desarrollo
4.1. Organizacion de HiperLab
4.1.1. Organizacion general
HiperLab esta conformado por los siguientes componentes:
1. Bibliotecas de cabecera: corresponde a las bibliotecas del codigo
fuente, es decir, a los archivos con extension .hpp donde estan imple-
mentadas las cuatro clases Harista, ParHarista, Hgrafo y Estruct
del sistema, junto con sus respectivos metodos.
2. Plataforma de experimentacion: aquı estan contenidos los archivos
fuente .cpp y los makefile de compilacion para producir los ejecuta-
bles. Estos archivos fuentes utilizan las bibliotecas del ıtem anterior
para la implementacion de algoritmos de experimentacion construidos
por los usuarios finales.
3. Generador de estructuras: el archivo Generador.cpp y su corre-
spondiente makefile. Este programa utiliza las bibliotecas propias del
Laboratorio, permitiendo generar estructuras de hipergrafos duales,
tanto para las etapas de testing como para pruebas aisladas de los
algoritmos implementados en la Plataforma de experimentacion.
4. Repositorio de Estructuras: lugar donde se almacenan las estruc-
turas de hipergrafos, como archivos de texto plano con extension .in
52
Capıtulo 4. Metodologıa de desarrollo 53
(de input) que los hace distinguible de los demas. Estos archivos pueden
crearse manualmente, o bien generarse automaticamente, utilizando el
Generador de estructuras.
5. Documentacion: conjunto de documentos afines a HiperLab; esto es,
manuales de usuario, documentos teoricos relacionados, y este mismo
informe de Memoria, junto con sus anexos.
Estos componentes estan almacenados individualmente en directorios, y
se organizan conforme el siguiente arbol de directorios:
Figura 4.1: Arbol de directorios de HiperLab.
El directorio principal HiperLab corresponde a la Plataforma de exper-
imentacion del Laboratorio, y en cada sub-directorio se ubica uno de los
componentes restantes.
Esta separacion mediante directorios tiene como finalidad ordenar el tra-
bajo de los usuarios finales del sistema, separando sus archivos de los pro-
pios de HiperLab, y evitando ası la edicion o eliminacion indeseada de estos
ultimos. Ası, una organizacion clara y transparente constituye un factor de
seguridad adicional para el Laboratorio.
4.1.2. Organizacion del codigo fuente
La totalidad del codigo fuente de HiperLab (archivos .hpp y .cpp) se
encuentra documentado.
Capıtulo 4. Metodologıa de desarrollo 54
Como se trata de un sistema de codigo abierto, se procuro que las lıneas
de codigo mas importantes de los archivos fuente .cpp, desde el punto de
vista de los algoritmos que implementan, estuvieran claramente comentadas,
para ası apoyar su entendimiento por parte de terceros. Ademas, se puso
especial atencion en que los outputs de los algoritmos fueran explicativos y
detallaran durante su computo explıcitamente en que paso se encontraban.
Para el caso de las bibliotecas .hpp, aparte de lo anterior, fue necesario
anadir una pequena resena del funcionamiento de cada uno de los metodos
implementados. Ademas se creo una etiqueta1 APOYO, que antecede al codigo
de cada metodo cuya unica finalidad es ayudar a otro metodo de la misma
clase, o de una clase jerarquicamente superior (ver seccion 3.1). Los metodos
con etiquetas APOYO son los unicos que no fueron disenados para ser utilizados
directamente por los usuarios finales.
Ejemplo. Una documentacion tıpica que antecede a la implementacion de
un metodo (en este caso, al metodo Completitud de la clase Hgrafo) es la
siguiente:
// [APOYO: Estruct-> Completitud]
/* Verificador de Completitud */
/* retorna NULL si es completa y ParHarista si no lo es */
La etiqueta APOYO de la primera lınea (encerrada entre corchetes para
mayor diferenciacion) indica que se trata de un metodo de apoyo a su meto-
do homonimo de la clase Estruct (en efecto, no tiene sentido verificar la
completitud de un solo hipergrafo). La segunda lınea es una suerte de tıtulo
del metodo, y la tercera, un breve resumen de lo que este debiera hacer o
retornar. Obviamente, el contenido de cada lınea depende del metodo; no to-
dos los metodos poseen la primera lınea; y la tercera lınea se puede extender
a mas de una, o bien puede prescindirse de ella, cuando el metodo es muy
simple.
La distribucion de los metodos dentro del codigo de cada biblioteca sigue
1Etiqueta: pequena marca o post-it para aclarar alguna idea o concepto, en este caso,escrita como comentario en el codigo fuente.
Capıtulo 4. Metodologıa de desarrollo 55
el siguiente orden:
1. Constructores de la clase.
2. Destructor de la clase.
3. Metodos propios de la clase (para el uso de terceros).
4. Metodos de apoyo para el funcionamiento de otros metodos.
5. Operadores estandar sobrecargados.
Finalmente, cabe destacar que mucha de la documentacion tiene que ver
con notaciones matematicas, las cuales no pueden representarse en archivos
de texto plano, como lo son los archivos de programacion. Es por esto que
se opto por utilizar un lenguaje en pseudo-LATEX, permitiendo mantener la
formalidad necesaria.
4.2. Gestion y configuracion de cambios
Durante todo el desarrollo de software se utilizo la metodologıa Extreme
Programing (XP), preferida para la realizacion de proyectos a corto plazo,
con pocos desarrolladores y una relacion estrecha con el cliente. En este caso,
se fueron entregando constantemente pequenos avances (implementaciones
de codigo o borradores del informe final) al profesor patrocinante, el cual los
revisaba mediante pequenos testing informales. Esto permitio una continua
retroalimentacion positiva cliente-desarrollador, facilitando la verificacion de
los requerimientos del software, y apoyando la minimalidad del codigo fuente,
en el sentido que ningun modulo del sistema resulta irrelevante.
Para garantizar el exito de esta metodologıa se puso especial atencion
en la organizacion de las entregas y la actualizacion y evolucion del sistema.
Apoyados en la organizacion general de HiperLab (seccion 4.1.1) cada avance
de implementacion que se entrego al profesor patrocinante se hizo de la sigu-
iente forma:
Cada avance se envio vıa e-mail, en archivos comprimidos en .tar.gz,
llamados HiperLab.tar.gz. Su descompresion modifica automatica-
mente el contenido anterior del sistema, pudiendose verificar la version
Capıtulo 4. Metodologıa de desarrollo 56
actual de un archivo mediante su ultima fecha de modificacion, o bien
en la carpeta “Recibidos” del correo electronico.
Por cada avance enviado, se guardo en el computador del de-
sarrollador una copia, con un nombre que seguıa el formato
mes-dia-nombre_archivo.tar.gz. Tales archivos se guardaron en
una carpeta adicional de HiperLab, llamada Respaldo, y situada en el
mismo nivel jerarquico que las carpetas 1, 3, 4 y 5, de la figura de 4.1.
Todos los archivos enviados, y por ende, almacenados en el repositorio
Respaldo, debıan compilar y venir acompanados de un archivo fuente
.cpp que arrojara outputs coherentes.
En cada envıo, el nuevo archivo HiperLab.tar.gz solo debıa contener
los archivos modificados o nuevos, y todos ellos, dentro de sus subcar-
petas correspondientes.
4.3. Plan de Testing
Para verificar el cumplimiento de los requisitos funcionales del software,
se realizo primero un plan de testing general, con el fin de verificar experi-
mentalmente la correctitud de los operadores y algoritmos implementados, y
si estos efectivamente permiten la implementacion de algoritmos interesantes,
relacionados con el Problema de Dualidad.
Una vez terminado este testing, se dio paso a la ejecucion de un segun-
do plan de testing, esta vez abocado a los Generadores, para realizar un
analisis comparativo entre el Generador-A y el Generador-B, en relacion a
su distribucion de probabilidades de generacion y a su eficiencia.
4.3.1. Plan de Testing General
A lo largo de toda la etapa de desarrollo del sistema, cada operador y algo-
ritmo, descrito en el Capıtulo 3, fue testeado independientemente luego de ser
implementado. Para este fin, se creo un unico archivo fuente2 en la Platafor-
2Este archivo fuente se mantuvo en el producto final, por tratarse de un codigo genericoque introduce al usuario novato en la utilizacion del programa.
Capıtulo 4. Metodologıa de desarrollo 57
ma de Experimentacion (directorio principal), que despliega en pantalla la
estructura original del archivo de entrada, y luego los resultados obtenidos
de la aplicacion de las distintas funcionalidades deseadas. Con esto se com-
probo el cumplimiento de los requisitos funcionales 1, 2 y 3, descritos en el
Capıtulo 2.
No obstante, aun es necesario hacer ver que las funcionalidades implemen-
tadas permiten efectivamente construir otros algoritmos interesantes, rela-
cionados con El Problema de Dualidad. Esto se pudo verificar justamente
mediante la implementacion de los Generadores descritos en el Capıtulo
3, los cuales debıan poder construirse utilizando unicamente las funcional-
idades existentes en HiperLab. Ademas, ambos Generadores, una vez con-
struidos, fueron testeados como cajas negras, tomando una serie de estruc-
turas obtenidas de su ejecucion como archivos de salida, y utilizandolas como
archivos de entrada para verificar, mediante el Algoritmo de Khachiyan y
desde la Plataforma de Experimentacion, la dualidad de todas ellas.
Figura 4.2: Prueba de ejecucion del Algoritmo de Khachiyan.
Capıtulo 4. Metodologıa de desarrollo 58
4.3.2. Plan de Testing de Generadores
Tanto el Generador-A como el Generador-B despliegan en pantalla de
igual manera las estructuras finales obtenidas de su ejecucion, ademas de
almacenar tales estructuras en el archivo de salida correspondiente, el cual
se situa automaticamente dentro del Repositorio de Estructuras.
La figura 4.3 muestra una captura de pantalla de la ejecucion de uno
de los Generadores. Parte de los datos que se exhiben son producto de una
modificacion que se hizo en el codigo fuente, con el fin de explicitar los valores
|Dom(G)|, |H| y |K|, ademas del tiempo de ejecucion. El calculo de todos
estos valores tiene complejidad constante, por lo que no afecta la eficiencia
del Generador.
Todos estos datos debieron posteriormente manipularse para obtener in-
formacion mas detallada, que permitiese comparar ambos Generadores, segun
su distribucion de probabilidades de generacion de estructuras.
Figura 4.3: Captura de pantalla de una generacion de estructura dual.
Capıtulo 4. Metodologıa de desarrollo 59
Como etapa previa al analisis de los datos se definio el siguiente plan de
testing:
1. Ejecutar 50 veces cada Generador, para cada uno de los siguientes
valores de |A|: 3, 5, 7, 9 y 11.
2. Construir para cada Generador y para cada valor de |A|, una tabla con
los valores |Dom(G)|, |H|, |K|, |H|+ |K|, κ(G) y el tiempo de ejecucion
(en segundos).
En base a esta informacion, se construyeron posteriormente distribuciones
de frecuencia y graficos que permitieron llegar a interesantes conclusiones.
Capıtulo 5Testing
5.1. Testing General
Ambos Generadores se implementaron utilizando solo algoritmos y op-
eradores provistos por HiperLab, sin la necesidad de construir metodos adi-
cionales ni sobrecargas de operadores de ningun tipo.
Ademas, cada Generador se ejecuto 50 veces para 5 distintos conjuntos
base ingresados como argumento, obteniendo 500 estructuras como archivos
de salida, las que, ingresadas como input para el Algoritmo de Khachiyan,
siempre arrojaron respuesta positiva, afirmando su dualidad. Luego, a cada
estructura se le quito una hiperarista al azar, con lo cual el Algoritmo de
Khachiyan, segun lo esperado, cambio su respuesta indicando no-dualidad.
Todo esto corrobora que los Generadores cumplen efectivamente su ob-
jetivo principal de generar estructuras de hipergrafos duales, y que ademas
pudieron lograrlo prescindiendo de herramientas de programacion ajenas a
las proporcionadas por HiperLab.
5.2. Testing de Generadores
El plan de testing se ejecuto segun lo descrito en la seccion 4.3.2, y los
resultados obtenidos se tabularon como se muestra en las tablas 5.2, 5.3, 5.4 y
5.5, al final de este capıtulo. Para el analisis de los datos, se compararon, para
cada valor de |A|, las distribuciones de frecuencia de κ(G) en cada Generador:
60
Capıtulo 5. Testing 61
Fig
ura
5.1
:C
om
para
cio
nd
ed
istr
ibu
cio
nes
de
frecu
en
cia
.
Capıtulo 5. Testing 62
Las ordenadas de cada grafico representan el numero de estructuras
obtenidas para cada rango de κ(G), cuyos valores estan representados en
las abscisas, y evidentemente aumentan a medida que aumenta |A|, pues
recordemos que κ(G) := |A| · (|H|+ |K|).En estos graficos puede apreciarse que el Generador-A produjo en gen-
eral estructuras mucho mas pequenas que el Generador-B, lo que se debe
fundamentalmente a dos razones:
La gran mayorıa de las estructuras obtenidas con el Generador-A tienen
dominio parcial, mientras que las obtenidas con el Generador-B, tienen
dominio total. Esto se puede apreciar en las tablas al final del capıtulo,
donde se marcaron con una T todas las estructuras con dominio total.
Las estructuras obtenidas con el Generador-A poseen en general un
hipergrafo con muy pocas hiperaristas; no ası el Generador-B, donde
el numero de hiperaristas entre ambos hipergrafos es bastante similar.
La explicacion para esto es que la probabilidad de que el Generador-A
produzca estructuras G ′′ mucho mayores que G ′ es muy baja, debido, por un
lado, a que en cada iteracion de la funcion Mantener dualidad (ver seccion
3.4.1), al elegir un Z /∈ ν(H′), este aumentara H′ (mediante el join), pero a la
vez disminuira la probabilidad de elegir un proximo Z que no lo responda; y
por el otro, a que para obtener este G ′′ grande, deben obtenerse en una misma
iteracion un numero importante de Zs consecutivos que no respondan a H′, y
la probabilidad de conseguir un Z tal disminuye exponencialmente en funcion
del incremento logrado por los Zs anteriores. Por lo tanto, la composicion de
G ′ y G ′′ retornara estructuras G con relativamente pocas hiperaristas X ∈ H,
tal que a ∈ X (ver algoritmo Componer en seccion 3.4), lo que implica un
|H| pequeno (ergo, un |K| pequeno), con dominio incompleto.
Capıtulo 5. Testing 63
Esta diferencia en el tamano de las estructuras puede apreciarse tambien
en las concentraciones de las frecuencias en cada grafico, donde las estructuras
generadas por el Generador-A se ubican en su enorme mayorıa a la izquierda,
y las generadas por el Generador-B, al centro del grafico 1.
Note ademas que estas distribuciones son casi disjuntas, lo que induce a
creer que en la practica, y al contrario de lo demostrado en los Lemas 4 y
7, los Generadores no logran obtener todas las estructuras existentes, como
supusimos serıa el caso; es decir, el Generador-A no consigue generar las es-
tructuras obtenidas por el Generador-B, y viceversa. No obstante, note que
en el cuarto grafico se da un caso en que el Generador-B produce una estruc-
tura relativamente pequena que esta dentro de los rangos del Generador-A.
Y ademas note que, segun [19]2, la mayorıa de las estructuras duales serıan
las de mayor tamano, y por tanto, en conjunto, mas probables de generar.
Finalmente, note que el Generador-B tiene una mejor distribucion de
probabilidades de generacion de estructuras que el Generador-A, puesto
que su rango de generacion es mas amplio. Esto, segun nuestro criterio
de calidad definido originalmente en los requisitos funcionales, nos harıa
preferir al Generador-B de entre ambos. Pero un estudio minucioso del
tema podrıa eventualmente contradecir conclusiones apresuradas. A pesar
de haber demostrado teoricamente que ambos Generadores pueden obtener
todas las estructuras duales, tambien queda experimentalmente (y en el caso
del Generador-A, incluso tambien teoricamente) claro que la probabilidad
de obtener con ellos cierto tipo de estructuras es muy cercana a cero.
Este (importante) problema de generacion quedara como trabajo futuro.
Nos contentamos, por ahora, con haber logrado obtener estructuras aleatorias
que sabemos son duales, y en el caso del Generador-B, la mayorıa de las veces
con dominio total y distribucion relativamente homogenea.
1Es sabido que dado un conjunto base A, existen estructuras duales, suponiendo |A|impar, de tamano κ(G) = 2 · |A| ·
( |A||A|2 +1
); a saber, aquellas con H = K := Z ⊆ A; |Z| =
|A|2 + 1. Ası, por ejemplo, para |A| = 7, κ(G) = 490, por lo que las distribuciones del
Generador-B en la figura 5.2 estarıan ubicadas en el centro del grafico, y no a la derecha.2Allı se propone un lattice de estructuras duales, ordenado segun v, cuyos maximo y
mınimo son las estructuras (∅, ∅) y (∅, ∅), respectivamente.
Capıtulo 5. Testing 64
Con respecto a la evaluacion del rendimiento promedio, se obtuvieron los
siguientes resultados:
Generador-ATime (s) κ(G) |A|0.024477 6 30.024957 18 50.025579 32 70.029065 57 90.037442 110 11
Generador-BTime (s) κ(G) |A|0.025140 12 30.029012 53 50.079097 231 70.805939 811 914.99955 2910 11
Tabla 5.1: Resultados promedio para ambos Generadores.
que representados graficamente se ven como sigue:
Figura 5.2: Eficiencia algorıtmica.
Este grafico muestra la eficiencia de ambos generadores. Se ve claramente
que el Generador-A se comporta muchısimo mejor que el Generador-B, en
funcion de |A|; en efecto, el Generador-B presenta claramente un compor-
tamiento exponencial. Sin embargo, si consideramos este grafico en funcion
de κ(G), ambos comportamientos no deberıan ser demasiado distintos. En
Capıtulo 5. Testing 65
otras palabras, el Generador-B es mucho mas lento que el Generador-A, no
tanto porque su estrategia de generacion sea mas ineficiente que la del segun-
do, sino porque tal estrategia genera en su mayorıa estructuras con dominio
total y con tamanos muy grandes. Eventualmente, si el Generador-A (luego
de muchos intentos) lograra generar una estructura mayor, esta tambien po-
drıa tardar mucho tiempo en obtenerse.
Capıtulo 5. Testing 66
|A|=
3
|Dom
(G)|
|H|
|K|
|H|+
|K|
κ(G
)time(s)
11
12
20.02394
22
13
60.023985
22
13
60.02479
11
12
20.024906
22
13
60.022544
22
13
60.020765
11
12
20.025606
22
13
60.025032
3T
22
412
0.02266
11
12
20.025337
22
13
60.024352
3T
22
412
0.023282
22
13
60.020256
11
12
20.026372
11
12
20.026982
22
13
60.022855
22
13
60.02474
3T
22
412
0.027196
11
12
20.021509
11
12
20.023142
3T
22
412
0.02226
11
12
20.026361
11
12
20.026781
3T
22
412
0.027727
22
13
60.023896
22
13
60.024596
3T
22
412
0.022907
3T
22
412
0.023755
11
12
20.025018
22
13
60.021382
22
13
60.026223
11
12
20.028051
21
23
60.025231
22
13
60.021381
22
13
60.023762
21
23
60.021096
3T
33
618
0.024302
3T
31
412
0.026271
3T
13
412
0.022355
3T
22
412
0.0221
11
12
20.021109
21
23
60.021397
11
12
20.02467
11
12
20.023127
22
13
60.023803
22
13
60.027391
3T
22
412
0.026239
11
12
20.024449
3T
22
412
0.025095
22
13
60.020864
|A|=
5
|D(G
)||H
||K
||H
|+|K
|κ(G
)time(s)
5T
42
630
0.027629
22
13
60.025691
11
12
20.026091
43
25
20
0.026238
5T
42
630
0.025034
22
13
60.02476
11
12
20.023199
22
13
60.021966
32
24
12
0.02051
11
12
20.024074
43
25
20
0.023666
22
13
60.026841
22
13
60.025115
5T
36
945
0.024838
5T
55
10
50
0.023665
43
25
20
0.024737
43
25
20
0.027666
22
13
60.022243
32
24
12
0.024329
44
37
28
0.024031
32
24
12
0.023012
43
25
20
0.025597
22
13
60.02738
22
13
60.023957
43
25
20
0.023278
5T
43
735
0.022403
22
13
60.023775
22
13
60.025112
5T
42
630
0.028014
43
25
20
0.024658
5T
45
945
0.023793
43
25
20
0.02177
43
25
20
0.023149
32
24
12
0.029646
32
24
12
0.021236
42
35
20
0.023408
32
24
12
0.024443
11
12
20.022192
32
24
12
0.022531
22
13
60.024141
5T
54
945
0.025806
42
35
20
0.025406
22
13
60.027001
5T
44
840
0.026295
44
37
28
0.025438
44
15
20
0.025755
42
35
20
0.023708
42
46
24
0.022065
32
24
12
0.025489
42
35
20
0.025052
|A|=
7
|D(G
)||H
||K
||H
|+|K
|κ(G
)time(s)
33
14
12
0.025416
7T
36
96
0.022606
7T
55
10
60.024428
22
13
20.027405
22
13
60.026572
53
36
60.022656
11
12
20.023075
33
14
60.022763
33
14
12
0.024139
53
36
20.028406
33
14
60.026888
43
25
12
0.023748
7T
45
96
0.026346
7T
46
10
20.027325
32
24
20.026417
7T
76
13
60.029071
53
36
60.025282
54
26
12
0.025272
64
37
20.023929
22
13
20.026964
7T
46
10
12
0.025165
43
25
20.022035
33
14
20.024547
64
48
12
0.028173
53
36
60.026157
43
25
60.024655
22
13
12
0.024306
53
36
12
0.024528
43
25
20.022526
7T
45
96
0.022935
22
13
60.026511
22
13
20.026008
54
48
60.02752
54
59
60.028717
22
13
60.024866
7T
67
13
60.025171
22
13
18
0.026381
7T
48
12
12
0.029203
53
36
12
0.024432
43
25
12
0.025029
33
14
20.022475
7T
48
12
60.026112
64
48
20.027415
65
38
20.024692
43
25
60.026386
22
13
60.02353
43
25
12
0.026625
64
48
20.02407
54
26
12
0.023546
53
47
60.026506
Tab
la5.2
:T
est
ing
de
Gen
era
dor-
Ap
ara|A|=3,5,7.
Capıtulo 5. Testing 67
|A|=
9
|Dom
(G)|
|H|
|K|
|H|+
|K|
κ(G
)time(s)
85
611
88
0.026885
76
39
63
0.025562
52
46
30
0.025069
85
813
104
0.030371
54
26
30
0.025095
53
36
30
0.027547
75
712
84
0.032030
64
59
54
0.026494
84
711
88
0.028751
64
48
48
0.026480
9T
917
26
234
0.057476
73
811
77
0.030830
87
11
18
144
0.040835
85
712
96
0.032650
54
26
30
0.033124
74
59
63
0.023932
53
36
30
0.025575
22
13
60.025363
22
13
60.030006
22
13
60.028035
22
13
60.023457
73
58
56
0.027434
65
27
42
0.023437
84
711
88
0.028465
87
613
104
0.033305
33
14
12
0.028996
52
46
30
0.025369
43
25
20
0.026910
53
36
30
0.029846
64
59
54
0.028320
42
35
20
0.027497
75
49
63
0.028333
32
24
12
0.026801
75
611
77
0.031633
65
49
54
0.028712
33
14
12
0.025159
64
37
42
0.026589
9T
410
14
126
0.026026
22
13
60.025059
53
36
30
0.024403
64
610
60
0.032282
22
13
60.024796
9T
610
16
144
0.047416
43
25
20
0.026293
74
812
84
0.034261
84
913
104
0.029035
75
510
70
0.031337
64
48
48
0.024961
85
510
80
0.029250
43
25
20
0.025751
|A|=
11
|Dom
(G)|
|H|
|K|
|H|+
|K|
κ(G
)time(s)
22
13
60.025472
10
716
23
230
0.066323
54
26
30
0.025634
84
59
72
0.026494
33
14
12
0.025169
97
15
22
198
0.058355
64
37
42
0.028327
53
47
35
0.032616
11
T5
13
18
198
0.033129
11
T7
17
24
264
0.063717
54
37
35
0.028462
64
48
48
0.032560
64
37
42
0.027377
74
48
56
0.026163
33
14
12
0.026298
22
13
60.022591
10
721
28
280
0.067121
10
58
13
130
0.029364
64
37
42
0.026217
33
14
12
0.025213
85
611
88
0.033968
22
13
60.025893
10
620
26
260
0.050367
83
69
72
0.027852
54
26
30
0.029323
98
715
135
0.043439
63
47
42
0.026211
10
11
13
24
240
0.066073
54
26
30
0.031309
11
T6
20
26
286
0.051847
74
59
63
0.025975
75
49
63
0.039751
74
48
56
0.029390
95
813
117
0.029877
96
612
108
0.036921
63
69
54
0.035385
53
36
30
0.028424
10
612
18
180
0.040742
84
711
88
0.027031
10
58
13
130
0.026020
10
514
19
190
0.040415
74
48
56
0.028954
11
T7
18
25
275
0.051997
65
49
54
0.031295
11
T8
14
22
242
0.055249
10
10
20
30
300
0.102238
54
26
30
0.028788
10
817
25
250
0.066246
53
36
30
0.027276
11
T3
21
24
264
0.037228
Tab
la5.3
:T
est
ing
de
Gen
era
dor-
Ap
ara|A|=9,1
1.
Capıtulo 5. Testing 68
|A|=
3
|Dom
(G)|
|H|
|K|
|H|+
|K|
κ(G
)time(s)
3T
33
618
0.023825
3T
22
412
0.022892
21
23
60.023562
3T
22
412
0.023577
3T
22
412
0.022898
3T
31
412
0.027482
21
23
60.023673
3T
33
618
0.026656
3T
33
618
0.029913
3T
31
412
0.023546
3T
22
412
0.025053
3T
33
618
0.027347
3T
22
412
0.024400
3T
22
412
0.026022
22
13
60.023884
3T
33
618
0.020071
3T
22
412
0.024938
3T
22
412
0.025211
3T
22
412
0.025525
3T
33
618
0.025666
21
23
60.025191
3T
22
412
0.023782
3T
22
412
0.022292
3T
22
412
0.023322
21
23
60.023926
21
23
60.026545
11
12
20.024182
3T
13
412
0.023290
22
13
60.025744
3T
22
412
0.021797
3T
22
412
0.031798
3T
31
412
0.026788
3T
13
412
0.023076
3T
33
618
0.023919
3T
33
618
0.034908
11
12
20.024618
3T
13
412
0.020864
3T
33
618
0.030316
3T
22
412
0.027069
3T
33
618
0.023900
21
23
60.032189
3T
22
412
0.028662
3T
22
412
0.024054
3T
22
412
0.023328
3T
22
412
0.021558
3T
22
412
0.021044
3T
33
618
0.033400
11
12
20.022426
3T
22
412
0.022543
3T
22
412
0.024321
|A|=
5
|D(G
)||H
||K
||H
|+|K
|κ(G
)time(s)
5T
77
14
70
0.026961
5T
56
11
55
0.031990
5T
57
12
60
0.029129
5T
66
12
60
0.028857
5T
37
10
50
0.027005
5T
55
10
50
0.027562
5T
44
840
0.031754
5T
87
15
75
0.032155
5T
66
12
60
0.028072
5T
43
735
0.025515
5T
66
12
60
0.027203
5T
45
945
0.028997
5T
77
14
70
0.026372
5T
54
945
0.027196
5T
44
840
0.026809
5T
66
12
60
0.030043
5T
45
945
0.029699
5T
45
945
0.027949
5T
77
14
70
0.030685
5T
66
12
60
0.028452
5T
55
10
50
0.037667
5T
54
945
0.028566
5T
56
11
55
0.027685
5T
55
10
50
0.028278
5T
55
10
50
0.029566
5T
87
15
75
0.033329
5T
64
10
50
0.029408
5T
55
10
50
0.026196
5T
46
10
50
0.031797
5T
55
10
50
0.024794
5T
54
945
0.024654
5T
55
10
50
0.029144
5T
45
945
0.032212
5T
55
10
50
0.029195
5T
57
12
60
0.026159
5T
65
11
55
0.028883
5T
66
12
60
0.028674
5T
77
14
70
0.026019
5T
56
11
55
0.029723
5T
66
12
60
0.030932
43
25
20
0.028886
5T
64
10
50
0.035902
5T
55
10
50
0.030441
5T
45
945
0.027941
32
24
12
0.025248
5T
77
14
70
0.029628
5T
66
12
60
0.030333
5T
66
12
60
0.028362
5T
45
945
0.029768
5T
67
13
65
0.028797
|A|=
7
|D(G
)||H
||K
||H
|+|K
|κ(G
)time(s)
7T
14
15
29
203
0.073015
7T
18
13
31
217
0.071504
7T
18
19
37
259
0.077710
7T
12
14
26
182
0.069341
7T
17
17
34
238
0.064128
7T
16
16
32
224
0.080931
7T
16
17
33
231
0.074483
7T
20
16
36
252
0.077096
7T
18
16
34
238
0.085348
7T
17
16
33
231
0.085456
7T
20
22
42
294
0.094113
7T
17
21
38
266
0.094563
7T
19
15
34
238
0.071256
7T
13
14
27
189
0.069208
7T
16
18
34
238
0.084613
7T
17
19
36
252
0.078335
7T
20
16
36
252
0.067610
7T
19
19
38
266
0.082607
7T
17
16
33
231
0.072725
7T
19
17
36
252
0.061652
7T
16
16
32
224
0.084486
7T
13
14
27
189
0.080447
7T
14
13
27
189
0.074239
7T
14
15
29
203
0.076234
7T
18
15
33
231
0.079463
7T
15
15
30
210
0.073338
7T
15
12
27
189
0.081999
7T
14
14
28
196
0.085780
7T
17
18
35
245
0.071902
7T
15
18
33
231
0.084696
7T
18
16
34
238
0.080974
7T
14
15
29
203
0.070950
7T
14
15
29
203
0.069911
7T
16
18
34
238
0.090181
7T
14
19
33
231
0.090010
7T
15
15
30
210
0.069212
7T
20
16
36
252
0.080064
7T
14
17
31
217
0.068558
7T
16
16
32
224
0.081595
7T
21
22
43
301
0.092226
7T
17
16
33
231
0.072333
7T
17
18
35
245
0.093477
7T
19
17
36
252
0.075223
7T
17
15
32
224
0.091308
7T
13
14
27
189
0.070065
7T
14
17
31
217
0.076978
7T
18
19
37
259
0.104866
7T
18
19
37
259
0.082713
7T
17
16
33
231
0.080948
7T
19
20
39
273
0.084962
Tab
la5.4
:T
est
ing
de
Gen
era
dor-
Bp
ara|A|=3,5,7.
Capıtulo 5. Testing 69
|A|=
9
|Dom
(G)|
|H|
|K|
|H|+
|K|
κ(G
)time(s)
9T
42
39
81
729
0.709325
9T
45
43
88
792
0.655464
9T
43
39
82
738
0.815629
9T
53
43
96
864
0.836942
9T
52
49
101
909
0.902451
9T
52
45
97
873
0.796999
9T
54
55
109
981
0.937789
9T
43
39
82
738
0.667070
9T
42
41
83
747
0.756809
9T
40
47
87
783
0.813318
9T
48
48
96
864
0.873560
9T
43
48
91
819
0.729076
9T
48
46
94
846
0.894203
9T
42
44
86
774
0.783554
9T
55
48
103
927
0.935926
9T
44
47
91
819
0.782155
9T
42
45
87
783
0.728604
9T
41
50
91
819
0.778868
9T
44
43
87
783
0.801494
9T
40
52
92
828
0.734627
9T
43
49
92
828
0.951197
9T
40
46
86
774
0.655391
9T
41
42
83
747
0.720712
9T
46
40
86
774
0.885418
9T
46
45
91
819
0.767792
9T
45
35
80
720
0.692567
9T
41
35
76
684
0.734278
9T
60
52
112
1008
1.071190
9T
43
51
94
846
0.911540
9T
40
49
89
801
0.681429
9T
51
48
99
891
0.880103
9T
46
47
93
837
0.768595
9T
39
45
84
756
0.691717
9T
48
56
104
936
0.750745
9T
49
53
102
918
0.710063
9T
42
44
86
774
0.709010
9T
48
54
102
918
0.905823
9T
43
52
95
855
0.806489
9T
47
47
94
846
1.162130
9T
42
38
80
72
0.741105
9T
47
48
95
855
0.847621
9T
43
42
85
765
0.767482
9T
45
45
90
810
0.780556
9T
42
52
94
846
0.765658
9T
46
50
96
864
0.854270
9T
55
53
108
972
0.949553
9T
48
49
97
873
0.887805
9T
49
48
97
873
0.847618
9T
40
37
77
693
0.683713
9T
44
44
88
792
0.781519
|A|=
11
|Dom
(G)|
|H|
|K|
|H|+
|K|
κ(G
)time(s)
11
T122
132
254
2794
15.07710
11
T140
147
287
3157
18.36570
11
T144
135
279
3069
18.52400
11
T142
139
281
3091
15.82980
11
T144
158
302
3322
18.68370
11
T139
138
277
3047
13.97480
11
T140
138
278
3058
15.24620
11
T134
148
282
3102
17.50640
11
T114
117
231
2541
11.93520
11
T134
140
274
3014
17.71570
11
T120
134
254
2794
13.47970
11
T150
148
298
3278
18.81790
11
T125
130
255
2805
15.65170
11
T128
119
247
2717
12.19330
11
T141
145
286
3146
16.95170
11
T136
142
278
3058
17.99240
11
T132
128
260
2860
14.48120
11
T136
125
261
2781
14.17550
11
T141
132
273
3003
15.05540
11
T122
118
240
2640
13.66910
11
T141
117
258
2838
13.67560
11
T144
133
277
3047
14.99510
11
T113
115
228
2508
10.75200
11
T129
134
263
2893
15.16810
11
T142
136
278
3058
14.20980
11
T138
128
266
2926
16.57870
11
T141
135
276
3036
15.41360
11
T122
119
241
2651
13.16100
11
T140
138
278
3058
13.91270
11
T118
119
237
2607
11.75620
11
T118
112
230
2530
10.20580
11
T122
112
234
2574
13.81190
11
T136
139
275
3025
13.46630
11
T133
130
263
2893
14.06700
11
T135
125
260
2860
16.36960
11
T143
131
274
3014
16.75200
11
T128
140
268
2948
14.76620
11
T144
131
275
3025
15.78480
11
T136
142
278
3058
16.46890
11
T120
130
250
2750
15.02420
11
T127
125
252
2772
13.80840
11
T124
126
250
2750
13.50950
11
T132
132
264
2904
14.26170
11
T135
144
279
3069
15.44330
11
T122
129
251
2761
14.92700
11
T138
143
281
3091
17.07840
11
T137
134
271
2981
13.75490
11
T119
124
243
2673
12.39330
11
T131
136
267
2937
16.27510
11
T129
144
273
3003
16.85980
Tab
la5.5
:T
est
ing
de
Gen
era
dor-
Bp
ara|A|=9,1
1.
Capıtulo 6Conclusiones
En esta Memoria de Tıtulo se ha construido un Laboratorio de Hiper-
grafos que cumple con todos los requisitos funcionales descritos en la seccion
2.1. HiperLab permite tanto la creacion como manipulacion de estructuras,
hipergrafos e hiperaristas, ademas de la ejecucion de los operadores y algo-
ritmos basicos relacionados con el Problema de Dualidad de Hipergrafos.
Observamos que los paradigmas de diseno y programacion utilizados du-
rante toda la etapa de desarrollo, a saber, la orientacion a objetos y la mod-
ularidad, fueron un gran acierto, pues favorecen una de las caracterısticas
quiza mas esperanzadoras de este trabajo: su reusabilidad, propiedad que hace
permisiva la utilizacion de este software por parte de otros investigadores-
programadores relacionados con el tema. Esta reusabilidad se debe a que tan-
to operadores como algoritmos fueron implementados independientemente de
las futuras aplicaciones que los utilicen, todos con entradas y salidas generi-
cas y sin parametros de entrada prescindibles. Pero corresponde, ademas, a
una decision de diseno y programacion que ha ido de la mano con el de-
sarrollo de lo que pretende ser una teorıa de hipergrafos de alto nivel [18]
[19] [20], donde los detalles de los conceptos mas complejos pueden ser pasa-
dos por alto, quedando encapsulados en los operadores mas basicos que los
conforman.
No obstante lo anterior, el proyecto no estuvo escaso de dificultades. Antes
de comenzar el desarrollo del Laboratorio, existıan muchos conceptos y de-
talles tecnicos poco maduros, e incluso obviados, que ahora han salido a luz
70
Capıtulo 6. Conclusiones 71
en toda su inesperada complejidad. Nos referimos, por ejemplo, al problema
de definir una jerarquıa de clases, que permitiese la implementacion de los
distintos operadores y algoritmos (la idea de una clase ParHarista, a saber,
en un principio no estaba contemplada); o bien a la organizacion del software,
mediante el uso de directorios; o a la utilizacion de plantillas para organizar
el codigo fuente. Sin embargo, entre todas las dificultades encontradas, sin
duda la mayor de todas resulto ser la del Problema de generacion de estruc-
turas duales, el cual no pudo ser resuelto satisfactoriamente. Recordemos, eso
sı, que una solucion polinomial a este Problema de Generacion implicarıa la
pertenencia del Problema de Dualidad a la clase NP (ver seccion 2.5).
Porque a pesar de haber logrado construir dos Generadores capaces de
producir, en teorıa, todas las estructuras duales, existen para ambos, es-
tructuras cuyas probabilidades de ser obtenidas son practicamente nulas. En
particular, vimos en los graficos de la figura 5.2 que las estructuras obtenidas
por el Generador-A son practicamente inalcanzables por el Generador-B, y
viceversa. Asimismo, suponemos que existen estructuras duales inalcanzables
para ambos Generadores. En este sentido, cabe decir que los resultados del
testing de Generadores no son en ningun caso concluyentes, lo que queda claro
con la nota de la seccion 5.2, que indica que no debemos fiarnos ciegamente
de los lımites de κ(G) mostrados en los graficos de la figura 5.2.
Por otra parte, como resultado experimental de la comparacion entre am-
bos Generadores, concluimos que el Generador-B era mejor que el Generador-
A, en el sentido que el primero genera estructuras duales con una distribucion
de probabilidades mas homogenea, y la gran mayorıa de las veces con un do-
minio total. No obstante, debemos considerar que el objetivo de obtener tales
estructuras es el de utilizarlas como inputs no triviales para algoritmos y oper-
adores relacionados con el Problema de Dualidad; y puesto que este problema
es sub-exponencial, en la practica resulta inviable la generacion de estruc-
turas en un tiempo exponencial, dada la cantidad y tamano de ellas que se
necesitan para realizar pruebas mas interesantes. Es en la practica, entonces,
demasiado restrictivo el comportamiento exponencial del Generador-B.
Dado lo anterior, surge una pregunta natural: ¿son mejores los nuevos
Generadores obtenidos, a la manera “tradicional” de generacion (aquella que
Capıtulo 6. Conclusiones 72
determina H minimales al azar, para obtener desde allı K := λ(H))?
La respuesta a esta pregunta no es directa. Sabemos que el Generador
tradicional serıa sub-exponencial (aunque nunca polinomial, por su depen-
dencia del Algoritmo de Khachiyan) si pudiesemos generar cualquier hiper-
grafo minimal, al azar y en tiempo sub-exponencial. Pero este es un problema
abierto, que sabemos es equivalente a nuestro Problema de generacion de es-
tructuras duales, debido a que existe una correspondencia uno a uno entre
las estructuras duales y los hipergrafos minimales. Por lo tanto, la resolu-
cion de cualquiera de estos problemas gatillarıa una solucion para el otro.
De hecho, los Generadores A y B propuestos, esencialmente lo que hacen es
ir generando justamente hipergrafos minimales H, fuera de que ademas pro-
duzcan hipergrafos λ(H), lo que para efectos de este analisis resulta lateral.
Por un lado, el Generador-A, aunque se demostro era super-polinomial
(Lema 5), en la practica se comportaba eficientemente. Sin embargo, su dis-
tribucion de probabilidades de generacion resulto ser muy poco homogenea,
y sus estructuras generadas, todas demasiado pequenas. Por otro lado, el
Generados-B, aunque poseıa una distribucion bastante homogenea, pecaba
de un comportamiento marcadamente exponencial, ya claro a partir de su
diseno, lo que restringe su utilizacion practica a conjuntos base demasiado
pequenos. Por ultimo, con respecto al Generador tradicional, desconocemos
su distribucion de probabilidades, ası como no tenemos claro como obtener el
H minimal. Porque si utilizaramos, por ejemplo, el metodo de fortalecimiento
de la variante implementada del Generador-A, ¿como sabrıamos hasta donde
fortalecerlo? ¿como impedir que se precisen demasiadas iteraciones (en fun-
cion de |H|) antes de llegar al H final, al momento de eliminar hiperaristas
producto del join, tal como ocurre con el Generador-A?
Por todo esto, resulta claro que se deberıa a futuro investigar otras formas
de generacion.
Una manera “natural” serıa, por ejemplo, dada la estructura vacıa, ir
fortaleciendo sus hipergrafos paulatinamente, manteniendo la coherencia de
G, y hasta que esta sea completa. Esto podrıa lograrse mediante el sigu-
iente algoritmo (considerando la funcion Dualidad como la implementada en
HiperLab):
Capıtulo 6. Conclusiones 73
1. Dado G := (H,K) = (∅, ∅)2. Definir (W,Z) = G →Dualidad( )
3. Mientras (W,Z) 6= ∅4. 5. //Dentro de iteracion, (W,Z) es particion no respondida por (H,K)
6. Elegir b ∈ 0, 1 al azar
7. Si b = 0, Redefinir H := H t W8. Si b = 1, Redefinir K := K t Z9. Definir (W,Z) = G →Dualidad( )
10. 11. Retornar G := (H,K) //G es completa y por tanto dual
Este generador es correcto, en el sentido que permite obtener todas las es-
tructuras duales, pero super-polinomial al igual que el Generador-A, puesto
que las hiperaristas W o Z ingresadas pueden “eliminar” (al momento de
hacer el join) hiperaristas antiguas, respectivamente, de H o K. Un tipo de
mejoras que se podrıa barajar para evitar estas eliminaciones, serıa aumen-
tar el control sobre la generacion, forzando que las estructuras obtenidas
sean siempre semi-completas (en cuyo caso los nuevos W,Z agregados siem-
pre pertenecerıan a las transversales minimales de los hipergrafos), en par-
ticular, haciendo que las hiperaristas integradas sean siempre minimal-no-
respondidas por el hipergrafo al que se integran (de manera que respondan
siempre a muchas hiperaristas, obteniendo estructuras pequenas con hiper-
aristas que no se pueden eliminar). Pero aun ası encontramos problemas, pues
tales restricciones van en desmedro de la obtencion de todas las estructuras
duales: en general, vemos que no todas las estructuras completas se pueden
obtener a partir de generaciones de solo semi-completas, a saber, por ejem-
plo, la estructura H := K := 110, 101, 011; y en el particular, relacionado
con las minimal-no-respondidas, las estructuras obtenidas serıan demasiado
pequenas, de modo que si partieramos con alguna estructura incompleta, no
es seguro que se pudiesen generar todas las posibles completas, a saber, por
ejemplo, para el caso H := K := ∅, el cual necesariamente terminarıa en una
iteracion integrando ∅ a uno de los hipergrafos. Adicionalmente, tal como se
hizo con los Generadores A y B, se precisarıa ademas estudiar la distribucion
de probabilidades de generacion de este metodo.
Capıtulo 6. Conclusiones 74
Intuitivamente, pareciera ser que ası como esta, este Generador produce
en general estructuras demasiado grandes (de tamano exponencial en funcion
de |A|), bien porque obtendrıa estructuras ubicadas muy cerca del centro del
lattice (seccion 5.2), o bien porque necesitarıa normalmente de muchas par-
ticiones (W,Z) para que hagan completo a G. Esto constituye un problema,
ya que tales estructuras son facilmente verificables en el Problema de Dual-
idad, en tiempo polinomial en funcion de su tamano, por un algoritmo que
simplemente pruebe todas las particiones de A. Y justamente este pareciera
ser el caso tambien de nuestro Generador-B, el cual seguramente con altas
probabilidades genera estructuras duales que se hacen completas “por des-
gaste”, vale decir, porque ya poseen tal tamano que resultarıa difıcil que no
lo fueran.
Vemos ası que las estructuras duales mas difıciles de obtener, parecieran
ser aquellas que no se obtienen por medio de este “desgaste”, sino al contrario,
son resultado de una secuencia “suficiente” y “precisa” de hiperaristas Z no
respondidas.
Esta conjetura nos invita a formular otra nueva pregunta: ¿por que esmer-
arnos en la generacion de todas las estructuras duales, y no buscar generar
solo un subconjunto representativo de ellas? Porque, ciertamente, existen al-
gunos tipos de estructuras para las cuales decidir su dualidad es un problema
al que el Problema de Dualidad General se puede reducir polinomialmente.
Tal es el caso de las estructuras saturadas (aquellas minimales que no pueden
crecer mas sin dejar de serlo) o de las auto-duales (aquellas con H = K),
entre otras.
Estas son consideraciones que se pueden tomar en trabajos futuros, para
la busqueda de Generadores mas eficientes a los implementados en HiperLab.
Bibliografıa
[1] C. Berge. Graphs and Hypergraphs. Dunod. 1970.
[2] A. Polymeris. Stability of two player games structures. Discrete AppliedMathematics. doi:10.1016/j.dam.2007.11.009, 2007.
[3] A. Polymeris, R. Contreras, M.A. Pinninghoff, E. Osses. Response-ability and its complexity. Proceedings of the International Conferenceon Artificial Intelligence IC-AI’02, volume III, CSREA Press, Las Ve-gas, USA. 2002.
[4] M.L. Fredman, L. Khachiyan. On the complexity of dualization of mono-tone disjunctive normal forms. Journal of Algorithms, 21. 1996.
[5] E. Boros, V. Gurvich, L. Khachiyan, K. Makino. Dual-bounded gener-ating problems: partial and multiple transversal of a hypergraph. SIAMJournals, SICOMP volume 30 issue 6. 2001.
[6] E. Boros, K. Elbassioni, V. Gurvich, L. Khachiyan, K. Makino. Dual-bounded generating problems: all minimal integer solutions for a mono-tone system of linear inequalities. SIAM Journals, SICOMP volume 31issue 5. 2002.
[7] E. Boros, V. Gurvich, L. Khachiyan, K. Makino. Dual-bounded gener-ating problems: weighted transversals of a hypergraph. Journal of Algo-rithms. 2003.
[8] E. Boros, K. Elbassioni, V. Gurvich, L. Khachiyan. An Efficient Imple-mentation of a Quasi-Polynomial Algorithm for Generating HypergraphTransversals and its Application in Joint Generation. Algorithms - ESA2003, 11th Annual European Symposium, Budapest, Hungary. 2003.
[9] V. Gurvich. Nash-solvability of games in pure strategies. USSR. Comput.Math. and Math. Phys., 15(2):357-371. 1975.
75
Bibliografıa 76
[10] T. Eiter, G. Gottlog. Identifying the minimal transversals of a hyper-graph and related problems. SIAM J. Computing, 24(6):1278-1304. 1995.
[11] T. Eiter, G. Gottlog, K. Makino. New results on monotone dualizationand generating hypergraph transversals. Proceeding of the STOC’02 con-ference, Montreal, Quebec, Canada. 2002.
[12] Kavvadias, E. Stavropoulos. A new algorithm for the transversal hyper-graph problem. echnical Report CTI TR 99.03.03, Computer TechnologyInstitute, Patras, Greece. 1999.
[13] D. Kavvadias, E. Stavropoulos. Evaluation of an algorithm for thetransversal hypergraph problem. Proceedings of the 3rd InternationalWorkshop on Algorithm Engineering, p. 72-84. 1999.
[14] S. MacLane, G. Birkhoff. Algebra. The MacMillan Company. 1986.
[15] G. Avello. Apuntes de Matematicas Universales, Cap.2: Relaciones Bina-rias. Departamento de Matematicas, Universidad de Concepcion, Chile.2003.
[16] F. Riquelme. Completitud de hipergrafos en Zchaff. Trabajo de investi-gacion. DIICC, Universidad de Concepcion, Chile. 2006.
[17] G. Gallo, M. Scutella. Directed Hypergraphs as a Modelling Paradigm.Technical Report. UMI Order Number: TR-99-02., University of Pisa.1999.
[18] A. Polymeris. Structure Response-Ability. Apunte de estudio. DIICC,Universidad de Concepcion, Chile. 17/10/2007.
[19] A. Polymeris. Hypergraph Response-Ability. Apunte de estudio. DIICC,Universidad de Concepcion, Chile. 26/02/2007.
[20] A. Polymeris. Weak Completeness Problem. Apunte de estudio. DIICC,Universidad de Concepcion, Chile. 10/05/2004.
[21] K. Takata. On the sequential method for listing minimal hitting sets.Proceedings Workshop on Discrete Mathematics and Data Mining, 2ndSIAM International Conference on Data Mining, April 11-13, Arlington,Virginia, USA. 2002.
Apendice AManual de usuario
A.1. Como utilizar HiperLab
Los nuevos codigos fuente que implemente debera crearlos en el directo-rio “HiperLab”, correspondiente a la “plataforma de experimentacion” delsistema. Para utilizar tanto los operadores como los algoritmos de HiperLab,ubicados en el directorio “Clases”, es necesario incluir previamente la claseEstruct en el encabezado de su archivo, mediante la instruccion:
#include "./Clases/Estruct.hpp"
Esta clase llama a todas las demas. Sin embargo, si se desea manipularuna clase especıfica (junto con todas las que esten por debajo de su jerarquıa),entonces debe llamarla mediante una instruccion del tipo:
#include "./Clases/Nombre_clase"
Una vez termine de implementar su algoritmo, puede ejecutar cualquierade los generadores ubicados en el directorio “Generador”, los cuales ledevolveran estructuras duales aleatorias del tamano deseado, que seranalmacenadas en el directorio “Estructuras”. Estos generadores requierende dos argumentos: el nombre principal del archivo con extension .in enque sera almacenada la estructura, y la cardinalidad del conjunto basesobre el cual estara definida. Ası, el archivo se almacenara bajo el nombre|A|_nombre_principal_archivo.in. Recuerde que cualquiera de estasestructuras dejara de ser dual, si elimina cualquiera de sus hiperaristas.
Finalmente, si lo desea, puede ir guardando los informes de sus experien-cias con HiperLab en la carpeta “Documentacion”.
77
Apendice A. Manual de usuario 78
A.2. Algoritmos y Operadores de HiperLab
Clase Estruct
1. Chvatal. Verificador del Lema de Chvatal.ParHarista* Chvatal(); O(|A|) := κ(H +K).
2. Coherencia. Verificador de Coherencia.ParHarista* Coherencia(); O(|A|) := κ(H · K).
3. Completitud. Verificador de Completitud.ParHarista* Completitud(); O(|A|) := 2|A|.
4. Dualidad. Verificador de Dualidad.ParHarista* Dualidad(); O(|A|) := 2Log|A|.
5. GetE. Retorna atributo privado de objeto que llama al metodo.pair<Hgrafo*,Hgrafo*> GetE(); O(|A|) := k.
6. GetH. Retorna primer o segundo hipergrafo de estructura que llama almetodo, segun parametro es true o false.Hgrafo* GetH(bool b); O(|A|) := k.
7. Mu. Retorna estructura minimal de estructura que llama al metodo.Estruct* Mu(); O(|A|) := κ(H2 +K2).
8. Nu. Retorna estructura respondida por hipergrafos de estructura quellama al metodo.Estruct* Nu(); O(|A|) := 2|A|.
9. Semi completitud. Verificador de Semi-completitud.ParHarista* Semi_completitud(); O(|A|) := κ(H2 +K2).
10. Sigma. Retorna estructura crıtica sujeta a hipergrafos de estructuraque llama al metodo.Estruct* Sigma(); O(|A|) := 2|A|.
11. swap. Cambia atributo privado de objeto que llama al metodo.Estruct* swap(pair<Hgrafo*,Hgrafo*> est); O(|A|) := k.
12. Tau. Retorna estructura transversal a hipergrafos de estructura quellama al metodo.Estruct* Tau(); O(|A|) := 2|A|.
13. << Despliegue de estructura en pantalla.ostream& <<(ostream& output, Estruct& G); O(|A|) := κ(H+K).
Apendice A. Manual de usuario 79
14. + Retorna el join de dos estructuras ingresadas como parametro.Estruct& +(Estruct& G1, Estruct& G2); O(|A|) := κ((H +K)2).
15. * Retorna el meet de dos estructuras ingresadas como parametro.Estruct& *(Estruct& G1, Estruct& G2); O(|A|) := κ((H +K)2).
Clase Hgrafo
1. GetH. Retorna atributo privado de objeto que llama al metodo.list<Harista*> GetH(); O(|A|) := k.
2. is in. Retorna true o false segun hiperarista ingresada como parametropertenece o no a hipergrafo que llama al metodo.bool is_in(Harista* Z); O(|A|) := κ(H).
3. is in nu. Retorna true o false segun hiperarista ingresada comoparametro es respondida o no por hipergrafo que llama al metodo.bool is_in_nu(Harista* Z); O(|A|) := κ(H).
4. is in sigma (1). Retorna true o false segun hiperarista ingresadacomo parametro es crıtica o no con respecto a hipergrafo que llama almetodo.bool is_in_sigma(Harista* Z); O(|A|) := κ(H).
5. is in sigma (2). Retorna −1 si hiperarista Z ingresada como parametroes crıtica con respecto a hipergrafo H que llama al metodo; en casocontrario, retorna a ∈ Z tal que (Z\a) ∈ σ(H).int is_in_sigma(Harista* Z, bool b); O(|A|) := κ(H).
6. is in tau. Retorna true o false segun hiperarista ingresada comoparametro es transversal o no de hipergrafo que llama al metodo.bool is_in_tau(Harista* Z); O(|A|) := κ(H).
7. Mu. Retorna hipergrafo minimal de hipergrafo que llama al metodo.Estruct* Mu(); O(|A|) := κ(H2).
8. Nu. Retorna hipergrafo respondido por hiperaristas de hipergrafo quellama al metodo.Estruct* Nu(); O(|A|) := 2|A|.
9. Sigma. Retorna hipergrafo crıtico sujeto a hiperaristas de hipergrafo quellama al metodo.Estruct* Sigma(); O(|A|) := 2|A|.
10. swap. Cambia atributo privado de objeto que llama al metodo.Hgrafo* swap(list<Harista*> hg); O(|A|) := k.
Apendice A. Manual de usuario 80
11. Tau. Retorna hipergrafo transversal a hiperaristas de hipergrafo quellama al metodo.Estruct* Tau(); O(|A|) := 2|A|.
12. << Despliegue de hipergrafo en pantalla.ostream& <<(ostream& output, Hgrafo& H); O(|A|) := κ(H).
13. + Retorna el join de dos hipergrafos ingresados como parametro.Hgrafo& +(Hgrafo& H, Hgrafo& K); O(|A|) := κ((H +K)2).
14. * Retorna el meet de dos hipergrafos ingresados como parametro.Hgrafo& *(Hgrafo& H, Hgrafo& K); O(|A|) := κ((H · K)2).
Clase ParHarista
1. GetHa. Retorna primera o segunda hiperarista de par de hiperaristasque llama al metodo, segun parametro es true o false.Harista* GetHa(bool b); O(|A|) := k.
2. << Despliegue de par de hiperaristas en pantalla.ostream& <<(ostream& output, ParHarista& W_Z); O(|A|) := |A|.
Clase Harista
1. Atomos. Retorna lista de hiperaristas correspondiente a los atomos dehiperarista que llama al metodo.list<Harista*> Atomos(); O(|A|) := |A|.
2. Card. Retorna cardinalidad de hiperarista que llama al metodo.int Card(); O(|A|) := |A|.
3. GetHa. Retorna atributo privado de objeto que llama al metodo.list<Harista*> GetHa(); O(|A|) := k.
4. Intersecta. Retorna true o false segun hiperarista que llama al metodose intersecta o no con hiperarista ingresada como parametro.bool Intersecta(Harista* Z); O(|A|) := |A|.
5. Neg. Incluye o elimina elemento ingresado como parametro de hiper-arista que llama al metodo.Harista* Neg(int a); O(|A|) := k.
6. swap (1). Cambia atributo privado de objeto que llama al metodo.Harista* swap(vector<bool> ha); O(|A|) := k.
Apendice A. Manual de usuario 81
7. swap (2). Cambia atributo privado de objeto que llama al metodo, porotro seteado aleatoriamente. Puede setearse hasta posicion a del vector,y lo restante con 0’s.Harista* swap(int a); O(|A|) := |A|.
8. << Despliegue de hiperarista en pantalla.ostream& <<(ostream& output, Harista& Z); O(|A|) := |A|.
9. <= Relacion “menor o igual” entre dos hiperaristas, en funcion del ordenusual de conjunto base.bool <=(Harista& W, Harista& Z) O(|A|) := |A|.
10. == Relacion “igualdad” entre dos hiperaristas.bool ==(Harista& W, Harista& Z) O(|A|) := |A|.
11. ! = Relacion “desigualdad” entre dos hiperaristas.bool !=(Harista& W, Harista& Z) O(|A|) := |A|.
12. ++ Incrementa en 1 la codificacion numerica de vector binario queconforma atributo privado de hiperarista que llama al metodo.Harista& ++(Harista& Z) O(|A|) := |A|.
13. ∼ Retorna complemento de hiperarista que llama al metodo.Harista& ~(Harista\& Z) O(|A|) := |A|.
14. + Retorna union de dos hiperaristas que llaman al metodo.Harista& +(Harista& W, Harista& Z) O(|A|) := |A|.