• No se han encontrado resultados

Implementación de un algoritmo genético para la conformación de grupos mediante análisis de redes sociales

N/A
N/A
Protected

Academic year: 2020

Share "Implementación de un algoritmo genético para la conformación de grupos mediante análisis de redes sociales"

Copied!
98
0
0

Texto completo

(1)

Implementación de un Algoritmo Genético para la

conformación de grupos mediante Análisis de

Redes Sociales

Tesis de Grado de la Carrera de Ingeniería de Sistemas presentada a la Facultad de Ciencias Exactas de la UNICEN

Por

Eduardo Grave Leo Andrés Rubino

Directores : Dr. Eduardo Zamudio, Prof. Dr. Luis Berdun

(2)

Capítulo 1-Introducción 3

Capítulo 2- Marco teórico 7

2.1 Redes sociales 7

2.1.1 Definición de Red Social 7

2.1.2 Representaciones 8

2.1.3 Análisis de Redes Sociales 13

2.1.4 Herramientas 14

2.1.5 Usos y aplicaciones de redes sociales 18

2.2 Algoritmos Genéticos 19

2.2.1 Introducción a los Algoritmos Evolutivos 19

2.2.2 Representaciones 20

2.2.3 Operadores 21

2.2.4 Herramientas 23

2.2.5 Usos y aplicaciones de algoritmos evolutivos 23 2.3 Aplicaciones de Algoritmos Genéticos y Redes Sociales 24

2.3.1 Detección de Comunidades 25

2.3.2. Cálculo de Centralidad 26

2.3.3 Recomendación 27

2.3.4 Formación de grupos con miembros independientes 27

2.4 Resumen 28

Capítulo 3- Propuesta 29

3.1-Enfoque 29

3.2-Construcción de la red social 31

3.3-Optimización mediante algoritmos genéticos 34

3.4 Resumen 39

Capítulo 4- Implementación 40

4.1-Visión general 40

4.2-Neo4J para desarrollo de red social 42

4.2.1.Modelado de los datos en Neo4j 42

4.2.2 Cypher para manejo de la red social 45

4.3-Jenetics para implementar algoritmo genético 48

4.4-Aplicación java para formar grupos 57

4.5-Resumen 60

Capítulo 5- Experimentación 61

5.1-Presentación del dominio 61

5.2-Consideraciones previas a la evaluación 67

5.3 Evaluación 69

(3)

5.3.2 Optimización de operadores. Selectores 75

5.3.2 Optimización de operadores. Alteradores 80

5.3.3 Caso de estudio. Comités de Investigadores por región 82 5.3.4 Caso de estudio. Evaluación y comparación de comisiones designadas

por el CONICET. 86

5.4 Resumen 90

Capítulo 6-Conclusiones 92

(4)

Capítulo 1-Introducción

Las organizaciones requieren a menudo formar grupos de personas con determinadas características para cumplir alguna función. Para resolver este problema se deben tener en cuenta las características individuales de los candidatos y las necesidades puntuales del grupo a conformar. Por ejemplo, se pueden requerir grupos con miembros de edades distintas, áreas de trabajo en común o con algún puesto específico en la estructura de la organización.

Es muy importante para la conformación de grupos saber qué características o puntos en común tienen los individuos, así como las diferencias existentes entre ellos. Se pueden requerir grupos de individuos que cumplan una serie de condiciones en común o por el contrario un grupo de personas que no compartan nada. También se pueden buscar individuos que sean representativos de un conjunto o jugadores clave que nos permitan llegar a la mayor cantidad de gente posible.

La gran cantidad de información disponible acerca de las personas hace de la selección de grupos un problema cada vez más costoso y al mismo tiempo es un punto de interés para cualquier organización.

El primer problema de la conformación de grupos consiste en buscar una forma de representar los datos de las personas de una manera que nos permita tener toda la información disponible y apta para ser procesada eficientemente por un algoritmo de selección. Como se dijo anteriormente las personas generan un volumen de datos cada vez mayor y es crucial para lograr una buena solución encontrar una representación adecuada.

El segundo problema de este trabajo consiste en que la selección de grupos de individuos a partir de un conjunto de candidatos constituye un problema NP-Hard. La solución más simple para resolver esta problemática consiste en efectuar una combinación matemática, pero la cantidad total de soluciones en un dominio de n individuos constituyendo grupos de k miembros está dada por el coeficiente binomial n! y el costo computacional es de O(n!). Por ejemplo, la

(5)

selección de 5 individuos a partir de 70000 candidatos, implica una gran cantidad de soluciones posibles, dada por:

C(70000,5) = 14003832600039625014000 ≈ 14x1021

Resulta muy costoso evaluar todas las soluciones, por lo que una alternativa al problema de optimización consiste en la implementación de un algoritmo de aproximación.

En este trabajo se propone un enfoque para la selección de grupos de personas con dos aspectos principales.

El primer aspecto de la propuesta consiste en representar los datos de las personas y sus relaciones mediante el uso de redes sociales, es decir constituir una estructura de grafo donde cada nodo corresponde a una persona y las aristas son las relaciones entre ellas.

(6)

.[Figura 1.1] Diagrama Conceptual del Algoritmo Genético

El presente trabajo se organiza de la siguiente manera:

● En el capítulo 2 se presenta el marco teórico. En este, Se desarrollan los conceptos de algoritmos genéticos y redes sociales. También se presentan herramientas y aplicaciones de los mismos. Finalmente se presentan los trabajos que resuelven problemas similares al planteado en este documento utilizando los mismos conceptos teóricos.

(7)

● En el capítulo 4 se profundiza el enfoque propuesto, presentándose la implementación en detalle. Se describen las herramientas usadas y el desarrollo realizado.

● En el capítulo 5 se presentan los resultados de la ejecución del trabajo realizado sobre un conjunto de datos reales. Se presenta una red social real como dominio y una serie de ejemplos como casos de estudio. También se muestra el desempeño del algoritmo al resolver un problema real.

(8)

Capítulo 2- Marco teórico

En este capítulo se describen los dos conceptos teóricos más relevantes aplicados en el desarrollo de este trabajo: Redes Sociales y Algoritmos Genéticos. Esta descripción incluye definiciones, características, ejemplos y aplicaciones.

2.1 Redes sociales

En la primera sección de este capítulo se desarrolla el concepto de Red Social, se explica cómo estas pueden ser representadas mediante grafos o matrices y se describen brevemente las aplicaciones y la historia del análisis de redes sociales.

2.1.1 Definición de Red Social

Cuando se piensa en una red social, se piensa en Facebook , Twitter o 1 2

algún otro sitio web que es clasificado como red social. Sin embargo, estos sitios son medios sociales y el concepto de red social es en realidad un concepto anterior y más general.

La características esenciales de una red social son [2]:

1. Existe un conjunto de entidades que participa en la red. Por lo general estas entidades son personas.

2. Existe al menos una relación entre entidades de la red. En Facebook, por ejemplo, esta relación es llamada amistad, en twitter son seguidores, en Linkedin contactos. La relación puede ser absoluta (se es amigo o no se es 3

1Facebook

,https://www.facebook.com/ [2017]

2Twitter,

https://twitter.com/ [2017]

3LinkedIn,

(9)

amigo) pero también puede tener algún grado de valoración como por ejemplo el tiempo promedio que dos personas usan hablando entre ellas. 3. Se asume que existe algún tipo de localidad. Esta condición es la más difícil de formalizar, pero se intuye que las relaciones tienden a formar clusters. Es decir si la entidad A está relacionada con B y C, entonces hay una alta probabilidad de que B y C estén relacionadas también.

