Analogías y comentarios de la lectura de Griffiths et al. (Capítulo 3)

En “The chromosomal basis of inheritance” nos encontramos con una más que interesante reseña histórica del desarrollo de la teoría de los cromosomas. Debería ser lectura obligatoria en los colegios secundarios1.

Una de las notas que tomo de este capítulo, es como se da un patrón de herencia especial para ciertos genes pertenecientes a los cromosomas de sexo. En otro post comenté la posibilidad2 de utilizar analogías de sexo en GA. Lo interesante es ver como en genética, han descubierto este patrón a través de la observación. A nosotros, desde GA nos pasa lo contrario, podríamos inducir ciertas características de las soluciones de los problemas que tratamos para que respeten estos patrones especiales de herencia.

Cuando las células se dividen pueden hacerlo por mitosis o por meiosis.

La mitosis está identificada con la reproducción asexual de las células, claro que es la reproducción asexual en organismos unicelulares (eucariotas), mientras que en organismos multicelulares tiene que ver con la reproducción de las células y no con la reproducción de dichos organismos.

En la meiosis, a partir de células diploides, se producen células haploides (4) llamadas gametos relacionadas con la reproducción sexual de los organismos multicelulares.

Conviene estudiar las fases de la meiosis, que tienen cierta complejidad, para analizar posibilidades de implementación en GA.

Evidentemente con la introducción del sexo (y la característica diploide) en los GA deberíamos dejar de hablar únicamente de cromosomas-individuos para hablar de células-individuos que contienen al menos 2 cromosomas (con sus respectivos pares).

Cabe notar que la meiosis también ocurre en organismos haploides, en donde una célula de cada padre se juntan para formar una célula diploide temporal (meiocito) para luego ser sometida a meiosis y así formar células haploides (esporas por ejemplo).

Se puede destacar que en la meiosis (en cualquier organismos), las leyes de Mendel se respetan, dado que los alelos de los genes se segregan igualmente en los gametos y que los alelos de un gen se segrega independientemente de los alelos de otros genes.

Conjuntamente con la introducción del sexo en GA, conviene comentar la existencia de cromosomas en las organelas de las células. Dado que este material genético se encuentra fuera del núcleo de las células, no es utilizado durante la reproducción sexual, por lo que el uso de este material genético no se describe mediante las leyes de Mendel, ya que:

  1. Se hereda de uno de los padres exclusivamente (la madre generalmente)
  2. Puede ocurrir segregación de genes citoplasmática: Hay células que pueden portar dos alelos distintos de un mismo gen (heteroplasmonte o cytohets), que a su vez pueden generar una descendencia de celulas que tomen el alelo A o el a.
  3. También puede ocurrir que células asexuales puedan someterse a procesos análogos al crossing over.


Notas
1 Lo digo con la fe de los conversos. Es decir, la peor de todas.
2 Y de hecho cité un artículo más que interesante sobre el tema.

Anuncios

Un ejemplo de optimización con GA

Así como los genetistas tienen individuos de pruebas, los problemas de optimización (tanto para algoritmos genéticos como para otras técnicas) poseen problemas de prueba. Es decir, problemas ya estudiados que sirven para estudiar el rendimiento de las técnicas a utilizar.

Aquí vamos a tratar de encontrar el máximo global de una función de dos variables que determina una superficie en el espacio. No lo vamos a hacer para un espacio infinito, sino acotado.

La función que vamos a seleccionar es una variante de la función conocida como el Valle de Rosenbock1. Se define como f(x,y)=100(y-x^2)^2+(1-x)^2 y vamos a estudiarla en el intervalo [-2;2] tanto para la dimensión x, como para la dimensión y. A continuación se ve la representación gráfica de la superficie que la función describe en el intervalo estudiado:
vallederosenbrockEl esquema básico de funcionamiento de los algoritmos genéticos se puede resumir en el siguiente diagrama:

esquemabasico

Un algoritmo genético debe poseer los siguientes componentes:

  • Una representación genética para soluciones potenciales.
  • Una forma de crear una población inicial de soluciones potenciales.
  • Una función de evaluación que tome el rol del entorno biológico, calificando los individuos (potenciales soluciones) en términos de su fitness.
  • Operadores genéticos que alteren la composición de la descendencia.
  • Valores para parámetros, como son los siguientes:
    • Tamaño de la población
    • Probabilidad de aplicación de cada operador genético
    • Otros

Paso a paso vamos a ir definiendo nuestro algoritmo genético.

Representación

