J'apprends en ce moment le JAVA pour un projet universitaire, je dois aligner 2 séquences protéiques.
J'ai écrit l'algorithme d'alignement, mais lorsque j’exécute, j'ai l'impression que le programme tourne à l'infini. Je ne sais pas si j'ai foiré quelque chose dans l'algorithme, ou si simplement mon JAVA n'est pas assez bon.
Pourriez vous me donner un coup de main ? merci d'avance.
L'algo utilisé est basé sur Needleman & Wunsch.
public class NeedWunsch {
private String sequence1;
private String sequence2;
private int matrice[][];
public NeedWunsch(String s1, String s2){//constructeur class
this.sequence1 = s1;
this.sequence2 = s2;
}
public String[] AlgoNeedWunsch(){ //construction de la matrice (initialisation des gap puis comparaison)
int i,j, init = 0;
StringBuilder aligne1 = new StringBuilder();
StringBuilder aligne2 = new StringBuilder();
matrice = new int[sequence1.length()+1][sequence2.length()+1];
for(i = 0; i < sequence1.length()+1; i++){
matrice[i][0] = init;
init --;
}
for(i = 0, init = 0; i < sequence2.length()+1; i++){
matrice[0][i] = init;
init --;
}
for(i = 1; i <= sequence1.length(); i++){
for(j = 1; j <= sequence2.length(); j++){
if(sequence1.charAt(i-1) == sequence2.charAt(j-1)){
matrice[i][j] = matrice[i-1][j-1] + 1; // si match, on ajoute le socre diag +1
}
else{
if(matrice[i-1][j] > matrice[i][j-1])
matrice[i][j] = matrice[i-1][j]-1;
else
matrice[i][j] = matrice[i][j-1]-1;
}
}
}
//debut de l'alignement
for(i = sequence1.length(), j = sequence2.length(); i > 0 || j > 0;){
if(i > 0 && matrice[i][j] == matrice[i-1][j] + 1){
aligne1.append(sequence1.charAt(--i));
aligne2.append("-");
}
else if(j > 0 && matrice[i][j] == matrice[i][j-1] + 1){
aligne2.append(sequence2.charAt(--j));
aligne1.append("-");
}
else if((i > 0 && j > 0) && (matrice[i][j] == matrice[i-1][j-1])){
aligne1.append(sequence1.charAt(--i));
aligne2.append(sequence2.charAt(--j));
}
}
return new String[]{aligne1.reverse().toString(), aligne2.reverse().toString()};
}
public void AffichageM(){//methode affichage
System.out.println("Affichage de la sequence 1 : "+sequence1);
System.out.println("Affichage de la sequence 2 : "+sequence2);
System.out.println("Calcul de la matrice");
for(int i = 0; i < sequence1.length()+1; i++){
for(int j = 0; j < sequence2.length()+1; j++){
System.out.print(" "+this.matrice[i][j]);
}
System.out.println();
}
}
}
et enfin la classe de test:
import java.sql.SQLException;
public class Test {
public static void main(String[] args) throws SQLException {
String[] res = new String[2];
Bdd recup = new Bdd();
recup.recup_sequence();
NeedWunsch test = new NeedWunsch(recup.getS(0), recup.getS(1));
res = test.AlgoNeedWunsch();
System.out.println(res[0]);
System.out.println(res[1]);
}
}
Je précise, j'ai une classe BDD, rien d'important, je réussi a me connecter à ma base, je récupère 2 séquences, je sais que la matrice d'alignement est créer (elle s'affichait avant que j'ajoute la dernière partie de l'algo).
Une classe qui se connecte à une base de données, et qui récupère des séquences, pour l'instant seulement 2.
J'ai réussi à faire fonctionner le programme, mais il y a quelques erreurs, mais je pense qu'il faudrait quelqu'un qui connaisse l'algorithme de Needleman and Wunsch.
Je demande au cas ou, mon algo ne fonctionne que si et seulement si : le match >= mismatch && gap(à l'initialisation) == mismatch.
Merci
Algorithme alignement
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.