En la figura 2.1 se muestran las personas y las relaciones que conformaban la red social Facebook en diciembre del año 2010.

[Figura 2.1] Grafo de amistades de facebook de diciembre de 2010

2.1.2 Representaciones

(10)

de facebook, pero también pueden ser dirigidos como la idea de “seguidores” en Twitter.

[Figura 2.2] Redes sociales formadas por grafos

En la figura 2.2 se muestran dos ejemplos de red social con grafos. El primero es un grafo no dirigido que podría representar relaciones de amistad en Facebook: una sola arista representa la amistad, Abel es amigo de Elsa y Elsa es amiga de Abel. El segundo es un grafo dirigido como la representación de

seguidores de Twitter: Abel sigue a Elsa pero Elsa no sigue a Abel.

Esta representación de grafo pareciera restringir la red social solo a

relaciones binarias, pero esta restricción deja de existir si se crean nuevos tipos de entidades. Por ejemplo, si se quiere representar una relación entre muchas

personas que pertenecen a un club, se puede crear la entidad club y crear una relación binaria entre el club y cada una de las personas que pertenecen a él.

Para entender mejor esta representación se muestra un ejemplo de una pequeña organización donde trabajan seis personas (Roberto, Mario, Marisa, Juana, Ezequiel y Agustina) distribuidas en tres sectores:

- Sector operativo, al cual pertenecen Roberto, Mario y Juana - Ventas, al cual pertenecen Agustina y Ezequiel

-Finanzas, al cual pertenece Marisa.

Por otra parte Roberto, Marisa, Juana y Agustina tienen entre treinta y cuarenta años, y Mario y Ezequiel tienen entre cuarenta y cincuenta años.

(11)

al mismo rango etario mientras que Ezequiel y Mario pertenecen a otro. Al mismo tiempo Roberto, Juana y Mario trabajan en el mismo sector, mientra que Agustina y Ezequiel también comparten el sector de trabajo.

[Figura 2.3] Ejemplo de grafo social

El problema de esta representación es la cantidad de enlaces que hay que generar cuando muchas personas comparten una misma condición. En el ejemplo, se observa que, para representar el rango etario de entre treinta y cuarenta años, se generan seis enlaces para cuatro personas. Esto es así porque la cantidad de enlaces necesarios para representar las uniones entre personas con una misma condición, está dada por el coeficiente binomial n! , donde n es la cantidad de

(nm)!m!

(12)

conectadas por cada enlace. Como m= 2, porque los enlaces se forman entre cada par de personas, el coeficiente es n(n2−1) .

Si tuviéramos un dominio con 1000 personas que comparten una misma condición la cantidad de enlaces sería 1000(999)2 = 499500, solo para representar esa condición.

(13)

[Figura 2.4] Ejemplo de red social con distintos tipos de nodos

En esta nueva representación el coeficiente binomial presentado anteriormente es reemplazado por n, siendo n la cantidad de nodos. Es decir, si, por ejemplo, 1000 personas comparten una misma condición, la cantidad de enlaces generados será 1000 (se conecta cada persona con el nodo que representa la condición).

En el ejemplo de la figura 2.4 puede verse esta mejora para las personas en el rango etario entre treinta y cuarenta años. Siendo cuatro personas las que comparten esta condición (n=4), en el enfoque anterior la cantidad de enlaces estaba dada por 4(3)2 = 6 y ahora hay tantos enlaces como personas (4).

(14)

persona de la red social. En esta representación, el elemento Xij de la matriz indica la relación de i con j. En el caso de representar una relación de amistad bidireccional, la matriz del modelo sería simétrica y redundante. Por ejemplo, en la relación de amistad en Facebook, si i es amigo de j, entonces j es amigo de i (

) . Si la relación no es bidireccional, como los seguidores de Twitter, la

Xij =Xji

matriz puede no ser simétrica (ver figura 2.5).

[Figura 2.5] Representación matricial de grafo dirigido

2.1.3 Análisis de Redes Sociales

(15)

Esta disciplina está actualmente en auge debido a la cantidad de información generada por medios sociales, páginas web y dispositivos de proximidad, entre otros.

Procesar tal cantidad de información presenta un gran desafío debido a su gran tamaño y su naturaleza desestructurada. La información perteneciente a una red social puede alojarse en muchas fuentes de datos y en escalas muy diferentes. La red social se puede derivar desde fuentes tan distintas como bases de datos, archivos de texto, dispositivos de proximidad o medios sociales. Encontrar y representar una red social a partir de una fuente de datos puede ser un problema difícil. Este desafío se debe a varios factores como la ambigüedad del lenguaje humano, los múltiples alias, las representaciones incompatibles o la ambigüedad de las relaciones entre individuos.

2.1.4 Herramientas

(16)

La primera estrategia son las bases de datos Relacionales, por ejemplo: MySQL, Oracle, PostgreSQL, entre otras. En esta alternativa,la relación de adyacencia entre nodos se construye en una tabla de relación N:N. En esta tabla se encuentran todas las relaciones del mismo tipo que hay en el grafo, generando una enorme tabla muy costosa de acceder aunque se use un buen índice (ver figura 2.7).

[Figura 2.7] Representación de un grafo en una base de datos relacional

(17)

[Figura 2.8] Estructura del índice de la relación adyacencia en forma de árbol

Para acceder al índice de adyacencia el costo es log( n), siendo n el número total de relaciones existentes en el modelo. Como se puede ver, este tipo de persistencia no resulta eficiente para recorrer grafos, ya que las relaciones están todas en la misma estructura de búsqueda lo que genera un costo de acceso muy alto.

(18)

Las bases de datos de documentos JSON almacenan conjuntos de agregaciones desconectadas. Esto hace que sea difícil utilizarlos para datos y grafos conectados.

Como se puede ver en el ejemplo, en los documentos XML, la estructura de los datos es muy similar a la de una base de datos relacional debido a que también se utilizan índices de adyacencia.

La última opción que se presenta en esta sección son las base de datos orientadas a grafos, por ejemplo Neo4j.

(19)

para moverse de un nodo a cualquiera de sus vecinos, ya que depende solo de la cantidad de relaciones que provienen del nodo (local). Cada nodo tiene un pequeño índice de sus adyacentes. Esto es mucho más eficiente que un índice de una base relacional, permitiendo que consultas mucho más complejas se hagan en tiempo real.

[Figura 2.9] Representación de la red en Neo4j

2.1.5 Usos y aplicaciones de redes sociales

Una aplicación fundamental del análisis de redes sociales es la detección de comunidades. Las comunidades son grupos de nodos que tienen alta conectividad dentro del grupo y baja conectividad entre grupos. Estas comunidades, que pueden ser obtenidas a partir del análisis de la representación de la red, se corresponden generalmente con grupos sociales reales. En la literatura se pueden encontrar muchos ejemplos de diversas técnicas para detectar comunidades en una representación de grafo (ver sección 2.3). Un uso posible para la detección de comunidades puede ser en sistemas de recomendaciones que buscan comunidades de personas con intereses similares para realizar recomendaciones.

