Algoritmos genéticos: simulando mutaciones sobre cromosomas

Una función de Perl que os puede ser de utilidad es rand, el generador de números aleatorios. Los números aleatorios se han usado en biología para modelar eventos de mutación y de recombinación genética . Pero se han llevado más allá en computación y son la base de varios tipos de algoritmos como los algoritmos genéticos y de Monte Carlo.

En este ejemplo que os propongo vamos a implementar un algoritmo genético muy sencillo que va a recombinar una serie de secuencias de ADN para obtener una secuencia final recombinante con un contenido en GC que se aproxima a uno definido.

#!/usr/bin/perl -w 
# Ejercicio escrito por Bruno Contreras

# Programa que recombina una serie de moleculas de ADN que codifican para genes homologos,
# y obtiene un gen recombinante que optimiza su contenido en %GC

# REQUISITOS:
# los genes deben estar alineados y si tienen diferente longitud deberan incorporar inserciones
# mira http://www.cbs.dtu.dk/services/RevTrans/

use strict; 

@genes = (     # en este ejemplo hay 3 genes homologos de CRP
#CRP_HAEIN
'ATGTCAAATGAATTAACCGAAATTGATGAAGTTGTAACCTCCTCTCAAGAAGAAGCAACT  
CAACGAGATCCCGTTTTAGATTGGTTTCTTACTCACTGCCATTTGCATAAATATCCTGCA
AAATCAACTTTAATTCATGCTGGGGAAGATGCGACCACGCTGTATTATGTAATTAAAGGT
TCTGTAATGGTATCTTCAAAAGATGATGAAGGCAAAGAGATGATCCTCACTTACTTAGGT
GCAGGACAATTTTTTGGCGAAGCGGGATTATTTGATGAAGGTTCAAAACGATCAGCTTGG
GTAAAAACAAAAACAACATGTGAAATTGCTGAAATTTCCTATAAGAAATATCGCCAGTTG
ATTCAGGCAAACCCTGAAATCTTAATGTTTCTCACTGCACAATTGGCAAGACGTTTGCAA
AATACATCACGTCAAGTCACGAATTTGGCATTTTTAGACGTCGCAGGTCGCATCGCTCAA
ACTTTAATGAACTTAGCTAAACAGCCTGAAGCAATGACGCATCCTGATGGTATGCAAATC
AAAATTACACGCCAAGAAATAGGGCAAATGGTGGGTTGTTCACGAGAAACTGTGGGGCGC
ATTATTAAGATGTTGGAGGATCAGAATCTTATCCACGCTCATGGAAAAACAATCGTTGTA
TATGGCGCAAGA',

#CRP_KLEAE
'ATGGTGCTTGGCAAACCGCAAACA------------------------------------  
------GACCCTACCCTTGAATGGTTCTTGTCTCATTGCCACATTCATAAGTACCCATCA
AAGAGCACGCTGATCCACCAGGGTGAAAAAGCAGAAACGCTGTACTACATCGTTAAAGGC
TCCGTGGCTGTACTCATCAAGGATGAAGAAGGTAAAGAGATGATCCTCTCCTACCTCAAC
CAGGGCGATTTCATCGGTGAATTAGGCCTGTTTGAAGAGGGTCAGGAGCGTAGCGCCTGG
GTACGGGCGAAAACCGCATGTGAAGTGGCCGAAATCTCTTATAAGAAATTCCGTCAGCTG
ATCCAGGTGAACCCGGACATTCTGATGCGTCTCTCTTCGCAAATGGCTCGCCGTCTGCAG
GTCACGTCTGAGAAAGTGGGCAACCTCGCCTTCCTCGACGTGACGGGCCGTATCGCCCAG
ACGCTGCTGAACCTGGCGAAGCAACCGGATGCCATGACCCACCCGGACGGTATGCAAATT
AAAATTACACGCCAGGAAATTGGTCAGATCGTCGGCTGCTCTCGTGAAACCGTTGGTCGT
ATTTTGAAAATGCTGGAAGATCAGAACCTGATTTCCGCGCACGGTAAAACCATCGTCGTC
TACGGCACCCGT',

#CRP_PASMU
'ATGCAAACTACACCATCGATA---------------------------------------
------GATCCTACGTTAGAGTGGTTTCTATCTCACTGCCATATTCACAAATATCCTTCC
AAAAGTACATTGATTCATGCAGGTGAAAAAGCCGAGACGCTGTATTATCTGATTAAAGGT
TCCGTTGCTGTCTTAGTCAAAGATGAAGATGGCAAAGAAATGATTTTGACTTATTTAAGT
CAAGGTGATTTTTTTGGTGAGGCTGGTCTTTTCGAAGAGGGACAATTACGTTCAGCTTGG
ATTAAGGCAAAAAGCCCTTGTGAAATTGCTGAAATTTCTTATAAAAAATTTCGTCAATTA
ATTCAGGTCAACCCAGATATTTTAATGCATTTATCAGCTCAGCTAGCACGTCGCTTACAA
AATACGTCGAGACAAGTAAGTAATCTAGCCTTTTTAGATGTGACGGGGCGTATCGCACAA
ACCTTATTAAATCTGGCTAAAATGCCAGAAGCCATGACCCATCCAGATGGGATGCAAATT
AAAATCACGCGCCAAGAAATTGGGCAAATGGTGGGATGTTCGCGTGAAACGGTAGGACGA
ATCCTCAAAATGTTAGAAGATCAGCATTTAATCTCTGCACATGGTAAAACCATTGTCGTT
TACGGTACAAGA'
);

# 0) establecer el %GC deseado

# 1) abrir un bucle while que recombine aleatoriamente estos genes,
# conservando el marco de lectura y controle el GC de las secuencias
# recombinantes que van saliendo

# 2) calcula el GC con algo como
# my $totalGC = $gen =~ tr/gc/gc/;
# my $GC = $totalGC/length($gen);

# 3) sal del bucle cuando GC lleve n generaciones sin cambiar

# 4) elige al azar dos secuencias para recombinar

# 5) para recombinar usa rand con la longitud del alineamiento
# restringiendo los puntos de sobrecruzamiento a los que sean multiplos
# de tres

Bruno Contreras-Moreira
http://www.eead.csic.es/compbio