Exemple de Programmation Dynamique pour la Recherche de Séquence ADN avec Interface de Test
Introduction
La programmation dynamique peut être utilisée pour résoudre le problème de l'alignement de séquences ADN, qui est crucial en biologie moléculaire. L'objectif est de trouver la meilleure correspondance entre deux séquences ADN en minimisant les différences (mutations, insertions, et délétions).
Explication de l'Alignement de Séquences ADN
L'alignement de séquences est une technique pour disposer deux séquences d'ADN de manière à identifier les régions similaires. Cela est fait en insérant des "gaps" (trous) dans les séquences pour les aligner de façon optimale.
Notation :
- Match : Les nucléotides sont identiques.
- Mismatch : Les nucléotides sont différents.
- Gap : Un espace inséré dans une des séquences.
Matrice de Score :
- Match : +1
- Mismatch : -1
- Gap : -1
Implémentation en JavaScript
HTML pour l'Interface de Test
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Alignement de Séquences ADN</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.input-group {
margin-bottom: 10px;
}
.input-group label {
margin-right: 10px;
}
.result {
margin-top: 20px;
white-space: pre;
}
</style>
</head>
<body>
<div class="container">
<h1>Alignement de Séquences ADN</h1>
<div class="input-group">
<label for="seq1-input">Séquence 1 :</label>
<input type="text" id="seq1-input" value="ACCGT">
</div>
<div class="input-group">
<label for="seq2-input">Séquence 2 :</label>
<input type="text" id="seq2-input" value="ACG">
</div>
<button onclick="alignSequences()">Aligner</button>
<div class="result" id="result"></div>
</div>
<script src="dna_alignment.js"></script>
</body>
</html>
JavaScript pour l'Alignement de Séquences ADN (dna_alignment.js)
// Fonction pour aligner deux séquences ADN en utilisant la programmation dynamique
function alignSequences() {
const seq1 = document.getElementById('seq1-input').value;
const seq2 = document.getElementById('seq2-input').value;
const m = seq1.length;
const n = seq2.length;
// Initialisation de la matrice de score
const dp = Array(m + 1).fill().map(() => Array(n + 1).fill(0));
for (let i = 0; i <= m; i++) dp[i][0] = i * -1; // Coût des gaps dans seq1
for (let j = 0; j <= n; j++) dp[0][j] = j * -1; // Coût des gaps dans seq2
// Remplissage de la matrice de score
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
const match = dp[i - 1][j - 1] + (seq1[i - 1] === seq2[j - 1] ? 1 : -1);
const deleteSeq1 = dp[i - 1][j] - 1;
const deleteSeq2 = dp[i][j - 1] - 1;
dp[i][j] = Math.max(match, deleteSeq1, deleteSeq2);
}
}
// Récupération de l'alignement optimal
let alignedSeq1 = '';
let alignedSeq2 = '';
let i = m;
let j = n;
while (i > 0 || j > 0) {
if (i > 0 && j > 0 && dp[i][j] === dp[i - 1][j - 1] + (seq1[i - 1] === seq2[j - 1] ? 1 : -1)) {
alignedSeq1 = seq1[i - 1] + alignedSeq1;
alignedSeq2 = seq2[j - 1] + alignedSeq2;
i--;
j--;
} else if (i > 0 && dp[i][j] === dp[i - 1][j] - 1) {
alignedSeq1 = seq1[i - 1] + alignedSeq1;
alignedSeq2 = '-' + alignedSeq2;
i--;
} else {
alignedSeq1 = '-' + alignedSeq1;
alignedSeq2 = seq2[j - 1] + alignedSeq2;
j--;
}
}
// Affichage de l'alignement optimal
const resultDiv = document.getElementById('result');
resultDiv.innerText = `Alignement Optimal :\n${alignedSeq1}\n${alignedSeq2}`;
}
// Exemple d'utilisation pour tester directement
document.addEventListener('DOMContentLoaded', () => {
alignSequences();
});
Explication du Code
-
Initialisation de la Matrice de Score :
- La matrice
dpest utilisée pour mémoriser les scores d'alignement. - Les coûts des gaps sont initialisés le long des premières lignes et colonnes.
- La matrice
-
Remplissage de la Matrice de Score :
- Pour chaque paire de positions
(i, j), le score est calculé en considérant les options de match, mismatch et gap. match: Le score d'alignement des caractères correspondants ou différents.deleteSeq1etdeleteSeq2: Les scores pour les gaps dansseq1etseq2.
- Pour chaque paire de positions
-
Récupération de l'Alignement Optimal :
- En parcourant la matrice de score de bas en haut, les séquences alignées sont reconstruites.
- Les décisions de match, mismatch ou gap sont prises en fonction des valeurs dans la matrice
dp.
-
Affichage des Résultats :
- Les séquences alignées sont affichées de manière optimale avec les gaps nécessaires.
Cas Réels d'Utilisation
-
Recherche en Génétique :
- Identifier les mutations génétiques en comparant les séquences ADN de différents individus ou espèces.
-
Détection de Virus :
- Comparer les séquences génétiques de virus pour identifier les souches et les mutations, ce qui est crucial pour la recherche de vaccins.
-
Analyse de Phylogénie :
- Utiliser l'alignement de séquences pour étudier les relations évolutives entre les espèces.
-
Bioinformatique :
- Utiliser des algorithmes d'alignement de séquences pour annoter les génomes et identifier les gènes et les régions fonctionnelles.
Exemples de Chaînes d'ADN à Tester avec le Programme
Pour tester l'alignement de séquences ADN avec le programme fourni, voici quelques exemples de chaînes d'ADN que vous pouvez utiliser :
-
Séquences Courtes :
- Séquence 1 : ACCGT
- Séquence 2 : ACG
-
Séquences avec Mutations :
- Séquence 1 : GATTACA
- Séquence 2 : GCATGCU
-
Séquences Similaires :
- Séquence 1 : AGTACGCA
- Séquence 2 : TATGC
-
Séquences Longues avec Gaps :
- Séquence 1 : ATCGAT
- Séquence 2 : TAGC
-
Séquences avec Repetitions :
- Séquence 1 : AACCGGTT
- Séquence 2 : AACGTT
-
Séquences Réelles d'ADN :
- Séquence 1 : CGTGAATTCAT
- Séquence 2 : GACTTAC
Interface de Test
Pour tester ces séquences, vous pouvez simplement entrer les séquences dans les champs de texte de l'interface et cliquer sur "Aligner".
Exemple d'Entrée dans l'Interface
-
Séquences Courtes :
- Séquence 1 :
ACCGT - Séquence 2 :
ACG
- Séquence 1 :
-
Séquences avec Mutations :
- Séquence 1 :
GATTACA - Séquence 2 :
GCATGCU
- Séquence 1 :
Conclusion
L'alignement de séquences ADN est une application importante de la programmation dynamique en biologie moléculaire. L'implémentation en JavaScript avec une interface de test permet de comprendre comment les séquences peuvent être alignées de manière optimale en utilisant une matrice de score et des techniques de programmation dynamique. Les cas réels d'utilisation montrent l'importance de cette technique dans divers domaines scientifiques et médicaux.