(20)

2.2 Algoritmos Genéticos

En esta sección se presenta una introducción a los algoritmos evolutivos en general, y a los algoritmos genéticos en particular. Asimismo, se describen algunas herramientas para implementarlos y sus posibles aplicaciones.

2.2.1 Introducción a los Algoritmos Evolutivos

En la década de 1950 empezaron a estudiarse sistemas evolutivos con la idea de que la evolución podía ser utilizada como una herramienta de optimización para problemas de ingeniería [8][9]. La idea básica en estos sistemas era evolucionar una población de soluciones candidatas a un problema dado usando operadores inspirados en la variación genética y la selección natural. En las décadas de 1950 y 1960 muchos investigadores plantearon soluciones usando estas estrategias evolutivas.

Los algoritmos genéticos fueron introducidos por John Holland en la década de 1960, y luego desarrollados por Holland, estudiantes y colegas en la universidad de Michigan en los 60 y en los 70 . En contraste con las estrategias de evolución y 4 la programación evolutiva, el objetivo original de Holland no era diseñar algoritmos para resolver problemas específicos, sino estudiar formalmente el fenómeno de adaptación como ocurre en la naturaleza y desarrollar formas en que los mecanismos de la adaptación natural pueden ser importados en sistemas computacionales. El libro de Holland “Adaptation in Natural and Artificial Systems” [6] publicado en 1975 presentó el algoritmo genético como una abstracción de la evolución biológica. El algoritmo genético de Holland es un método para moverse de una población de cromosomas hacia una nueva población usando una especie de selección natural junto con operadores de entrecruzamiento, mutación e inversión inspirados en la genética. Cada cromosoma está compuesto por genes, por ejemplo de bits. Cada gen es una instancia de un alelo particular, por ejemplo 0 o 1. El

4

(21)

operador de selección elige aquellos cromosomas en la población que van a ser aptos para reproducirse. En promedio, los cromosomas más aptos producen más descendencia que los menos aptos. El entrecruzamiento intercambia partes de dos cromosomas, imitando aproximadamente la recombinación biológica entre dos organismos de un solo cromosoma. La mutación cambia aleatoriamente los valores de los alelos, y la inversión invierte el orden de una sección contigua del cromosoma.

La idea de Holland de un algoritmo basado en población con entrecruzamiento, mutación e inversión, fue una gran innovación. Trabajos anteriores tenían un enfoque más acotado. Los trabajos presentados por Rechenberg en 1965 [16] y 1973 [17] usaban solo una población de dos individuos (un padre y un hijo, el hijo era una mutación del padre). El desarrollo de 1966 de Fogel, Owens, y Walsh [18] "evolutionary programming" de manera similar a Rechenberg usaba solo mutación para introducir variaciones.

Hoy en día los investigadores estudian e implementan muchos métodos de evaluación computacional. Actualmente el término algoritmo genético es usado de manera más general para describir algoritmos que no responden estrictamente al concepto original de Holland. En este trabajo se utilizan los conceptos introducidos por Holland con excepción del operador de inversión que ha caído en desuso. La principal ventaja de este operador consiste en introducir variación manteniendo la vecindad entre genes, para el problema presentado en este trabajo mantener la vecindad entre genes no es necesario.

2.2.2 Representaciones

(22)

selección de grupos, el tamaño del vector será igual a la cantidad de candidatos, y cada posición del vector (x[i]) representará a un candidato. Entonces si x[i]= 1 el candidato será parte del grupo conformado.i

Si bien esta representación binaria es la más común desde que fue utilizada por Holland y sus estudiantes en los primeros desarrollos con algoritmos geneticos, tambien existen otras representaciones que pueden resultar más eficientes para algunos dominios. Estas representaciones alternativas pueden consistir en vectores que contengan otro tipo de elementos, por ejemplo vectores numéricos o de strings.

Existen otras representaciones para algoritmos genéticos más específicas que pueden representar las soluciones mediantes árboles o grafos pero son pocos comunes y requieren operadores más complejos para implementar el algoritmo.

Además de la representación de las soluciones se debe definir la función de aptitud que calcule la aptitud de cada solución. Esta función depende de la representación elegida y de la naturaleza del problema que se quiere resolver.

2.2.3 Operadores

(23)

Los operadores de entrecruzamiento forman nuevos individuos a partir de la recombinación de individuos existentes.

[Figura 2.10] Recombinación o Entrecruzamiento

La idea principal de los operadores de entrecruzamiento es formar un nuevo vector con una combinación de elementos de dos vectores anteriores. En la figura 2.10 se ve un ejemplo de ello donde se cortan los individuos “padres” en la primera posición. Luego, el hijo tiene el primer elemento (gen) de un padre y el resto del otro padre.

Los operadores de mutación también forman nuevos individuos pero de forma distinta. Estos operadores toman un solo individuo y, basados en algún criterio probabilístico, modifican algunos de sus genes. Se define una probabilidad de cambio de los genes y según ésta, se cambian o se mantienen los genes.

(24)

-Elegir los n individuos más aptos.

-Dividir la población en n conjuntos y elegir el individuo más apto de cada subconjunto.

-Elegir aleatoriamente.

-Definir una función de probabilidad de selección que utilice el valor de aptitud

2.2.4 Herramientas

Para implementar los algoritmos genéticos existen diferentes frameworks. Estos frameworks permiten desarrollar algoritmos genéticos fácilmente definiendo solamente la función de aptitud, la representación de los cromosomas y eligiendo los operadores que dichos frameworks brindan. Una serie de herramientas fueron relevadas para este trabajo: Java Genetic Algorithms Package ,ECJ 23 ,5 6

Watchmaker Framework7 y Jenetics .8 Todas estas herramientas tienen características similares. La eficiencia del algoritmo genético implementado depende mayormente de cómo se represente el problema y cómo se use la herramienta más que en la elección de la misma.

2.2.5 Usos y aplicaciones de algoritmos evolutivos

En la literatura hay gran cantidad de aplicaciones exitosas de algoritmos genéticos (ver sección 2.3), pero también se encuentran algunos casos donde el rendimiento de estos algoritmos es pobre. No hay una respuesta rigurosa para saber si los algoritmos genéticos son un buen método para aplicar en un problema dado, sin embargo hay algunas consideraciones generales. Los algoritmos genéticos son una buena opción cuando el espacio de búsqueda es grande, el dominio no es muy bien entendido, la función de aptitud tiene ruido o no se requiere una solución óptima global (encontrar rápidamente soluciones buenas es suficiente). Si el espacio de búsqueda no es grande, se puede buscar la solución

5 ​ http://jgap.sourceforge.net/ 6 ​ http://cs.gmu.edu/~eclab/projects/ecj/ 7 ​ http://watchmaker.uncommons.org/ 8 ​

(25)

exhaustivamente y asegurarse de que la mejor solución es encontrada. Si el espacio de búsqueda es bien entendido, se pueden usar heurísticas específicas del dominio que respondan mejor que un método de propósito general, como los algoritmos genéticos. Si la función de aptitud tiene ruido, una solución que involucre un candidato por vez podría ser desviada. En cambio, evaluando y evolucionando un conjunto de soluciones múltiple se puede obtener un buen resultado incluso en presencia de pequeñas cantidad de ruido.

