ricerca di motivi funzionali in sequenze di dna mediante algoritmi

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.