Tuesday, November 12, 2013

Hice programa para simular evolución de organismos libre, licencia MIT, simulacion genetica con bases nitrogenadas y estructura similar a una celula


Hice un algoritmo evolutivo que la simple lectura de su código posiblemente te hará entender los fundamentos de la teoría de darwin y su selección natural, así como los fundamentos de reproducción celular y herencia es un api pero trae un demo, uso bases nitrogenadas reales complementarias y células con una estructura similar a un organismo (con respecto a su núcleo y material genético).

La reproducción se da entre los más aptos random en el universo de población con distribución uniforme bajo el producto de sus aptitudes con respecto a un gen elite.

La manera de que estos se juntan es si son más aptos, esto es para simular el elitismo biologico, podrian reproducirse otros no aptos con cierta probabilidad .

Sus hijos comparten aproximadamente la mitad de los genes de sus padres.

Las poblaciones envejecen en cada generación, dañando el ADN en cierto porcentaje de los menos aptos.


Corranlo... trae un demo y me dicen que opinan... segun yo quedo muy didactico.

Y se puede adaptar para usar genomas reales y trazar evolucion no solo de 1 gen sino de varios a la vez.

En mi programa una celula humana ocuparía aproximadamente 9gb de memoria (46 cromosomas, 30 mil genes en el ADN con 1000 pares de bases nitrogenadas)

Por lo que en el demo uso un organismo con 4 cromosomas pero pueden bajar los genomas de ECOLI que ocupan como 6 mb en mi programa y generar poblaciones para ver como evolucionan... aqui tengo uno.

http://math.co.ro/ecoli.dna

Gracias Ximena Tochtli Bouchain Pedrón
por resolverme dudas de genética y reproducción celular, ya que con sus tips y consejos esto funciona y es más realista :)

Esta aquí el leeme y el código
http://b3ck.blogspot.mx
Salu2

Eduardo Ruiz (beck)


Aquí dejo el LEEME.TXT

bevolucion-0.1.tar.gz

Copyright Nov-2013 Eduardo Ruiz Duarte (rduarte@ciencias.unam.mx)


Programa para calcular las generaciones requeridas para alcanzar la estructura de un gen definida
utilizando la estructura aproximada biologica de un organismo.

Si quieres aprender un poco de genetica basica fundamental, sigue leyendo y corre este programa

Si quieres aprender mas de la parte biologica, quien me asesoro fue Ximena Tochtli Bouchain, escribele a rhapanus@gmail.com

Si quieres saber como funciona el API , lee los prototipos y sus comentarios al final del header bevolucion.h

Si estas desesperado y te da flojera leer esto , solo compila y corre el programa que ya trae un DEMO

./compila
./bevolucion


en el ejemplo se intenta evolucionar a un gen_elite aleatorio.



COMO FUNCIONA?

Se puede definir.
numero de organismos
numero de cromosomas
numero de genes
numero de pares de bases nitrogenadas por gen
coeficiente de mutacion (cuantos pares de bases se van a modificar aleatoriamente en todos los genes... podrian no modificarse algunos genes por probabilidad)
cromosoma y gen de referencia para analizar su evolucion

QUE HAY EN EL DEMO? [ main() ]

En el main() se implementa:

 INICIO_ALGORITMO {

1. El programa genera una poblacion con genes aleatorios y un gen_elite para comparar la evolucion, cada organismo contiene en su 'ser'
  su coeficiente de adaptacion con respecto al gen_elite

  LOOP() {
2. Se organizan jerarquicamente en funcion de su adaptacion al gen_elite

3. Usando la distribucion aleatoria uniforme escogemos aleatoriamente 2 padres aptos para reproducirse (de acuerdo a su coeficiente de adaptacion)
  podrian no ser los mas aptos, pero la funcion esta probada para arrojar mayormente aptos al azar.
  para simular elitismo usual entre organismos.

4. Se reproducen y generan un hijo con cierta probabilidad de mutacion y se le integra en su 'ser' su coeficiente de adaptacion
  el ADN de el hijo contiene genes con 50% de probabilidad del padre y 50% de probabilidad de la madre

5. Se integra a la poblacion si este hijo es mas apto que el menos apto

6. Muere el menos apto

7. Envejece 1/3 de la poblacion menos adaptada de manera que se dania el ADN,  el danio es una mutacion
  de solo 1 par de bases nitrogenadas en el gen de referencia.
  Esto esta fundamentado en que el envejecimiento consiste en la creacion de proteinas menos adecuadas
  para el ciclo de vida de las celulas debido a que el ADN contiene ya informacion erronea
  (el ADN contiene las 'instrucciones' del ciclo de vida de una celula, creacion de proteinas)
  Por ejemplo los rayos UV danian el gen XPD humano que llevan a defectos en la reparacion del ADN y transcripccion.
  las personas con este danio tienen el sindrome de Cockayne, por eso aqui modelamos con 1/3 de los menos
  adaptados la mutacion en el gen de referencia.

 }
}
FIN_ALGORITMO


Cada organismo (celula) esta organizada asi:

typedef struct celula_s
{
  cromosoma cromosomas[MAX_CROMOSOMAS];
  int16_t num_cromo;
  int16_t num_genes;
  int32_t aptitud_gen_ref;
  uint64_t identidad;
  uint32_t padre, madre;
  int32_t num_hijos;
  int32_t hijos[MAX_HIJOS];
 } celula;

donde su 'identidad' esta compuesta de 64 bits
{20 bits info de padre}{20 bits info de madre}{4 bits pseudo-random}{20 bits (Padre XOR Madre) + num_hijos_padre+num_hijos_madre}


Las variables globales gGen_ref y gCromo_ref son para encontrar el gen de referencia para evolucionar, esta definida en main() y se genera aleatoriamente ej. (ATCGGCTA)


Todas las subestructuras estan organizadas jerarquicamente con los componentes biologicos del organismo simple (solo nucleo)


CROMOSOMA:
Un cromosoma tiene el ADN enrollado y tiene asociadas proteinas, especialmente histonas, aqui las podemos relacionar con el mismo indice
pero la estructura de proteinas que el cuerpo usa para unir el ADN como cromatina no se usa aun en esta implementacion aun (ni otras proteinas)

typedef struct cromosoma_s
{
adn molecula_adn;
uint64_t proteinas[MAX_GENES * MAX_NUC_GEN];
} cromosoma;

ADN:
El ADN esta seccionado por genes
typedef struct adn_s
{
gen genes[MAX_GENES];
int8_t recesivo;
} adn;

GEN:
Un Gen esta compuesto de bases nitrogenadas, y guardaremos su aptitud y tamanio de pares de bases nitrogenadas en format AT,TA,GC,CG,AU,UA
que son los pares complementarios de pirimidinas y purinas en el ADN de un organismo y en ARN (U:=Uracilo que sustituye T=Timina)

typedef struct gen_s
{
  uint8_t par_bases[MAX_NUC_GEN];
  uint16_t tamano;
  uint32_t aptitud;
} gen;


PAR DE BASES NITROGENADAS

#define Adenina     0x08
#define Citosina    0x04
#define Guanina     0x02
#define Timina      0x01
#define Uracilo     0x0f
 ADN pares complementarios
#define AT (int8_t)(Adenina<<4 imina="" p="">#define TA (int8_t)(Timina<<4 denina="" p="">#define GC (int8_t)(Guanina<<4 itosina="" p="">#define CG (int8_t)(Citosina<<4 p="" uanina=""> ARN pares complementarios
#define AU (int8_t)(Adenina<<4 p="" racilo="">#define UA (int8_t)(Uracilo<<4 denina="" p="">