Aplicar estos criterios al momento de decidir el uso de algoritmos genéticos frente a una problemática no implica una solución eficiente. La performance depende mucho de la representación del dominio, la codificación de las soluciones candidatas, los operadores, el valor de los parámetros y el criterio de éxito.

Un campo de aplicación frecuente para los algoritmos genéticos se encuentra en las ciencias del medioambiente. Habitualmente se presenta el problema de definir los parámetros para optimizar un modelo en base a la información recolectada. Un ejemplo de esto es el trabajo para clasificación y predicción de días lluviosos o no lluviosos realizada por Sen y Oztopal[12]. Estos usaron un algoritmo genético para estimar los parámetros de un modelo de Markov de tercer orden.

Los algoritmos genéticos son también usados en campos tan diversos como la mejora y segmentación de imágenes[13], la ciencia de nanomateriales[14] y las ciencias económicas[15].

2.3 Aplicaciones de Algoritmos Genéticos y Redes

Sociales

(26)

2.3.1 Detección de Comunidades

En la literatura se encuentran múltiples trabajos que combinan redes sociales y algoritmos genéticos. Por lo general, es habitual encontrar que estos trabajos tengan como objetivo la conformación de grupos con distintas características.

En este contexto uno de los campos más desarrollados, y más estrechamente relacionado con la conformación de grupos, es el de la identificación de comunidades (también llamadas clusters). Las comunidades son grupos cohesivos dentro de la red que están densamente intraconectados y escasamente interconectados. Es decir, los individuos dentro de una comunidad presentan gran cantidad de conexiones entre ellos pero poca cantidad de conexiones con individuos del resto de la red, o de otras comunidades.

En [19] se presenta un algoritmo genético para identificar comunidades, llamado GA-Net. Este trabajo presenta dos características importantes que permiten resolver el problema sin necesidad de establecer con anterioridad la cantidad de comunidades que se deben formar: la utilización de locus-based adjacency para la representación de los individuos y el criterio de community score.

La representación locus-based adjacency consiste en representar cada individuo del algoritmo genético como un vector(V) de enteros de tamaño n, donden

es la cantidad total de nodos de la red. Los índices del vector corresponden a los nodos de la red y los valores en cada posición del vector indican las conexiones entre nodos. Si V[i]=j, entonces el nodo i tiene un enlace al nodo j. Los nodos que tienen enlaces entre sí en la solución elegida forman parte de la misma comunidad.

El criterio de community score se utiliza como función de fitness para evaluar la división en comunidades de toda la red y es proporcional a la cantidad de conexiones dentro de cada comunidad.

Kim,McKay y Moon [20] reutilizan la representación locus-based adjacency

(27)

silhouette. El algoritmo multiobjetivo presentado en [20] busca optimizar los valores de las dos funciones usando el modelo de pareto.

Trabajos recientes [21] [22] utilizan también, la representación locus-based adjacency para detectar comunidades. En estos trabajos, la solución mediante algoritmos evolutivos es optimizada al ser combinada con otros conceptos. En [21], los individuos de la población son agentes que, dispuestos en una cuadrícula, se comunican con sus vecinos para mejorar su fitness. En [22] se incorpora la noción de algoritmo cultural, que incorpora un belief space que almacena la frecuencia con la que aparece cada enlace en los individuos con mayor fitness. Las nuevas poblaciones son generadas a partir de los datos acumulados en el belief space.

El problema de identificación de comunidades en redes sociales y su resolución mediante el uso de algoritmos genéticos sigue siendo el objetivo de múltiples publicaciones en la actualidad [23][24][25].

2.3.2. Cálculo de Centralidad

Otro problema frecuente en el análisis de redes sociales consiste en analizar la centralidad de los nodos. Esto sirve para identificar aquellos nodos que tienen un valor clave en la estructura de la red. En [26] se presenta un procedimiento para identificar conjuntos de jugadores clave en una red social, a partir de dos enfoques: KPP-POS y KPP-NEG. KPP-POS identifica aquellos nodos claves para usar como semillas a la hora de difundir algo a través de la red. KPP-NEG identifica los nodos claves para fragmentar la red si éstos son removidos. Los autores tratan el problema de la optimización obteniendo buenos resultados con algoritmos genéticos, sin embargo sólo presentan resultados con un algoritmo greedy.

(28)

2.3.3 Recomendación

Un problema específico relacionado con la formación de grupos en redes sociales consiste en la recomendación de amigos. Dada una persona en la red social se desea obtener un conjunto de posibles amigos para recomendarle. En [28] y [29] se utilizan algoritmos genéticos para optimizar el criterio de posible amistad para cada persona. En estos casos los algoritmos genéticos no se encargan de la formación de grupos directamente, sino que se utilizan para parametrizar la función que se utiliza posteriormente para la formación de grupos.

2.3.4 Formación de grupos con miembros independientes

Como se muestra en esta sección la utilización de algoritmos genéticos para formar grupos en una red social, aunque actualmente vigente, no es nueva. Sin embargo, la mayoría de los trabajos en la literatura hacen foco en la centralidad de los nodos o en los clusters. Otro criterio muy diferente para la conformación de grupos es presentado en [30]. En esta publicación se propone un algoritmo genético para la formación de grupos con miembros independientes. El objetivo es formar grupos cuyos individuos tengan la mayor distancia social entre sí. Para esto, se busca maximizar una función de fitness definida como la suma normalizada de todos los caminos más cortos entre cada par de miembros del grupo propuesto.

(29)

2.4 Resumen

Tanto las redes sociales como los algoritmos genéticos son herramientas que ya tienen varias décadas, sin embargo actualmente siguen estando muy vigentes.

Por un lado, las redes sociales permiten analizar un conjunto de personas representando las relaciones entre ellas. La prioridad del análisis de redes sociales está puesto en las relaciones de las personas más que en las características específicas de cada individuo.

Por otra parte, los algoritmos genéticos consisten en una estrategia que, usando operadores análogos a los de la selección natural, filtra y optimiza un conjunto de soluciones inicialmente aleatorio. Este tipo de algoritmos de naturaleza heurística resulta de utilidad para problemas que involucren un gran caudal de información y un gran conjunto de soluciones posibles.

(30)

Capítulo 3- Propuesta

La primera sección de este capítulo presenta el enfoque general propuesto, donde se describe el problema de la formación de grupos y cómo pueden combinarse los conceptos de algoritmos genéticos y redes sociales para su resolución. Las secciones siguientes se extienden sobre el uso de cada uno de estos conceptos.

3.1-Enfoque

En este trabajo se propone la conformación de grupos de personas independientes, utilizando redes sociales como alternativa de representación y algoritmos genéticos como estrategia de optimización.

(31)

En la figura 3.1 se muestra el enfoque propuesto. El primer paso consiste en tomar la información de un conjunto de personas (entrada “Individuos” en la figura), con el objetivo de construir una red social que contenga los datos de cada individuo y las relaciones entre ellos, esto es lo que se denomina “construcción de la Red Social”. Una vez construida la red social se ejecuta un algoritmo genético, cuya salida será un conjunto de grupos solución, que respondan a los criterios de conformación de grupos establecidos. Como se dijo anteriormente, el objetivo principal es conformar grupos con miembros independientes, por lo tanto la condición que se busca para el grupo conformado es que sus integrantes sean lo más distantes posible (ver sección 3.2). El algoritmo genético utiliza las relaciones en la red social para medir las distancias entre los candidatos. Finalmente, la ejecución del algoritmo definido en base a la o las configuraciones dadas, da como resultado los grupos de personas independientes encontrados.

