Sunteți pe pagina 1din 53

Universitatea Din Craiova.

Facultatea de Stiinte
Exacte, Departamentul de Informatica

Lucrare de disertatie

Absolvent
Ecaterina Litu

Coordonator Stiintific:
Conf. Costin Radu
Boldea

Craiova, iulie 2012

Universitatea Din Craiova. Facultatea de Stiinte


Exacte, Departamentul de Informatica

Calcul ADN. Modele de Filtrare

Absolvent
Ecaterina Litu

Coordonator Stiintific:
Conf. Costin Radu

Craiova, iulie 2012

Boldea

Cuprins
1 Introducere
1.1 Biologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Informatica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Bioinformatica . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Calcul ADN
2.1 Structura ADN-ului . . . . . . . . . . . . . . . .
2.2 Operatii cu ADN . . . . . . . . . . . . . . . . .
2.2.1 Sinteza . . . . . . . . . . . . . . . . . . .
2.2.2 Denaturarea, Hibridizarea si Fuzionarea
2.2.3 Separarea sirurilor . . . . . . . . . . . .
2.2.4 Electroforeza gelului . . . . . . . . . . .
2.2.5 PCR: Reactia in lant a polimerazei . . .
2.2.6 Enzimele de restrictie . . . . . . . . . . .
2.2.7 Clonarea . . . . . . . . . . . . . . . . . .
3 Grafuri
3.1 Tipuri de grafuri . . . . . . . . . . . . . . . .
3.1.1 Subgrafuri . . . . . . . . . . . . . . . .
3.2 Grafuri ADN . . . . . . . . . . . . . . . . . .
3.2.1 Operatii de baza asupra grafului ADN
3.2.2 Algoritmul implementat de Adelman .
3.2.3 Problema colorarii grafului . . . . . . .
4 Modele de filtrare ADN
4.1 Metode de calcul ADN . . . . . .
4.2 Metode de filtrare . . . . . . . . .
4.2.1 Modelul nerestrictionat . .
4.2.2 Modelul de satisfiabilitate
4.2.3 Metoda de filtrare paralela
4.2.4 Un prim algoritm . . . . .
4.2.5 Permutarile . . . . . . . .

.
.
.
.

.
.
.
.
.
. .
. .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.

3
3
3
5

.
.
.
.
.
.
.
.
.

6
6
9
9
9
10
11
13
15
16

.
.
.
.
.
.

18
18
19
20
20
21
23

.
.
.
.
.
.
.

26
26
26
27
31
32
33
34

4.2.6
4.2.7
4.2.8
4.2.9

Algoritmi de selectie a unei probleme


lema colorarii grafului . . . . . . . .
Problema dumurilor hamiltoniene .
Problema izomorfismului subgrafului
Metoda Sticker . . . . . . . . . . . .

N P complete: Prob. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .

.
.
.
.

35
36
36
37

5 Prezentarea aplicatiei
40
5.1 Aplicatii ale problemei colorarii grafului . . . . . . . . . . . . . . . 40
5.2 Originile limbajului C++ . . . . . . . . . . . . . . . . . . . . . . . . 41
5.3 Tehnici de programare folosite in aplicatia lucrarii . . . . . . . . . . 42
6 Concluzii

48

1
1.1

Introducere
Biologie

Cromozomii sunt responsabili de transmiterea catre urmatoarele generatii a materialului genetic al organismelor celulare. Acesti cromozomi sunt formati
din doua substante, proteinele si ADN-ul, sau acidul dezoxiribonucleic. Intrebarea care i-a macinat pe cercetatori era: care din aceste substante este de fapt
responsabila cu transmiterea informatiei genetice? La inceput, s-a considerat ca
responsabile de transmiterea genomului sunt proteinele, deoarece au o structura
mult mai complexa (contin 20 de aminoacizi) decat ADN-ul (compus numai din
4 aminoacizi), si nimeni nu a recunoscut sau a crezut ca , de fapt, ADN-ul cu
structura sa simpla, transmite, intr- adevar, informatia genetica atat de complexa
catre urmatoarele generatii. ADN-ul uman are in jur de trei miliarde de aminoacizi
(baze), si mai mult de 99 % din ele sunt identice la toti oamenii!
Dogma centrala a bilogiei moleculare este ca aceea ca ADN-ul produce
ARN-ul (Acid ribonucleic), care la randul lui produce proteine. Blocurile de constructie de baza ale informatiei genetice sunt genele. Fiecare gena codifica o anumita proteina si poate fi activa sau deactivata cand este nevoie. proprietatea unei
proteine rezulta dintr-o secventa de amino-acizi pe care aceste le contin. Proteinele
sunt lanturi simple de amino- acizi, legati unul de altul ca margelele intr-un colier.
Exista 20 de aminoacizi diferiti, si dat fiind faptul ca proteinele pot avea de la 50
pana la 500 de aminoacizi, numarul de proteine posibile este imens.
Pionierul geneticii este considerat a fi Mendel, a carui munca si cercetare
asupra plantelor de mazare a dus la recunoasterea oficiala cum ca ambii parinti
sunt responsabili cu contributia materialului genetic asupra progeniturilor sale.
Cercetarile sale au pus bazele geneticii moderne si au ajutat la descoperirea celor
mentionate mai sus.

1.2

Informatica

Termenul informatica desemneaza stiinta procesarii sistematice a informatiei, in special a procesarii cu ajutorul computerelor si provine din alaturarea
termenilor informatie si matematica. Inainte de anii 90, termenul de computer se
3

referea la o persoana care efectua calcule.


Parintele informaticii moderne este Alan Turing. El a creeat o masina,
masina Turing, care reprezinta, practic, o persoana virtuala care executa o procedura bine definita. Masina Turing este echivalenta cu automat cu stiva.
O masina Turing este alcatuita din:
o banda impartita in celule aflate una langa cealalta; fiecare celula contine un
simbol dintr-un alfabet finit; alfabetul contine un simbol special (0) si unul
sau mai multe alte simboluri; banda se deplaseaza la stanga si la dreapta,
adica are masina Turing intotdeauna suficienta banda pentru a efectua calculele; celulele care nu au fost scrise anterior se presupune ca sunt ocupate
cu simbolul vid;
un cap care poate scrie si citi simboluri pe sau de pe alta banda, si care se
poate deplasa la stanga si la dreapta;
un registru de stare care stocheaza starea masinii;
o tabela de actiuni care spune masinii ce simbol sa scrie, cum sa deplaseze
capul si care va fi noua sa stare.
Cu aceasta masina, Turing a adus o generalizare si formalizare a conceptului de algoritm. Fiecare utilizare a computerului din ziua de astazi se datoreaza
lui Turing, deoarece oricine tasteaza la un calculator lucreaza de fapt pe o forma
de masina Turing.
Gratie electronicii digitale (masina Turing era una analogica, mecanica),
urmatoarea etapa din dezvoltarea computerelor a reprezentat-o arhitectura von
Newmann, sau arhitectura cu program memorat. Tuburile electronice au fost inlocuite de tranzistori, mult mai mici si mai eficienti. Mai tarziu, circuitele integrate
a coborat si mai mult dimensiunea calculatorelor. O arhitectura von Newmann
descrie un calculator cu 4 module importante: unitatea aritmetica- logica, unitatea
de control, memoria centrala si dispozitivele de I/E.
Despre calculatoare s-a prezis ca vor ramane extraordinar de mari (ca
greutatea lor va scadea de la 30 de tone, la probabil o tona jumate) pe masura ce
le vor imbunatati performantele, si nu isi vor avea aplicabilitate reala sau meritata
in viata de zi cu zi (exclus deci folositul in mod personal). Realitatea difera in
4

zilele noastre, computerele pe care le avem, fiecare dintre noi, sunt enorm de mici
in comparatie cu primul produs vreodata.
Tot conceptul de calculator are la baza logica de decizie. Toata informatia
este criptata in cifrele 0 si 1, care reprezinta raspunsul da sau nu la anumite
intrebari (de decizie).

1.3

Bioinformatica

In mod traditional, biologia a fost privita mai degraba ca o stiinta observationala, decat ca o stiinta deductiva. Cu toate ca descoperirile recente nu au
influentat aceasta observatie, tipul datelor s-a schimbat dramatic.
Bioinformatica reprezinta aplicarea informaticii si tehnologiei informatiei
in campul biologiei si medicinei. Bioinformatica include algoritmi, tehnologii web,
inteligenta artificiala, inginerie sofware, procesarea imaginilor, statistici e.t.c. Ea
a luat nastere prin creearea si intretinerea unei baze de date ce trebuia sa stocheze
informatii biologice cum ar fi secventele de nucleotide su secventele de amino-acizi.
Principala tinta este de a creste intelegerea proceselor biologice. De exemplu,
imaginati-va ca, asa cum un tranzistor amplifica semnalele electrice, reactia in
lant de polimeraza amplifica mostrele de ADN.
Exista deja multe produse software si unelte de dezvoltare pentru bioinformatica. Ele oscileaza intre unelte cu linii simple de comanda pana la programe
grafice mult mai complexe. Exemple de programe specializate: Bioconductor,
BioPerl, Biophyton, BioJava, BioEclipse, EMBOSS sau BioRubby.
Parintele bioinformaticii este considerat a fi Adelman. El a demonstrat in
laborator solutia unei probleme utilizand instrumente standard de biologie moleculara. Acest experiment (problema Drumurilor Hamiltoniene)a fost starterul interesului pentru calcul ADN. Ulterior lui Adelman, Lipton a demostrat ca mai multe
probleme N P complete pot de asemenea fi rezolvate prin codificarea datelor in
molecule de ADN.