Tomando el enfoque clásico de algoritmos genéticos, vamos a buscar una forma de representar una posible solución como una riestra de bits. Y aquí nos encontramos con el primer problema: la función está definida en el conjunto de los reales, es decir que x,y \in \mathbb{R}. Y nosotros podemos expresar soluciones en términos de matemática discreta, es decir, enteros (\mathbb{Z}). Entonces conviene cómo vamos a representar esos números reales a partir de riestras de binarios, fijando qué precisión vamos a considerar válida. Tomemos una precisión arbitraria, como por ejemplo 10 decimales. Es decir, discretizamos un contínuo en 1010 slots para ambas dimensiones (x e y). Vale decir, entonces, que para cada dimensión vamos a tener 4 x 1010 valores posibles. Necesitaremos 36 bits de precisión para especificar las variables, ya que:

235 = 3,4359738368 1010 < 4 x 1010 < 236 = 6,8719476736 x 1010

Por tanto necesitaremos 72 bits para representar las variables x e y. Para convertir nuestra representación a decimal, bastaría con aplicar las siguiente fórmulas:

  • x = -2 + x' \dfrac{4}{2^{36}-1}
  • y = -2 + y' \dfrac{4}{2^{36}-1}

Vamos, entonces a definir nuestro cromosoma como un arreglo de bits de logitud 72, portador de dos genes, uno representando a la variable x y otro representando a la variable y. Con la siguiente estructura:

  • Gen x o 1: ubicado en el loci 0, longitud 36 bits.
  • Gen y o 2: ubicado en el loci 36, longitud 36 bits.

Un ejemplo de nuestro cromosoma podría ser la siguiente tira de bits:

010100001101001001101010011010010101010111010000001010100101000101111101

Que representaría una solución que indica que

  • gen x=010100001101001001101010011010010101 (2,1695473301 x 1010 en base 10, es decir que la variable x valdría 0,1695473301)
  • gen y=010111010000001010100101000101111101 (2,4967270781 x 1010 en base 10, es decir que la variable y valdría 0,4967270781)
  • Por tanto la solución (z) tomaría el valor 11,394310437 que surge de aplicar la definición de la función a optimizar.

Población inicial

Hay varias maneras de generar una población inicial. En el enfoque clásico, se utiliza la generación pseudoaleatoria. En enfoques más híbridos, se pueden utilizar salidas de otros algoritmos, como por ejemplo, soluciones que estén en el plano de lo factible. En este caso utilizaremos una población aleatoria.

Función de evaluación

Para evaluar a cada individuo según su fitness utilizaremos una función que tome el cromosoma o arreglo de bits a estudiar y produzca un número real, de tal modo que la función de evaluación sea eval(v) = f(x,y) .

Operadores genéticos

La población de individuos evolucionará en función de dos de los operadores básicos de los GA, a saber, mutación y crossover.

Aquí utilizaremos la versión más simple del operador de mutación, que alterará un gen particular, en una posición particular según una probabilidad de mutación (que es un parámetro de la corrida de los GA). La mutación en si, consiste en la inversión del bit a mutar, es decir, si en la posición concreta hay un 0, se mutará a un 1 y vice versa.

Dentro del operador de crossover hay más posibilidades, todo una gama de operaciones posibles. Aquí utilizaremos la más sencilla, el crossover en un punto. Se toman los dos individuos a cruzar, a saber I1 e I2, siendo, por ejemplo:

I1 = 001011001010000110101010111111111111010101010101010001110101000101101010
I2 =010100001101001001101010011010010101010111010000001010100101000101111101

Suponiendo que el punto de cruce fue la posición 10 (seleccionada al azar, marcada en negrita en los individuos), la descendencia quedaría configurada de la siguiente manera:

I12‘ = 001011001001001001101010011010010101010111010000001010100101000101111101

I12” =010100001110000110101010111111111111010101010101010001110101000101101010

Mecanismo de Selección

Para ser seleccionados para cruzarse, los individuos son sometidos a un mecanismo de selección (en el que intenta analogarse la selección natural), que puede tener muchas variantes. Aquí utilizaremos el enfoque clásico de Ruleta o Selección proporcional. Con este método la probabilidad que tiene un individuo de reproducirse es proporcional a su valor de función de evaluación. Como primer paso es necesario calcular la sumatoria del valor de la función de fitness aplicada a cada uno de los elementos del conjunto que están aptos para ser elegidos. Este será el rango máximo. Luego se calculan los rangos individuales de cada uno de los individuos de la siguiente manera:

  • R0=0
  • R1=eval(v1)
  • R2=R1+eval(v2)
  • ………………..
  • Rn=Rn-1+eval(vn)

