用Java填充数组。 (对于序列比对)

时间:2017-02-20 17:39:46

标签: java arrays algorithm

我需要填充二维数组,使用受Needleman-Wunsch动态编程算法启发的算法进行序列比对:

  • 选择1:[ i-1 ][ j-1 ] + (string1.charAt(i-1) == string2.charAt(j-1)?2:-1
  • 选择2:[ i-1 ][ j ] + penality(等于-1)
  • 选择3:[ i ][ j-1 ] + penality(与上述相同)

[ i ][ j ] = max (choice1, choice2, choice3)

string1 = attgastring2 = 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

这是错的,但我找不到原因。我很感激你的帮助,谢谢你。

1 个答案:

答案 0 :(得分:0)

这里的问题是我颠倒了列和行,也是为了choice1,我每次都选择它: seq1.charAt(i-1)== seq2.char(j-1),实际上没有采用max语句。

问题解决了。