Calcul ADN

Ideea ca celulele vii si moleculele complexe pot fi privite ca niste potentiale


componente mecanice i-a apartinut lui Richard Feynman, cand acesta a publicat
un articol care descria computerele sub-microscopice. Trecerea de la SF la realitate s-a produs in 1994, cand Leonard Adelman i-a preluat ideea si a rezolvat
problema Drumurilor hamiltoniene cu ajutorul calculului ADN. Algoritmul nu a
fost executat cu ajutorul unui computer clasic, pe baza de siliciu, ci, in schimb,
a folosit tehnologia tubului de test ale ingineriei genetice. Prin reprezentarea
informatiei ca secvente de nucleotide ale moleculelor de ADN, el a aratat ca tehnicile de manipulare ale ADN-ului pot fi folosite pentru a rezolva mult mai rapid o
problema data.
Computerele cele mai performante din ziua de azi au capacitatea de a
executa aproximativ trei miliarde de operatii pe secunda. Computerele cu ADN
pot efectua pana la trei sute de miliarde de operatii pe secunda. Secretul? Fiecare
operatie este executata nu pe un singur lant, ci pe amandoua lanturile de ADN
simultan.In calcul biomolecular, informatiile sunt pastrate in biomolecule iar procesarea lor se face cu ajutorul manipularii acestora, prin diferite metode.

2.1

Structura ADN-ului

In majoritatea organismelor vii, materialul genetic este depozitat in ADN,


molecule care sunt responsabile de dezvoltarea si functionarea acelui organism.
Eficienta maxima asupra duplicarii si transmiterii ADN-ului este determinata de
caracteristicile sale structurale si de proteinele participante la proces.
ADN-ul este format din siruri de polimeri, cunoscute ca lanturi ADN.
Fiecare lant trebuie privit ca un lant de nucleotide, baze sau amino-acizi. Cele
patru nucleotide ale ADN-ului sunt adenina, guanina, citozina si timina, abreviate
de obicei cu A, G, C, T. Nucleotidele sunt legate covalent prin zahar si sedimente
fosfate, acestea formand coloana ADN-ului; zaharul si grupul fosfat alterneaza in
coloana ADN-ului si determina directia acestuia: capatul cu un grup de hidroxil
expus al deoxiribozei (zaharul) este cunoscut ca fiind capatul 3 iar cel ce se termina
cu grupul fosfat este denumit ca fiind capatul 5.

Figure 1: ADN dublu inlantuit -Schematic


Structura ADN-ului este dublu inlantuita(Fig. 1, 2), si se formeaza atunci
cand 2 siruri de polimeri se leaga (unesc).

Figure 2: ADN dublu inlantuit


Doua lanturi simple de ADN alcatuiesc un lant dublu, care este stabilizat
de legaturile de hidrogen dintre nucleotide. Structura chimica a bazelor permite o
formare eficienta a legaturilor de hidrogen numai intre A si T sau C si G. Perechea
bazelor A si T se uneste printr-legatura dubla de hidrogen, iar cea dintre C si G,
printr-o legatura tripla. Stabilitatea generala a moleculei de ADN creste odata
7

cu cresterea proportiei perechilor de G-C. Cele doua lanturi simple de ADN sunt
aliniate complementar in directie opusa: lantul principal are o orientare de la 5 la
3, iar lantul complemenatr are orientare opusa, de la 3 la 5 (Fig. 1 ).
Bazele imperecheate pot fi rupte reversibil, procedura esentiala replicarii
ADN-ului. Fortele non- covalente care stabilesc spirala dubla ADN pot fi perturnate complet prin incalzire. procesul de restrangere a structurii native si a
disocierii lantului bicatenar in doua lanturi mono- catenare este numit denaturare. Renaturarea este procesul invers denaturarii: temperatura descreste usor,
iar imperecherea corecta a bazelor poate fi restabilita.
Procesul de legare a doua lanturi simple si de formare a unui lant dublu
este cunoscut sub numele de tratament termic sau hibridizare. Acest tratament
termic trebuie sa asigure o modificare lenta a temperaturii, deoarece o descrestere
brusca forteaza o renaturare rapida(Fig. 3)

Figure 3: Denaturarea si renaturarea ADN-ului

2.2

Operatii cu ADN

Anumite (dar nu toate) calcule ADN folosesc o secventa specifica de operatii


biologice pentru a stabili componentele. Aceste operatii sunt folosite de obicei de
biologii moleculari, iar in continuare, le vom descrie mai amanuntit:
2.2.1

Sinteza

Oligonucleotidele (molecule monocatenare scurte) pot fi sintetizate la comanda de un mecanism de dimensiunea unui cuptor cu microunde. Sinetizatorul
este alimentat cu 4 baze de nucleotide, care sunt combinate in conformitate cu
secventa introdusa de utilizator. Instrumentul face milioane de copii ale oligonucleotidei necesare si le plaseaza intr-o solutie intr-o eprubeta.
2.2.2

Denaturarea, Hibridizarea si Fuzionarea

ADN-ul dublu inlantuit poate fi redus la un singur lant (sau denaturat) prin
incalzirea solutiei la o temperatura determinata de compozitia sirului. Caldura
rupe legaturile de hidrogen dintre sirurile complementare. Deoarece o pereche GC este compusa din 3 legaturi de hidrogen, temperatura necesara pentru a produce
ruptura este usor mai ridicata decat pentru o pereche A- T, compusa din numai 2
legaturi de hidrogen.
Hibridizarea este opusul dizolvarii (topirii),prin care o solutie din siruri
simple este racita, permitand componentelor complementare sa se uneasca intre
ele (Fig. 4)

Figure 4: Topirea si hibridizarea ADN- ului


9

In ADN-ul dublu inlantuit, daca unul dintre componente contine o discontinuitate (o nucleotida nu este legata de vecina ei) atunci aceasta poate fi reparata
de legarea( fuzionarea) ADN-ului. Acest lucru ne permite sa creeam un lant
unitar din mai multe siruri legate impreuna de complementele lor respective. De
exemplu, Fig. 5.a reprezinta 3 componente diferite care pot fuziona, cu o dicontinuitate unde cele 2 componente mai scurte se intalnesc. Ele pot fi reparate de
ligarea ADN-ului (Fig. 5.b), formand un lant dublu unificat (Fig 5.c).

Figure 5: a)3 lanturi distincte; b)Fuzionarea ce repara discontinuitatea; c) Rezultat


2.2.3

Separarea sirurilor

Divizarea este o operatie fundamentala, si presupune extragerea oricarui


sir ce contine o secventa specifica dintr-o eprubeta(Ex: extragerea tuturor componentelor ce contin secventa GCTA). Daca vrem sa extragem componente unice
continand secventa x, am putea crea multe replici ale complementului sau, x.
Atasam acestor oligonucleotide molecule, care de fapt uneste cu o matrice nucleara fixa. Daca turnam continutul eprubetei peste aceasta matrice, sirurile ce-l
contin pe x vor fuziona cu sirurile complementare. Spalarea matricii indeparteaza
toate sirurile care nu au hibrizat), lasand numai sirurile ce-l contin pe x. Acestea
pot fi apoi indepartate din matricea nucleara.

10

Alta tehnica de indepartare(extirpare) presupune folosirea lantului de


separare magnetic. Folosind aceasta metoda, cream din nou oligonucleotidele din
nou, dar de aceasta data le atasam mici particule metalice. Cand oligoelemetele
complementare fuzioneaza cu sirurile dorite(Fig. 6-a), putem folosi un magnet
pentru a extrage particulele(moleculele) din solutie impreuna cu sirurile dorite
lipite de ele (Fig 6-b)

Figure 6: Separarea cu magnetul


2.2.4

Electroforeza gelului

Electroforeza cu gel este o tehinca importanta pentru trierea sirurilor de


ADN dupa marimea lor. Electroforeza este miscarea moleculelor incarcate intr-un
camp electric. Intrucat moleculele de ADN transporta o sarcina negativa, cand
sunt puse intr-un camp electric ele au tendinta de a migra catre polii pozitivi.
Rata de migrare a unei molecule intr-o solutie apoasa depinde de forma ei si de
sarcina electrica. Deoarece moleculele de ADN au aceeasi sarcina pe unitatea de
lungime, ele migreaza in totalitate cu aceeasi viteza in solutia apoasa. Totusi,
daca electroforeza se desfasoara intr-un gel (de obicei compus din agaroza, poliacrilamida sau o combinatie intre cele 2), rata de migrare a moleculei este afectata
de dimensiunea ei. Aceasta se datoreaza faptului ca gelul este o retea densa de
pori prin care moleculele trebuie sa treaca. Moleculele mai mici migreaza deci mai
repede prin gel, deci se sorteaza in functie de dimensiune.
Odata ce gelul este rulat(de obicei in timpul noptii), este necesar sa vedem
rezultatele. Acesta este obtinut prin colorarea ADN-ului cu o vopsea fosforescenta
de bromur de etidiu si apoi gelul este analizat cu ajutorul ultravioletelor. O versiune simplificata este prezentata in Fig. 7.

11

Figure 7: Procesul electroforezei cu gel