De este modo, los rangos se encuentran en el intervalo [0;\sum\limits_{i=1}^n eval(v_{i})], el individuo con más fitness tendrá una amplitud mayor de intervalo, cada individuo tendrá una probabilidad p_{i}=\dfrac{eval(v_{i})}{\sum\limits_{j=1}^n eval(v_{j})} de ser elegido, y obviamente, para la selección se utiliza un numero pseudoaleatorio en el rango [0;\sum\limits_{i=1}^n eval(v_{i})].

Otros Parámetros

El tamaño de la población es fijo a lo largo de la evolución y se ha decidido (arbitrariamente en este caso) establecerlo en 50.

La probabilidad de mutación es de 0,035.

La distribución de probabilidades es uniforme para seleccionar el punto de cruce en la operación de crossover.

La condición de corte no la establecimos, sino que evolucionamos 100 generaciones y nos quedamos con el mejor individuo.

Resultados

La salida del programa ha sido la siguiente:

Solución encontrada en 0.291 segundos.
La mejor solución tiene un fitness de 3609.0
El individuo resultó ser:
x=-2.0
y=-2.0

Es decir, que f(x,y)=3609 siendo (-2,-2) uno de los puntos que estábamos buscando. Sin paralelismo y sin mucha optimización, pudimos resolver el problema en menos de 3 décimas de segundo.

Ahora, veamos cómo fue evolucionando la población: ResumenGeneracionesRosenbockValley

Podemos ver que no hizo falta llegar a las 100 generaciones, ya que en la 66 se encontró el óptimo global que estábamos buscando (al menos uno de los varios que puede haber en la función).

También es posible graficar la evolución del fitness en función del tiempo (generaciones) de la siguiente manera:

analisisvallerosenbrock

En donde podemos observar que hay un incremento importante inicial en el fitness que se ameseta hasta llegar al máximo.

La implementación fue realizada en Java con el framework jgap y maven que ayuda mucho a evitar el infierno de las dependencias, por lo que dejo disponible el código fuente (realmente programé muy pocas líneas… Es casi una vergüenza…)  aquí:

La función de Fitness, en este archivo java: FitnessRosenbockValley

La Aplicación que se ejecuta, en este archivo java: App

El archivo pom.xml de Maven: pom


Notas
1 La idea de utilizar esta función fue tomada del trabajo de Marcin Molga y Czeslaw Smutnicki “Test functions for optimization needs” en el que se analiza un gran catálogo de funciones modelo para analizar desde las técnicas de optimización.

Analogías y comentarios de la lectura de Griffiths et al. (Capítulo 2)

Dentro de las variantes discontinuas en los rasgos, los patrones de herencia pueden clasificarse de la siguiente manera:

  • Autosomal: basada en la variación de genes en cromosomas regulares (autosomas)
  • Vinculados al sexo: basada en la variación de los cromosomas determinantes del sexo.
  • Citoplasmática: basada en la variación de genes de los cromosomas de las organelas de las células.

En GA no contamos con sexo, ni tenemos células siquiera… Tenemos únicamente cromosomas y generalmente uno sólo (ni siquiera apareado)… Por lo que la categoría en la que cae el patrón de herencia existente en los GA (clásicos) es el autosomal.

Se puede decir que la maquinaria celular está representada por el framework o máquina donde corremos los GA. Sólo si se tiene mucha fe en las implementaciones.

Es un planteo interesante la introducción del sexo en lo GA (lo que implicaría definir cromosomas particulares para cada sexo, de gametos, de procesos como la meiosis, etc.) Sería interesante estudiarlo en detalle. Aquí hay una referencia a quienes han hecho una experiencia en este sentido.

Una de las características de los cromosomas que definen el sexo (X e Y) es que no tienen la misma estructura. En términos computacionales, hablaríamos de que la meta-data es distinta. Es decir, haciendo una burda analogía, puede ser que el cromosoma X tenga 2 genes:

  1. Comienza en la posición o loci 0 (así lo hacemos computacionalmente más atractivo) y tiene 10 bits (serían 5 bases)
  2. Comienza en el loci 10 y tiene 2 bits (1 base)

Y que el cromosoma Y tenga un sólo gen de 20 bits que incluso no tenga la misma función que el gen 1 del cromosoma X.

