UNIVERSITÀ DEGLI STUDI DI URBINO CARLO BO Facoltà di Scienze e Tecnologie Corso di Laurea in Informatica Applicata Tesi di Laurea RICERCA DI MOTIVI FUNZIONALI IN SEQUENZE DI DNA MEDIANTE ALGORITMI GENETICI Relatore: Candidato: Chiar.mo Prof. Valerio Freschi Danilo Casaccia Anno Accademico 2007-2008 Indice 1 Introduzione 1 1.1 Ricerca di motivi funzionali in sequenze di DNA . . . . . . . . 1.2 Algoritmi genetici come strumento di ottimizzazione 1.3 Organizzazione del lavoro 1 . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . 3 2 Fondamenti di biologia molecolare 4 2.1 DNA e proteine: elementi base per la vita . . . . . . . . . . . . 4 2.2 Il Genoma, patrimonio genetico di ogni essere vivente . . . . . . 5 2.3 Il processo di 6 espressione genica . . . . . . . . . . . . . . . . . . 3 Algoritmi genetici 8 3.1 Struttura canonica di un algoritmo genetico . . . . . . . . . . . 8 3.2 Beneci e limiti . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4 Approccio proposto 4.1 14 Presentazione del software sviluppato . . . . . . . . . . . . . . . 14 4.1.1 Rappresentazione del problema in ambito informatico . 16 4.1.2 Popolazione di individui . . . . . . . . . . . . . . . . . . 17 4.1.3 Funzione di tness . . . . . . . . . . . . . . . . . . . . . 18 4.1.4 Meccanismo di selezione . . . . . . . . . . . . . . . . . . 21 4.1.5 Crossover e mutazione . . . . . . . . . . . . . . . . . . . 24 4.1.6 Implementazione 25 . . . . . . . . . . . . . . . . . . . . . . 5 Risultati sperimentali 28 5.1 Datasets sintetici . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Datasets biologici . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.2.1 YDR02c binding sites 32 5.2.2 CRP binding sites . . . . . . . . . . . . . . . . . . . . . 32 5.2.3 E2F binding sites . . . . . . . . . . . . . . . . . . . . . . 35 5.2.4 ERE binding sites 35 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.2.5 LSF binding sites . . . . . . . . . . . . . . . . . . . . . . 36 5.2.6 Kruppel binding sites 36 . . . . . . . . . . . . . . . . . . . 5.2.7 Bicoid binding sites . . . . . . . . . . . . . . . . . . . . . 37 5.2.8 AZF1 binding sites . . . . . . . . . . . . . . . . . . . . . 37 ii 6 Conclusioni 38 6.1 Sintesi del lavoro svolto e dei risultati ottenuti . . . . . . . . . . 38 6.2 Sviluppi futuri 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . A Frammento di codice della classe geneticAlgorithm.java 41 Bibliograa 48 iii Elenco delle gure 2.1 Struttura 3D del DNA . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Processo di Splicing . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 Regolazione della Trascrizione [6] . . . . . . . . . . . . . . . . . 7 3.1 Roulette Wheel Selection 3.2 Single/Double Point Crossover . . . . . . . . . . . . . . . . . . 11 3.3 Bitwise Mutation . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.4 Diagramma di usso GA . . . . . . . . . . . . . . . . . . . . . . 12 4.1 Software: nestra principale . . . . . . . . . . . . . . . . . . . . 15 4.2 Software: logo sequenza/graco tness medie . . . . . . . . . . 15 4.3 Schema di principio . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.4 Funzione di tness 20 4.5 Tournament Selection . . . . . . . . . . . . . . . . . . . . . . . 21 4.6 Curve di Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.7 Relazioni varianza, intensità e diversità . . . . . . . . . . . . . . 24 4.8 Crossover e mutazione 25 5.1 Diagramma di usso generatore di sequenze . . . . . . . . . . . 29 5.2 Confronto logo sequenza CRP . . . . . . . . . . . . . . . . . . . 33 5.3 Logo sequenza CRP 33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv 9 Elenco delle tabelle 1.1 Esempio di motivi allineati . . . . . . . . . . . . . . . . . . . . 2 4.1 4.2 File nel formato Fasta . . . . . . . . . . . . . . . . . . . . . . . 14 Classe java: individuo . . . . . . . . . . . . . . . . . . . . . . . 18 4.3 Intensità selettiva . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.4 Varianza selettiva . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.1 Parametri utilizzati . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.2 Test datasets sintetici (Roulette Wheel) . . . . . . . . . . . . . 30 5.3 Test datasets sintetici (Tournament Selection) . . . . . . . . . . 31 5.4 YDR02c dataset . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.5 CRP dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 5.6 CRP dataset - posizioni iniziali . . . . . . . . . . . . . . . . . . 34 5.7 E2F dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.8 ERE dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.9 LSF dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.10 Kruppel dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.11 Bicoid dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 5.12 AZF1 dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 v Capitolo 1 Introduzione 1.1 Ricerca di motivi funzionali in sequenze di DNA I motivi funzionali (Transcription Factor Binding Site motifs) o siti di binding sono piccoli frammenti nucleotidici, situati nella regione promotrice di ciascun gene; questi segmenti di DNA vengono conservati, seppur debolmente a seguito di mutazioni genetiche, attraverso i processi evolutivi, in virtù della loro importanza strutturale e funzionale. Sono infatti dei componenti cruciali espressione genica, trascrizione e che fenotipo di ogni organismo, ovvero l'eettiva e totale manifestazione sica del genotipo (l'insieme dei geni che costituiscono il corredo genetico che inuenzano e innescano i processi di determinano il di ogni individuo/essere vivente). fattori di trascrizione, in risposta a stimoli biologici, si legano ai siti di binding compatibili da dove In particolare, certe proteine chiamate determinati poi regolano i processi cellulari a cui sopra si è accennato e che verranno trattati meglio nel capitolo seguente. Per ora basti sapere che l'espressione genica è il regolato e che consegue la sintesi delle proteine, costituenti fondamentali e insostituibili per la sopravvivenza di ogni processo con il quale ciascun gene viene essere vivente. L'individuazione di un motivo funzionale, seppur indispensabile nella comprensione di questi processi, è in realtà una sda quanto mai dicile a seguito delle mutazioni che investono il DNA e con esso, i siti di binding. Questo che potremmo denire come un problema di pattern discovery è un processo che si articola generalmente ricercando all'interno di sequenze multiple di DNA dei frammenti quanto più simili ed omogenei tra di loro. Tipicamente non si conosce ciò che si sta cercando (problema di pattern recognition) ma si dispone solamente di frammenti di sequenze rispondenti agli stessi stimoli biologici; è quindi auspicabile che tali sequenze contengano gli stessi motivi funzionali, ovvero frammenti nucleotidici con il più alto grado di similarità. Se consideriamo un insieme, composto da 15 sequenze di lunghezza variabile e vogliamo cercare 1.2 Algoritmi genetici come strumento di ottimizzazione 2 un sito di binding di lunghezza k, al termine della ricerca otterremo un allineamento di 15 possibili motifs. Il motivo ancestrale, ottenuto dai k nucleotidi con il più alto numero di occorrenza su ciascuna posizione dell'allineamento, viene denito consenso (Tabella 1.1); non conoscendo quale sia il pattern antenato, quello non soggetto a mutazioni evolutive, si tende a considerare il consenso come pattern reale. A C T A G T A G A C T G A G T Tabella 1.1: Un esempio di motivi allineati; in grassetto il consenso 1.2 Algoritmi genetici come strumento di ottimizzazione La ricerca del consenso all'interno di un dataset biologico è un problema che nel corso degli anni è stato arontato in diversi modi, con risultati più o meno incoraggianti. Le tecniche senza dubbio migliori, che danno i risultati più a- DNA footprinting gel electrophoresis appartengono a questa categoria, ma sono tecniche par- dabili sono quelle sperimentali arontate su datasets reali; la e la ticolarmente esigenti dal punto di vista delle risorse e che richiedono tempi di ricerca elevati. Così sono state sviluppate in campo informatico (da qui nasce la bioinformatica) delle tecniche che prestassero soccorso ai biologi, facilitando- ne il compito. La prima classe di algoritmi che venne sviluppata, anni orsono, sfruttava la cosiddetta ricerca esaustiva, ma ci si accorse ben presto che questo tipo di algoritmi mal si adattava ad un problema di tale complessità. Esplorare l'intero spazio di ricerca signica, infatti, dover comprovare tutte le possibili soluzioni; in altri termini se si deve cercare un pattern di lunghezza k occorre vericare la presenza di 4k (4, numero di nucleotidi) possibili patterns all'inter- no di tutte le sequenze, con una complessità che tende a crescere esponenzialmente all'aumentare della lunghezza del pattern. Inoltre come già accennato, non è suciente trovare un'occorrenza esatta all'interno di ciascuna sequenza e questo peggiora notevolmente le cose dal punto di vista della complessità. Un approccio euristico o probabilistico, al contrario, comporta beneci indiscussi sulla complessità della ricerca ma introduce un errore non stimabile determi- nisticamente sull'accuratezza della predizione. In pratica la ricerca esaustiva qualora porti all'individuazione della soluzione da la certezza assoluta della sua correttezza; lo stesso non lo si può dire utilizzando un approccio probabilistico. Dunque questa seconda categoria ha punti di forza evidenti ma anche limiti 1.3 Organizzazione del lavoro indiscutibili. 3 Il terzo approccio, più recente, prevede l'utilizzo di un algorit- mo genetico quale strumento di ottimizzazione, che consente di raggiungere la maggior parte delle volte un buon livello di accuratezza e una soglia di errore sostenibile. Questo tipo di algoritmi sono particolarmente potenti in quanto la complessità non dipende in maniera così determinante dalla lunghezza del pattern; inoltre per loro natura riescono ad esplorare lo spazio di ricerca meglio di altri algoritmi che utilizzano approcci diversi, minimizzando l'errore della soluzione proposta. Dunque l'informatica può esser di grande aiuto ai biologi ma purtroppo non suciente; i motivi funzionali predetti utilizzando questo tipo di algoritmi devono necessariamente essere comprovati sperimentalmente per certicarne la veridicità. Certamente per un biologo aver una traccia da cercare e vericare è sicuramente meglio che dover brancolare nel buio. Questo consente di diminuire il volume di esperimenti abbattendo notevolmente tempi e costi. 1.3 Organizzazione del lavoro Arontare un lavoro di questo tipo signica prima di tutto aver assimilato preliminarmente delle conoscenze basilari di biologia molecolare; non occorre essere dei biologi, ma conoscere i fondamenti di questa scienza è indispensabile al ne di muoversi all'interno di un campo poco conosciuto con la dovuta disinvoltura. Così il secondo capitolo, quello prossimo all'introduzione, ha l'obiettivo di fornire il bagaglio di conoscenza minimale per poter arontare l'intero iter progettuale di questa tesi. Nel terzo capitolo si è voluta invece descrivere la struttura canonica di un strumento di ottimiz- algoritmo genetico, evidenziarne le assolute qualità come zazione algoritmica ma anche i limiti dovuti alla rappresentazione del problema in esame e alla molteplicità dei parametri in gioco. Questi due capitoli hanno più che altro una valenza descrittiva e forniscono le conoscenze necessarie per comprendere quanto fatto realmente in questo lavoro; il quarto capitolo introduce ed aronta da vicino il problema oggetto di questa tesi, spiegando come viene rappresentato in ambito informatico, analizzando gli aspetti tecnici e quelli pratici del software sviluppato e proposto come soluzione. Nel quinto capitolo vengono riportati i risultati dei molteplici test eettuati, sia su datasets biologici che sintetici. Inne il sesto capitolo contiene le considerazioni conclusive sul lavoro svolto, i beneci derivanti dall'approccio proposto e gli sviluppi futuri per migliorare l'ecienza e l'ecacia del software. Capitolo 2 Fondamenti di biologia molecolare 2.1 DNA e proteine: elementi base per la vita Gli organismi viventi si dierenziano in relazione alla loro complessità cellulare, in particolare si distinguono i procarioti dagli eucarioti; i procarioti sono orga- nismi unicellulari (e.g. batteri) caratterizzati da una cellula la cui dimensione è dell'ordine del micrometro, senza membrana nucleare o altre suddivisioni interne. Gli eucarioti, invece, sono organismi pluricellulari (e.g. animali, piante) caratterizzati da cellule più complesse, con nucleo ben denito e isolato dal resto della cellula tramite involucro nucleare. Ciò che accomuna queste due categorie di organismi è la presenza di materiale genetico, organizzato in sequenze di DNA. Negli organismi procarioti questo si trova dislocato nel toplasma, ci- mentre negli eucarioti viene gelosamente custodito all'interno del nucleo, sotto forma di cromosomi (aggregati di DNA e proteine). Il nucleo (negli eucarioti) è quindi una delle strutture più importanti della cellula ed è il luogo dove ha inizio il processo di espressione genica. Esternamente al nucleo vi sono strutture dierenti, ma non per questo di minore importanza, tra cui si possono citare i ribosomi poiché sono le strutture dove si protraggono le fasi nali della sintesi proteica, che verrà analizzata più avanti. DNA e le proteine sono gli elementi costituenti di ogni organismo vivente; acido desossiribonucleico e contiene le informazioni genetiche necessarie alla biosintesi di RNA e proteine; l'RNA, acido ribonucleico, Il il primo è l'acronimo di è simile al DNA in tutto e per tutto, eccezion fatta per la Timina che viene Uracile. rimpiazzata dall' Le proteine, invece, sono composti organici complessi nonché componenti fondamentali di tutte le cellule animali e vegetali. Dal punto di vista chimico sono polimeri (o macromolecole) di residui amminoacidici, uniti mediante legami peptidici. Per quanto concerne la sua struttura, il DNA può essere visto come una 2.2 Il Genoma, patrimonio genetico di ogni essere vivente 5 catena di 4 unità fondamentali chiamate nucleotidi: Adenina, Citosina, Guanina e Timina. Queste formano tra di loro, mediante legami ad idrogeno, delle coppie complementari, ancorate a un doppio lamento elicoidale di zucchero e fosfato (Figura 2.1); in particolare l'Adenina si lega sempre e solo con la Timina e di conseguenza la Citosina solo con la Guanina. Figura 2.1: Struttura 3D del DNA Le proteine, al contrario, sono composte da 20 unità dierenti chiamate noacidi, che sono semplicemente triple ammi- di nucleotidi aggregati. Se pensiamo al numero di possibili amminoacidi ottenibili combinando tra di loro i 4 nucleotidi, ci accorgiamo che in natura viene adottata una codica in eetti si potrebbero ottenere 43 , ridondante; quindi 64, diversi amminoacidi quando in realtà ne vengono utilizzati solo 20. Questo spiega perché il processo di sintesi proteica è un processo irreversibile. 2.2 Il Genoma, patrimonio genetico di ogni essere vivente L'intero patrimonio genetico di un essere vivente, contenuto nel DNA, viene denito genoma; questo è organizzato in sotto unità chiamate geni, che altro frammenti di DNA con una diversa specica funzionale. Il genoma non sono umano, ad esempio, è composto da un numero ancora non del tutto confermato, ma superiore di poco ai 30.000 geni (secondo i dati raccolti dal Genoma Umano). Progetto Negli organismi eucarioti, ciascun gene è solitamente costi- tuito da regioni non codicanti chiamate quelle codicanti denite esoni. introni, che si contrappongono a Quest'ultime sono frammenti di DNA che 2.3 Il processo di espressione genica 6 contengono parte delle informazioni necessarie per codicare le proteine. Nel processo di espressione genica le regioni non codicanti, gli introni, vengono eliminate mediante un processo chiamato splicing (Figura 2.2), mentre gli esoni vengono riassemblati correttamente per poter procedere nella sintesi proteica. Figura 2.2: Processo di Splicing Occorre precisare che questo ha successo solo se gli introni e gli esoni sono privi di mutazioni che potrebbero impedire la corretta saldatura tra le parti residue. 2.3 Il processo di espressione genica espressione genica L' è il processo mediante il quale l'informazione contenuta in un gene viene convertita in una macromolecola funzionale (una proteina, ma anche tRNA o rRNA). Tecnicamente si articola in due fasi distinte: la trascrizione e la traduzione, nel mezzo delle quali possiamo collocare la fase di splicing introdotta nel paragrafo precedente. Nella fase di trascrizione ha luogo la cosiddetta replicazione del DNA, dove frammenti di materiale genetico vengono duplicati e sintetizzati in particolari molecole di RNA, chiamate mRNA (messenger RNA). Dapprima, la struttura elicoidale del DNA viene slegata ottenendo due lamenti separati che, in un secondo momento, grazie ad un enzima chiamato RNA polimerasi, vengono utilizzati come stampo per ricostruire la doppia elica, complementando le basi nucleotidiche una dopo l'altra. Negli organismi eucarioti, una volta duplicato il materiale genetico, questo deve essere trasportato fuori dal nucleo no ai ribosomi, per poter ultimare la successiva fase di traduzione; questo avviene mediante l'ausilio di particolari molecole di RNA, chiamate tRNA (transfer RNA) Nelle strutture ribosomali ha dunque inizio la seconda fase, quella di duzione o sintesi proteica, dove le triplette nucleotidiche tra- di mRNA vengono tradotte nei rispettivi amminoacidi, successivamente aggregati in modo da poter formare la proteina oggetto della sintesi. In questo processo sono coinvolte oltre a molecole di tRNA, anche un terzo tipo di molecole chiamate rRNA (ribosomal RNA). Ma come si attiva il processo di espressione genica? Come spiegato nell'introduzione a questa tesi, quando un fattore di trascrizione riesce a legarsi a 2.3 Il processo di espressione genica 7 un sito di binding, questo consente alla RNA polimerasi di conuire nel DNA e iniziare (Figura 2.3 - A) la trascrizione di un gene in molecole di mRNA. Il processo cessa con la separazione della RNA polimerasi dalla sequenza di DNA (Figura 2.3 - B). Figura 2.3: Regolazione della Trascrizione [6] Capitolo 3 Algoritmi genetici 3.1 Struttura canonica di un algoritmo genetico Gli algoritmi genetici sono una famiglia di modelli computazionali ispirati alla teoria evoluzionistica darwiniana, introdotti per la prima volta da John Holland e dai suoi studenti nel 1975 [5]. Sono in genere utilizzati per risolvere problemi di ricerca e ottimizzazione. La base di partenza di un algoritmo genetico è senza ombra di dubbio la rappresentazione del problema, ovvero stabilire come rappresentare un problema reale in un modello verosimile, che sia di facile riproduzione all'interno di un elaboratore elettronico. Questa è forse la fase più complessa e delicata di tutta l'implementazione, che mal interpretata potrebbe far deteriorare notevolmente l'ecienza dell'algoritmo. Una volta stabilito come codicare il problema, occorre denire una popolazione iniziale di individui, che in accordo alla teo- ria evoluzionistica, vengono anche detti cromosomi; in genere la popolazione iniziale viene scelta casualmente, senza dunque un criterio predeterminato e rimane costante per tutte le generazioni. Nel modello tradizionale i cromosomi sono stringhe di bit a lunghezza ssa e di fatto sono la rappresentazione formale di una possibile soluzione al problema. Se deniamo la funzione di codica come: cF U N : S −→ X dove S è lo spazio delle soluzioni al problema e X è lo spazio dei cromosomi, possiamo vedere un individuo c∈X come : c = cF U N (s), s ∈ S si immagini dunque che un individuo sia il genotipo e la soluzione il suo fenotipo. Ciò che determina il grado di bontà di un individuo è la cosiddetta funzione obiettivo, che in problemi di ottimizzazione dere con la funzione di tness. La funzione obiettivo spesso tende a coincimisura le performance 3.1 Struttura canonica di un algoritmo genetico 9 di un individuo rispetto ad un particolare set di parametri, che modellano il problema. Quella di tness, invece, trasforma la performance in opportunità riproduttive. Seguendo il parallelo con la teoria evoluzionistica, la funzione di tness misura l'adattabilità (inglese: t) dei cromosomi all'ambiente, che immaginiamo rappresentare allegoricamente il problema. Quindi tanto più un individuo riesce ad adattarsi all'ambiente, tanto più avrà probabilità di riprodursi e di trasmettere i propri geni alle generazioni future (sarà quindi una soluzione migliore). Nello schema canonico la tness di ciascun individuo è denita come: fi f dove fi esima e è la performance (valutazione) associata alla stringa (cromosoma) i- f è la media della performance su tutta la popolazione di individui. A questo punto entra in gioco il meccanismo di selezione, che ha un duplice scopo; da un lato deve favorire la riproduzione degli individui con la tness più alta, dall'altro deve preservare la diversità della popolazione in modo da esplorare tutte le regioni dello spazio di ricerca. Un eventuale perdita di diversità nelle primissime generazioni potrebbe portare ad una prematura convergenza dell'algoritmo. Ovviamente esistono diverse tecniche di selezione, ciascuna con punti di forza e limiti; il meccanismo utilizzato nello schema canonico viene denito Roulette Wheel Selection (o Proportional Selection). Figura 3.1: Roulette Wheel Selection Supponiamo che la popolazione al tempo t contenga n cromosomi: P (t) = {x1 , x2 , ..., xn } deniamo F la tness totale della popolazione e f(x) la funzione che computa la tness dell'individuo x: F = la probabilità che l'individuo xi Pn i=1 f (xi ) venga selezionato sarà: P robi = f (xi ) F 3.1 Struttura canonica di un algoritmo genetico 10 A questo punto, si immagini di costruire una roulette truccata dove gli spicchi non sono di egual misura, ma sono in qualche modo proporzionati alla tness di ciascun individuo (Figura 3.1). Lanciando una pallina, questa avrà più probabilità di nire in uno spicchio di dimensioni elevate, ma nulla vieta che si fermi al contrario in uno meno capiente. Questo meccanismo dovrebbe rispondere in maniera accettabile ai requisiti espressi in precedenza. Dal punto di vista algoritmico la roulette viene implementata distribuendo le probabilità di riproduzione di ciascun individuo tra 0 e 1 (Figura 3.1). Di seguito uno pseudo-codice: double Sum = 0.0; for (int i = 0; i < pop.size(); i++){ Position_i = Sum + Probability_i; Sum += Probability_i; } semplicemente generando un numero casuale nell'intorno [0 - 1] si simula il lancio della pallina e si seleziona l'individuo: double prec_Position = 0.0; for (int i = 0; i < pop.size(); i++) { if ( (rand_Number <= current_Position) && (rand_Number > prec_Position) ) select (current_Individual); prec_Position = current_Position; } il processo di selezione viene ripetuto più e più volte e gli individui selezionati, ricombinati, entrano a far parte di quello che viene denito ospring; successivamente l'ospring viene mutato e i suoi cromosomi diventano la nuova popolazione (grande quanto quella di partenza); l'intero processo sin qui descritto costituisce una generazione. dopo essere stati Lo schema canonico prevede due tipologie di ricombinazione: la prima viene denita single point crossover, la seconda double point crossover (Figura 3.2). La ricombinazione riproduce quel meccanismo secondo cui in natura una cellula glia eredita parte del patrimonio genetico della cellula padre e parte della cellula madre. In entrambi i meccanismi di crossover viene scelta una coppia di individui (mediante meccanismo di selezione) e con una certa probabilità pc (in genere 60%-80%) si stabilisce se eettuare o no la ricombinazione. Nel crossover a singolo punto di taglio viene estratto un intero compreso tra 0 e la lunghezza della stringa che rappresenta un singolo individuo, con probabilità uniforme. A questo punto si procede tagliando i cromosomi genitori in corrispondenza del punto di taglio precedentemente stabilito e incrociando i frammenti derivanti dalla scissione, si ottengono due nuovi individui gli. 3.1 Struttura canonica di un algoritmo genetico 11 Nel crossover a punto di taglio doppio, invece, vengono estratti due numeri con probabilità uniforme che costituiscono i punti di incisione dei cromosomi genitori; per il resto il meccanismo di ricombinazione è lo stesso. Qualora si decida stocasticamente di non eettuare alcuna ricombinazione, i gli immessi nell'ospring saranno la copia esatta dei loro genitori. Figura 3.2: Single/Double Point Crossover Una volta costruito l'ospring non resta che eettuare la mutazione, altro operatore che si ispira a quanto avviene realmente in natura. Così ogni singolo bit, di ogni singolo individuo che compone l'ospring, viene mutato con proba- bilità ps (in genere < 1%). Nello schema canonico viene utilizzata la Bitwise Mutation, che semplicemente complementa il bit candidato alla mutazione. Figura 3.3: Bitwise Mutation La nuova popolazione è ora pronta per essere sottoposta a nuovi cicli iterativi, ripetendo tutto il processo descritto sin ora. L'algoritmo cessa la sua esecuzione dopo un numero prestabilito di cicli o eventualmente quando la tness converge al disopra di una soglia predeterminata. Questo è particolarmente vero in problemi di ottimizzazione, dove l'utente che utilizza un algoritmo di questo genere, conosce i limiti a cui la soluzione migliore dovrebbe tendere. Al contrario, in problemi di ricerca non sempre si conosce il valore di convergenza della soluzione che si vuole trovare. In genere il numero di iterazioni è un parametro che si adatta ad ogni tipo di problema, mentre il valore di convergenza può essere sconosciuto a priori. È altrettanto vero però che la 3.2 Beneci e limiti 12 convergenza ha una valenza più marcata e che se raggiunta garantisce la bontà della soluzione; al contrario, il numero di iterazioni è un parametro opinabile che non garantisce alla sua scadenza di aver trovato una soluzione ottimale. Quando un algoritmo genetico termina la sua esecuzione l'individuo candidato a soluzione migliore è quello con la tness più alta. Di seguito viene riportato il diagramma di usso che riassume il principio di funzionamento descritto nel paragrafo: Figura 3.4: Diagramma di usso GA 3.2 Beneci e limiti Nel capitolo introduttivo si è cercato di spiegare molto velocemente quale fosse il benecio più grande, nell'utilizzare un algoritmo genetico per arontare un problema computazionalmente complesso, come quello in oggetto a questa tesi. Come scritto nel precedente paragrafo questa metodologia viene utilizzata soprattutto in problemi di ottimizzazione e ricerca, laddove le tecniche tradizionali non riescano a raggiungere dei risultati positivi in un lasso di tempo ragionevole. Quindi i beneci più evidenti si hanno in termini di tempo di esecuzione; il fatto che la complessità di questi algoritmi non cresca esponenzialmente li rende scalabili, rapportati al problema che si pressano di risolvere. Si prenda come esempio quanto arontato in questa tesi; utilizzando la ricerca esaustiva la complessità dell'algoritmo cresce esponenzialmente all'aumentare della lunghezza del pattern da trovare e con essa il tempo di esecuzione. Utilizzando un algoritmo genetico, invece, la lunghezza del pattern diventa un parametro di secondo livello e ciò che inuisce maggiormente sul tempo di esecuzione è la molteplicità dei parametri in gioco, quindi il setting scelto inizialmente. Quella sul tempo di esecuzione è dunque un ottimizzazione importante ma che sarebbe inutile laddove non si riuscissero a maturare risultati qualitativamente ottimali. La natura fortemente stocastica e non deterministica di questi 3.2 Beneci e limiti 13 algoritmi, non fornisce la garanzia che si riesca a trovare la soluzione, denita l'ottimo globale; la letteratura riguardante gli algoritmi genetici ha però teo- rizzato e dimostrato sperimentalmente che il principio di funzionamento alla base di questi modelli computazionali, consente di trovare in tempi ragionevoli. soluzioni ottimali In particolare si sostiene che sotto determinate ipote- si, gli individui con alti valori di tness tendono a crescere esponenzialmente nella popolazione attraverso il meccanismo dell'incrocio, assicurando così la convergenza dell'algoritmo verso una soluzione ottimale. Anche il meccanismo di mutazione fornisce un contributo notevole e aumenta l'ecienza con cui l'algoritmo esplora lo spazio di ricerca. È importante notare, però, come detto in precedenza che questo avviene solo sotto determinate ipotesi; parametri come la grandezza della popolazione, il numero di iterazioni, il valore di convergenza, la probabilità di mutazione e quella di crossover, sono determinanti e possono stravolgere completamente l'ecienza dell'algoritmo. Un setting non ottimale, può portare a una pre- matura convergenza verso un ottimo locale molto distante da quello globale. Questa è una controindicazione che aigge molto spesso questi modelli computazionali, ed è dovuta ad una sostanziale perdita di diversità all'interno della popolazione. Se questa avviene sin dalle primissime generazioni l'algoritmo non riesce ad esplorare tutto lo spazio di ricerca e converge prematuramente, rimanendo incastrato in un ottimo locale. Trovare il setting ottimale è dunque un problema non banale, tenendo presente che i parametri utilizzati sono molti e le possibili combinazioni notevoli. Ma questo non è il solo aspetto che incide negativamente sull'ecienza dell'algoritmo. Ad esempio il meccanismo di selezione può accentuare o meno gli eetti negativi derivanti da un setting non ottimale. Un meccanismo come la Roulette Wheel Selection ha un funzionamento decitario quando vi è molta distanza tra le tness degli individui. Immaginiamo di avere 4 individui: il primo con una tness che gli garantisce una probabilità di selezione del 90%, il secondo raggiunge il 4% e i restanti due il 3%. La probabilità di selezionare un individuo diverso dal primo, è praticamente irrisoria e si perde ben presto diversità nella popolazione. Ovviamente esistono molteplici meccanismi di selezione che tentano di risolvere questo problema ma che a loro volta ne introducono di altri. Persino se le tness sono troppo vicine tra di loro può essere un ostacolo, in questo caso diventa fondamentale la codica del problema e la scelta della funzione di tness. Tutto ciò suggerisce che questi modelli computazionali non debbano essere utilizzati in maniera deterministica; in genere questi algoritmi, una volta trovato il setting migliore, vengono eseguiti più volte e alla ne la soluzione proposta sarà quella che avrà maturato il punteggio più alto in assoluto. Capitolo 4 Approccio proposto 4.1 Presentazione del software sviluppato Il software è stato scritto in Java e per poter funzionare correttamente richiede l'installazione della JRE ( java runtime environment) 1.6 o superiore. Dispone di un interfaccia graca (Figura 4.1) semplice, pulita e di facile comprensione grazie ai tooltips informativi deniti sui pulsanti del menù. nucleotidiche possono essere caricate da le nel formato Le sequenze Fasta (Tabella 4.1) > rst sequence name aacccgatgagatgagtagat ... Tabella 4.1: File nel formato Fasta mySQL; il programma, infatti, dispone di un'interfaccia di comunicazione che sfrutta il driver JDBC (se correttamen- oppure direttamente da una base di dati te installato e funzionante), anche se occorre precisare che nella realtà questa pratica è poco utilizzata così il modulo è volutamente semplicato e qualora vi fosse l'esigenza di operare concretamente con una base di dati sarebbe opportuno integrarlo di funzionalità suppletive. consenso, permette di calcolare la Il tool oltre alla ricerca del precisione, mostrare il graco che evidenzia l'andamento delle tness medie (e/o massime) nelle diverse generazioni (Figura 4.2), generare il logo sequenza e la PWM ( position weight matrix) relativa (Figura 4.2). Inoltre, sono previste altre caratteristiche ausiliarie che ritornano utili in fase di test; ad esempio sarà possibile stampare su le le tness massime e medie della popolazione, oppure riportare sull'interfaccia graca la tness dell'individuo migliore, che ha consentito l'individuazione del consenso proposto. 4.1 Presentazione del software sviluppato Figura 4.1: Software: nestra principale Figura 4.2: Software: logo sequenza/graco tness medie 15 4.1 Presentazione del software sviluppato 16 4.1.1 Rappresentazione del problema in ambito informatico Se si considera il solo aspetto informativo e non strutturale, una sequenza di DNA si può facilmente rappresentare con un'espressione regolare: (A + C + G + T )(A + C + G + T )∗ quindi con una parola, non vuota, appartenente ad un alfabeto di soli 4 simboli, semplici iniziali dei nucleotidi: A per Adenina, C per Citosina, G per Guanina e T per Timina. Σ = {A, C, G, T } Secondo questa rappresentazione possiamo indicare con Σ+ l'insieme di tutte k le stringhe derivabili dall'alfabeto Σ, dove Σ contiene solo parole di lunghezza k: Σ+ = Σ1 ∪ Σ2 ∪ Σ3 ∪ ... Di conseguenza il genoma di un essere vivente, avendo dimensioni elevate ma nite, sarà contenuto in Σ+ : Genoma ⊂ Σ+ Di fatto la ricerca di motivi funzionali in sequenze di DNA, da un punto di vista prettamente informatico, si traduce come un problema di pattern discovery in stringhe di caratteri. Già nell'introduzione si è cercato di spiegare come il motivo funzionale che si intende cercare sia sconosciuto a priori e che si dispone soltanto di un pool di sequenze rispondenti agli stessi stimoli biologici. Quindi il vero problema diventa trovare all'interno di un certo numero di sequenze delle sottostringhe di lunghezza k (dimensione pattern), che abbiano il più alto grado di similarità tra di loro. Si immagini di aver un dataset di 4 sequenze e di voler cercare in ognuna di queste un pattern di lunghezza 8 (Figura 4.3); per eettuare questa operazione, non conoscendo i veri siti di binding, si procede estraendo da ciascuna sequenza una sottostringa k (|ω| x = 8). Queste formeranno una ω , di modulo matrice allineata 4 x 8 ( sequenceNumber patternWidth) che consentirà di calcolare un indice di similarità, attraverso la funzione di tness. 4.1 Presentazione del software sviluppato 17 Figura 4.3: Schema di principio campionamento delle sottostringhe e tutti gli altri aspetti tecnici si rimanda la spiegazione Per quanto riguarda la derivazione della funzione, il principio di ai paragra successivi, quando si analizzerà l'algoritmo genetico che sta alla base del software sviluppato. Lo schema di principio dell'approccio proposto è il seguente: 1. le sequenze di DNA vengono rappresentate all'interno dell'elaboratore elettronico, mediante delle stringhe di caratteri; 2. il processo descritto in precedenza (Figura 4.3) consente di selezionare dei siti di binding, il cui grado di similarità si determina con l'ausilio della funzione di tness; 3. il principio di funzionamento dell'algoritmo genetico permette alle soluzioni presunte di evolversi, incrementando l'omogeneità dei motivi allineati, no a trovare il consenso proposto. 4.1.2 Popolazione di individui Una volta stabilito come rappresentare il problema occorre denire una popolazione iniziale di individui; nello schema canonico questi vengono generalmente rappresentati tramite stringhe di bit, un modo ecace per esprimere qualsivoglia contenuto informativo all'interno di un elaboratore elettronico. Tuttavia, il meccanismo di ricerca adottato nell'approccio proposto, consiglia l'utilizzo di una struttura dati, che in qualche modo agevoli l'estrazione dei motivi da allineare e su cui calcolare in un secondo momento il valore di tness. Nel precedente paragrafo di questo capitolo si è detto come le sequenze nucleotidiche vengano rappresentate mediante delle stringhe, i cui caratteri possono essere facilmente indicizzati ed inseriti all'interno di una struttura ad accesso sequenziale, come ad esempio un array. Pertanto possiamo immaginare di rappresentare un individuo con una lista o comunque una successione di interi, indicanti il punto esatto dove eettuare il campionamento dei siti di binding. 4.1 Presentazione del software sviluppato 18 Sulla base di questa riessione si è scelto di rappresentare un cromosoma mediante una classe, i cui attributi sono principalmente un array di interi e due double (Tabella 4.2): oneIndividual.java + initialStartPositions: int [sequenceNumber] + tnessNotNormalized: double + tnessNormalized: double Methods Tabella 4.2: Classe java: individuo Questi valori sono: 1. le posizioni iniziali utilizzate come indici, per prelevare da ciascuna se- quenza i motivi funzionali da inserire all'interno della matrice di allineamento (il numero di elementi del vettore è costante in tutti i cromosomi ed equivale al numero di sequenze caricate); 2. il valore di tness che misura il grado di similarità dei siti estratti; 3. il valore di tness normalizzato che viene utilizzato per assegnare proba- bilità riproduttive ai cromosomi, nel meccanismo di selezione. Quest'ultimo si calcola dividendo la tness di un individuo per la somma di tutte le tness della popolazione: f itnessN otN ormalizedi f itnessN ormalizedi = PpopSize f itnessN otN ormalized 1 Come lo schema canonico impone, i cromosomi iniziali vengono generati casualmente, scegliendo gli interi di posizione nell'intorno [0 - Limit] dove: Limit = sequencei W idth − patternW idth ovvero non sono consentite posizioni iniziali che eccedano la lunghezza della sequenza i-esima, tenuta presente la dimensione del pattern. Occorre, inne, precisare che la rappresentazione binaria avrebbe comunque consentito di effettuare tutte le operazioni descritte, ma solo dopo l'implementazione di un meccanismo di conversione per interi. 4.1.3 Funzione di tness Ora che si è denita la popolazione di individui occorre assegnare loro probabilità riproduttive. Come spiegato nei precedenti paragra, le posizioni iniziali di ciascun cromosoma consentono di costruire una matrice sulla quale si può 4.1 Presentazione del software sviluppato 19 calcolare un indice di similarità attraverso la funzione di tness. Poiché la popolazione viene istanziata casualmente le sorti dell'algoritmo sono fortemente adate al caso; questo, come si è visto nel terzo capitolo, è un pò nella natura di questi modelli computazionali ma esiste una tecnica che può limitarne gli eetti negativi. Per diminuire la probabilità che l'algoritmo rimanga incastrato in un ottimo locale e converga prematuramente, le posizioni iniziali di un individuo vengono shiftate, sia a destra che a sinistra, di un piccolo contributo. Di conseguenza il valore di tness di ciascun cromosoma, che determina la bontà della soluzione rispetto al problema, verrà calcolato sulla matrice che avrà ottenuto il punteggio migliore. In questa maniera si da all'algorit- mo genetico uno strumento ulteriore per esplorare con maggiore incisività lo spazio di ricerca, che in problemi del genere si è visto esser molto vasto. Tuttavia, ciò non è suciente per risolvere completamente i problemi di prematura convergenza, che aiggono molto spesso questi modelli computazionali. Si è detto che la funzione di tness deve misurare la similarità dei motivi allineati; per far ciò si utilizza una metrica denita contenuto informativo (IC), che viene calcolata su ogni singola colonna della matrice di allineamento; concettualmente si può asserire che questo valore tende a crescere, tanto più le colonne diventano omogenee (Figura 4.4). In realtà il discorso è sensibil- mente più complesso, poiché oltre alle occorrenze sulle singole colonne, si tiene in considerazione della distribuzione di fondo dei nucleotidi sull'intero data- set. Questo è un valore che in qualche modo attribuisce un peso a ciascun nucleotide all'interno dell'allineamento. É quindi possibile che una colonna, apparentemente disomogenea, ottenga un punteggio maggiore di un'altra con un elevato grado di omogeneità. Questo perché i nucleotidi contenuti nella prima colonna hanno una consistente rilevanza all'interno delle sequenze, oggetto della ricerca. La funzione di tness è denita come segue: f itness = PpatternW idth i=1 ICi è quindi la somma dei contenuti informativi su tutte le colonne della matrice. Questi si calcolano sommando il contenuto informativo relativo a ciascun nucleotide: ICi = P4 1 ICN ucleotideb ICN ucleotideb = fb log2 dove fb è la frequenza osservata del nucleotide b fb pb sulla colonna corrente e pb è la frequenza di fondo (background) dello stesso. Per evitare complicanze computazionali qualora la frequenza osservata fosse nulla (ICN ucleotideb = ∞), vengono introdotti dei pseudo contatori come fattori di correzione; sono piccoli coecienti diversi da zero, che impediscono ad un contenuto informativo di convergere a i parametri fb e pb ∞. Sulla base di questa notazione possono essere riscritti nella seguente maniera: 4.1 Presentazione del software sviluppato dove db cb fb = cb + db N +D pb = c0b + db S+D 20 b indica il numero di occorrenze del nucleotide lo pseudo contatore del nucleotide b, N sulla colonna corrente, S la somma c0 ), D la somma dei 4 nucleotide b denita come: il numero di sequenze, P delle occorrenze di tutti i nucleotidi nel background ( pseudo contatori, c0b la frequenza di fondo del c0b = cAllb − cM atrixb dove cAllb rappresenta il cM atrixb quello dataset e numero di occorrenze del nucleotide b sull'intero nella sola matrice allineata. Figura 4.4: Funzione di tness La gura 4.4 riassume il principio di funzionamento descritto sin ora; le posizioni iniziali di ciascun individuo permettono di indicizzare le sequenze, determinando il punto esatto di estrazione dei motivi. Questi, una volta allineati, consentono di derivare i contenuti informativi delle singole colonne, la cui somma costituisce il valore di tness. Se si analizza la composizione della 4.1 Presentazione del software sviluppato 21 matrice si può notare come la terza colonna abbia ottenuto il miglior punteggio mentre la prima (seconda e ultima) il peggiore. Come ci si poteva aspettare viene premiata la maggiore omogeneità della terza colonna, composta di sole T (mentre la prima da 1 T, 1 G e 3 A). Questa rappresentazione consente di stimare il grado di similarità dei motivi allineati in modo ragionevole. Tuttavia, il valore di tness dipende in maniera consistente, non solo dalla disposizione dei nucleotidi all'interno della matrice, ma anche dalla loro distribuzione di fondo sull'intero dataset. Ciò suggerisce che la composizione delle sequenze è uno degli aspetti che incide in maniera determinante sulle prestazioni dell'algoritmo, al pari della congurazione dei parametri utilizzati. Inoltre, risultati sperimentali hanno dimostrato che, se la lunghezza media delle sequenze è bassa (< 100 bps), la frequenza così calcolata provoca in alcuni casi anomalie nel funzionamento, riducendo l'accuratezza della predizione. In altre parole la distribuzione di fondo dei nucleotidi non consente quasi mai all'algoritmo genetico di evolvere verso un ottimo globale e trovare il consenso reale. In tal caso si assegna, a ciascun nucleotide, una frequenza del 25%, quindi pari a 1 4 . Nell'implementazione proposta si è poi scelto di assegnare 1 a ciascun pseudo contatore, questo è un valore che viene spesso utilizzato in letteratura per problemi di questo genere. 4.1.4 Meccanismo di selezione Una volta valutati gli individui della popolazione entra in gioco il meccanismo di selezione. Nell'approccio proposto si è scelto di implementare sia la Roulette Wheel Selection (come nello schema canonico) [appendice pag. 41] che un secondo meccanismo, denito Tournament Selection [appendice pag. 42]. Del- la prima si è parlato ampiamente nel terzo capitolo e non occorre aggiungere altro, se non che ciascun individuo ha una probabilità riproduttiva pari al suo valore di tness normalizzato; la seconda è una tecnica che utilizza un principio di selezione completamente diverso. Si procede estraendo casualmente un tournament size). pool di competitori di cardinalità k ( Questi vengono fatti competere e alla ne l'individuo selezionato sarà quello con il valore di tness più alto, come sintetizzato in Figura 4.5. Figura 4.5: Tournament Selection 4.1 Presentazione del software sviluppato 22 Questo meccanismo, come ogni altro strumento di selezione, può esser descritto analiticamente denendo alcune metriche [1]: 1. la perdita di diversità, che indica la proporzione di individui non selezio- nati, nelle diverse generazioni; 2. l' intensità selettiva, che costituisce la media attesa dei valori di tness (dopo aver applicato il meccanismo di selezione ad una distribuzione Gaussiana); 3. la varianza selettiva, che rappresenta la varianza attesa della distribu- zione di tness (dopo aver applicato il meccanismo di selezione ad una distribuzione Gaussiana). . Una distribuzione Gaussiana (o normale) è una funzione continua utilizzata per descrivere statisticamente degli eventi: 1 f (x) = √ σ 2π dove µ e σ2 (x − µ)2 2σ 2 con − ∞ < x < ∞ e − sono rispettivamente la media (o valore atteso) e la varianza (quadrato della deviazione standard). Questa consente di derivare delle curve, le cui aree sottese hanno sempre valore 1 (Figura 4.6): Figura 4.6: Curve di Gauss La conoscenza di questa funzione permette di prevedere la probabilità che il risultato di una misura (la variabile x) cada entro un prescelto intervallo di valori; in riferimento alla gura 4.6 (curva verde), la probabilità che x cada in 4.1 Presentazione del software sviluppato un intervallo centrato sul valore medio ±2σ 95,45% e ±3σ µ 23 e di estremi ±σ è del 68,27% (con 99,73%). Detto ciò cerchiamo di denire formalmente le metriche sopra citate e di capirne il signicato; durante la selezione gli individui peggiori vengono scartati e rimpiazzati da quelli migliori (copie, eventualmente ricombinate). La perdita di diversità determina proprio il numero di cromosomi sostituiti durante la selezione: −1 −k LossDiversity(k) ≈ k k−1 − k k−1 ciò comporta, con k uguale a 5, una perdita pari al 50% della popolazione corrente. L'intensità (o pressione) selettiva misura concettualmente il variare della tness media, nella popolazione, prima e dopo aver applicato il meccanismo di selezione: r n hp io SelInternsity(k) ≈ 2 ∗ ln (k) − ln 4.14 ∗ ln (k) questa aumenta al crescere del parametro k, come mostrato in tabella (4.3): Tournament size (k) 1 2 3 5 10 30 Selection Variance 0 0.56 0.85 1.15 1.53 2.04 Tabella 4.3: Intensità selettiva La varianza selettiva è un indicatore di dispersione che ci dice quanto più un individuo possa discostarsi dal valore medio: SelV ariance(k) ≈ 0.918 ln (1.186 + 1.328 ∗ k) questa si diversica in maniera inversamente proporzionale al crescere del parametro k, come mostrato in tabella (4.4), e si annulla se gli individui della popolazione hanno tutti lo stesso valore di tness: Tournament size (k) 1 2 3 5 10 30 Selection Intensity 0.99 0.68 0.55 0.44 0.34 0.24 Tabella 4.4: Varianza selettiva 4.1 Presentazione del software sviluppato 24 Le relazioni fra queste tre metriche possono essere riassunte con il graco in gura (4.7): Figura 4.7: Relazioni varianza, intensità e diversità Alla luce delle considerazioni appena illustrate, nell'approccio proposto si è scelto di utilizzare un pool di 10 (k) competitori. Tuttavia, non è garantito che questo sia il compromesso migliore per tutti i tipi di esperimenti. L'in- uenza di tale parametro sull'accuratezza predittiva dell'algoritmo, dipende necessariamente dal numero di individui che compongono la popolazione. Così si è deciso di lasciare all'utente la possibilità di impostare tale valore, al pari della popolazione, della probabilità di mutazione e di tutti gli altri parametri da congurare. Questo aumenta la dicoltà nel trovare il setting migliore, ma è altresì vero che lascia l'utente libero di esplorare in maniera variegata lo spazio di ricerca cambiando la pressione selettiva dell'algoritmo. Laddove il setting proposto non portasse a risultati accettabili, variando la congurazione iniziale e con essa il numero di competitors, può darsi che si riescano ad ottenere risultati migliori, aumentando l'ecacia dell'algoritmo. Il fatto che i due meccanismi di selezione adottati, utilizzino principi di funzionamento completamente diversi, suggerisce che non vi può essere una prevalenza assoluta, uno nei confronti dell'altro. In eetti vi sono datasets in cui la Roulette Wheel Selection ore risultati migliori rispetto alla Tournament Selection e altri dove quest'ultima, viceversa, garantisce un'accuratezza di predizione migliore della prima. 4.1.5 Crossover e mutazione Nell'approccio proposto, a fronte di una popolazione di lezionano n cromosomi, si se- n 2 individui. Questi vengono ricombinati [appendice pag. 44] con 4.1 Presentazione del software sviluppato probabilità pc , 25 utilizzando uno dei meccanismi illustrati nel capitolo preceden- te (a singolo [appendice pag. 42] o doppio punto di taglio [appendice pag. 43]). A questo punto, a dierenza dello schema canonico, viene mutata l'intera popolazione e non il solo ospring; non potendo utilizzare la Bitwise Mutation, per come si è scelto di rappresentare i cromosomi, si procede mutando [appendice pag. 45] le singole posizioni iniziali di ciascun individuo con probabilità pm , semplicemente generando a caso un intero nell'intorno [0-Limit] (Limit è stato denito nel paragrafo precedente): Figura 4.8: Crossover e mutazione Inne, per mantenere la popolazione in numero costante, un terzo dei cromosomi, quelli con il valore di tness più basso, vengono eliminati [appendice pag. 46]. Ciò consente di derivare una nuova popolazione che può essere sottoposta a nuovi cicli iterativi, ripetendo l'intero processo sin qui descritto. Nell'algoritmo implementato la ricerca [appendice pag. 46] del consenso termina dopo un certo numero di iterazioni, parametro specicato dall'utente nella congurazione di input. 4.1.6 Implementazione L'algoritmo può essere riassunto esaustivamente con lo pseudo-codice seguente: 1. 2. Scegli congurazione Imposta patternWidth = grandezza pattern; Imposta iterationNumber = numero di iterazioni; Imposta shiftRange = scostamento; Imposta crossoverProbability = probabilità ricombinazione; Imposta mutationProbability = probabilità mutazione; Imposta populationSize = numero individui; Imposta tournamentSize = pool competitori; Seleziona crossover type = strategia crossover; Seleziona selection type = meccanismo di selezione; Inizializza popolazione casualmente 4.1 Presentazione del software sviluppato 3. 26 Valuta ogni candidato { Do loop (-shiftRange <= i <= shiftRange) { Incrementa i a tutte le posizioni iniziali Ottieni matrice allineata sulla base delle nuove posizioni iniziali Calcola valore di tness, come somma dei contenuti informativi if (maxFitness < currentFitness) maxFitness = currentFitness } Ritorna maxFitness; } 4. Ripeti n volte (n = iterationNumber) { Seleziona individui-genitore Ricombina individui-genitore Muta l'intera popolazione, individui-genitore e gli Valuta i nuovi candidati (funzione di tness) Rimuovi gli individui peggiori } 5. Mostra il consenso predetto Ora rimane soltanto da denire la congurazione migliore; dai test eettuati si è propeso nell'utilizzare la seguente combinazione di parametri: 1. Probabilità crossover: 0.4 2. Probabilità mutazione: 0.01 3. Shift range: [-3; 3] 4. Grandezza popolazione: 100 - 200 5. Numero di generazioni: 1500 - 2000 6. Meccanismo di selezione: Tournament & Roulette Wheel Selection 7. Tipo crossover: Singolo punto di taglio 8. Pool competitori: 10 Può darsi che questa non sia in assoluto la congurazione ottimale, ma di certo quella che nei test eettuati consente di ottenere il migliore compromesso in termini di accuratezza predittiva e tempo di elaborazione necessario. Come spiegato ampiamente in precedenza è n troppo dicile trovare un setting che si 4.1 Presentazione del software sviluppato 27 adatti a tutte le tipologie di test, se si considera la vastità dello spazio di ricerca e la molteplicità dei parametri che inuenzano le prestazioni dell'algoritmo. Pertanto, una congurazione può funzionare meglio con certi datasets, ed esser al contrario decitaria con altri. Chi utilizza questo tipo di strumenti deve avere la pazienza di cambiare il setting dei parametri ntanto non si riesca a trovare un buon compromesso. Tuttavia, si possono fare alcune considerazioni che in linea di massima dovrebbero valere a prescindere il tipo di sequenze. Se si diminuisce il numero di generazioni si perde in accuratezza predittiva salvo i casi in cui le sequenze sono molto corte, mentre accrescendolo non si conseguono vantaggi evidenti ma piuttosto il carico computazionale del tool diventa inutilmente gravoso. Per quanto concerne la grandezza della popolazione, oltre i 200 individui, aumenta in maniera eccessiva il tempo di elaborazione (può persino quintuplicare). Ciò suggerisce che non vale la pena utilizzare una popolazione ntroppo ampia; anche se questo comportasse dei miglioramenti sull'ecacia dell'algoritmo, con una popolazione ristretta si avrebbe comunque una maggiore probabilità di trovare il consenso reale, poiché nello stesso lasso temporale si potrebbe eettuare un numero superiore di prove. Aumentando, inne, la probabilità di crossover e soprattutto quella di mutazione, si ottengono (in media) risultati non lontani da quelli maturabili con la congurazione proposta, ma si perde in termini di precisione. Capitolo 5 Risultati sperimentali Tutti i test riportati di seguito, sono stati eettuati sulla stessa congurazione hardware 1 e utilizzando i parametri, che garantiscono il miglior binomio accuratezza predittiva/tempo di elaborazione (Tabella 5.1): Tipo Parametro Probabilità crossover 0.4 Probabilità mutazione 0.01 Shift range [-3; 3] Grandezza popolazione 100 - 200 Numero di generazioni 1500 - 2000 Meccanismo di selezione Tournament & Roulette Wheel Selection Tipo crossover Singolo punto di taglio Pool competitori 10 Tabella 5.1: Parametri utilizzati Come spiegato in precedenza, i motivi funzionali sono in genere sconosciuti a priori e si dispone soltanto di un pool di sequenze rispondenti agli stessi stimoli biologici. Per poter testare il principio di funzionamento del software sviluppato, questa non è di certo la condizione ideale; infatti, se si conoscessero per assurdo i siti di binding contenuti all'interno delle sequenze e il consenso relativo, testare il tool diventerebbe un operazione banale, in quanto basterebbe semplicemente vericare la conformità dei risultati prodotti. Inoltre, sapen- do l'esatta posizione occupata da ciascun motivo all'interno delle sequenze, si potrebbe calcolare la precisione del tool; Questa metrica consente di capire quanto più l'algoritmo riesce ad avvicinarsi all'individuazione dei motivi reali in ciascuna sequenza: P recision = 1 Intel Pentium M centrino 1.73Ghz overlappedP ositions realP ositions 5.1 Datasets sintetici 29 è pertanto il rapporto tra il numero di posizioni predette correttamente dal software (overlappedP ositions = realP ositions∩predictedP ositions) e quelle reali. Ciò signica che se l'algoritmo indovina su tutte le sequenze il vero sito di binding si ottiene il valore 1, precisione massima. 5.1 Datasets sintetici Da qui l'idea di generare dei datasets sintetici, composti da un numero arbitra- rio di sequenze costruite articialmente, con l'ausilio di un piccolo applicativo software scritto in Java. Questo, dati in ingresso 5 parametri che sono rispettivamente, lunghezza del pattern, grandezza e numero di sequenze, numero massimo di posizioni da mutare e probabilità di mutazione, consente di generare 3 le, di cui 2 nel formato fasta (le-sequenza) e 1 con estensione .POS (le di posizione, che diventa indispensabile se si vuole calcolare la precisione). Figura 5.1: Diagramma di usso generatore di sequenze Il principio di funzionamento del software (Figura 5.1) è molto semplice; per 5.1 Datasets sintetici 30 prima cosa vengono generate casualmente, con probabilità uniforme, delle sequenze e un pattern. Quindi, si procede impiantando il motivo generato all'interno di tutte le sequenze, in una posizione anch'essa scelta a caso. Costruito l'intero dataset, questo viene inserito in un le di testo nel formato fasta e gli interi di posizione stampati in un le .POS. Avere lo stesso pattern in tutte le sequenze rende, però, un dataset poco signicativo, poiché non sono ammesse quelle mutazione che nella realtà occorrono abbastanza di frequente. Così, prima di inserire un motivo funzionale, all'interno di una sequenza, questo viene mutato con probabilità pm . In pratica, attraverso un meccanismo stocastico, si decide quando mutare il pattern in una delle sue posizioni (per un massimo specicato tra i parametri di input). Questo consente, dunque, di generare un secondo le-sequenza, con i siti di binding mutati in qualche loro posizione. Il meccanismo appena descritto permette di derivare delle coppie di datasets sintetici, in cui sono impiantati dei patterns noti o eventualmente le loro varianti mutate. Nei test eettuati, in particolare, sono state generate 13 coppie di datasets, utilizzando una probabilità di mutazione del 50% e un massimo di 2 posizioni mutabili. Un singolo dataset è composta da 15 sequenze di 500 nucleotidi ciascuna. Lunghezza Pattern RW Prec RWm Prec 8 1/10 1.0 2/10 0.93 9 2/10 1.0 1/10 0.93 10 2/10 1.0 3/10 0.80 11 4/10 1.0 5/10 1.0 12 2/10 1.0 2/10 1.0 13 2/10 1.0 4/10 1.0 14 5/10 1.0 2/10 1.0 15 2/10 1.0 5/10 1.0 16 6/10 1.0 3/10 1.0 17 3/10 1.0 6/10 1.0 18 3/10 1.0 6/10 1.0 19 6/10 1.0 4/10 1.0 20 4/10 1.0 4/10 1.0 Tabella 5.2: Test datasets sintetici La tabella 5.2 mostra i risultati dei test eettuati utilizzando come meccanismo di selezione la Roulette Wheel. Le colonne riportano rispettivamente (da sinistra verso destra): 1. lunghezza del pattern; 2. patterns trovati con successo all'interno del dataset non mutato (su 10 runs); 5.1 Datasets sintetici 31 3. precisione massima raggiunta (in almeno 1 run, in riferimento alla seconda colonna); 4. patterns trovati con successo all'interno del dataset mutato (su 10 runs); 5. precisione massima raggiunta (in almeno 1 run, in riferimento alla quarta colonna). La cosa interessante da notare è che su 10 runs il software trova sempre il pattern reale (almeno una volta). Lunghezza Pattern TS Prec TSm Prec 8 2/10 1.0 0/10 0.0 9 0/10 0.0 1/10 0.93 10 3/10 1.0 1/10 0.66 11 3/10 1.0 3/10 1.0 12 1/10 1.0 1/10 1.0 13 3/10 1.0 3/10 1.0 14 3/10 1.0 5/10 1.0 15 3/10 1.0 4/10 1.0 16 3/10 1.0 5/10 1.0 17 6/10 1.0 5/10 1.0 18 6/10 1.0 5/10 1.0 19 3/10 1.0 4/10 1.0 20 4/10 1.0 3/10 1.0 Tabella 5.3: Test datasets sintetici La tabella 5.3 mostra, invece, i risultati dei test eettuati utilizzando la Tournament Selection. Anche in questo caso il software trova sempre il pattern reale, salvo quello di lunghezza 8 relativo al dataset mutato (TSm) e quello di lunghezza 9 relativo al dataset non mutato (TS). Se si analizzano entrambi le tabelle ( 5.2 e 5.3) si evince che in generale, come è lecito aspettarsi, all'aumentare della dimensione del pattern da trovare migliorano sensibilmente le prestazioni del software, anche se senza una regola precisa. Questo perché, come detto nei capitoli precedenti, le prestazioni dell'algoritmo dipendono in maniera determinante dalla composizione delle sequenze (in riferimento alla tabella 5.3 si noti come certi patterns mutati vengano trovati più frequentemente degli stessi non mutati, o come in alcuni casi il software riesca a trovare con maggiore facilità patterns più brevi; e.g. 18 vs 19 - 20). 5.2 Datasets biologici 32 5.2 Datasets biologici I datasets biologici utilizzati nei test seguenti sono tutti nel formato fasta e reperibili in 2 dierenti basi di dati: • http://jura.wi.mit.edu/fraenkel/download/release_v24/fsales/ • http://zlab.bu.edu/glam/sup/ 5.2.1 YDR02c binding sites Motif-nding program Predicted Motif AlignACE [10] - TCCGGGTAAA BioProspector [8] TACCGGGTAA Consensus [4] CCGGGTAAAA Gibbs Sampler [7] TATTTTGATG MEME GTCCGGGTAA GA: RW TGCCGGGTAA GA: TS TGCCGGGTAA Tabella 5.4: YDR02c dataset [3] Il dataset YDR02c consiste di 15 sequenze a lunghezza variabile, di cui non si conosce il consenso reale, in quanto non sono mai state eettuate delle prove sperimentali (e.g. DNA footprinting 2 ). La tabella 5.4 mostra il consenso pre- detto dal software sviluppato, utilizzando ambedue i meccanismi di selezione (GA: RW e TS) e quelli restituiti da altri programmi, noti in letteratura. Si può notare come tutti i consensi siano molto simili tra di loro (versioni leggermente mutate o shiftate) ad eccezione di quello restituito da Gibbs Sampler, che sembra esser un pattern completamente diverso. Questo è un aspetto certamente confortante, anche se non esistono ancora riprove sperimentali. 5.2.2 CRP binding sites Il dataset della proteina recettore dell'AMP (CRP) è composto da 18 sequenze di 105 nucleotidi ciascuna, in cui sono stati scoperti, grazie alla DNA footprinting 2 2 , 23 motivi funzionali lunghi 22 bps [11, 12]. Metodologia sperimentale per l'individuazione dei motivi reali 5.2 Datasets biologici 33 Pattern found ↓ Precision Times GA: RW TGTGATCGAGGTCACACTTTTG 0.86 3/10 GA: TS TGTGATCGAGGTCACACTTTTG 0.86 2/10 Reale TTATGTGATCGAGTTCACACTT Tabella 5.5: CRP dataset La tabella 5.5 mostra il consenso restituito dal software sviluppato e la frequenza relativa (su 10 runs). In basso, invece, viene riportato il consenso reale comprovato sperimentalmente con la tecnica della DNA footprinting 2 . Si può notare come il consenso restituito dal tool sia una variante shiftata di quello reale (gura 5.2), con una precisione dell'86%; in rosso sono evidenziate le corrispondenze esatte tra i due consensi. Figura 5.2: consenso reale (true) e predetto (ga) con i loghi relativi, dove l'altezza di ciascuna lettera è proporzionale alla propria frequenza 3 É interessante osservare come il consenso predetto dierisca da quello reale di un solo nucleotide (G al posto di T, freccia tabella 5.5). Per avere maggiore chiarezza su questo aspetto si è provato ad analizzare la PWM relativa. Figura 5.3: Logo sequenza CRP 3 Two Sample Logos: http://www.twosamplelogo.org/ 5.2 Datasets biologici 34 La gura 5.3 mostra il logo sequenza e la matrice di posizione, generati direttamente dal software sviluppato, sull'allineamento che ha consentito di derivare il consenso proposto. In posizione 11 si può notare come i nucleotidi G e T siano praticamente quasi equiprobabili. In particolare questi ottengono rispettivamente una frequenza del 33% e 28%. Una precisione di 0.86 suggerisce, inoltre, che il software riesce a trovare i motivi reali in quasi tutte le sequenze con una buona accuratezza. Tuttavia, il contributo mancante potrebbe essere corresponsabile dell'anomalia a cui sopra si è accennato. Così, analizzando la tabella 5.6 ci si accorge di come il tool non riesca a trovare il motivo reale a sequenza. all'interno della 17 Seq Number True Sites Gibbs. BioPros. GA 1 17,61 -2(59) 2(63) 2(63) 2 17,55 -2(53) 2(57) 2(57) 3 76 -2(74) 2(78) 2(78) 4 63 -4(59) 2(65) 2(65) 5 50 -39(11) 2(52) 2(52) 6 7,60 -2(5) 2(9) 2(9) 7 42 -2(40) -16(26) 2(42) 8 39 -2(37) 2(41) 2(41) 9 9,81 -2(7) 2(11) 2(11) 10 14 -2(12) 2(16) 2(16) 11 61 -2(59) 2(63) 2(63) 12 41 6(47) 2(43) 2(43) 13 48 -2(46) 2(50) 2(50) 14 71 -2(69) 2(73) 2(73) 15 17 -2(15) 2(19) 2(19) 16 53 -4(49) 2(55) 2(55) 17 1,84 24(25) -16(68) -27(57) 18 78 -4(74) 2(80) 0(78) Motifs found 12/18 16/18 17/18 Error 105 64 59 Precision 0.78 0.84 0.86 Tabella 5.6: CRP dataset - posizioni iniziali Ma la tabella 5.6 consente anche di confrontare le prestazioni del software sviluppato con quelle di altri programmi (Gibbs Sampler e BioProspector ). Per ciascuna sequenza si può notare la posizione predetta (quella tra parentesi) e l'errore relativo (di quanto la predizione si discosta dalla posizione reale: segno negativo ↔ shift verso sinistra, segno positivo ↔ shift verso destra). Inne, la parte riepilogativa mostra la precisione, l'errore totale (somma di quelli relativi) e il numero di sequenze in cui il pattern viene predetto correttamente 5.2 Datasets biologici 35 (dove c'è un errore relativo al massimo in 3 posizioni verso destra o sinistra). Da questa tabella si evince come l'approccio genetico, implementato nella soluzione proposta, funzioni meglio di quello utilizzato dagli altri due software, a riprova di quanto aermato nell'introduzione a questa tesi. Per onestà intellettuale occorre, anche dire però, che esistono approcci alternativi che hanno al contrario un'accuratezza migliore del tool sviluppato. Questo perché l'algoritmo genetico su cui si basa, manifesta alcune problematiche, che per motivi di tempo, non si è riusciti ad arontare (ma che aprono a sviluppi futuri). 5.2.3 E2F binding sites Il dataset E2F è composto da 27 sequenze di 50 nucleotidi ciascuna; in letteratura si ritiene che TTTCGCGCG [2] sia il consenso reale. Pattern found Times GA: TS TTTCGCGCGAA 10/10 GA: RW TTTCGCGCGAA 9/10 MEME TTCGCGCGAAA Glam TTCGCGCGAAA Reale -CAATTTTCGCGCGG Tabella 5.7: E2F dataset La tabella 5.7 mostra come il software sviluppato riesca a trovare il consenso reale, con ambedue i meccanismi di selezione e una frequenza relativa di 10 su 10 (TS). 5.2.4 ERE binding sites Il dataset ERE ( elements response estrogen) consiste di 25 sequenze, 50 nu- cleotidi ciascuna; in letteratura si considera GGTCATGACC [2], consenso reale. Pattern found Times GA: TS - GGTCAGGGTGACCT 10/10 GA: RW - GGTCAGGGTGACCT 9/10 MEME AGGTCACCGTGACCT Glam - GGTCAAGGTGACCT Reale - GGTCA TGACC - Tabella 5.8: ERE dataset La tabella 5.8 mostra come il software sviluppato riesca a trovare il consenso reale, con ambedue i meccanismi di selezione e una frequenza relativa di 10 su 10 (TS). 5.2 Datasets biologici 36 5.2.5 LSF binding sites Il dataset LSF è composto da 19 sequenze di 50 nucleotidi ciascuna; in letteratura si ritiene che CTGGCTGG [2] sia il consenso reale. Pattern found 4 Times GA: TS GG(A-C)GCTGGTT(C-T)GC(G-T)CTGGC 1/10 GA: RW GCTGGTTTG(A-C)ACTGGCTCA 2/10 MEME GCTGGTTTGCT CTGGCT Glam TGGAGCTGGTTTGTG CTGG Reale CTGG CTGG Tabella 5.9: LSF dataset La tabella 5.9 mostra come il software sviluppato riesca a trovare il consenso reale, con ambedue i meccanismi di selezione e una frequenza relativa di 2 su 10 (RW). 5.2.6 Kruppel binding sites Il dataset Kruppel consiste di 27 sequenze, 50 nucleotidi ciascuna; in letteratura si considera AAAGGGTTA [2], consenso reale. Pattern found Times GA: TS AAAGGGTTA 1/10 GA: RW AAAGGGTTA 3/10 MEME AAAGGGTTA Glam AAAGGGTTA Reale AAAGGGTTA Tabella 5.10: Kruppel dataset La tabella 5.10 mostra come il software sviluppato riesca a trovare il consenso reale, con ambedue i meccanismi di selezione e una frequenza relativa di 3 su 10 (RW). 5.2 Datasets biologici 37 5.2.7 Bicoid binding sites Il dataset Bicoid è composto da 35 sequenze di 50 nucleotidi ciascuna; in letteratura si ritiene che (C-T)CTAATCCC [2] sia il consenso reale. Pattern found 4 Times GA: TS GGATTAGG 2/10 GA: RW GGATTAGG 1/10 MEME TTTAATCCG Glam TTTAATCCG Reale (C-T)CTAATCCC Tabella 5.11: Bicoid dataset 5.2.8 AZF1 binding sites Il dataset AZF1 consiste di 24 sequenze, le cui ampiezze variano tra 175 e 1228 nucleotidi; in letteratura si considera TTTTTCTT [3], consenso reale. Pattern found Times GA: TS AAAAGAAA 1/10 GA: RW GAAAAGGA 1/10 Reale TTTTTCTT Tabella 5.12: AZF1 dataset Le tabelle 5.11 e 5.12 mostrano dei test che, rispetto a tutti gli altri eettuati, hanno avuto esito negativo. Per quanto riguarda il dataset Bicoid, non ci sono elementi a sucienza, che consentano di giusticare questo comportamento anomalo. Il dataset AZF1, al contrario, mostra aspetti comunque interessanti; Come si può notare i consensi predetti, con ambedue i meccanismi di selezione, sono abbastanza simili tra di loro. Si è constatato che il pattern reale (TTTTTCTT) è presente (corrispondenza esatta, non considerando quindi le varianti mutate) in sole 7 sequenze su 24, mentre il pattern AAAAGAAA in ben 10 sequenze su 24 (AAAAAGAA in 11/24). Ciò signica che il meccanismo di calcolo della tness, implementato nell'approccio proposto, premia un pattern comunque presente in quasi il 50% delle sequenze. A riprova di questo, si è provato ad eseguire il tool ntanto non si è riusciti a trovare, magari per pura casualità, il consenso TTTTTCTT. Interessante notare come quest'ultimo abbia ottenuto un valore di tness prossimo a 7, mentre il consenso AAAAGAAA raggiunga un punteggio di 7.5, quindi maggiore. 4 Tra parentesi i nucleotidi equiprobabili Capitolo 6 Conclusioni In questa tesi si è utilizzato un approccio basato su algoritmi genetici, per ricercare motivi funzionali in sequenze di DNA. Questi, da un punto di vista biologico, sono dei componenti cruciali che inuenzano e innescano, alcuni tra i più importanti processi cellulari: l' espressione genica e la trascrizione. La loro identità è tipicamente sconosciuta a priori e si dispone soltanto di un pool di sequenze rispondenti agli stessi stimoli biologici. Per tale scopo, esistono sosticate tecniche sperimentali di indiscussa ecacia che sono, tuttavia, costose e particolarmente esigenti dal punto di vista delle risorse. Dunque l'informatica può fornire un aiuto prezioso ai biologi proponendo algoritmi in grado di scegliere, sulla base di considerazioni euristiche, probabilistiche o stime di similarità, dei motivi candidati, che pilotino le prove sperimentali. la ricerca del consenso reale durante Pertanto il vero problema diventa, cercare all'interno di sequenze multiple motivi di lunghezza k, che abbiano il più alto grado di similarità tra di loro. Data la complessità del problema e l'inadattabilità della ricerca esaustiva, fra tutti gli approcci possibili, si è scelto di esplorare il ramo degli algoritmi genetici, incuriositi dalle note qualità quali strumenti di ottimizzazione algoritmica. Sotto quest'ottica, i test eettuati hanno dimostrato come l'approccio genetico sia scalabile e ai ni della complessità, la lunghezza del pattern diventi un parametro pressoché trascurabile. 6.1 Sintesi del lavoro svolto e dei risultati ottenuti Da un punto di vista prettamente tecnico, lo schema di principio del software sviluppato può essere riassunto esaustivamente in 3 punti: 1. le sequenze di DNA vengono rappresentate all'interno dell'elaboratore elettronico, mediante delle stringhe di caratteri; 2. i motivi funzionali, una volta estratti da ciascuna sequenza e allineati 6.2 Sviluppi futuri 39 all'interno di una matrice, vengono misurati dalla funzione di tness, che ne determina il grado di similarità; 3. il principio di funzionamento dell'algoritmo genetico permette alle soluzioni presunte di evolversi, incrementando l'omogeneità dei motivi allineati, no a trovare il consenso proposto. Anzitutto occorre precisare che l'algoritmo basa il suo funzionamento sull'assunzione che in ciascuna sequenza vi sia un solo motivo presente, quando nella realtà ve ne possono essere di molteplici. Il software è stato testato sia con datasets biologici (e.g. CRP, ERE, E2F e altri) che sintetici (ovvero costruiti articialmente impiantando patterns noti all'interno di sequenze a lunghezza ssa). Risultati sperimentali dimostrano come il tool riesca a trovare il consenso reale con ogni tipologia di datasets testato e funzioni meglio di strumenti alternativi (e.g. Gibbs Sampler e BioProspector) utilizzati in letteratura per problemi di questo genere. Tuttavia, come spesso accade in questi modelli computazionali, gli stessi esperimenti certicano anche la presenza di comportamenti disattesi che diminuiscono l'ecacia predittiva del tool (prematura convergenza ma non solo). Ciò suggerisce come l'algoritmo sviluppato non debba essere considerato un punto di arrivo, semmai una base solida su cui improntare sviluppi futuri. Da un lato si possono esplorare molteplici aspetti legati alla natura algoritmica della soluzione proposta, dall'altro apportare migliorie che derivino da uno studio approfondito della complessa struttura genomica. 6.2 Sviluppi futuri Per quanto concerne la prima categoria, si è detto come le prestazioni del software dipendano dalla congurazione dei parametri utilizzati ma anche dalla composizione delle sequenza e la conseguente distribuzione dei valori di tness all'interno della popolazione, che potrebbero portare l'algoritmo a convergere prematuramente. Per fronteggiare questi problemi che notoriamente sono indicatori di una prematura perdita di diversità all'interno della popolazione, si possono impiegare delle tecniche di clusterizzazione, mediante la formazione di nicchie (niching); tness fk , queste introducono un fattore di correzione al valore di k con il resto della calcolato in base alla similitudine dell'individuo popolazione, in modo da mantenere quest'ultima sucientemente diversa. La tecnica del crowding factor, ad esempio, seleziona i cromosomi che par- tecipano alla riproduzione, non solo sulla base del loro valore di tness, ma anche di quanto ciascuna soluzione sia mediamente vicina a tutte le altre della popolazione (crowding factor). Il meccanismo descritto ha lo scopo di favorire l'esplorazione di nuove aree nello spazio delle soluzioni, evitando che queste si avvicinino troppo l'una all'altra. 6.2 Sviluppi futuri 40 elitismo, invece, conserva il miglior individuo della popolazione prima che L' qualsiasi operazione di selezione e riproduzione avvenga, ricopiandolo nella popolazione discendente. In questo modo si evita il rischio di perdere la migliore soluzione trovata no a quel momento, tipico dei meccanismi di selezione stocastici. In sintesi, applicando questi meccanismi, è possibile che si riesca a migliorare l'ecacia e l'ecienza della soluzione proposta. Per quanto concerne la seconda categoria, lo studio del nucleosoma può essere la chiave per incrementare notevolmente le prestazioni dell'algoritmo. cromatina, costituita da un nucleo cen(denominato ottamero o core di istoni), a cui si Questa è la subunità elementare della trale di 8 molecole istoniche avvolge il DNA per quasi due giri completi. Ciò suggerisce come nella realtà vi siano porzioni di DNA, di fatto inaccessibili a fattori di trascrizione, dove quindi sarebbe inutile cercarvi dei motivi funzionali. Nel software sviluppato la ricerca del consenso investe, al contrario, interamente tutte le sequenze, dove i nucleotidi hanno equiprobabilità di appartenere ad un sito di binding. La conoscenza approfondita di queste strutture consentirebbe, invece, di costruire un modello di priorità 5 [9] in grado di limitare notevolmente lo spazio di ricerca e incrementare in maniera consistente le prestazioni dell'algoritmo, che al momento sono destinate a decadere all'aumentare del numero di sequenze e/o la lunghezza delle stesse. 5 Priorità 7→ probabilità che un certo nucleotide stia all'inizio di un motivo funzionale Appendice A Frammento di codice della classe geneticAlgorithm.java /∗ ∗ ∗ @(#) g e n e t i c A l g o r i t h m . j a v a ∗ ∗ ∗ @author C a s a c c i a D a n i l o ∗ @version 1 . 0 0 2008/5/2 ∗/ import java . u t i l . import java . io . public class ∗; ∗; geneticAlgorithm // A t t r i b u t i pubblici { della classe public static double public static int sequenceNumber ; static int patternWidth ; public avgSequenceWidth ; public individualsPopulation public V e c t o r <o n e S e q u e n c e > public int / / Metodo private [] per int selezione di // G e n e r a t o r e // Genera double di un numeri randomizer numero del // C o l l e z i o n e // Array individuo con il di [] sequenze pattern di di individui sequenze posizioni meccanismo ( double delle iniziali roulette wheel i n d i v i d u a l s P r o b a b i l i t y ){ casuali = new Random ( ) ; casuale selectionNumber sequenze // P o p o l a z i o n e selectIndividualRouletteWheel Random media di // Lunghezza population ; allSequences ; initialStartPositions ; la // Lunghezza / / Numero per = la selezione [0 −1] randomizer . nextDouble ( ) ; // I n d i c e int index = 0; // P r o b a b i l i t a ' double // S e l e z i o n a for d e l l ' elemento precProbability ( int i = a quello corrente individuo = 0; i < // C o n t r o l l a if && individualsProbability . length ; i ++) la i −e s i m o probabilita ' ( ( s e l e c t i o n N u m b e r <= ( selectionNumber index // Assegna // p r o s s i m a la = i ; > dell ' individuo individualsProbability // I n d i v i d u o probabilita ' = { [ i ]) precProbability )) i −e s i m o a l l ' elemento selezionato precedente iterazione ) precProbability } precedente 0.0; individualsProbability [ i ]; ( per la Frammento di codice della classe geneticAlgorithm.java // R e s t i t u i s c i return 42 l ' indice index ; } / / Metodo per la selezione dell ' individuo con il meccanismo tournament // s e l e c t i o n private int selectIndividualTournamentSelection // G e n e r a t o r e di numeri Random randomizer // P o o l di int [ ] (){ casuali = new Random (); competitori tournamentCompetitors = new int [ geneticAlgorithm . tournamentSize ] ; // Genera pool for i ( int = di 0; competitori i // E s t r a i < geneticAlgorithm . tournamentSize ; casualmente // a g g i u n g i l o al un individuo della i ++) popolazione e pool tournamentCompetitors [ i ] = randomizer . nextInt ( t h i s . population . entirePopulation . size ()); // F i t n e s s double massima maxFitness = this . population . entirePopulation . get ( tournamentCompetitors [ 0 ] ) . individualFitnessNotNormalized ; // I n d i c e int dell ' individuo con bestCompetitorIndex // E s e g u i competizione for i ( int = 1; i / / Nuovo if < = la fitness massima tournamentCompetitors [ 0 ] ; geneticAlgorithm . tournamentSize ; individuo con la fitness i ++) massima ( t h i s . population . entirePopulation . get ( tournamentCompetitors [ i ] ) . individualFitnessNotNormalized / / Nuova fitness maxFitness = > maxFitness ){ massima this . population . entirePopulation . get ( tournamentCompetitors [ i ] ) . individualFitnessNotNormalized ; / / Nuovo indice migliore bestCompetitorIndex = tournamentCompetitors [ i ] ; } // R e s t i t u i s c i return indice individuo selezionato bestCompetitorIndex ; } / / Metodo private che void esegue il crossover " single singlePointCrossover ( int int // I s t a n z i a primo oneIndividual // I s t a n z i a // I s t a n z i a indexSecondParent ){ figlio firstSoon secondo oneIndividual point " indexFirstParent , = new secondSoon array oneIndividual (); figlio di = new posizioni oneIndividual iniziali firstSoon . initialStartPositions = new del int (); primo figlio [ geneticAlgorithm . sequenceNumber ] ; // I s t a n z i a array di posizioni iniziali secondSoon . i n i t i a l S t a r t P o s i t i o n s = new del int secondo figlio [ geneticAlgorithm . sequenceNumber ] ; // G e n e r a t o r e Random di numeri randomizer = new casuali Random ( ) ; Frammento di codice della classe geneticAlgorithm.java // Genera punto // c a s u a l e di − [0 taglio − 1 = // sequenceNumber − 2 = / / Ex : s l i c e = 0 −> [ 0 ] // s l i c e = n − 2 −> // sequenceNumber int singolo slicePoint = per − ( sequenceNumber 1)[ indicizza [1] [0] il n−2 [ randomizer . nextInt il crossover ( sequenceNumber for il ( int i crossover = 0; i / / Siamo if ( i < " single | elemento [ n − 1] ( geneticAlgorithm . − <= del punto slicePoint ) 1); point " g e n e t i c A l g o r i t h m . sequenceNumber ; prima 2)]) ] ] sequenceNumber // E s e g u i ( numero − elemento ; penultimo [ n−1 . . . . . . − [0 l ' ultimo indicizza | effettuare −> 43 di i ++) taglio { firstSoon . initialStartPositions [ i ] = this . population . entirePopulation . get ( indexFirstParent ) . initialStartPositions [ i ]; secondSoon . i n i t i a l S t a r t P o s i t i o n s [ i ] = this . population . entirePopulation . get ( indexSecondParent ) . initialStartPositions [ i ]; / / Dopo il } { else punto di taglio firstSoon . initialStartPositions [ i ] = this . population . entirePopulation . get ( indexSecondParent ) . initialStartPositions [ i ]; secondSoon . i n i t i a l S t a r t P o s i t i o n s [ i ] = this . population . entirePopulation . get ( indexFirstParent ) . initialStartPositions [ i ]; } // A g g i u n g i i due figli alla popolazione t h i s . p o p u l a t i o n . e n t i r e P o p u l a t i o n . add ( f i r s t S o o n ) ; t h i s . p o p u l a t i o n . e n t i r e P o p u l a t i o n . add ( s e c o n d S o o n ) ; } / / Metodo private che void esegue il crossover " double doublePointCrossover ( int int // I s t a n z i a primo oneIndividual // I s t a n z i a // I s t a n z i a indexSecondParent ){ figlio firstSoon secondo oneIndividual point " indexFirstParent , = new secondSoon array oneIndividual (); figlio di = new posizioni oneIndividual iniziali firstSoon . initialStartPositions = new del int (); primo figlio [ geneticAlgorithm . sequenceNumber ] ; // I s t a n z i a array di posizioni iniziali secondSoon . i n i t i a l S t a r t P o s i t i o n s = new del int secondo figlio [ geneticAlgorithm . sequenceNumber ] ; // G e n e r a t o r e Random // Genera // I l di numeri randomizer 2 primo punti numero di secondo Random ( ) ; taglio sara ' // [0 −( sequenceNumber // I l casuali = new numero − per effettuare generato 2)] potra ' − −> appartenere crossover ne ll ' intorno −1)[ a l l ' intorno // [ ( f i r s t S l i c e P o i n t + 2) int = randomizer . nextInt firstSlicePoint il casualmente [0 −( sequenceNumber ( sequenceNumber − 1)] ( geneticAlgorithm . sequenceNumber int secondSlicePoint = 0; − 1); Frammento di codice della classe geneticAlgorithm.java / / Non e ' ammissibile // p i c c o l o while di avere un ( firstSlicePoint ( secondSlicePoint / / Numero < casuale secondo + ( firstSlicePoint = di taglio piu ' 1) compreso secondSlicePoint punto 44 tra + 1)) [0 −( sequenceNumber randomizer . nextInt − 1)] ( geneticAlgorithm . sequenceNumber ) ; // E s e g u i il for i ( int crossover = 0; i / / Siamo if (( i < in > " double point " g e n e t i c A l g o r i t h m . sequenceNumber ; mezzo ai due punti firstSlicePoint ) && di ( i i ++) taglio < secondSlicePoint )){ firstSoon . initialStartPositions [ i ] = this . population . entirePopulation . get ( indexSecondParent ) . initialStartPositions [ i ]; secondSoon . i n i t i a l S t a r t P o s i t i o n s [ i ] = this . population . entirePopulation . get ( indexFirstParent ) . initialStartPositions [ i ]; / / Prima del primo punto di taglio o dopo il secondo punto di // t a g l i o } else { firstSoon . initialStartPositions [ i ] = this . population . entirePopulation . get ( indexFirstParent ) . initialStartPositions [ i ]; secondSoon . i n i t i a l S t a r t P o s i t i o n s [ i ] = this . population . entirePopulation . get ( indexSecondParent ) . initialStartPositions [ i ]; } // A g g i u n g i i due figli alla popolazione t h i s . p o p u l a t i o n . e n t i r e P o p u l a t i o n . add ( f i r s t S o o n ) ; t h i s . p o p u l a t i o n . e n t i r e P o p u l a t i o n . add ( s e c o n d S o o n ) ; } / / Metodo private che void esegue il crossover doCrossover // G e n e r a t o r e Random di ( int numeri randomizer se effettuare −1]; se questo if crossover , due e ' il crossover massimo " single ( genera grande un quanto numero la casuale da probabilita ' // E s e g u i il t h i s . c r o s s o v e r P r o b a b i l i t y ){ point " ( t h i s . crossoverType // d i indexSecondParent ){ l ' operazione ) ( r a n d o m i z e r . n e x t D o u b l e ( ) <= if int Random ( ) ; al esegui // C r o s s o v e r genitori casuali = new // D e c i d i // [ 0 // d i di indexFirstParent , == 0){ crossover a punto singolo ( un punto taglio ) this . singlePointCrossover ( indexFirstParent , indexSecondParent ) ; } // C r o s s o v e r else " double point " { // E s e g u i // d i il crossover a punto doppio ( due punti taglio ) t h i s . doublePointCrossover ( indexFirstParent , indexSecondParent ) ; } } Frammento di codice della classe geneticAlgorithm.java / / Non viene // e s a t t e else eseguito dei il crossover ma i 2 figli 45 generati sono copie genitori { // I s t a n z i a un // g e n i t o r e ( invoca nuovo oneIndividual individuo metodo firstSoon come clone () = copia della esatta classe ( oneIndividual ) del primo oneIndividual ) this . population . entirePopulation . get ( indexFirstParent ) . clone ( ) ; // A g g i u n g i il nuovo individuo alla popolazione t h i s . p o p u l a t i o n . e n t i r e P o p u l a t i o n . add ( f i r s t S o o n ) ; // I s t a n z i a un // g e n i t o r e ( invoca nuovo oneIndividual individuo metodo secondSoon come clone () = copia della esatta classe ( oneIndividual ) del secondo oneIndividual ) this . population . entirePopulation . get ( indexSecondParent ) . clone ( ) ; // A g g i u n g i il nuovo individuo alla popolazione t h i s . p o p u l a t i o n . e n t i r e P o p u l a t i o n . add ( s e c o n d S o o n ) ; } } / / Metodo private che void esegue la mutazione doMutation in maniera stocastica (){ // F l a g boolean isMutated ; // TopLimit int sequenza topLimit ; // G e n e r a t o r e Random // I t e r a for di numeri randomizer ( int l ' intera i = casuali = new Random ( ) ; popolazione 0; i < this . population . entirePopulation . s i z e ( ) ; isMutated = false ; i ++){ // F l a g // I t e r a for le ( int j j < posizioni = iniziali di un individuo 0; t h i s . population . entirePopulation . get ( i ) . i n i t i a l S t a r t P o s i t i o n s . length ; // D e c i d i se // ( g e n e r a // s e effettuare un questo numero a ' al mutazione , la mutazione casuale massimo esegui j ++) da [0 grande // di if ( r a n d o m i z e r . n e x t D o u b l e ( ) <= di ciascun gene −1]; quanto la probabilita ' l ' operazione ) this . mutationProbability ){ // Mutazione avvenuta isMutated true ; = // TopLimit topLimit = j −e s i m a sequenza t h i s . allSequences . get ( j ) . sequenceWidth − g e n e t i c A l g o r i t h m . patternWidth ; / / Muta casualmente la posizione iniziale // c o r r e n t e t h i s . population . entirePopulation . get ( i ) . initialStartPositions [ j ] = randomizer . nextInt ( topLimit 1); } //L ' i n d i v i d u o // i n i z i a l e // c h e if o i −e s i m o la e ' fitness l ' individuo e ' stato non frutto mutato in normalizzata di almeno e ' una nulla posizione ( significa crossover ( ( isMutated ) || ( t h i s . population . entirePopulation . get ( i ) . individualFitnessNotNormalized // R i c a l c o l a la nuova == 0.0)) fitness this . computeIndividualFitness ( geneticAlgorithm . shiftRange , i ); + Frammento di codice della classe geneticAlgorithm.java 46 } } / / Metodo che elimina // n o r m a l i z z a t a private void piu ' un terzo doEvolution // F i t n e s s double di individui ( quelli con la fitness non bassa ) (){ minima minFitness ; // I n d i c e int index ; // E l i m i n a for ( int i i peggiori = 0; i individui < // Assegna la minFitness ( un terzo del ∗ ( t h i s . crossoverTimes fitness = del primo totale ) 2); i ++){ individuo t h i s . population . entirePopulation . get ( 0 ) . individualFitnessNotNormalized ; // Assegna index = // I t e r a for l ' indice del primo individuo 0; la ( int popolazione j = 1; j < this . population . entirePopulation . size (); / / Nuova if fitness j ++){ minima ( t h i s . population . entirePopulation . get ( j ) . individualFitnessNotNormalized // Assegna nuova minFitness = < minFitness ){ fitness this . population . entirePopulation . get ( j ) . individualFitnessNotNormalized ; // Assegna index = nuovo indice j ; } } // E l i m i n a l ' individuo peggiore t h i s . p o p u l a t i o n . e n t i r e P o p u l a t i o n . remove ( i n d e x ) ; } } / / Metodo che / / ( numero public esegue di void la ricerca iterazioni : doResearch / / Stampa del pattern in maniera iterativa iterationNumber ) (){ fitness massima su file o mostra grafico fitness massima // a b i l i t a t i if ( ( g e n e t i c A l g o r i t h m . showMaxFitnessGraphic || ( geneticAlgorithm . printMaxFitness // I n i z i a l i z z a il vettore di t h i s . population . maxFitness == == 1)) fitness = new 1) massime double [ geneticAlgorithm . iterationNumber / / Stampa fitness media su file o mostra grafico fitness + 1]; media // a b i l i t a t i if ( ( g e n e t i c A l g o r i t h m . showAvgFitnessGraphic || ( geneticAlgorithm . printAvgFitness // I n i z i a l i z z a il vettore di this . population . avgFitness == == 1)) fitness = new 1) medie double [ geneticAlgorithm . iterationNumber // C a l c o l a le fitness // ( g e n e r a z i o n e ( normalizzate ) " zero ") [ viene t h i s . computeAllFitness / / Quante volte // Array double di [] = calcolata la popolazione anche la + 1]; istanziata fitness media ] ( geneticAlgorithm . shiftRange ) ; occorre t h i s . crossoverTimes per eseguire il crossover ?! this . population . entirePopulation . s i z e () probabilita ' probabilityArray = null ; / 4; Frammento di codice della classe geneticAlgorithm.java // E s e g u i la for i ( int ricerca = 0; i < geneticAlgorithm . iterationNumber ; // Se selezionata // l e probabilita ' if 47 la roulette di wheel le probabilita ' // ( p o p o l a z i o n e il for j ( int di 0) = selezione t h i s . computeProbability ( ) ; crossover = 0; j < t h i s . crossoverTimes ; // S e l e z i o n a t a if == corrente ) probabilityArray // E s e g u i ricalcola selezione ( geneticAlgorithm . selectionType // C a l c o l a selection i ++){ la roulette wheel j ++) selection ( geneticAlgorithm . selectionType // I n v o c a metodo di == 0) crossover t h i s . doCrossover ( t h i s . selectIndividualRouletteWheel ( probabilityArray ) , this . selectIndividualRouletteWheel ( probabilityArray ) ) ; // S e l e z i o n a t a la tournament selection else // I n v o c a metodo di crossover t h i s . doCrossover ( t h i s . selectIndividualTournamentSelection this . selectIndividualTournamentSelection // I n v o c a metodo di () , ()); mutazione t h i s . doMutation ( ) ; // E v o l v i la popolazione " eliminando " gli individui peggiori t h i s . doEvolution ( ) ; // N o r m a l i z z a // i n d i v i d u i / / ( non l ' intera inseriti popolazione e calcola la this . population . normalizeFitness ( i // Se if sulla base fitness + 1); ( geneticAlgorithm . printMaxFitness // C a l c o l a la fitness massima == per == t h i s . population . getMaxFitness ( i la } } + 1) 1)) generazione // c o r r e n t e } nuovi abilitato ( ( g e n e t i c A l g o r i t h m . showMaxFitnessGraphic || dei media normalizzata ) 1); Bibliograa [1] T. Blickle and L. Thiele, A Comparison of Selection Schemes used in Genetic Algorithms (2. Edition), TIK Report No. 11, Computer Engineering and Communication Networks Lab (TIK), Swiss Federal Institute of Technology (ETH) Zürich, Switzerland, 1995. [2] C.M. Frith, U. Hansen, J.L. Spouge and Z. Weng, Finding functional sequence elements by multiple local alignment. Nucleic Acids Research, January 2 2004, Vol. 32, No. 1. 189-200. [3] C.T. Harbison, D.B. Gordon, T.I. Lee, N. Rinaldi, K.D. Macisaac, T.D. Danford, N.M. Hannett, J.B. Tagne, D.B. Reynolds, J. Yoo, E.G. Jennings, J. Zeitlinger, D.K. Pokholok, M. Kellis, P.A. Polfe, K.T. Takusagawa, E.S. Lander, D.K. Giord, E. Fraenkel and R.A. Young, Transcriptional Regulatory Code of a Eukaryotic Genome. Nature, 431, 7004 (Sep. 2004), 99-104. [4] G.Z. Hertz and G.D Stormo, Identifying DNA and protein patterns with statistically signicant alignments of multiple sequences. Bioinformatics, 15, 7 (July, 1999), 563-577. [5] J. Holland, Adaptation in Natural and Articial Systems, University of Michigan Press, Ann Arbor, 1975. [6] M. Lässig, From biophysics to evolutionary genetics: statistical aspects of gene regulation, Institut für Theoretische Physik, Universität zu Köln, Zülpicher Str., 77, 50937 Köln, Germany. [7] J.S. Liu, A.F. Neuwald and C.E. Lawrence, Bayesian models for multiple local sequence alignment and Gibbs sampling strategies . J. Am. Stat. Assoc., 90, 432 (Nov. 1995), 1156-1170. [8] X. Liu, D.L. Brutlag and J.S. Liu, BioProspector: discovering conserved DNA motifs in upstream regulatory regions of co-expressed genes. Pac. Symp. Biocomput., 6, 2001, 127-138. Bibliograa 49 [9] L. Narlikar, R. Gordân, U. Ohler and A. Hartemink, Informative Priors Based on Transcription Factor Structural Class Improve de novo Motif Discovery. Intelligent Systems in Molecular Biology 2006 (ISMB06), Bioinformatics, 22, July 2006. [10] F.R. Roth, J.D. Hughes, P.E. Estep and G.M. Church, Finding DNA regulatory motifs within unaligned non-coding sequences clustered by wholeGenome mRNA quantitation. Nature Biotechnology 16, 10 (Oct. 1998), 939-45. [11] G.D. Stormo and G.W. Hartzell, Identifying protein-binding sites from unaligned DNA fragments. Proc. Natl Acad. Sci. USA, 86, 4, (Feb. 1989), 1183-1187. [12] G.D. Stormo, Computer methods for analyzing sequence recognition of nucleic acids. Annu. Rev. BioChem. 17, 1988, 241-263.