我需要填充二维数组,使用受Needleman-Wunsch动态编程算法启发的算法进行序列比对:
[ i-1 ][ j-1 ] + (string1.charAt(i-1) == string2.charAt(j-1)?2:-1
[ i-1 ][ j ] + penality
(等于-1)[ i ][ j-1 ] + penality
(与上述相同) [ i ][ j ] = max (choice1, choice2, choice3)
string1 = attga
和string2 = cttga
的示例
第一行和col初始化为0 -> - i
(行的长度)
我应该得到:
a t t g a
0 -1 -2 -3 -4 -5
c -1 -1 -2 -3 -4 -5
t -2 -2 1 3 2 1
t -3 -3 3 5 7 6
g -4 -4 2 2 9 11
a -5 -5 1 3 8 13
所以我用java编写了这个:
int i,j, gap = -1, choix1, choix2, choix3;
for(i = 0; i <= seq1.length(); i++){
matrice[i][0] = i * gap;
}
for(j = 0; j <= seq2.length(); j++){
matrice[0][j] = j * gap;
}
for(i = 1; i <= seq1.length(); i++){
for(j = 1; j <= seq2.length(); j++){
choix1 = matrice[i-1][j-1] + (seq1.charAt(i-1)==seq2.charAt(j-1)?2:-1);
choix2 = matrice[i-1][j] + gap;
choix3 = matrice[i][j-1] + gap;
matrice[i][j] = Math.max(Math.max(choix1, choix2),choix3);
}
}
它会产生这个矩阵:
0 -1 -2 -3 -4 -5
-1 -1 -2 -3 -4 -2
-2 -2 1 0 -1 -2
-3 -3 0 3 2 1
-4 -4 -1 2 5 4
-5 -5 -2 1 4 7
这是错的,但我找不到原因。我很感激你的帮助,谢谢你。
答案 0 :(得分:0)
这里的问题是我颠倒了列和行,也是为了choice1,我每次都选择它: seq1.charAt(i-1)== seq2.char(j-1),实际上没有采用max语句。
问题解决了。