Esto podría ser fuente de un estudio interesante, calculo que puede tener sentido en la optimización multiobjetivo, poseer individuos (soluciones) con definiciones distintas no desde el punto de vista de sus alelos, sino directamente de sus genes. Habría que estudiarlo en detalle.

Analogías y comentarios de la lectura de Griffiths et al. (Capítulo 1)

Conviene empezar citando fugazmente las analogías obvias (de la genética a los GA):

  • cromosoma → individuo o estructura (potencial solución)
  • gen → característica o atributo
  • alelo → valor
  • locus → posición en la estructura
  • genotipo → conjunto de genes o estructura
  • fenotipo → estructura decodificada

Una vez dicho esto, vale la pena escribir algo sobre la representación. Los GA codifican soluciones mediante arreglos de bits (en el enfoque clásico es la única posibilidad, en algoritmos evolutivos la representación es mas flexible). Estos arreglos configuran cromosomas (o mas bien directamente individuos, dado que en GA hay un único cromosoma), es decir el genotipo de un individuo. Para llegar al fenotipo, solo hace falta aplicar la función objetivo (a veces la de fitness) para ver que tal se ven estos individuos. El análisis genético de la genética de poblaciones es un tanto más complejo, ya que distingue las variaciones existentes en una población (en sus características, en su fenotipo) como discontinuas o continuas. Las variaciones discontinuas suelen tener identificada su razón de ser en la variación de un gen (un alelo A en vez de un a por ejemplo) pudiendo tratarse de polimorfismos en una población (formas que se dan comúnmente) o mutaciones (más raras). Las variaciones continuas no tienen ningún tipo de mapeo “1-1” con un gen, sino que son mucho más difusas (desde el punto de vista fenotípico) y el entorno juega un rol significativo en la expresión de estas variaciones.

Dicho esto conviene repensar el objeto de estudio de ambos campos (GA y Genética de Poblaciones). En ambos casos no interesa la noción clara de origen de la “vida”. Una población es un grupo de individuos más o menos estable (admite migraciones y cierta composición heterogénea obviamente). La genética de poblaciones actúa sobre esas poblaciones ya establecidas, las analiza y hace predicciones. En cambio en GA normalmente la población inicial la generamos al azar (con cierto cuidado de no generar individuos no viables, obviamente). En algunos casos, admitimos individuos que surgen como resultado de otras técnicas (en un problema de optimización podríamos admitir como individuos a soluciones que ya se saben que están en la base, o que son factibles). Entiendo que en GA se pueden tomar elementos de la genética de poblaciones, pero claramente hay que adaptarlos o utilizarlos como herramientas con un enfoque “top down”, mientras que los genetistas las utilizan con un enfoque más inductivo o “bottom up”. Para utilizar la parte estadística de la genética de poblaciones en GA, debemos dejar que las poblaciones inicialmente inicializadas al azar hayan recorrido cierto trecho, sino no tendría ningún sentido. Creo que sería útil valorar desde el punto de vista del teorema de schemas o building blocks de los GA el sentido de determinar qué variaciones discontínuas se encuentran en una población de individuos. También es claro que se puede hacer con cierta complejidad de genes (GA), no tiene sentido hacerlo para pocos genes.

El texto explica el experimento de Mendel de una manera sumamente amena. Conviene aclarar que los GA admiten la forma haploide de representación, es decir, que los individuos portan una copia del cromosoma que los representa… Es por eso que en GA puede a veces utilizarse el término cromosoma e individuo de manera intercambiable.

Desde el punto de vista Mendeliano, los GA cumplen al menos 2/3 de las leyes de Mendel, es decir:

  • Se cumple la Ley de dominancia en donde los híbridos de dos formas alternativas de un rasgo, se parecen a uno de los tipos paternales.
  • Se cumple la ley de recombinación independiente de los factores en donde un rasgo se hereda independientemente de otro.
  • No tiene sentido aplicar la ley de segregación, en donde los factores de rasgos alternativos que posee un individuo (aunque se exprese uno de los dos) se vuelven a separar cuando la descendencia produce gametos. Dado que los individuos del enfoque de GA clásico no producen gametos ni son diploides.

No es “dramático” que los GA no verifiquen la totalidad de las leyes de Mendel. De hecho, en los humanos, parte del material genético no puede verificar dichas propiedades, ya que sólo se hereda de la madre (ADN mitocondrial, todo el material genético que no está en el núcleo de la célula no se combina con el material genético del padre).