Gelurile sunt interpretate dupa cum urmeaza; fiecare banda (1-7 in exemplul nostru) corespunde unei anumite mostre de ADN (folosim termenul tub
in modelul abstract). Putem deci sa manevram mai multe tuburi cu acelasi gel
pentru comparare. Banda 7 este cunoscuta ca banda de marcaj; aceasta contine
diverse fragmente de ADN cu lungimea stiuta, in scopul etalonarii. Fragmentele
de ADN cu aceeasi lungime se grupeaza pentru a forma lanturi orizontale vizibile,
cele mai lungi fragmente formand lanturi in partea de sus a picturii, iar cele mai
scurte in partea de jos. Stralucirea unui anume lant depinde de cantitatea de ADN
a lungimii corespunzatoare prezenta in mostra. Concentratia mai mare de ADN
absoarbe mai multa vopsea, si deci este mai luminoasa. Un avantaj al acestei
tehnici este senzitivitatea sa- cat mai putin din 0.05 g de ADN intr-un singur
lant poate fi vizibil detectat ca fiind fluorescent ( Fig 8).

Figure 8: Electroforeza

12

Dimensiunea fragmentelor din diferite benzi este aratata in dreapta benzii


de etalon, si se masoara in perechi de baza(b.p.). In exemplul nostru, cea mai mare
banda solubila de gel este 2.036 b.p. , iar cea mai mica este de 134 b.p. Miscarea de
la dreapta la stanga (circuitul 6-1) este o serie de PCR(Polymerase chain reaction)
care au fost montate ADN diluat progresiv (134b.p.) pentru a senzitivitatea unei
reactii. Diluarea fiecarui tub este evidenta de la decolorarea benzilor, care eventual
dispar in banda 1.
2.2.5

PCR: Reactia in lant a polimerazei

Polimerazele ADN-ului indeplinesc mai multe functii, inclusiv repararea si


duplicarea ADN-ului. Dat fiind un oligoelement initial scurt, p, in prezenta unor
trifosfati de nucleotide (nucleotida de rezerva), polimeraza extinde p numai si
numai daca p este legat de un model mai lung de oligo, t. De exemplu, in Fig.
9.a, p este oligoelementul TCA care este legat de t, ATAGAGTT. In prezenta
polimerazei, p este marit de un sir complementar de baze de la sfarsitul lui 5 spre
3 din t.(Fig.9.b) Alta metoda folositoare pentru manevrarea ADN-ului este reactia
in lant a polimerazei sau PCR. PCR este un proces care amplifica rapid cantitatea
de ADN intr-o solutie data. Fiecare ciclu al reactiei dubleaza cantitatea fiecarui
sir, dand o crestere exponentiala in numarul sirurilor. PCR angajeaza polimeraza
sa faca replici ale unei anumite regiuni (sau secventa- tinta)ale ADN-ului care se
afla intre 2 secvente cunoscute. Remarcati ca secventa tinta (care poate fi in jur de
3,000 b.p.) poate fi necunoscuta inainte. Pentru a mari modelul ADN cu regiuni
cunoscute (probabil la oricare capat al sirului), vom modela intai primerii (amorsa
/piston/preionizator) inainte si inapoi (care merg de la 5 la 3 pe fiecare sir).

Figure 9: a) Primerul fuzioneaza la un sablon mai lung; b) polimeraza se extinde


in directia 5- 3
13

Adaugam apoi o cantitate mare de primer in exces (relativa la cantitatea


de ADN ce urmeaza a fi reprodusa) solutiei si o incalzim pentru a denatura modelul
sirului dublu(Fig 10.a). Racind solutia permitem apoi primerilor sa fuzioneze
cu secventele tinta (Fig 10.b). Apoi adaugam polimeraza. In acest caz, folosim
polimeraza Taq derivata din bacteria termofila Thermus aquaticus, care traieste
in medii caduroase. Asta inseamna ca polimeraza lor functioneaza mai bine la
temperaturi inalte, si este sigur chiar aproape de punctul de fierbere (Taq este in
siguranta la 94 grade C). Rolul acestei stabilitati este ca este nevoie ca polimeraza
sa fie adaugata odata, la inceputul procesului, si ramane activa in continuare.

Figure 10: PCR


Aceasta faciliteaza cea mai usoara automatizare a procesului PCR, unde ingredientele sunt asezate intr-o piesa a aparatului numita ciclu termic, si nicio interventie umana ulterioara nu mai este necesara. Polimeraza extinde apoi primerii,
dand nastere unei copii identice a modelului de ADN(Fig. 10c). Daca plecam de la
un singur model, atunci desigur ca acum avem 2 replici (Fig. 10.d). Daca repetam
apoi ciclul de incalzire, fuzionare si polimerizare, este normal ca aceasta apropiere
14

sa produca un numar exponential de replici ale modelului. Un numar normal de


cicluri ar fi 35, producand(presupunand un singur model) in jur de 68 de miliarde
de copii ale secventei- tinta( de exemplu, o gena).
2.2.6

Enzimele de restrictie

Endonucleazele de restrictie (des mentionate ca enzime de restrictie) recunosc


o secventa specifica de ADN cunoscuta ca o zona de restrictie. Orice ADN ce
contine zona de restrictie in secventa sa este intrerupt de enzime in acel punct.

Figure 11: a)ADN dublu inlantuit; b) ADN restrictionat de enzime; c) Rezultat


De exemplu, ADN-ul dublu- inlantuit din Fig 11.a este intrerupt de enzimele de restrictie RsaI, care recunoaste zona de restrictie GTAC. Enzimele rup
(sau separa) ADN-ul la jumattaea zonei de restrictie. Anumite enzime ca RsaI lasa
un capat bont al ADN-ului. Altele pot lasa capete lipicioase. De exemplu, ADN-ul
dublu- inlantuit din figura 1.14a este intrerupt de enzima de restrictie Sau3AI, care
recunoaste zona de restrictie GATC (Fig 11. b). Capetele lipicioase care rezulta
sunt numite asa din cauza ca sunt apoi libere sa fuzioneze cu complementul lor.

15

Figure 12: a) Adn-ul dublu inlantuit restrictionat de SAU3AI; b) Capetele lipicioase care rezulta
2.2.7

Clonarea

Odata ce structura moleculei de ADN a fost elucidata iar procesul transcriptiei sau translatiei au fost intelese, biologii moleculari au fost frustrati de lipsa
tehnicilor potrivite pentru experimente care ar facilita o examinare in detaliu a
materialului genetic..
Clonarea este definita, in general, ca producerea de multiple copii identice
ale unei singure gene, celule, virus sau organism. In cazul calculelor moleculare,
clonarea ne permite deci sa obtinem mai multe copii de secvente specifice de ADN.
Acest lucru este posibil astfel:
Secventa specifica este introdusa intr-o molecula de ADN circulara, cunoscuta ca vector, producand o molecula ADN recombinata . Acest lucru este efectuat
prin separarea vectorului ADN dublu inlantuit si sirul tinta cu aceeasi enzima de
restrictie. Din moment ce vectorul este dublu-inlantuit, restrictiile cu enzimele
potrivite produc 2 regiuni cu un singur sir scurt la fiecare capat al moleculei( capatul lipicios). Acelasi lucru se aplica si sirului tinta. Procesul de insertie este
reprezentat in Fig 12. Vectorul si tinta sunt amandoua supuse restrictiei; apoi,
o populatie de siruri tinta este introdusa in solutia ce contine vectorul. Capatul
lipicios al tintei se uneste cu capatul lipicios al vectorului, integrand tinta in vector. Dupa ligare, noi molecule dublu- inlantuite sunt prezente, fiecare continand o
16

noua secventa-tinta.

Figure 13: Inserarea componentei tinta in vectorul ADN

17

Grafuri

Graful, asemenea arborelui, reprezinta o structura in care relatia dintre nodul


parinte si nodul fiu este una ierarhica; un nod poate avea mai multi succesori, dar
si mai multi predecesori.
Graful este larg utilizat in domeniile: cibernetica, matematica, chimie,
retelelor de transport pentru optimizarea traseelor, circuitelor electronice pentru simularea functionarii corecte, inteligentei artificiale si, nu in ultimul rand, in
domeniul aplicatiilor software.
Graful este o pereche G=(V, E), unde multimea V= {v1 , v2 , ..., vn }
reprezinta multimea varfurilor grafului, iar multimea E ={e1 , e2 , ..., en } reprezinta
multimea formata din submultimi a doua elemente din V. O muchie are forma e=
{uv}. Numarul varfurilor unui graf reprezinta gradul acelui graf.
Exemplu de graf: multimea nodurilor V= {v1 , v2 , v3 , v4 } si multimea muchiilor
E= {v1 v3 , v2 v3 , v2 v4 , v3 v4 } (Fig. 14).

Figure 14: Diagrama unui graf

3.1

Tipuri de grafuri
Graful este de mai multe feluri, fiind clasificat in functie de:

directia arcelor; in cazul in care arcele dintre nodurile grafului sunt nedirectionate, graful este neorientat; cand exista sens intre doua noduri Vi si Vj
si arcul este directionat (Ni Nj ), atunci graful este unul orientat;

18

Figure 15: Graf orientat si neorientat


