Esercizio 1 Implementare l’algoritmo di Needleman-Wunsch per l’allineamento globale di due sequenze A=a1a2…an e B=b1b2…bm di lunghezza n e m rispettivamente. Si scelga a piacere la funzione dei pesi w: S U {-} -> R+ (S è l’alfabeto su cui sono definite A e B). Si riscostruisca anche uno dei possibili allineamenti ottimi (come nell’esempio seguente). Ricorrenza generale per il riempimento della matrice C dei costi di dimensione (n+1)*(m+1): C(0,j) = j * w(-,bj) 0 <= j <= m C(i,0) = i * w(ai,-) 0 <= i <= n C(i-1,j) + w(ai,-) C(i,j) = MIN C(i,j-1) + w(-,bj) C(i-1,j-1) + w(ai,bj)
Pseudocodice per la ricostruzione di un allineamento ottimo Build-alignment(A,B,C,w) #A e B sono array di caratteri (il primo carattere ha posizione 0) begin Inizializzo la lista vuota A_Align Inizializzo la lista vuota B_Align i := length(A) j := length(B) while(i > 0 and j > 0)do if(C(i,j) == C(i-1,j-1)+w(A[i-1],B[j-1])) then aggiungo A[i-1] in testa a A_Align aggiungo B[j-1] in testo a B_Align i := i-1 j := j-1 elseif(C(i,j) == C(i-1,j)+w(A[i-1),-)) then aggiungo ‘-’ in testa a B_Align else aggiungo ‘-’ in testa a A_Align aggiungo B[j-1] in testa a B_Align endwhile …
end while(i > 0) do aggiungo A[i-1] in testa a A_Align … while(i > 0) do aggiungo A[i-1] in testa a A_Align aggiungo ‘-’ in testa a B_Align i := i-1 endiwhile while(j > 0) do aggiungo ‘-’ in testa a A_Align aggiungo B[j-1] in testa a B_Align j := j-1 endwhile end