Así como la genética necesita de organismos “modelo”, los GA cuentan con problemas modelo para hacer otro tipo de evaluaciones que en la genética, pero que al menos, podemos hacer una analogía de entrecasa.

En la naturaleza, los genes no pueden dictar por si sólo la estructura de un organismo, dado que hace falta un entorno para que el organismo se desarrolle. En GA esto se logra mediante el establecimiento de una función de fitness que determina cuán apto es un individuo. A diferencia de la naturaleza, normalmente, la función de fitness no varía a lo largo de la evolución de los GA (o ejecución mejor dicho).

Para los GA el modelo de determinación genética es muy fuerte (dentro de una misma ejecución, es decir, con una misma función de fitness), hecho que en la naturaleza no se verifica tan estrictamente. Por tanto en  GA no hay una interacción entre el genotipo y el entorno como puede en la naturaleza, cuando los genes inteactúan con el entorno para determinar al organismo (en su desarrollo).

CNEISI 2012

Durante 2012 fui invitado a La Plata (UTN) a dar una charla sobre algoritmos genéticos en el marco del Congreso Nacional de Estudiantes de Ingeniería en Sistemas de Información. Espero que este año se pueda repetir y mejorar (por mi parte). Por suerte la asistencia fue muy grande y el tema despertó interés en los alumnos y profesores que estuvieron presentes.

DSC00367(1)

Adjunto el apunte que dejé en dicha oportunidad.

CNEISI – Algoritmos Geneticos

 

Un poco de ciencia de base

Con el fin de asomarme a los procesos biológicos relacionados con la genética, pedí asistencia a quienes conocen del tema, que me recomendaron varias lecturas entre las que se encuentran artículos de Stephen Jay Gould e “Introduction to Genetic Analysys” de Griffiths, Wessler, Lewontin, y Carroll:

GriffithsSu lectura (y re-lectura) ha sido muy amena, lamento no tener más conocimientos de química orgánica, ya que los hubiese aprovechado para ir un poco más allá de mi intención original. La recomiendo.

En cuanto a la relación con algoritmos genéticos, no sólo pude determinar ciertas analogías obvias (y otras no tanto) sino también:

  • Establecer en qué puntos el modelo evolutivo de la computación es un “toy model” de la genética.
  • Comprender los procesos de mutación a nivel de nucleótidos y también a nivel de cromosomas “enteros”.
  • Explorar qué procesos hay de intercambio de información genética entre células (no sólo existe el crossover que utilizamos en GA!)
  • Entender la mecánica de la copia de material genético.
  • Distinguir claramente el genotipo del fenotipo (no somos muy buenos en GA haciendo eso! Bah… Por lo menos yo no era muy bueno…) y verificar que no es trivial determinar que un rasgo de una población tenga una causa directa en el genotipo, sino que el entorno tiene una gran influencia.
  • Verificar que la matemática aplicable a esta rama de la biología es esencialmente la matemática discreta, claro está, que en el análisis genético se utiliza mucha estadística (y, en particular, en el laboratorio mucha distribución \chi ^2!)
  • Explorar ese “CRC avant la lettre” que es el proceso de corrección de errores.
  • Estudiar el experimento de Mendel y verificar que los algoritmos genéticos verifican sus principios.

En las próximas entradas voy a transcribir algunas notas que tomé durante esta lectura en relación con los algoritmos genéticos y en particular, con el procesamiento paralelo.

Una introducción básica

La Programación Matemática como rama de la Matemática Aplicada ha estudiado (desde mediados del siglo XX) problemas de decisión en los que se deben determinar acciones que optimicen un determinado objetivo (optimización).
El elemento clave con el que se sirve la programación matemática para verificar el método científico es el modelo matemático. Los modelos matemáticos son abstracciones simplificadas de sistemas reales que destacan las relaciones e interacciones principales entre las entidades del sistema estudiado1. Para elaborar dichos modelos, la programación matemática se nutre de resultados del álgebra, del análisis matemático, del cálculo numérico, de la geometría, de la topología, etc. El proceso de modelización debe verificar el método científico tal como puede observarse en el siguiente diagrama:
metodocientifico Dentro de los modelos, los problemas de optimización que se intentan resolver suelen tener la siguiente forma: min\{f(x) : x \in S\} es decir, encontrar si existe un elemento (o todos los elementos) donde la función objetivo f alcance su valor mínimo (o máximo), siendo el conjunto S el de las soluciones factibles. Las búsquedas de dichas soluciones puede concluir con uno de los siguientes resultados:

  • Problema no factible: No hay ninguna solución factible, es decir, que el conjunto S=\{\emptyset\}
  • Problema no acotado: Cuando no se determina que siempre se encontrará una solución mejor, que haga tender a infinito (positivo o negativo) la función objetivo.
  • Problema con óptimo: Cuando se encuentra al menos una solución que satisface el la función objetivo siendo un mínimo (o máximo) global.