greutatea arcelor; daca oricare arc dintre doua noduri ale grafului are asociata o valoare numerica (care reprezinta de cele mai multe ori distanta, durata
de timp sau costul), atunci graful este cu greutate; in cazul in care arcele
nu au asociate valori numerice, graful este unul fara greutate;
existenta arcelor; daca intr-un arc nu exista niciun varf izolat, atunci graful este conectat; daca exista cel putin un nod izolat, atunci graful este
neconectat;
3.1.1

Subgrafuri

Fie G={V, E} un graf. Un subgraf al lui G este un graf G= {V, E} cu


proprietatea ca V V si E E.
Exemplu: considerand graful din Fig. 14, reprezentam doua subgrafuri
G1 , G2 ale grafului G. Graful G1 este format din multimea varfurilor {v2 , v3 , v4 },
in vreme ce G1 nu area aceleasi noduri, deoarece muchia {v2 v3 } lipseste (Fig 16).

Figure 16: Subgrafurile G1 , G2


ale grafului G

19

3.2

Grafuri ADN

Un graf ADN reprezinta mai multe polinucloetide unite prin hibridizarea


Watson- Crick.
Formal, un graf ADN este un graf conectat, cu varfuri etichetate din
alfabetul ADN, = {A, C, G, T} si cu muchii etichetate fie cu denumirea de
coloana, fie cu cea de pereche de baza. Muchiile coloana sunt directionate, indicand
directia 5 spre 3, in timp ce muchiile pereche de baza sunt nedirectionate si
sunt de tip Watson- Crick. Mai mult, fiecare varf dintr-un graf ADN are cel mult
o muchie de intrare si una de iesire de fiecare tip. Exista 10 grafuri ADN cu doua
muchii coloana si doua muchii pereche de baza (Fig. 17). Grafurile ADN pot
reprezenta o varietate de structuri ADN bogata.

Figure 17: Cele 10 subgrafuri Watson- Crick


3.2.1

Operatii de baza asupra grafului ADN

Sunt introduse trei operatii de baza asupra grafurilor ADN:


Hibridizarea: se iau doua grafuri ADN, D1 si D2 si se asigura un graf ADN
combinat D3, D3= D1+D2, prin formarea muchiilor perechi de baze unind
varfurile din D1 cu varfurile din D2.
Procesul de legare: se considera un graf ADN D si se produce un graf ADN
D= -D prin adugare de muchii coloana care leaga varfurile in D.
Denaturarea: se alege un graf ADN D si se dobandeste un set de grafuri
ADN, D = Di , fiecare fiind componenta a coloanei D fara muchii perechi
de baza.
20

Exemplu: se considera doua grafuri ADN cu capete lipicioase complementare (Fig 18). Hibridizarea produce un graf ADN combinat. Dupa procesul
de legare, graful ADN este denaturat, rezultand doua lanturi simple.

Figure 18: Hibridizarea, legarea si denaturarea a 2 grafuri ADN


3.2.2

Algoritmul implementat de Adelman

Leonard Adelman a folosit capacitatea incredibila de stocare a ADN-ului pentru a implementa algoritmul drumurilor Hamiltoniene. Acest algoritm presupune
gasirea unui drum printr-un graf care trece prin fiecare varf o singura data.
Abordarea sa era simpla:
Genera siruri ce codificau drumurile aleator astfel incat problema era reprezentata cu probabilitate mare. Cantitatile de ADN folosite depaseau cu mult
necesarul pentru un graf mic , asa ca mai degraba existau mai multe siruri
care codificau drumurile .

21

Sterge toate sirurile care nu codifica drumurile hamiltoniene.


Se verifica sirurile care codifica drumurile.

Figure 19: Solutia lui Adelman


Pasii individuali au fost implementati dupa cum urmeaza:
1. Fiecarui varf si muchie i-a fost asociata o secventa distincta de ADN. Secventele reprezentand muchiile se comporta ca niste atele intre sirurile ce marcheaza
capetele. In termeni formali, secventa asociata cu muchia i j este 3 10mer la secventa ce reprezinta vi , urmata de a 10-a mer 5 a secventei reprezentand vj . Aceste oligonucleotide au fost apoi combinate pentru a forma siruri
ce codifica aleator drumuri prin graf. O cantitate fixa de oligonucleotide
au fost amestecate intr-o singura operatie de legare. La finalul reactiei, se
presupune ca un sir ce reprezinta un drum hailtonian este prezent cu o posibilitate mare. Aceasta abordare rezolva problema generarii unui numar exponential ale diferitelor rute folosind un numar polinomial de oligoelemente
initiale.
2. PCR a fost folosit initial pentru a amplifica masiv populatia de oligonucleotide ce codifica rutele ce incep de la v1 pana la v7 . Apoi, sirurile care
nu codifica exact n cai au fost eliminate. Rezultatul amplificarii PCR-ului
a rulat pe gel de agaroza pentru a izola sirurile de lungime 140 b.b. Apoi a
urmat o serie de pasi blanzi de purificare care au avut rolul de a izola sirurile
ce codifica drumurile care au vizitat fiecare varf o singura data.
3. PCR care a ramas a fost folosita pentru a identifica singurul drum hamiltonian pe care acest tip de problema il furnizeaza. Pentru un graf cu n varfuri,
22

executam n - 1 reactii PCR, cu sirul care reprezinta v1 ca primerul din stanga


si complementul sirului care reprezinta vs ca primerul din dreapta din zona
cu numarul em i.
Importanta experimentului lui Adelman a venit din faptul ca a fost primul
care a demonstrat in laborator posibilitatii calculului cu ajutorul ADN-ului. Cu
toate acestea, remarcam ca a fost executat cu o singura instanta a problemei, si
cu un singur drum hamiltonian.
3.2.3

Problema colorarii grafului

Problema colorarii grafului este una dintre cele mai vechi si mai intens studiate probleme din cadrul Combinatoricii si Algoritmicii. Cerinta acestei probleme
(problema colorarii nodurilor) este de a colora varfurile grafului astfel incat doua
noduri adicacente sa nu aiba aceeasi culoare.DIn punct de medere matematic, colorarea grafului devine interesanta numai daca restrictionam numarul de culori la
o multime finita S.
Formal, o k- colorare a grafului G este o functie : V (G) {1, 2, ..., k}
care satisface relatia (i) 6= (j) pentru orice muchie e= ij. Se spune despre graf
ca este k- colorabil daca exista o astfel de functie. Numarul cromatic xG este
numarul minim de culori k pentru caregraful este k- colorabil, si spunem ca G este
k- cromatic daca xx(G)= k.
Problema colorarii varfurilor unui graf are multe date si teoreme:
Un graf este 2- colorabil (cunoscut de asemenea si sub denumirea de graf
bipartit) numai si numai daca nu contine un numar impar de cicluri.
Decizia ca un graf 3- colorabil ( sau k- colorabil pentru oricare k3) este o
problema NP- completa si gasind numarul cromatic este # P-completa.
Teorema colorarii grafului cu 4 culori sustine ca fiecare graf plan este 4colorabil
Cum se poate determina numarul cromatic al unui graf dat? Ideea este
simpla: selectam doua noduri i, j din V(G) fara nicio muchie intre ele. Putem
clasifica colorarile in doua categorii:
23

care il au pe i, j colorate diferit; se adauga o muchie intre i, j si devine G+ij.


Adaugarea muchiei ne asigura ca, culorile asociate celor doua noduri sunt,
intr-adevar, diferite.
care il au pe i, j colorate la fel; i, j sunt unificate si reprezinta un singur nod,
deci sunt fortate sa aiba aceeasi coloare. Aceasta metoda se mai numeste
reducerea lui i, j si se noteaza Gij.

Figure 20: Un exemplu de colorare a grafului


Abordare din punct de vedere molecular presupune construirea unei librarii initiale de culori: pentru fiecare nod v1 V , vom sintetiza o singura oligonucleotida pentru a reprezenta fiecare vi = rosu, vi = verde, vi = albastru. Fiecare
muchie este o molecula dublu- inlantuita. Pentru fiecare muchie avem exact sase
molecule dublu- inlantuite, fiecare reprezentand o pereche de culori distincte la capatul muchiei moleculei. Acum, pentru a forma graful, toate moleculele- muchii si
toate nodurile sunt combinate si capetelor lor compatibile li se permite sa formeze
ADN-ul dublu inlantuit. Odata formate, muchiile se unesc prin etansarea tuturor
crestaturilor din lanturile ADN cu ajutorul operatiei de legare.
Solutia la problema 3- colorarii garfului se poate afla prin urmarea pasilor:
Se combina toate blocurile de constructie ale nodurilor cu toate muchiile intrun singur test de tub si se i permite capatului complementar sa hibrideze si
sa fie legat.
Se determina daca structura ADN a grafului s-a format din:

24

1. Se elimina partial structura ADN-ului format cu capete deschise care


nu s-au potrivit.
2. Din graful format la pasul anterior, se elimina prin electroforeza gelului
grafurile care sunt mai mari decat graful initial.
3. Daca mai sunt structuri de graf in tubul de test, atunci tragem concluzia
ca graful este 3- colorabil.

25

Modele de filtrare ADN

4.1

Metode de calcul ADN

In functie de natura operatiilor pe care le contin, metodele de calcul ADN se