[Figura 3.1] Diagrama de flujo de la solución propuesta

(32)

3.2-Construcción de la red social

La primera parte del enfoque consiste en analizar las estructuras que forman las relaciones de los candidatos a conformar los grupos.

Como se dijo en el capítulo anterior, el análisis de redes sociales, a diferencia de otros enfoques, se centra en las propiedades de las estructuras que conforman las relaciones entre personas, más que en las propiedades de esas personas. Es por esta razón que dicha representación resulta útil para la conformación de grupos independientes, ya que analizando las relaciones entre los distintos individuos podemos establecer una distancia que represente un grado de independencia entre los mismos [30]. Además, la representación de esta red mediante un grafo permite usar la teoría de grafos para obtener eficientemente las distancias entre los individuos.

Para establecer la independencia entre dos personas se utiliza, como se dijo anteriormente , el criterio de distancia en el grafo. De esta manera, la distancia en el grafo determina cuán distantes están dos personas, este número conforma el grado de independencia entre ellas. Cuando, además, los enlaces conectan a aquellas personas que tienen alguna propiedad en común (ver sección 2.1.2), el grupo obtenido maximizando la distancia social tiende también a ser heterogéneo (ya que debido a la naturaleza de los enlaces, solo los vecinos tienen características en común). A medida que la distancia entre dos nodos aumenta, no sólo no comparten ninguna propiedad sino que tampoco sus vecinos tienen alguna propiedad en común. Si la distancia crece un grado más, tampoco tendrán propiedades en común los vecinos de los vecinos. En este tipo de representaciones, la formación de grupos maximizando las distancias sociales entre sus integrantes, da como resultado grupos heterogéneos de integrantes independientes.

(33)

Mario-Martín y Ezequiel-Martin son las máximas en este ejemplo. Pero, que la distancia entre Mario y Martin sea máxima(en este caso 6), no solo significa que hay mayor cantidad de nodos intermedios entre ellos. En este ejemplo, significa que

- Mario no pertenece al mismo sector que Martin - Mario no pertenece al mismo rango etario que Martin

- nadie que trabaje en el mismo sector que Mario pertenece al rango etario de Martin

- nadie que trabaje en el mismo sector que Martin pertenece al rango etario de Mario

(34)

[Figura 3.2] Ejemplo extendido de red social con distintos tipos de nodos

La red social propuesta, entonces, consiste en un grafo no dirigido donde cada nodo corresponde a un candidato para la conformación de grupos. Mientras que los enlaces, corresponden a los puntos en común entre candidatos. Se utilizan además otros tipos de nodos para reducir la cantidad de enlaces (ver sección 2.1.2). Estos nodos representan las relaciones de los candidatos. Por ejemplo, una representación posible del rango etario implicaría definir nodos de tipo rango etario que podrían tener los siguientes valores:

● Menor de 30 ● 30-39

● 40-49 ● 50-59

(35)

Entonces todos los candidatos que tengan entre 30 y 39 años tendrían un enlace al nodo “30-39”.

Como se dijo,las redes sociales representadas con grafos, permiten calcular eficientemente las distancias entre las personas. Además, la representación mediante grafos permite asignar costos a los enlaces y así incidir en el cálculo de las distancias. De esta manera si, por ejemplo,se desea dar más importancia a la relación rango etario que a la de nacionalidad, es decir, si se consideran más dependientes dos personas que comparten nacionalidad que dos personas que comparten rango etario; entonces habría que asignar más peso a los enlaces con los nodos de rango etario que a los enlaces con los nodos de nacionalidad. Así, las distancias entre nodos serían mayores si contienen un enlace de rango etario.

La representación del problema es determinante para el resultado del algoritmo genético. En este caso, el algoritmo genético debe considerar: el cálculo de distancias en grafos, el peso de los enlaces, los tipos de nodos, los nodos inalcanzables y el diámetro del grafo, entre otros.

3.3-Optimización mediante algoritmos genéticos

Después de conformar la red social se deben obtener los grupos. Como se dijo, la cantidad total de soluciones en un dominio de n personas constituyendo grupos de k miembros, está dada por el coeficiente binomial n! , siendo el costo

k!(nk)! computacional de O(n!). El costo computacional de evaluar todas las soluciones es muy alto, el problema de la conformación de grupos es NP-hard. Ante esta situación se propone implementar un algoritmo genético, ya que resulta ser un método competitivo para encontrar buenas soluciones cuando el espacio de búsqueda es grande (ver sección 2.2).

(36)

algoritmo es el individuo o los individuos que hayan obtenido el mejor valor al ser evaluados por la función de aptitud. El valor de la función de aptitud también es guardado para poder contrastar los resultados entre distintas ejecuciones del algoritmo.

[Figura 3.3]Representaciones vectoriales de un grupo de candidatos

En la figura 3.3 se ve un ejemplo de formación de grupos de tres personas sobre un conjunto de ocho candidatos. La misma solución puede representarse mediante un vector de Strings que contenga los nombres de los tres candidatos elegidos, mediante un vector de enteros que contenga los identificadores de cada candidato elegido, o mediante un vector de bits que tenga un 1 en cada posición correspondiente a algún candidato elegido.

(37)

Un conjunto de estos vectores generados al azar forma una población inicial, la cual evoluciona mediante iteraciones, considerando la función de aptitud.

[Figura 3.4] Cruza de grupos de candidatos con representación de vector de enteros

Para asignarle un valor a cada uno de los vectores (individuos) en el algoritmo genético se calcula la siguiente función de aptitud:

f = 2 D

*

(i, j) / k + m

[(

k

i, j=0

d

) ]

Donde d es la distancia entre dos miembros, ∀i, j/ ij, ,i jS, S

representa el conjunto total de nodos, k la cantidad de distancias calculadas entre miembros del grupo, m es la distancia mínima entre cada par de miembros en el grupo y D es el diámetro de la red. Esta función de fitness no distingue entre los distintos tipos de enlaces que pueden existir en el grafo. Si se quiere priorizar algún tipo de enlace se deben asignar distintos costos a cada tipo.

Para la ejecución del algoritmo se debe especificar una configuración que incluya:

(38)

⎼ Selector de supervivencia: criterio para elegir los individuos que van a sobrevivir para la próxima iteración.

⎼ Selector de descendencia: criterio para elegir los individuos que van a ser alterados.

⎼ Alteradores: Operadores que introducen la variación genética. Pueden combinar individuos o mutarlos.

⎼ Limitador: condición de corte o convergencia del algoritmo.

⎼ Cantidad de miembros del grupo: cantidad de personas que constituirán el grupo buscado.

(39)

       

P0 ← Pinitial   F(P0)  

while (!finished) {    g ← g + 1   Sg ← select S(Pg−1)  Og ← select O(Pg−1)  Og ← alter (Og)  Pg ←(Sg) + (Og)  F(Pg)} 

[Figura 3.5] ​Diagrama de flujo del AG Pseudocódigo del AG

(40)