Según las características de las variables e inecuaciones (restricciones) de cada modelo, la programación matemática puede dividirse en varias ramas, como la programación lineal (cuando la función objetivo es lineal), y la no lineal. Por otro lado, cuando la variable a estudiar es entera2 (o natural) se habla de Programación Entera (lineal o no lineal). Otra rama de interés es la Optimización Combinatoria, que intenta resolver problemas caracterizados por tener un número finito (pero muy grande en general) de posibles soluciones.
Son muchas las herramientas y técnicas que asisten a la programación matemática para intentar abordar estos problemas.
Todo algoritmo utilizado para resolver un problema posee un orden de complejidad estudiado por la Teoría de la Complejidad Algorítmica. Este orden de complejidad estudia la mayor número de “pasos” que deberá ejecutar el algoritmo para resolver el problema en función del tamaño de la entrada de datos al algoritmo. Por tanto es importante no el hecho de conocer en sí la cantidad de pasos que utilizará para cada tamaño de instancia (o entrada), sino el orden de crecimiento de la cantidad de pasos que realizará el algoritmo. Este orden de crecimiento se describe con la llamada notación “O”. Por ejemplo, para un orden de crecimiento cuadrático, se denotará O(). El orden de complejidad nos dará una pauta de cuán tratable es un problema, para ilustrar las connotaciones del crecimiento del orden de complejidad se adjunta la siguiente tabla que muestra para distintos órdenes de complejidad, como crecen según el tamaño de la entrada al algoritmo:

cuadroorden

Si un problema admite una solución con un algoritmo de orden polinomial, se dice que pertenece a la clase P. Los problemas con un orden mayor al polinomial se conocen como NP (no polinomiales). Muchos de los problemas que estudia la programación matemática pertenecen a la clase NP3.
Los algoritmos genéticos (o de forma más general, la programación evolutiva) son algoritmos que se inspiran en la evolución biológica para buscar soluciones en espacios de estados. La gran mayoría de los problemas que busca solucionar la inteligencia artificial son problemas complejos de búsqueda en espacios de estados muy grandes. Si bien son algoritmos de búsqueda, se han utilizado (casi exclusivamente) en problemas de optimización combinatoria para problemas NP. Tienen la característica de ser altamente paralelizables4, lo que lo diferencia de muchos de los mecanismos de resolución clásicos de programación matemática, que esencialmente son soluciones secuenciales poco paralelizables.
MapReduce es un aporte5 introducido con la aparición de las bases de datos NoSQL y la necesidad de manejar grandes volúmenes de datos cada vez más complejos (con un orden mucho mayor de relaciones que las bases de datos más tradicionales). Este mecanismo de naturaleza funcional permite paralelizar problemas sobre distintos tipos de clusters estableciendo un marco de trabajo estándar para desarrollar trabajos altamente paralelizables.
Una vez introducidos los conceptos claves del trabajo, se pueden enumerar los objetivos del mismo:

  1. Construir una máquina o framework para correr algoritmos genéticos sobre MapReduce maximizando el nivel de paralelismo.
  2. Una vez logrado el primer objetivo, se procederá a estudiar la complejidad de los algoritmos dentro de este nuevo marco.
  3. Se estudiarán alternativas de paralelismo, contando con los desarrollos ya aportados sobre poblaciones.
  4. Se estudiarán las analogías (evaluadas y no evaluadas aún) con la biología, desde el punto de vista del alto paralelismo alcanzado.
  5. Se tratarán modelos de gran complejidad para optimizar la generación de energía eléctrica térmica e hídrica en la República Argentina.

Notas
1 Algunos de los modelos proceden directamente de la realidad, pero muchos otros son planteos de otras ramas de la ciencia, como la Teoría de Juegos, la teoría de grafos, la teoría de la decisión, la bioinformática, etc.
2 Ecuaciones deofánticas.
3 Uno de los problemas abiertos de la ciencia de la computación más interesantes es determinar si P = NP.
4 Esto quiere decir que pueden ser resueltos en paralelo de manera eficiente por varios procesadores al mismo tiempo.
5 Inicialmente concebido por Google.