impart in 3 categorii:
1. Filtrare; in toate metodele de filtrare, calclucul consta dintr-o secventa
de operatii pe multimi finite de siruri de caractere. Este normal cazul in
care calculul incepe si se termina cu o singura multi- multime. In timpul
calculelor, prin aplicarea de operatii permise ale unei metode, pot exista mai
multe multi- multimi in acelasi timp.
2. Separare; din moment ce orice instanta a oricarei probleme din din clasa NP poate fi exprimata ca o instanta a oricarei probleme N P- complete, rezulta
ca operatiile multi-multimilor trebuie sa fie capabile sa furnizeze suficienta
putere de calcul pentru a rezolva orice problema N P. Asa - zisa metoda de
separare furnizeaza suficienta compatibilitate Turing.
3. Constructive; o arie importanta de cercetare care se remarca este cautarea
algoritmilor care actioneaza asupra dimensiunii polinomiale ale multimilor
de caractere (de exemplu, cantitatea de ADN). Este o certitudine faptul
ca filtrarea nu suporta astfel de algoritmi, din moment ce ea se bazeaza pe
existenta dimensiunii exponentiale ale multimii de siruri de caractere.

4.2

Metode de filtrare

In toate modelele de filtrare (definite de Adelman si generalizate de Lipton


si Amos), un calcul este o secventa de operatii asupra multi- multimilor finite de
siruri de caractere. Multi- multimile sunt multimi care contin mai multe copii ale
aceluiasi element. Normal este cazul in care un calcul incepe si se termina cu un
singur multi-set. Fara calcul, prin aplicare de operatii permise asupra unui model,
mai multe multi - multimi pot exista in acelasi timp. Vom descrie operatiile asupra
multi- multimilor dupa ce von detalia natura multimii initiale.
O multi -multime initiala este alcatuita din stringuri care au de obicei
lungimea O(n) , unde n este dimensiunea problemei. Ca si submultime, muti26

multimea initiala ar trebui sa includa toate solutiile posibile (fiecare codificata de


un sir de caractere) ale problemei ce urmeaza a fi rezolvata. Ideea de aici este
ca super multimea, in orice implementare a modelului, este, in principiu, relativ
usor de generat ca un punct de incepere pentru un calcul. Calculul continua apoi
cu filtrarea multimilor de caractere care nu pot fi o solutie. De exemplu, calculul
poate incepe cu o multi- multime ce contine siruri de caractere care reprezinta
toate cele 3 colorari posibile ale unui graf, si merge mai departe cu inlaturarea
acelora care codifica colorari incorecte.
Pentru a da un alt exemplu, daca problema cere sa se genereze o permutare
ale numerelor intregi 1...n , atunci multi- multimea initiala ar putea contine toate
sirurile de caractere de forma p1 i1 p2 i2 ...pn in unde fiecare ik poate fi oricare din
numerele intregi cuprinse in intervalul [1, ...n] si pk codifica informatia pozitia
k . Pentru exemplul nostru cu permutarea, ar trebui sa filtram toate sirurile de
caractere in care acelasi intreg apare in cel putin 2 locatii pk . Oricare din sirurile
de caractere care raman este atunci o solutie viabila a problemei.
4.2.1

Modelul nerestrictionat

Adelman a generat impulsul pentru munca sa recenta prin solutia experimentala a problemei Drumurilor Hamiltoniene. Totusi, aceasta solutie nu a fost
rezolvata prin modelele normale de calcule. Lipton i-a aratat lui Adelman cum
poate include solutiile unui alte probleme N- P. Aici vom rezuma operatiile in
modelul nerestrictionat a lui Adelman ulterior. Toate operatiile sunt efectuate pe
multimi de caractere ale unui alfabet .
separarea (T, S). Fiind data o multime T si o subsir de caractere S, se
creeaza 2 multimi noi + (T, S) si -(T, S), unde +(T, S) sunt toate sirurile
de caractere din T care il contin pe S , iar -(T, S) sunt sirurile de caractere
din T care nu il contin pe S.
combinarea. Fiind date multimile T1 , T2 , ...Tn , se creeaza (T1 , T2 , ...Tn ) =
T1 , T2 , ...Tn .
identificarea. Fiind data o multime T, se returneaza true daca T e nevida,
in caz contrar se returneaza false.

27

De exemplu, fiind dat = {A, B, C}, algoritmul care urmeaza returneaza


true numai daca multimea initiala contine un sir compus numai din caracterul A:
Input(T)
T - (T, B)
T - (T, C)
Output((T))
Adelman descrie un algoritm pentru problema colorarii grafului. Pentru a
obtine o culoare potrivita a unui graf G=(V, E), culorile sunt asociate astfel incat
2 noduri adiacente sa nu aiba aceeasi culoare.

Figure 21: Un primer

28

Vom descrie acum algoritmul lui Adelman in detaliu. Multimea initiala,


T, este formata din siruri de caractere de forma c1 , c2 , ..., cn , unde ci {ri , gi , bi } si n
este |V |, numarul de varfuri din graful G. Astfel, fiecare sir de caracter reprezinta o
posibila (dar nu neaparat favorabila) colorare a grafului dat. Prin referire la Fig 2,
culoarea reprezentata in (c) ar putea fi codificata de sirul de caractere b0 , g1 , b2 , r3 ,
iar colorarea la (d) ar fi codificata de b0 , g1 , r2 , r3 .
Sa presupunem ca toate colorarile posibile sunt reprezentate in T. Algoritmul functioneaza astfel:
1. se citeste multimea initiala T
2. pentru fiecare nod executa
3.

din T, se creeaza canalul rosu ce contine sirurile de caractere ce codifica


nodul rosu, si se creeaza canalul albastru/verde ce contine
toate celelalte siruri

4.

se creeaza canalul albastru din canalul albastru/verde, si se creeaza


tubul rosu din sirurile ramase

5.

pentru toate muchiile adiacente acestui nod executa

6.

din nodul rosu se elimina sirurile de caractere ce codifica


nodul adiacent rosu

7.

din nodul albastru se elimina sirurile ce codifica


nodul adiacent albastru

8.

din nodul verde se elimina sirurile ce codifica


nodul adiacent verde

9.
10.

end for
se combina rosu, verde si albastru pentru a forma noul canal T

11. end for


12. se citeste ce a ramas in T
29

Sau, reprezentat mai simplu:


1. Intrare (T)
2. for i =1 to n do begin
3.

Tr +(T, ri ) and Tbg (T, ri )

4.

Tb +(Tbg , bi ) and Tg (Tbg , bi )

5.

pentru fiecare j astfel incat <i, j > E do begin

6.

Tr (Tr , rj )

7.

Tg (Tg , gj )

8.

Tb (Tb , bj )

9.
10.

end for
T combina( Tr , Tg , Tb )

11. end for


12. Iesire (identifica(T ))
La pasul 1 am introdus ca date de intrare toate colorarile posibile ale grafului.
Atunci, pentru fiecare nod vi V executam urmatorii pasi: impartim T in 3
multimi, Tr , Tg , Tb , unde Tr contine stringurile ce contin ri , TG continand numai
sirurile gi si Tb ce contine numai sirurile bi (pasii 3-4). Apoi, pentru fiecare muchie
<i, j>E, vom elimina din aceste multimi orice string ce contine ci = cj (de
exemplu, acele stringuri ce codifica colorarea unde nodurile adiacente i, j sunt
colorate la fel) (pasii 5-9). Dupa aceea, aceste multimi sunt combinate, formand
noua multime T (pasul 10), iar algoritmul trece la nodul urmator (pasul 11). Dupa
ce colorarea fiecarui nod a fost satisfacuta, vom demara o detectie (pasul 12). daca
T este nevida, atunci orice sir de caractere din T codifica o anumita 3-colorare a
grafului G.

30

4.2.2

Modelul de satisfiabilitate

Lipton a descris o solutie pentru o alta problema de tip N P, asa- numita


problema de satisfacere (SAT). SAT poate fi intrerpretata ca: fiind dat o multime
finita V = {v1 , v2 , ..., vn } de variabile logice, vom defini o litera ca fiind o variabila
vi sau complementul sau vi ; daca vi este adevarat, atunci vi este fals si vice- versa.
Definim o clauza (propozitie), Cj ca fiind un set de litere. O instanta, I, a SAT este
formata dintr-o multime de propozitii. Problema este sa asociem o valoare booleana
fiecarei variavile din V astfel incat cel putin o variabila din fiecare propozitie sa
aiba valoarea adevarat. Acesta este momentul in care putem spune ca I a fost
satisfacuta.
Cu toate ca Lipton nu defineste in mod explicit operatiile cu multimi,
solutia sa poate fi exprimata in termenii operatiilor descrise de Adelman. Lipton
foloseste operatiile combina, separa si detecteaza. Multimea initiala T contine
multe siruri de caractere, fiecare codificand o secventa de n- biti. Toate secventele
posibile de n- biti sunt reprezentate in T.
Algoritm functioneaza astfel:
1. Se creeaza multimea initiala T
2. Pentru fiecare propozitie executa incepe
3.

pentru fiecare litera vi executa incepe

4.

daca vi = xj extrage din T sirurile ce codifica vi = 1 altfel

5.

extrage din T sirurile ce codifica vi = 0

6.

sfarsit pentru

7.

creeaza o noua multime T prin combinarea sirurilor extrase

8. sfarsit pentru
9. daca T este nevida atunci I este satisfacator

31

4.2.3

Metoda de filtrare paralela

