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