Fragmentación Vertical usando AGs

Anuncio
FRAGMENTACIÓN VERTICAL Y ASIGNACIÓN SIMULTANEA EN BDD
USANDO ALGORITMOS GENÉTICOS.
Edmundo Taddei Zavala
Departamento de Ingeniería Civil y Minas
Universidad de Sonora
Hermosillo, Sonora, México
[email protected]
Ángel Kuri Morales
Centro de Investigación en Computación
Instituto Politécnico Nacional
México D. F.
[email protected]
Resumen.
La tecnología actual favorece el uso y aplicación de las bases de datos distribuidos (BDD):
aquellas BDs en las que la información se encuentra en sitios geográficamente separados.
El diseño de la distribución (la fragmentación de las relaciones y su asignación a los sitios
de la red) es una de las tareas más complejas involucradas en el diseño de una BDD y,
típicamente, no se hace de manera automática. En este trabajo se presenta un Algoritmo
Genético (AG) que se aplica a tal diseño. El AG ataca, simultáneamente, el problema de
fragmentar verticalmente y asignar los fragmentos a los sitios de manera óptima. La
naturaleza evolutiva del AG permite resolver en paralelo la fragmentación y la asignación:
problemas que guardan una relación no lineal entre ellos.
Palabras clave: Bases de Datos, Distribución, Fragmentación, Algoritmos Genéticos.
1. INTRODUCCIÓN.
El diseño de BDDs incluye, además de los problemas de diseño clásicos de bases de datos
centralizadas, el problema del diseño de la distribución, cuyo propósito es mejorar el
rendimiento global del sistema. El diseño de la distribución, a su vez, está compuesto de la
fragmentación y de la asignación de los fragmentos a los diversos sitios de la red. La
fragmentación es el proceso mediante el cual una relación global es descompuesta en
fragmentos horizontales y/o verticales. Un fragmento vertical atiende al agrupamiento de
datos en función de atributos o conjuntos de ellos, mientras que la fragmentación horizontal
atiende a dicho agrupamiento en función de tuplas o conjuntos de tuplas. La asignación, por
su parte, se refiere al problema de ubicar los fragmentos (ya sean verticales u horizontales)
de manera que el acceso a la información se haga de la “mejor” manera posible.
Típicamente, los criterios que determinan si la fragmentación y la asignación son óptimas
se establecen de manera independiente. Por ello, es frecuente que se trate de optimizar1 en
dos pasos. En el primero se busca la “mejor” fragmentación y, en el segundo, se busca la
“mejor” ubicación de los fragmentos obtenidos en el paso anterior [CERI84]. La aplicación
de un AG permite, entre otras cosas, la optimización simultánea de los criterios de
fragmentación de distribución sin presumir independencia de dichos criterios. En este
artículo reportamos resultados que se refieren solamente a la fragmentación vertical y a la
asignación de dichos fragmentos.
La partición vertical es el paso en el cual una relación es dividida en grupos de atributos
llamados fragmentos verticales [OZSU97]. La fragmentación vertical de las relaciones,
tradicionalmente, se puede hacer desde dos perspectivas diferentes. Una de ellas parte de
considerar que todos los atributos están ubicados en un fragmento único y éste se va
dividiendo sucesivamente de acuerdo con algún criterio (típicamente heurístico). La otra,
supone que cada atributo es un fragmento y a éstos los va agrupando de manera sucesiva de
acuerdo también con algún heurístico. Formulado de esta manera, el problema parece ser
bastante sencillo. Sin embargo, la metodología propuesta tiene dos limitantes
fundamentales. En primer lugar, que el número de posibles soluciones crece
exponencialmente con el número de atributos. Por ejemplo, en una relación con 10
atributos, el número de subconjuntos disjuntos que se pueden tener, esto es, el número de
fragmentos verticales posibles es de 115, 975. (En una relación de m atributos el número de
formas en que pueden éstos ser agrupados está definido por el número de Bell B(m). B(m),
se acerca a mm para una m suficientemente grande). En segundo lugar los algoritmos de
este estilo usados en la práctica (genéricamente llamados algoritmos best-first) asumen
independencia de los eventos considerados. Esta suposición es, en general, inválida; se
apela a ella a falta de mejores alternativas.
El propósito de la distribución es mejorar el rendimiento global del sistema por lo que tanto
la fragmentación como la ubicación de los fragmentos en la red deben estar fuertemente
ligados con los requerimientos del sistema mismo. Esto es, las decisiones de qué
fragmentos formar y dónde ubicarlos deben ser tomadas de acuerdo con el uso que las
diferentes transacciones induzcan en los atributos de la relación [NAVA89].
El resto del trabajo está organizado como sigue: en la sección 2 se comentan los trabajos
relacionados. En la sección 3 se expone el algoritmo genético utilizado para la solución el
problema. En la sección 4 se presentan los resultados experimentales obtenidos. En la
quinta y última sección se incluyen las conclusiones.
2. TRABAJOS RELACIONADOS.
El problema de la distribución en BDD ha sido abordado de muchas formas. Así, este
problema ha sido modelado como el problema de asignación de archivos, el cual establece,
como una premisa, la prohibición de fragmentar las relaciones (en este caso tratadas como
1
Utilizaremos el término “optimizar” y sus derivados para denotar la búsqueda y posible determinación del
mejor valor o conjunto de valores en un espacio finito de posible soluciones atendiendo a una medida de
desempeño claramente especificada.
archivos) y el problema se reduce a asignar las relaciones completas sobre los sitios de la
red, con el propósito de minimizar el costo total de accesos locales y remotos [BELL92].
Sin embargo, como se establece en la literatura, esta aproximación no modela
correctamente el problema de BDD ya que considerar las relaciones como archivos
individuales es inconveniente dado que no representan una unidad de asignación apropiada
[APER88]. Un estudio detallado sobre el problema de la asignación de archivos se
encuentra en [DOWD82].
En otras propuestas se asume que la fragmentación ha sido realizada como un paso previo a
la asignación de los fragmentos. El problema de la fragmentación puede verse en detalle en
[CERI84, OZSU97].
En [BRUN94] se asume que las relaciones pueden ser fragmentadas de alguna manera
natural en varios bloques de tamaño fijo o grupos de tuplas y el problema reside en dónde
ubicar esos fragmentos. Para ello, el algoritmo propuesto, mantiene un contador del número
de accesos de cada uno de los sitios a cada uno de los bloques. El contador de accesos a un
bloque es actualizado con cada una de las transacciones que accede a una tupla en ese
bloque. El bloque o fragmento es asignado al sitio con mayor número de accesos a ese
bloque. Un examen del contador de accesos a cada bloque a intervalos regulares, permite
hacer una reasignación dinámica de los fragmentos en respuesta a patrones de accesos
cambiantes con el tiempo.
Ceri y Pelagatti [CERI84] proponen un conjunto de criterios generales para la asignación
de fragmentos tomando en cuenta la diferencia de considerar la réplica de datos o no y una
medida de costo y beneficio de la asignación de fragmentos es dada en cada caso. Apers
[APER88], propone un esquema de fragmentación como el expuesto previamente si una
función de costo (tal como el costo de comunicación) será minimizada. A ello le agrega una
partición horizontal aleatoria que permita un mayor paralelismo si una función de
rendimiento (tal como el tiempo promedio de respuesta) será optimizada. Para minimizar el
costo total de transmisión, propone dos esquemas de evaluación de la solución: una basada
en árboles de decisión y la otra en un algoritmo voraz (greedy).
Un algoritmo de partición vertical de relaciones en BDD con el propósito de maximizar el
procesamiento de transacciones locales es propuesto en [NAVA84] y un algoritmo gráfico
para la partición vertical en diseño de bases de datos, se desarrolla en [NAVA89]. En
[PERE97] se considera que los atributos de una relación, al ubicarse en un nodo dado,
formarán el conjunto de elementos del fragmento vertical de la relación en dicho nodo.
Además, señalan, se formula una función objetivo sencilla que permite ubicar o reubicar los
atributos de la relación en los nodos de la red de manera óptima, minimizando los costos de
comunicación. Una extensión del algoritmo anterior es presentada en [PERE99] donde a la
función objetivo anterior se le agregan los términos necesarios para considerar el costo de
acceder a un fragmento y el costo de almacenar un fragmento en un sitio determinado.
En [SHEP95] se utiliza una aproximación de dos fases, las cuales consisten en: 1) formar
cúmulos de fragmentos y 2) asignar los cúmulos de fragmentos sobre los nodos de la red.
En los trabajos de [CHAK92 y MUTH93] se propone un algoritmo de fragmentación
vertical. Aquí el propósito es minimizar los accesos remotos y maximizar los accesos
locales sin considerar la réplica de datos. En otras palabras, se pretende que cada sitio sea
capaz de procesar las transacciones localmente con un mínimo de accesos a datos
localizados en sitios remotos. La meta es lograr un costo de procesamiento mínimo para
cualquier transacción originada en cualquier sitio. [SMIT97] reporta los resultados
obtenidos de aplicar un algoritmo genético al algoritmo propuesto por [CHAK92 y
MUTH93].
3. UN ALGORITMO GENÉTICO PARA LA FRAGMENTACIÓN VERTICAL Y
ASIGNACIÓN SIMULTANEA EN BDD.
El algoritmo genético diseñado para la fragmentación vertical y asignación simultanea en
BDD (al que llamaremos AGEP), consta de los siguientes cinco componentes:
3.1. Representación de las soluciones.
Cuando se fragmenta de manera vertical se tienen B(m) formas distintas de dividir una
relación de m atributos. Cada una de esas opciones tiene que ser representada con una
cadena de longitud finita sobre algún alfabeto finito [GOLD89], tomando en cuenta las
características del problema que se está resolviendo. En este caso los atributos de una
relación y el sitio al cual serán asignados éstos deben ser codificados. Para ello, un vector
de enteros de longitud igual al número de atributos de la relación será utilizado para
representar las posibles soluciones del problema. Este vector tendrá enteros entre 1 y N,
donde N indica el número de sitios en la red. De esta manera el vector siguiente representa
una posible solución, si consideramos una relación con 10 atributos y una red con 5 sitios.
(5 2 4 3 1 3 3 5 2 4)
La propuesta de solución anterior debe ser interpretada de la forma siguiente. La posición
de vector indica el atributo y los componentes del vector los sitios. Por lo tanto, la solución
previa nos dice que la fragmentación y asignación a los sitios respectivos debe ser de
acuerdo a la tabla siguiente
Sitio
1
2
3
4
5
Atributos en el Fragmento
5
2
4
3
1
9
6
10
8
7
Esta representación es adecuada para este problema ya que la solución incluye tanto la
división de la relación en subrelaciones como su asignación a un sitio de la red
simultáneamente.
3.2. Población inicial.
A diferencia de las técnicas de optimización tradicionales, que basan el proceso de
búsqueda del óptimo sobre puntos (es decir, ésta avanza de un punto a otro) los AG buscan
la solución pasando de un conjunto de puntos a otro. A cada punto se le llama individuo y
al conjunto de puntos se le llama población y es necesario crear una población inicial para
el arranque del algoritmo genético. Esta población inicial, generalmente, se crea de manera
aleatoria. Para la solución de este problema, un conjunto de vectores enteros como el de la
sección 3.1 fue creado para iniciar el algoritmo.
3.3. Función de evaluación.
La función de evaluación, también llamada función objetivo, establece una clasificación de
los individuos de la población asignándole a cada uno ellos una calificación de acuerdo a su
mérito (fitness) [MICH94]. Es decir, los individuos que mejor se comportan obtienen una
calificación mayor que aquellos que actúan pobremente. La función objetivo, se define en
función de la tarea de optimización que se desea realizar. En este caso, el objetivo de
fragmentar y asignar fragmentos es la minimización de los accesos remotos y la
maximización de los accesos locales. La función de evaluación propuesta por [MUTH93]
EP(i) = EM2 + ER2
evalúa las propuestas de solución con dos términos. El primero de ellos calcula el costo de
acceder a atributos locales irrelevantes, mientras que el segundo calcula el costo de acceder
a atributos remotos relevantes y para ello usa la matriz de uso de atributos (MUA). La
función objetivo usada en este algoritmo es
fitness(i) = C – EP(i)
En esta ecuación fitness(i) es la calificación asignada a la i-ésima solución propuesta y C es
una constante suficientemente grande para evitar fitness negativos.
3.4. Operadores genéticos.
Los AG utilizan un conjunto de operadores genéticos para recombinar la población. La
recombinación de la población es el proceso de alterar la población actual a partir de la
aplicación de los operadores genéticos para obtener la población siguiente. Los operadores
genéticos clásicos son la selección, el cruzamiento y la mutación, aunque otros operadores
también pueden ser usados [HOLL92].
En este algoritmo se usó la selección proporcional [BACK96], el cruzamiento simple y la
mutación uniforme [KURI99]. Durante la selección, los individuos de la población actual
son seleccionados aleatoriamente, de acuerdo a la calificación obtenida durante la
evaluación, para formar una población intermedia. Cabe aclarar que en este paso un
individuo puede ser seleccionado en más de una ocasión. En esta población intermedia se
forman parejas para, sobre ellas, aplicar el operador de cruzamiento. Este operador combina
dos individuos padres para obtener dos individuos hijos, como se ejemplifica a
continuación. Recordando lo expuesto en la sección 3.1, consideremos dos propuestas de
solución donde (para la claridad del ejemplo) todos los atributos están en un solo
fragmento, pero en sitios diferentes, como sigue
(1 1 1 1 1 1 1 1 1 1)
(5 5 5 5 5 5 5 5 5 5 )
Si el punto de cruzamiento, obtenido de manera aleatoria, es 5, al cruzar a los individuos
anteriores obtenemos como descendientes
(1 1 1 1 1 5 5 5 5 5)
(5 5 5 5 5 1 1 1 1 1)
La mutación uniforme, por su parte, toma una posición en el vector y la cambia de manera
aleatoria. El número de posiciones a mutar por generación se obtienen multiplicando la
probabilidad de mutación por la longitud del individuo y por el tamaño de población, esto
es,
Número de posiciones a mutar = Pm * l * Psize
Una mutación se realiza seleccionando una posición aleatoria en un vector de la población.
Por ejemplo, tomando al primer individuo ilustrado en el párrafo precedente y suponiendo
que la posición escogida fue la 3, después de mutar esa posición obtenemos
(1 1 4 1 1 1 1 1 1 1)
3.5. Parámetros para el AG.
Para la ejecución del AG se requiere de varios parámetros, cuya determinación no es una
tarea trivial, en tanto que no puede afirmarse que tales o cuales valores de ellos sean los
más apropiados. Si bien no existen valores que sean los mejores en todos los casos, si hay
algunas recomendaciones en torno a ello, como en [MITC97].
En la solución de este problema se usan los siguientes parámetros:
•
•
•
•
•
Tamaño de población = 100.
Probabilidad de cruzamiento = 0.85.
Probabilidad de mutación = 0.005.
Número de generaciones a ejecutarse = 100.
C = 65 000.
4. RESULTADOS EXPERIMENTALES.
Para evaluar la actuación del AGEP, se resolvió el problema siguiente2. Sea R una relación
con 10 atributos y 8 transacciones que se ejecutan sobre una base de datos. Considerando
que se tienen 10 sitios donde se pueden almacenar los fragmentos resultantes y una matriz
de uso de atributos mostrada en la figura 4.1, determinar el esquema de partición óptimo.
En el trabajo señalado se realizó una búsqueda exhaustiva y se estableció que el valor
mínimo de la función es de 5820.
Transacciones
1
25
2
0
3
0
4
0
5
25
6
25
7
0
8
0
0
50
0
35
25
0
0
0
0
50
0
0
25
0
25
15
Atributos
25
0
0
0
0
25
0
0
25
0
25
0
0
0
0
15
0
0
25
0
0
0
0
15
25
0
0
35
25
0
0
0
0
50
0
35
25
0
0
0
0
50
0
0
25
0
25
15
0
0
25
0
0
0
0
15
Figura 4.1. Matriz de Uso de Atributos.
4.1 Experimentos
El primer experimento consistió en generar una población inicial aleatoria para empezar la
ejecución del AGEP. Para la presentación de los resultados se ejecutó 100 veces el
algoritmo, y en base a ello se puede comentar lo siguiente: al promediar los resultados de
las 100 ejecuciones se obtuvo un valor mínimo de 5942 y en 75 ocasiones de las 100
corridas se logró alcanzar el valor mínimo, tal como se muestra en las gráficas de la figura
4.2 y 4.3.
13000.00
12000.00
fitness
11000.00
10000.00
9000.00
8000.00
7000.00
6000.00
99
92
85
78
71
64
57
50
43
36
29
22
15
8
1
5000.00
Generaciones
Fig. 4.2. Comportamiento del fitness promedio para 100 ejecuciones del AGEP, con 10 sitios disponibles.
2
Este problema se discute y resuelve en [MUTH93] apelando a un algoritmo de enumeración exhaustiva.
Otro experimento consistió en cambiar la forma de crear la población inicial y medir de
nueva cuenta el rendimiento del AGEP. Cuando la población inicial fue creada de manera
que todos los atributos estuvieran contenidos en un mismo fragmento (es decir, un solo sitio
mantiene almacenados a todos los atributos) el AGEP redujo su rendimiento pues el valor
mínimo promedio de la función objetivo paso a ser de 5978 y solamente encontró el
mínimo en 71 ocasiones.
100
90
No. de Mínimos
80
70
60
50
40
30
20
10
97
91
85
79
73
67
61
55
49
43
37
31
25
19
13
7
1
0
Generaciones
Fig. 4.3. Número de mínimos encontrados por generación.
Un tercer experimento consistió en crear la población inicial en forma tal que cada uno de
los atributos estuviera contenido en un sitio diferente. El rendimiento del AGEP estuvo por
12000
11000
10000
fitness
9000
8000
7000
6000
5000
97
91
85
79
73
67
61
55
49
43
37
31
25
19
13
7
1
4000
Generaciones
Fig. 4.4. Comportamiento del fitness promedio para 100 ejecuciones del AGEP con 8 sitios disponibles
debajo de los dos casos precedentes al pasar a un valor mínimo promedio de la función
objetivo de 6049 y encontrar el mínimo en tan solo 59 ocasiones de las 100 corridas del
algoritmo.
Un hecho importante que se observó es que cuando el número de sitios disponibles para
almacenar la información se reduce, el rendimiento del AGEP mejora notablemente, tal
como se muestra en las gráficas de las figuras 4.4 y 4.5.
Como se aprecia en las gráficas precedentes, el valor promedio del fitness se redujo a 5889
cuando el número de sitios disminuyó a 8 y el número de veces que encontró el valor
mínimo de la función aumentó a 85. Un comportamiento similar se produjo cuando el
número de sitios fue de 6, ya que el fitness promedio pasó a 5864 y el número de mínimos
encontrado fue de 88.
100
90
No. de Mínimos
80
70
60
50
40
30
20
10
97
91
85
79
73
67
61
55
49
43
37
31
25
19
13
7
1
0
Generaciones
Fig. 4.5. Número de mínimos encontrados por generación.
5. CONCLUSIONES.
A lo largo de este artículo se ha argumentado que el problema de optimizar la
fragmentación y asignación de fragmentos sobre los sitios de la red es muy difícil. Sin
embargo, también se mostró que cuando se usa un algoritmo genético para resolverlo, se
pueden obtener muy buenos resultados con un porcentaje bajo de evaluaciones de la
función objetivo. En el problema considerado, si se realiza una búsqueda exhaustiva, se
tienen que evaluar 115,975 esquemas de partición diferentes; si el número de atributos de la
relación se incrementa una solución enumerativa se vuelve impráctica. Para este problema,
el AGEP mostró que con un máximo de 10,000 evaluaciones (esto es 8.6% del total) se
alcanza un valor óptimo en la gran mayoría de las veces. Y si se aprecia de nueva cuenta la
figura 4.2, se observará que hacia la generación 75 se ha logrado ya un valor muy cercano
al óptimo. Esto significa que con aproximadamente el 6% de las evaluaciones del total
posible, se obtienen resultados muy buenos. Estos resultados se ven mejorados cuando el
número de sitios donde se pueden almacenar los fragmentos se reduce, como se mostró
también en la sección anterior.
Por otra parte, nuestros experimentos ilustraron el hecho de que, contra lo que pudiera
suponerse intuitivamente, el proceso de “sembrar” la población inicial del AG no induce
mejorías; por el contrario, entorpece la convergencia. Esto se explica, simplemente,
considerando que al sesgar la población inicial, se restringe el espacio de búsqueda de
manera negativa. Por otra parte es interesante señalar que este tipo de algoritmos son
demostrablemente convergentes. El sesgo mencionado, entonces, tiene impacto en la
eficiencia del algoritmo más no en su eficacia.
El algoritmo genético mostró ser una alternativa factible para aplicarse en la solución de
problemas de fragmentación de BDD en los que se considera la fragmentación vertical y la
replicación de datos. Es importante señalar que un algoritmo genético se comportará de
manera similar que el aquí presentado, independientemente de la función objetivo que se le
defina como se demostró en [RUDO97].
Finalmente, consignamos que esta metodología puede aplicarse prácticamente sin cambios
a la solución del problemas más general: la fragmentación horizontal y vertical y la
asignación de dichos fragmentos. En trabajos futuros reportaremos los resultados obtenidos
al efectuar un tipo de fragmentación mixta.
6. REFERENCIAS.
[APER88]
[BACK96]
[BELL92]
[BRUN94]
[CERI84]
[CHAK92]
[DOWD82]
Apears Peter M. G. Data Allocation in Distributed Database Systems. ACM
Transactions on Database Systems. Vol. 13, No. 3. September 1988. Pages
263-304.
Back, T. Evolutinary Algorithms in Theory and Practice.Oxford University
Press. 1996.
Bell David and Jane Grimson. Distributed Database Systems. AddisonWesley. 1992.
Brunstrom Anna, Scott T. Leutenegger and Rahul Simha. Experimental
Evaluation of Dynamic Data Allocation Strategies in a Distributed Database
With Changing Workloads. 1994.
Ceri Stefano and Giuseppe Pelagatti. Distributed Database, Principles &
Systems. McGraw-Hill. 1984.
Chakravarthy S., J. Muthuraj, R. Varadarajan and S.B. Navathe. An objective
Function for Vertically Partitioning Relations in Distributed Database and
its Analysis. Technical Report. University of Florida. 1992.
Dowdy L.W. and D.V. Foster. Comparative Models of the File Assignment
Problem. Computing Surveys, Vol. 14, No. 2. 1982.
[GOLD89]
[HOLL92]
[KURI99]
[MICH94]
[MITC97]
[MUTH93]
[NAVA84]
[NAVA89]
[OZSU97]
[PERE97]
[PERE99]
[RUDO97]
[SHEP95]
[SMIT97]
Goldberg, D. E. Genetic Algorithms in Search, Optimization, and Machine
Learning. Addison-Wesley. 1989.
Holland, J. Adaptation in Natural and Artificial Systems. MIT Press. 1992.
Kuri, A. A Comprehensive Approach to Genetic Algorithms in Optimization
and Learning. Theory and Applications. Vol 1. Foundations. IPN 1999.
Michalewicz, Z. Genetic Algorithms + Data Structures = Evolution
Programs. Springer-Verlag. Second Extended Edition. 1994.
Mitchel, M. An Introduction to Genetic Algoritms. MIT Third Printing.
1997.
Muthuraj R., S. Chakravarthy, R. Varadajan and S. B. Navathe. A Formal
Approach to the Vertical Partitioning Problem in Distributed Database
Design. Proceding IEEE, 1993.
Navathe S., S. Ceri, G. Wiederhold and J. Dou. Vertical Partitioning
Algorithms for Database Design. ACM Transactions on Database Systems.
Vol. 9. No. 4, December 1984.
Navathe S. And M. Ra. Vertical Partitioning for Database Design: A
Graphical Algorithm. ACM 1989.
Ozsu Tamer M. And Patrick Valduriez. Principles of Distributed Database
Systems. Prentice Hall. 1997.
Pérez Joaquín, Rodolfo Pazos, Guillermo Rodríguez, Juan Frausto y Ana
Gpe. Vélez. Fragmentación Vertical y Reubicación Dinámica en Base de
Datos Distribuidas. 1997.
Pérez, Joaquín, David Romero, Rodolfo Pazos, Juan Frausto y Laura Cruz.
Integración de la Fragmentación Vertical y Ubicación en Bases de Datos
Distribuidas Usando el Algoritmo de Aceptación por Umbral.1999.
Rudolph G., Convergence Análisis of Canonical Genetic Algorithms. IEEE
Transactions on Neural Networks. 5(1):96-101, January, 1997.
Shepherd J., B. Harangsri, H. Ling Chen, A. Ngu. A Two-Phase Approach to
Data
Allocation
in
Distributed
Database.
ftp://ftp.cse.unsw.edu.au/pub/users/andrewt/publications/1995/
Smith John K. Genetic Algorithm in Vertical Partitioning.
http://www.ics.hawaii.edu/ jksmith/gavert.html University of Hawaii. 1997.
Descargar