Acest model a fost primul care a furnizat un cadru formal pentru o mai
facila descriere a algoritmilor ADN pentru orice problema a clasei N P complete.
Aici vom descrie oeratiile de baza pe multimile acestei metode. Alegerea noastra
este determinata de ceea ce stim ca poate fi implementat de niste reactii chimice
complete si foarte precise asupra lantului ADN. Principala diferenta dintre filtrarea
paralela si cea de mai sus se afla in implementarea extragerii sirurilor de caractere.
Toate celelalte modele promovau pasii emphsepararii, unde sirurile de caractere
erau pastrate, si puteau fi folosite mai tarziu in calcule. In metoda filtrarii paralele,
sirurile eliminate sunt aruncate, si nu mai pot face parte din calcule. Aceasta
metoda este primul exemplar al asa numitei marcheaza si distruge din calculele
moleculare.
sterge(U, {Si }). aceasta operatie elimina din multimea U, orice sir de caractere care contine cel putin o aparitie a oricarui substring si . Aceasta operatie
este compusa dintr-un set de alte operatii, dupa cum urmeaza:
marcarea (U, S). Aceasta operatie marcheaza toate sirurile din multimea U care contin cel putin o aparitie a subsirului S.
distruge (U). Aceasta operatie distruge toate sirurile marcate din multimea U.
marcarea (U, S) este implementata prin adaugarea la U a mai
multor copii ale primerului corespunzator lui S (Figura 22 b). Primerul
hibrideaza numai cu lanturile simple ce contin subsecventa S. Adaugam
apoi polimeraza ADN-ului pentru a extinde primerii odata ce au hibrizat, formand lanturi duble numai sirurilor ce il contin pe S.
Putem apoi distruge sirurile ce il contin pe S prin adaugarea enzimelor de restrictie Sau3AI. ADN-ul dublu inlantuit este taiat la
zonele de restrictie integrate in el, sirurile singure ramanand intacte.
Apoi putem sa eliminam toate sirurile intacte prin separarea pe lungime
folosind electroforeza gelului.

32

Figure 22: Implementarea functiei distruge


uniunea ({Ui , U}). Aceasta operatie multimea U care este multimea reunita
a multimilor Ui
copierea (U, {Ui }). Aceasta operatie produce un numar de copii, Ui , ale
multimii U
selectarea(U). Aceasta operatie selecteaza un element aleator din U ; daca U
este multime vida, atunci se returneaza 0.
4.2.4

Un prim algoritm

Vom descrie acum primul algoritm caracteristic metodei. Problema care