El algoritmo termina cuando se cumple la condición de corte o convergencia establecida en la configuración. Debido a que la solución debe funcionar en organizaciones numerosas con gran cantidad de candidatos para la conformación de grupos, es deseable usar alteradores que introduzcan gran variación genética y realizar una gran cantidad de iteraciones. También tendrán un mejor desempeño aquellos alteradores que impidan la creación de grupos que contengan más de una vez al mismo integrante y los selectores de supervivencia que aseguren la supervivencia del grupo con mejor fitness.

3.4 Resumen

La conformación de grupos es un problema presente en múltiples organizaciones, cuya dificultad reside en la cantidad de candidatos y en la complejidad de la información disponible sobre los mismos. En este trabajo se propone una solución para la formación de grupos independientes, entendiendo que este concepto de independencia puede aplicarse en ciertas redes para obtener, también, grupos heterogéneos.

Dado que esta solución se propone para grandes organizaciones con un grupo de candidatos numeroso, se utiliza un algoritmo genético como solución heurística para obtener un grupo lo suficientemente independiente sin tener que evaluar exhaustivamente todas las alternativas.

(41)

Capítulo 4- Implementación

En este capítulo se detalla la implementación de la propuesta presentada en el capítulo anterior. En la primera sección se presentan los componentes que interactúan durante la ejecución y en las secciones subsiguientes se describe cómo se utilizaron las herramientas Neo4j y Jenetics para crear el grafo y ejecutar el algoritmo genético respectivamente

4.1-Visión general

Al implementar la solución se utilizó un conjunto de herramientas que ayudaron a resolver distintas partes del enfoque propuesto.

La red social se modeló usando Neo4j, una base de datos orientada a grafos que, como se explicó anteriormente (ver 2.1.4), resulta la mejor alternativa para persistir este tipo de estructura de datos.

Por otra parte se utilizó la biblioteca Jenetics, desarrollada en java, para implementar el algoritmo genético. Esta biblioteca permite ejecutar el algoritmo con solo definir la función de aptitud y elegir la configuración.

La aplicación fue desarrollada en java y la información acerca de las diferentes ejecuciones del algoritmo (configuraciones y salidas) se guardó en una base de datos relacional (MySQL).

Los componentes principales que interactúan en tiempo de ejecución en la aplicación son entonces:

-Un módulo Formador de Grupos que implementa la interfaz gráfica y se encarga de invocar al módulo de Jenetics.

-El módulo de Jenetics que ejecuta el algoritmo genético.

(42)

obtener la configuración del algoritmo y con la base Neo4j para obtener los candidatos a los grupos. Con esta información invoca a la biblioteca Jenetics que ejecuta el algoritmo invocando en cada iteración a la función de aptitud. La función de aptitud se comunica con la base Neo4j para obtener las distancias entre los candidatos pertenecientes al individuo que esté evaluando. Finalmente el formador de grupos también se comunica con la base MySQL para escribir los resultados obtenidos en la ejecución y genera un archivo XML que contiene los candidatos y el grupo conformado. Este archivo puede abrirse posteriormente utilizando Gephi para visualizar el grafo y la solución encontrada.

(43)

4.2-Neo4J para desarrollo de red social

Como se mencionó anteriormente Neo4j es una Base de datos de Grafos(ver sección 2.1.4).Las principales características de esta herramienta son :

○ Alto desempeño y alta disponibilidad.

○ Soporte sólido y real para transacciones ACID. ○ Escalable y de alto rendimiento.

○ Servidor con una API REST o empotrable con una biblioteca (driver) java.

En el caso implementado, usamos la biblioteca de java para realizar las consultas en la base Neo4j.

4.2.1.Modelado de los datos en Neo4j

Para el modelado de los datos se definen las siguientes unidades de construcción: Nodo, Relación, Propiedad y Etiqueta. En base a estas cuatro unidades se debe representar la red social de candidatos de una organización para el desarrollo propuesto. A continuación se describe cómo se usa esta estructura para representar la red social:

● Nodos: Los nodos son la herramienta que brinda Neo4j para representar las entidades del dominio. En la implementación presentada se construye un nodo por cada candidato para la conformacion del comite. Las características de estos candidatos son representadas como propiedades de Neo4j. Las propiedades se definen como un par de clave (String) y valor. Además de los candidatos, los tipos de nodos alternativos también son creados (ver sección 3.2).

(44)

Como se dijo anteriormente, las características se almacenan como propiedades de los nodos, pero además, se establecen como nodos intermedios con los que se relacionan los candidatos. Esto se formalizó de esta manera para permitir el cálculo de distancias entre individuos que va a ser usado como criterio de independencia en la función de fitness.

● Etiquetas: Las etiquetas tienen un nombre y un grupo de nodos asociados. Son la herramienta que permite distinguir distintos tipos de nodos. Mediante estas etiquetas se pueden distinguir los nodos que representan a los candidatos de los nodos que representan sus características.

En la figura 4.2 se muestran , en una captura de Neo4j, los nodos que representan a los candidatos del dominio que es evaluado en el capítulo 5 (ver sección 5.1). Cada candidato se modeló como un nodo con una etiqueta “investigador” y con propiedades como nombre, sexo, cuit o pasaporte, nacionalidad, entre otros.

[Figura 4.2] Nodos modelados en Neo4j etiquetados como “Investigador”. En la parte inferior se pueden ver las propiedades del nodo.

(45)

[Figura 4.3] Relación “Tiene como disciplina”. Los Nodos color verde están etiquetados como “Investigador”, mientras los amarillos como “disciplina”

Los nodos creados fueron conectados con relaciones, las cuales unen 2 nodos entre sí. En la tabla mostrada a continuación, se pueden observar los nodos implicados en cada relación creada.

Relación Conecta

nacionalidad país investigador

tiene como disciplina disciplina investigador

trabaja en institución investigador

reside en provincia investigador

edad rango etario investigador

(46)

[Figura 4.4] Nodo “Oscar Matias” en el modelo de investigadores del conicet, relacionándose con los diferentes tipos de nodos

Para ver un ejemplo más completo de cómo se representan los investigadores en la red, en la figura 4.4 se muestran las relaciones del investigador Oscar Matias Benitez con los distintos tipos de nodos.

4.2.2 Cypher para manejo de la red social

El lenguaje de consulta base en Neo4J es Cypher y se basa en la navegación entre nodos, ofreciendo la posibilidad de calcular el camino más corto entre dos nodos. Es un lenguaje declarativo, inspirado en SQL, en el que es posible representar entidades de grafos usando caracteres ascii.

(47)

Cypher usando la relación 'Likes’':

Cyper:

(A)-[:Likes]->(B)

Cypher es un lenguaje relativamente simple pero muy potente. Las consultas muy complejas de la base de datos se pueden expresar fácilmente con Cypher.

Este lenguaje es usado en primera instancia en la aplicación para seleccionar el conjunto de candidatos para la selección de grupos. La aplicación desarrollada permite seleccionar el grafo completo o un subconjunto del mismo (ver sección 4.4). Por eso una de las primeras acciones en la ejecución del algoritmo es obtener los candidatos que van a ser utilizados. Para esto se usa la siguiente sentencia en Cypher:

MATCH (i:investigador) return i

