Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algorithme alignement

    15 février 2017 à 13:23:25

    Bonjour, 

    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).

    Merci 

    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2017 à 16:44:39

      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 

      • Partager sur Facebook
      • Partager sur Twitter

      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.
      • Editeur
      • Markdown