trebuie rezolvata este ceea a generarii multimii tuturor permutarilor numerelor
intregi de la 1 la n. o permutare este o rearanjare a elementelor multimii, unde
niciunul dintre ele nu este eliminat, adaugat sau schimbat. Multimea initiala
si filtrarea sirului de caractere care nu puteau fi permutate au fost descrise mai
devreme.
Descrierea algoritmului de mai jos introduce un format pe care il vom
utiliza si in alte parti. Componenta particulara a copierii unei multimi (ca in

33

copieaza(U, {U1 , U2 , .., Un })), urmata de eliminarea operatiilor (ca in elimina (Ui ,
{pj 6=i, pk i}) este o operatie de compunere foarte folositoare.
4.2.5

Permutarile

Sa se genereze o multime Pn ale tuturor permutarilor numerelor intregi {1, 2, ..,


n}
Solutie:
Intrare: Multimea de intrare U este formata din toate stringurile de forma
p1 i1 p2 i2 ...pn in unde, pentru fiecare j, pj unice se codifica pozitia j iar fiecare
ij se afla in {1, 2, ..., n}. Asadar fiecare sir de caractere este format din n
intregi cu mai multe (posibile) aparitii ale aceluiasi intreg.
Algoritmul
pentru j =1 la n - 1 executa
Incepe
copiaza(U, {U1 , U2 , .., Un })
pentru i = 1, 2, .., n si k > j
executa in paralel elimina (Ui , {pj 6=i, pk i})
uniune ( {U1 , U2 , .., Un }, U )
sfarsit
Pn U
Complexitatea: O(n) in timp paralel
Dupa iterarea j a buclei for, calculul se asigura ca in sirurile care au
ramas intregul 1j nu se dubleaza la pozitia k > j din sir. Intregul l 1j poate fi
oricare din multimea {1, 2, .., n}. La terminarea calculului, fiecare din sirurile
ramase vor contine exact o instanta a fiecarui intreg din multimea {1, 2, .., n}. si
astfel reprezinta una din permutarile posibile. Fiind data intrarea specifica, este
usor de observat ca Pn va fi multimea tuturor permutarilor ale primelor n numere.

34

4.2.6

Algoritmi de selectie a unei probleme N P complete: Problema


colorarii grafului

Vom descrie acum un set de algoritmi de teoria grafurilor pentru rezolvarea


porblemelor N P complete. Problemele din clasa de complexitate N P par sa aiba
o expresie naturala si sa usureze gasirea solutiilor:
Problema: utilizarea a 3 culori
Fiind dat un graf G = (V, E), gasiti nodurile colorate daca exista, in caz
contrar returneaza zero.
Solutie:
Date de intrare: Multimea initiala U formata din toate stringurile de forma
p1 c1 p2 c2 ...pn cn unde n=|V | este numarul de noduri din graf. Pentru fiecare
i, pi codifica pozitia i, iar fiecare ci reprezinta una dintre culori, 1, 2
sau 3. Fiecare asemenea string reprezinta o posibila asociere a culorilor cu
nodurile grafului.
Algoritm:
pentru j =1 la n executa
Incepe
copiaza(U, {U1 , U2 , U3 })
pentru i = 1, 2, 3 si k astfel incat (j, k ) E
executa in paralel elimina (Ui , {pj 6=i, pk i})
uniune ( {U1 , U2 , U3 }, U )
sfarsit
selecteaza (U )
Complexitatea: O(n) in timp paralel
Dupa iterarea j a buclei for,l se asigura ca in varfurile care au ramas i j (desi
poate fi colora cu 1, 2 sau 3, depinzand de care din multimile Ui au ramas)
nu exista noduri adiacente care au aceeasi culoare. Deci, cand algoritmul se
incheie, U codifica numai culorile posibile daca exista. De asemenea, fiecare
colorare viabila va fi reprezentata in U.
35

4.2.7

Problema dumurilor hamiltoniene

Problema: Drumurile Hamiltoniene


Un drum Hamiltonian intre oricare 2 noduri u, v ale unui graf este un graf care
trece prin fiecare nod din V{u, v} o singura data.
Fiind dat un graf G=(V, E) cu n noduri, sa se determine daca G contine un
drum Hamiltonian. Solutie:
Date de intrare: multimea de intrare U este multimea Pn ale tuturor permutarilor numerelor intregi de la 1 la n ca si datele de iesire de la Problema: Permutarile. Un numar intreg i la pozitia pk intr-o permutare, se
interpreteaza astfel: sirul de caractere reprezinta o solutie ce candideaza la
problema in care nodul i este vizitat la pasul k.
Algoritm:
pentru 2 i n -1 si j, k astfel incat (j, k )
/E
executa in paralel elimina (U, {jpi k})
selecteaza (U )
Complexitate: constanta paralela a timpului dat Pn
In stringurile ramase este o muchie a grfului pentru fiecare pereche consecutiva
de noduri din sirul de caractere. Din moment ce sirul de caractere este tot o permutare a multimii nodurilor trebuie, de asemenea, sa fie si un drum Hamiltonian.
Desigur, U va contine toate solutiile viabile ale problemei.
4.2.8

Problema izomorfismului subgrafului

Fiind date 2 grafuri G1 , G2 , urmatorul algoritmul verifica daca G2 este subgraf al


lui G2 .
Problema: izomorfismul subgrafurilor
Este G2 = (V2 , E2 ) un subgraf al lui G1 = (V1 , E1 )? Prin {v1 , v2 , ..., vs } intelegem multimea nodurilor din G1 ; in mod asemanator, multimea nodurilor din
G2 este {u1 , u2 , ..., us } unde luam t s.
Solutie:

36

Date de intrare: multimea de intrare U este multimea Ps a iesirilor permutarilor din algoritmul permutarilor. Pentru 1 j t un element p1 i1 p2 i2 ...ps is
din multimea Ps este privit ca nodul asociat pj {u1 , u2 , .., ut } al lui ij
{v1 , v2 , .., vs }. Algoritmul este proiectat pentru a inlatura orice element care
catalogheaza nodurile v1 in V2 intr-un mod care nu reflecta cerinta initiala
ca daca (ps , pt ) E1 , atunci (is , it ) E2 .
Algoritm:
pentru j =1 la t- 1 executa
incepe
copiaza (U, {U1 , U2 , ..., Ut })
pentru fiecare l, j l t astfel incat (pi , pl ) E2 si (ii , il )
/ E1
in paralel executa elimina (Uj , {pl il })
uniune ({U1 , U2 , ..., Ut },U )
sfarsit
selecteaza (U )
Complexitate: O(|Vs |)
Pentru fiecare sir ramas, primele t perechi pl il reprezinta o asociere unula- unu ale nodurilor lui G1 cu nodurile G2 indicand subgraful lui G1 , care
este izomorf la G2 . Daca selecteaza (U ) returneaza zero, atunci G2 nu este
subgraf al lui G1
4.2.9

Metoda Sticker

Vom introduce acum o metoda alternativa de filtrare, numita metoda sticker.


In cadrul acestui model, operatiile sunt efectuate pe multi-multimi de siruri de
caractere in alfabetul binar {0, 1}. Sirurile de memorie au lungimea n de caractere
si contin k substringuri nesuprapuse de lungime m. Fiecare subsir corespunde unei
variabile Booleene (sau bit), deci in metoda fiecare subsir este on sau off.
Vom descrie in continuare operatiile metodei sticker. Ele sunt similare
celor descrise mai sus, deci pastram acelasi sistem general de notatie. Un tub este
o multi- multime, membrii ei fiind siruri de memorare.
37

combina: creeaza o uniune a multi- multimilor celor doua tuburi.


separa (N, i). Fiind dat un tub N si un numar intreg i, se creeaza doua noi
tuburi +(N, i) si -(N, i) unde +(N, i) contine toate sirurile din N cu subsirurile i setate pe on, iar -(N, i ) contine toate stringurile din N cu subsirurile
i setate pe off.
porneste (N, i). Fiind data un tub N si un intreg i, se creeaza o noua multime
de tuburi (N, i) in care subsirul cu numarul din fiecare lant de memorie
este pornit.
curata (N, i). Fiind dat un tub N si un intreg i, se creeaza o noua multime
de tuburi (N, i) in care subsirul cu numarul din fiecare lant de memorie
este oprit.
Ca si in modelele anterioare, calculele sunt alcatuite din secvente de operatii ale multimii disponibile. Rezultatul final este citit la capautl tubului prin
determinarea continutului lanturilor de memorie.
Algoritmul pentru metoda sticker este:
1. initializeaza (p, q) in tubul N0
2. bf pentru i= 1 la q executa incepe
3.
4.

N0 separa ((+(N0 , i), -(N0 , i))


pentru j = 1 la |Ci |

5.
6.
7.

porneste ((+(N0 , i), q+ ci )


sfarsit pentru
N0 combina ((+(N0 , i), -(N0 , i))

8. sfarsit pentru
Acum separam pentru folosiri viitoare numai acele memorii in care ultimul
subsir i este setat pe on.
1. pentru i= q+1 la q+p incepe
38

2.

N0 +(N0 , i)

3. sfarsit pentru
Sortam acum sirurile care raman in functie de cate pachete codifica
1. bf pentru i= 0 la q-1 incepe
2.

pentru j-1 pana la 0 incepe

3.

separa ((+(Nj , i + 1), -(Nj , i + 1))

4.

Nj+1 combina ((+(Nj , i + 1) ,Nj+1 )

5.

Nj (Nj , i + 1)

6.

sfarsit pentru

7. sfarsit pentru
Linia 3 separa fiecare tub in functie de valoarea lui i, iar linia 4 executa
schimbul din dreapta sirurilor selectate. Apoi vom cauta iesirea finala:
1. Citeste N1
2. altfel daca este goala atunci citeste N2
3. altfel daca este goala atunci citeste N3
4. ...

39

Prezentarea aplicatiei

Aplicatia lucrarii Calcul ADN. Modele de filtrare este reprezentata de o implementare in limbajul C++ a clasicii probleme de colorare a varfurilor unui graf.
Reamintim ca aceasta problema are ca cerinta principala colorarea nodurilor
unui graf astfel incat doua noduri adiacente sa nu aiba aceeasi culoare. Acest
algoritm are la baza o idee destul de simpla: se construieste solutia pas cu pas;
daca se constata ca pentru o anumita valoare nu se poate ajunge la o solutie, se
renunta la acea valoare si se reia cautarea din punctul unde am ramas.

5.1

Aplicatii ale problemei colorarii grafului

Colorarea varfurilor unui graf are o arie de aplicabilitate destul de mare:


colorarea unei harti, astfel incat doua tari vecine sa nu aiba aceeasi culoare
si sa foloseasca cel mai mic numar de culori;
organizarea unui program de examinare intr-o scoala; fiecare examinare are
nevoie de o anumita perioada de timp, iar scoala vrea sa organizeze cat mai
multe examinari posibile in paralel;
niste avioane se apropie de un aeroport; sistemul de control al traficului le
asociaza o altitudine, pe care o mentin pana la aterizare. Daca sosirile a
doua avioane coincid, avioanele nu pot folosi aceeasi altitudine.
anumite vehicule sunt folosite pentru a transporta anumite elemente( produse). Anumite elemente nu pot fi transportate impreuna cu altele in acelasi
vehicul, deoarece sunt periculoase sau necesita echipament specializat. Problema este aceea de a reduce la minim numarul vehiculelor necesare.
frecventele radio trebuie sa fie atribuie radio- difuzarii unei statii de emisie,
in asa fel incat doua statii alaturate, care ar putea interfera, sa foloseasca
frecvente diferite( fiecare staie de emisie poate avea nevoie de una sau mai
multe frecvente);
dezvoltarea unui joc de puzzle sau sudoku; la sudoku, fiecare careu, linie sau
coloana nu trebuie sa contina mai mult de o instanta a unui numar;
40

5.2

Originile limbajului C++

Limbajul C sta la baza limbajului C++. C a fost dezvoltat de Denis Ritchie


in anii 70 si implementat pe un calculator ce utiliza sistemul de operare UNIX. C
isi are de asemenea descendent in limbajul B, inventat de Ken Thompson. Procesul
de standardizare al lui C a durat aproape 6 ani.
C este un limbaj de nivel mediu. El combina cele mai bune facilitati ale
unui limbaj de nivel inalt cu posibilitatile de control si flexibilitatea limbajului
de ansamblare. Datorita acestei caracteristici, C permite lucrul cu biti, octeti si
adrese (elementele de baza cu care functioneaza calculatorul).
Chiar daca C acopera o mare varietate de posibilitati de dezvoltare,
cresterea complexitatii programelor a dus la crearea lui C++( denumit initial C cu
clase). Aceste clase sunt formate din obiecte (entitati logice care incapsuleaza atat
date , cat si cod care manevreaza aceste date). C++ este un limbaj de programare
orientata pe obiect .
Principalele caracteristici ale programarii orientata pe obiecte sunt:
incapsularea. Incapsularea este un mecanism care leaga impreuna codul si
datele si le pastreaza pe ambele in siguranta fata de interventii din afara si
de utilizari gresite. Incapsularea este cea care permite crearea unui obiect.
Intr-un obiect, o parte din cod si/ sau date pot fi particulare acelui obiect
si inaccesibile pentru orice din afara sa. In acest fel, un obiect dispune de
un nivel semnificativ de protectie care impiedica modificarea accidentala sau
utilizarea incorecta de catre sectiuni ale programului cu care nu are legatura.
polimorfismul. Polimorfismul este caracteristica ce permite unei interfete
sa fie folosita cu o clasa generala de actiuni. Polimorfismul este caracterizat
prin fraza o interfata, metode mutiple. El ajuta la reducerea complexitatii,
permitand aceleiasi interfete sa fie folosita pentru a specifica o clasa generala
de actiuni.
mostenirea. Mostenirea este procesul prin care un obiect poate sa preia prototipul altui obiect. Acest lucru permite conceptul de clasificare. Majoritatea
cunostiintelor sunt accesibile deoarece sunt clasificate ierarhic (exemplu: un
mar ionatan face parte din clasa mar, care face parte din clasa fructe). Fara

41

existenta claselor, fiecare obiect ar trebui definit explicitandu-se toate caracteristicile sale. Insa, prin folosirea clasificarilor, un obiect are nevoie doar
de definirea acelor calitati care il fac unic in clasa sa. Mecanismul mostenirii
este acela care face posibil ca un obiect sa fie un exemplar specific al unui
caz mai general.

5.3

Tehnici de programare folosite in aplicatia lucrarii

Pentru a implementa algoritmul colorarii varfurilor unui graf am folosit Dev


C++, un mediu de dezvoltare (IDE) open source (gratuit).
Fisierele antet (header, cu extensia .h) folosite sunt:
#include
#include
#include
#include
#include
#include

<stdio.h> // fisier C de intrare/ iesire


<graphics.h> // programe grafice, figuri geometrice, etc
<stdlib.h> // genereaza nr. random, aloca memorie, etc
<math.h> // imlpementeaza functii matematice de baza
<iostream> // intrare/ iesire
<fstream> // intrare, iesire

Sintaxa # include spune compilatorului sa citeasca si un alt fisier sursa


in afara de cal care o contine. using namespace std permite gruparea entitatilor
precum clasele, obiectele sau functiile sub un singur nume.
Functiile sunt constructii- bloc si locul unde se petrece intreaga activitate
a programului. Ele sunt cea mai importanta caracteristica. Forma generala a unei
functii este :
specificator de tip nume functie(lista de parametrii)
{
corpul functiei
}
, unde specificator de tip specifica tipul de date pe care il returneaza functia (
daca nu este specificat niciun tip, returneaza un rezultat de tip int), (lista de parametrii
este o lista de nume de variabile si tipuri de date asociate lor care primesc valorile
argumentelor atunci cand este apelata functia.
Corpul functiei este propriu acelei functii si nicio instructiune din alta
functie nu poate sa aiba acces la el decat printr-un apel al functiei. Variabilele
42

care sunt definite intr-o functie se numesc variabile locale. O variabila locala este
creata atunci cand se intra in acea functie si este distrusa la iesirea din ea. Acest
lucru inseamna ca variabilele locale nu isi pastreaza valorile intre apelarile functiei.
Acest lucru poate fi modificat prin folosirea specificatorului de memorare static,
care determina compilatorul sa trateze variabila ca si cum ar fi una globala, in
scopul stocarii ei, dar o limiteaza la interiorul functiei.
Functiile care alcatuiesc programul sunt :
initGraf ()
desenareGraf ()
desenareSolutii ()
colorareGraf ()
main()
Functia initGraf() genereaza un graf cu muchii aleatoare si noduri , cu
ajutorul functiei ran() si creeaza matricea de adiacenta.
void initGraf(int n)
{
int i, j,f;
for(int i=1;i<n+1;i++)
{
nod[i].x=(int ) rand()%350+100;
ran=rand()%101 /100.0;
if (i%2==0)ran=rand()%101 /100.0;
nod[i].y=(int ) rand()%350+100-rand()%15;
//printf("Nodul %d este dat de (%d,%d)\n",i,nod[i].x,nod[i].y);
};
for(i=1;i<n;i++)
{
f=0 ;
for(j=i+1;j<=n;j++)
43

{
ran=rand()%101 /100.0; ran=rand()%101 /100.0;
if ((ran<0.7)&& (f<3))
{
mat[i][j]=1;
mat[j][i]=1;
f++;
}
else
{
mat[i][j]=0;
mat[j][i]=0;
};
};
};
}
Functia desenareGraf() deseneaza graful creat in functia anterioara, cu
ajutorul functiilor setcolor() (seteaza culoarea grafului), line() (traseaza muchiile),
circle() (reprezinta nodurile cu ajutorul unor cercuri).
void desenareGraf()
{
int i,j;
char c[3];
setcolor(0);
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(mat[i][j]==1)
line(nod[i].x,nod[i].y,nod[j].x,nod[j].y);
setcolor(0);
setfillstyle(SOLID_FILL, 0);
for(i=1;i<=n;i++)
{
44

circle(nod[i].x,nod[i].y,3);
itoa(i,c,10);
outtextxy(nod[i].x+3,nod[i].y+3,c);
};
}
Functia desenareSolutii() genereaza cele trei culori ale cercurilor pe
care le pot primi nodurile.
void desenareSolutii()
{
int i,j;
for(i=1;i<=n;i++)
{
setcolor(2*cf[i]+9);
circle(nod[i].x,nod[i].y,3);
circle(nod[i].x,nod[i].y,2);
circle(nod[i].x,nod[i].y,4);
}
}
In functia colorareGraf() se parcurge algoritmul de colorare a nodurilor
unui graf; se cauta solutii la rezolvarea problemelor; daca acestea exista, se coloreaza nodurile grafului; daca nu exista, se afiseaza un mesaj de avertizare.
void colorGraf(int n)
{
int max,i,j,k;
max=(int) floor(pow(3,n));
for (nr=1; nr< max;nr++)
{
m=nr; k=0;
for(k=1;k<=n;k++)
{
cf[k]=m%3; m= m/3;
45

};
esol=1;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if ( (mat[i][j]==1 ) && (cf[i]==cf[j]))
esol=0;
if(esol)
{
sol++;
for(i=1;i<=n;i++)
{
col[sol][i]=cf[i];
printf("%d ", cf[i]);
};
printf("\n ");
desenareGraf();
desenareSolutii();
getchar();
}
}
if (sol==0)
printf("\n Nu avem colorari posibile ale acestui graf! \n ");
else
printf("\n Acestea au fost toate variantele gasite.
\n ");
}
Functia principala a programului, main() gestioneaza functiile deja create. Pe baza numarului de noduri pe care dorim sa il aiba graful, se genereaza
graful, se deseneaza, se citesc datele de la consola (numar de noduri si muchiile
aleator generate), se calculeaza solutiile si se afiseaza graful si solutiile gasite.
int main()
46

{
int gd,gm;
int i,j;
printf("Introduceti numarul de noduri n=");
scanf("%d",&n);
initwindow(600,600, " Colorarea varfurilor unui graf",650,50);
setbkcolor(15);
cleardevice();
printf("Se genereaza graful...\n");
initGraf(n);
desenareGraf();
getchar();
printf("Solutiile de desenare: \n");
colorGraf(n);
setcolor(0);
getchar();
getchar();
closegraph();
return 0;
}

47

Concluzii

Calculul ADN reprezinta o modalitate de a regandi cu totul metodele obisnuite de calcul. Matematica reprezinta, probabil pentru majoritatea oamenilor,
fundatia tuturor lucrurilor. Prin descoperirea calculului ADN, realizam ca matematica sta, de asemenea, si la baza biologiei.
Microprocesoarele fabricate din siliciu isi vor atinge cu timpul limitele
in ceea ce priveste viteza si eficienta. Fabricantii de cipuri au nevoie de un nou
material pentru a produce viteze mai mari de calcul. Oamenii de stiinta au descoperit ca viitoarea generatie de microprocesoare se poate afla in organismele vii,
si anume in ADN. Aceste molecule au potentialul de a efectua calcule mult mai
rapid decat cel mai performant computer actual. ADN-ul ar putea fi integrat pe
viitor intr-un chip, pentru a creea asa- numitul biochip, care va avea performante
mult mai bune. Computerele ADN vor avea capacitatea de a stoca de un miliard
de ori mai multe date decat computerele personale.
Aceste noi computere ADN, care se afla inca in stadiul de cercetare, pot
reprezenta urmatoare generatie de computere, dupa cele bazate pe microprocesoare
de siliciu. S-a observat o similaritate intre ADN si hard disk-ul unui computer, in
ceea ce priveste modul de a stoca permanent informatiile.
Folosirea biochipului prezinta cateva avantaje fata de folosirea unui chip
fabricat din siliciu:
Vor exista provizii de ADN, atata vreme cat vor exista organisme celulalre;
Biochipurile nu sunt fabricate din materiale toxice;
Computerele ADN vor fi cu mult mai mici decat cele de astazi;
Pe langa faptul ca sunt mai mici, ele vor avea capacitatea de a stoca mai
multe date;
Fata de computerele traditionale, cela cu ADN pot efectua calcule in paralel
(de aici rezulta viteza cu care se efectueaza calculele);
Rezervele mari de ADN fac din acesta o sursa ieftina.

48

Avantajele potentiale ale calculului ADN fata de calculele electronice obisnuite se observa destul de clar, in cazul problemelor de genul Drumurilor Hamiltoniene, Metodei de satisfiabilitate, s.a.m.d. Pe de alta parte, aceste exemple sunt
probleme particulare rezolvabile cu ajutorul biologiei moleculare.
Prin prezenta lucrare, am incercat sa raspundem la urmatoarele intrebari
fundamentale:
1. Ce fel de probleme se pot rezolva cu ajutorul calculului ADN?
2. Exista o sansa reala, de a proiecta un calculator ADN programabil?
3. Este calculul ADN complet din punct de vedere computational, in sensul ca
o actiune a unei functii de calcul (sau calculul oricarei masini Turing) poate
fi dus mai departe prin manevrarea ADN-ului?

49

References
[1] Theoretical and experimental DNA Computation, Martyn Amos
[2] Introduction to bioinformatics,Arthur M. Lesk
[3] DNA Computing models, Zoya Ignatova, Israel Martinez- Perez, KarlHeinz Zimmermann
[4] DNA computers, tomorrows reality, Lila Kari
[5] DNA Computation, Martyn Amos
[6] On the computational power of DNA, Dan Boneh, Cristopher Dunworth,
Richard J. Lipton
[7] Using DNA to solve NP- Complete problems, Richard J. Lipton
[8] Molecular Computation Of Solution To Combinatorial Problems ,
Leonard M. Adelman
[9] On some properties of DNA graphs, J. Blazewicz, A. Hertz, D. Kobler,
D. de Werra
[10] Computation by Self- Assembly of DNA Graphs, Natasa Jonoska,
Nadrian C. Seeman, Phiset SA- Ardyen
[11] Creating 3-dimensional Graph Structures with DNA , Natasa
Jonoska, Stephen A. Karl, Masahico Saito
[12] Algoritmica grafurilor, C. Croitoru
[13] DNA Models and Algorithms for NO- complete Problems, Erich
Bach, Elton Glaser, Anne Condon, Celena Tanguay
[14] The Chromatic Polynomial, Cody Fouts
[15] Improved Exact Algorithms for Counting 3- and 4- Colorings, Fedor
V. Fomin, Serge Gasper, Saket Saurabh
[16] The chromatic Polynomial, Master Thesis, Tamas Hubai
50

[17] Probleme algoritmice in studiul proprietatilor ereditare pe grafuri,


Teza de Doctorat, Cristian Frasineanu
[18] C++ Manual complet, Herbert Schildt
[19] Gregor Mendel, Wikipedia, http : //ro.wikipedia.org/wiki/GregorM endel
[20] Informatica, Wikipedia, http : //ro.wikipedia.org/wiki/Inf ormatica
[21] Alan Turing, Wikipedia, http : //ro.wikipedia.org/wiki/AlanT uring
[22] Masini Turing, Wikipedia, http : //ro.wikipedia.org/wiki/M asinaT uring
[23] Calculator, Wikipedia, http : //ro.wikipedia.org/wiki/Calculator
[24] Bioinformatics, Wikipedia, http : //en.wikipedia.org/wiki/Bioinf ormatics
Open source bioinf ormatics sof tware

51

S-ar putea să vă placă și