Esta operación devuelve todos los nodos que tengan la etiqueta “investigador”. El resultado de esta consulta se almacena en un vector y se utiliza para formar los genes del algoritmo genético. Si se desea filtrar la red social, se debe modificar la sentencia anterior para seleccionar solo los nodos con ciertas características. Para esto se utiliza la palabra reservada WHERE como en las bases de datos SQL. Por ejemplo, si se quiere seleccionar solo los investigadores menores de treinta años la sentencia a usar sería:

MATCH​ ​(i:investigador)

WHERE i.RangoEtario =​ ​ ​ Menor de 30 RETURN​ ​i

(48)

MATCH​ ​(from:investigador), (to:investigador), path = shortestPath((from)-[ *0..]-(to))

WHERE id(from)​ ​=​ ​80366​ ​AND id(to)​ ​=​ ​82562

RETURN length(path)​ ​AS distancia

Si se desea usar solo algunas relaciones para el análisis de las distancias, se puede filtrar la consulta anterior. Por ejemplo, si se quieren tener en cuenta sólo la nacionalidad y la edad para relacionar a los candidatos se utilizará la siguiente sentencia:

MATCH​ ​(from:investigador), (to:investigador),

path = ​shortestPath​((​from​)-[​:nacionalidad|edad*​0​..]-(​to​))

WHERE id​(from​)​ ​=​89986​ ​AND id​(to​)​ ​=​120739

(49)

4.3-Jenetics para implementar algoritmo genético

Como se dijo anteriormente, Jenetics es una biblioteca desarrollada en java que implementa algoritmos genéticos. Para esto, desarrolla en forma de clases o interfaces de java los conceptos relativos a estos algoritmos: genes, cromosomas, genotipos, fenotipos, población y función de aptitud. Para ejecutar un algoritmo se deben instanciar, extender e implementar estas clases e interfaces.

Algunas de las principales ventajas de Jenetics son: -Soporte para procesamiento en paralelo. -Preparada para java 8.

-Libre de dependencias con otras bibliotecas.

-Soporta minimización o maximización de la función de aptitud.

En cada ejecución del algoritmo se genera un stream de evolución que está ligado a un motor de evolución que se encarga de realizar todos los pasos de la evolución para cada generación del stream. Un motor se puede utilizar para el desarrollo de múltiples evolution streams que pueden ser usados de manera segura en distintos threads. El motor de evolución se puede describir como una función sin estados y no determinística que devuelve una población de salida a partir de una población inicial.

(50)

En la figura 4.5 se muestra el diagrama de clases de las clases de dominio. Los genes son el primer bloque del dominio, en el caso de este trabajo cada gen corresponde a un candidato a la conformación del grupo.

Los cromosomas son una interfaz intermedia que puede tener más de un gen. Sobre esta estructura se realiza el crossover, si es que existe. En la aplicación presentada, cada cromosoma representa a un grupo de personas y está compuesto por tantos genes como miembros tenga el comité. Para incorporar los candidatos al algoritmo, se usa una función proveída por Jenetics que genera cromosomas de enteros en un rango determinado. Estos enteros son índices del vector que contiene la totalidad de los candidatos y el rango irá de 0 a la cantidad total de candidatos, la invocación para generar cromosomas queda constituida de la siguiente manera: IntegerChromosome.of(0, candidatos.size(),n), donde n es la cantidad de miembros del grupo o comité buscado. En la figura 4.6 se puede ver un ejemplo de la representación utilizada para crear los cromosomas utilizando los índices del vector de candidatos.

(51)

La siguiente clase es genotype,un genotipo que representa a un individuo, es decir una solución al problema. Los objetos genotype pueden contener distintos cromosomas con distintas características. En la implementación presentada cada genotipo contiene un solo cromosoma ya que una solución esta dada por un solo comité. El genotipo es evaluado por la función de aptitud y en base a ese valor es mantenido, descartado o combinado con otros. El genotipo junto con la función de aptitud conforman el fenotipo que es la siguiente clase del dominio. Esta última clase solo consiste en un entorno para el genotipo, no cambia la estructura ni el contenido de este.

Finalmente la población es la clase que al instanciarse estará conformada por el resto de los objetos del dominio. Cada invocación al motor por parte del stream

tiene como parámetro un objeto de tipo población y devuelve otro objeto de tipo población.

Para introducir la variación genética, hay que definir en la creación del motor los alteradores y selectores que se van a utilizar. Jenetics provee un conjunto de múltiples operadores genéticos.

Los selectores son los que se encargan de elegir un grupo de individuos dentro de la población dada, devuelven un subconjunto de la población que reciben como parámetro. Pueden usarse tanto para elegir los supervivientes o la descendencia. Los tipos de selectores que brinda Jenetics son:

Tournament selector El mejor individuo de una muestra aleatoria de s

individuos es elegido de la población. Este individuo, el ganador del torneo, es el que tenga el mejor valor de aptitud de la muestra. Bajo esta configuración, el peor individuo nunca sobrevive, y el mejor individuo siempre sobrevive. La presión de la selección puede variar cambiando el tamaño de los torneos. Mientras más grande sea el valor de s, menos posibilidad de sobrevivir tienen los individuos débiles.

(52)

Monte Carlo selector Selecciona aleatoriamente los individuos de una población dada. Este selector puede ser usado para medir la performance de otros selectores. En general, la performance de un selector debería ser mejor que la del selector Monte Carlo.

Probability selectors Estos selectores eligen individuos de una población en base a su probabilidad de selección.

[Figura 4.7] Funcionamiento de selectores probabilísticos

La figura 4.7 muestra el funcionamiento del selector probabilístico: P(i) es la probabilidad del individuo i de ser elegido, y F la suma de estas probabilidades. Se crea un espacio de probabilidades que va de 0 a F que contiene las probabilidades ordenadas en base a i.Luego se genera un número aleatorio r/0≤r<F y según su valor en el rango de probabilidades se elige el individuo. Por ejemplo, si se tienen 3 individuos (0,1,2) para seleccionar con P(0)=0.3, P(1)=0.5 y P(2)=0.2, entonces se crea un espacio de probabilidades de la siguiente manera:

-Si 0 ≤r< 0.3 se elige el individuo 0. -Si 0 ≤.3 r < 0.8 se elige el individuo 1. -Si 0 ≤.8 r < 1 se elige el individuo 2.

A continuación se describen una serie de selectores probabilísticos.

(53)

(

i

)

P

=

fi

n

j=1fj

Donde fi es el valor de fitness del individuo i y n es la cantidad de individuos en la población. Seleccionar n individuos de una población dada es equivalente a jugar n veces en la ruleta. La población no tiene que ser ordenada antes de elegir los individuos.

Linear-rank selector Primero los individuos son ordenados de acuerdo a su valor de aptitud. El valor N se asigna al mejor individuo y el valor 1 es asignado al peor. La probabilidad de selección P(i) es asignada linearmente a los individuos de acuerdo a su valor.

(

i

)

(

n

n

n

)

)

P

=

N1 −

+ (

+

Ni−1−1

es la probabilidad de que el peor individuo sea seleccionado y es la N

n

nN+

probabilidad de que el mejor individuo sea seleccionado. Notar que todos los individuos obtienen diferente valor y, por lo tanto, diferente probabilidad, incluso si tienen el mismo valor de aptitud

Exponential-rank selector Se propone como una alternativa más fuerte al Linear-rank selector. Asigna probabilidades de supervivencia a los individuos ordenados usando una función exponencial:

(

i

)

c

)

P

= ( − 1

ccNi−1−1

Donde 0 ≤c< 1. Un valor pequeño de c incrementa la probabilidad de que los mejores individuos sean seleccionados. Si ces cero, la probabilidad de selección del mejor individuo es uno. La probabilidad de selección de todos los demás individuos es cero. Un valor cercano a uno iguala las probabilidades de selección. Este selector ordena la población en orden descendente antes de calcular las probabilidades de selección.

Boltzmann selector La probabilidad de selección es definida como

(

i

)

(54)

Donde b es un parámetro que controla la intensidad de selección y Z es definido como

Z

= ∑

n

i=1

e

fi

es el fitness del individuo i y n es el tamaño de la población. Valores

fi

positivos de b incrementan la probabilidad de selección de individuos con valores de aptitud altos. Mientras que valores negativos de b la decrementan. Si b es cero, la probabilidad de selección de todos los individuos es .1

N

Además de los selectores el otro tipo de operadores provistos por Jenetics son los alteradores, estos se encargan de introducir la variación genética modificando y recombinando los individuos de las poblaciones. Existen dos tipo de alteradores: los alteradores de mutación y los alteradores de recombinación.

En los alteradores de mutación, la probabilidad de mutación P( m) es el parámetro que debe ser optimizado. El valor óptimo para la tasa de mutación depende del rol que cumpla la mutación en la implementación del algoritmo. Si la mutación es la única fuente de exploración (si no hay entrecruzamiento) , la tasa de mutación debe tener un valor que asegure que una buena cantidad de soluciones sea explorada. La probabilidad de mutación es definida como la probabilidad de que un gen específico, sobre toda la población, sea mutado.

El mutador selecciona el gen que va a ser mutado siguiendo tres pasos: 1. Seleccionar un genotipo G[i] de la población con probabilidad

(m)

PG

2. Seleccionar un cromosoma C[j] del genotipo seleccionado G[i] con

probabilidad PC(m) .

3. Seleccionar un gen g[k] del cromosoma seleccionado C[j] con probabilidad Pg(m) .

Las probabilidades para las subselecciones mencionadas son

(

m

)

(

m

)

(

m

)

P

G

=

P

C

=

P

g

=

3

P

(

m

)

(55)

Single-point crossover este operador cambia dos cromosomas hijos tomando dos cromosomas y cortandolos en algún punto aleatorio.

[Figura 4.8] Cruzamiento por Single-point crossover

En la figura 4.8 se muestra el funcionamiento de este operador para la implementación presentada en este trabajo. En el ejemplo, se busca un grupo de tres personas, donde punto de corte es 0 (se corta en la primer posición del genotipo). A partir de los dos grupos de personas iniciales se forma un nuevo grupo usando la primera persona del primer grupo y el resto del segundo grupo.

Si se crea un hijo y su complemento, se conserva el número total de genes en la población, previniendo cualquier desviación genética. Este tipo de entrecruzamiento es muy lento si se compara con multi-point crossover.

(56)

[Figura 4.9] Cruzamiento por Multi-point crossover

La figura 4.9 muestra un 2-point crossover, es decir una instancia de Multi-point crossover con 2 puntos de corte. En este caso los índices son 0 y 2. También para este tipo de crossover se forma el vector complementario al generado.

Partially-matched crossover Este operador es un 2-point crossover que además controla en cada combinación que los cromosomas resultantes no tengan genes repetidos. Si existe algún gen repetido, modifica el gen del cromosoma.

Ahora que ya se describieron los componentes más importantes de Jenetics para desarrollar el algoritmo genético se puede mostrar de qué manera es usada esta biblioteca en el código para crear el motor y el stream.

(57)

//Crea un motor con genes enteros y aptitud double

final Engine<IntegerGene, Double> engine = Engine

//invoca al constructor pasándole la función de aptitud previamente

definida y define cada individuo(genotipo) como n enteros, donde c/entero

representa a un candidato.

.builder(fitnessfunction, Genotype.of(IntegerChromosome.of(0,

candidatos.size()-1),n))

//se define el tamaño de la población como p

.populationSize(p)

//se elige como selector de supervivencia un TournamentSelector con muestra

de tamaño x

.survivorsSelector(new TournamentSelector<>(x))

//se elige como selector de descendencia un RouletteWheelSelector

.offspringSelector(new RouletteWheelSelector<>())

//se agregan dos alteradores, un Mutator con probabilidad de mutación xm y

un SinglePointCrossover con probabilidad xc

.alterers(

new Mutator<>(xm),

new SinglePointCrossover<>(xc))

.build();

Después de haber creado el motor se debe generar el stream que encontrara el mejor individuo.

//se crea el fenotipo que va a contener la solución final

final Phenotype<IntegerGene, Double> best = engine.stream()

//se va a truncar el stream después de n generaciones estables

.limit(bySteadyFitness(n))

//se define un límite de x generaciones como máximo

.limit(x)

//se actualizan las estadísticas en cada generación

.peek(statistics)

// Se reduce el stream de evolución a su mejor fenotipo

(58)

En esta invocación se ve que se debe crear previamente el objeto statics que es el que guarda las estadísticas del algoritmo. Este objeto es una instancia de la clase EvolutionStatistics proveída por Jenetics y contiene información estadística acerca de la aptitud, fenotipos inválidos y eliminados, e información en tiempo de ejecución acerca de los diferentes pasos de la evolución.

4.4-Aplicación java para formar grupos

Para poder invocar el algoritmo genético se desarrolló una aplicación en java que mediante una interfaz gráfica sencilla permite a un usuario cualquiera formar un grupo o comité de personas independientes.

(59)

[Figura 4.10] Interfaz gráfica de aplicación java

(60)

Como se ve, la interfaz gráfica solo sirve para filtrar la red y establecer el tamaño del comité a conformar. Los parámetros de configuración para ejecutar el algoritmo genético mediante Jenetics se obtienen automáticamente de la base de datos MySQL. Es posible que múltiples configuraciones de parámetros se utilicen en cada ejecución de la aplicación. Esto hace que cada ejecución requiera mucho tiempo. Para optimizar el uso del tiempo se usó la clase Thread de Java para ejecutar múltiples combinaciones del algoritmo simultáneamente. Cada hilo de ejecución toma una configuración general y una configuración de alteradores y produce una salida. De esta manera se aplican las ventajas del paralelismo para mejorar el rendimiento del proceso de evaluación.

[Figura 4.11] Diagrama de componentes y conectores de aplicación java

(61)

datos de las tablas configuración y alteradores. Cuando un algoritmo termina el thread correspondiente guarda la salida en la tabla SQL y lee una nueva tarea de la cola. Si no hay más tareas en la cola, el thread se duerme.

4.5-Resumen

El resultado de la implementación es una aplicación java que, mediante una interfaz gráfica sencilla, permite formar grupos de personas del tamaño deseado. Para ello utiliza, una base de datos Neo4j donde se almacenan los candidatos y sus relaciones, y la librería Jenetics como framework para ejecutar el algoritmo genético.

Quedando especificada la implementación de la propuesta del capítulo anterior, falta analizar el rendimiento. En el capítulo siguiente se presenta un caso de estudio y se contrastan los resultados obtenidos mediante las diferentes configuraciones.

Referencias

Documento similar