0

2 つの文字列間のグローバル シーケンス アラインメントを取得しようとしました。しかし、それは私に間違った答えを与えます。以下のようにスコアリングマトリックスを生成する私の方法。

public void makeScoringMatrix(String v,String w)
{
    int ar[][]=new int[v.length()+1][w.length()+1];
    for(int i=v.length()-1;i>=0;i--)
    {
        for(int j=w.length()-1;j>=0;j--)
        {
            if(v.charAt(i)==w.charAt(j))
                ar[i][j]=ar[i+1][j+1]+1;
            else if(v.charAt(i)!=w.charAt(j))
                ar[i][j]=ar[i+1][j+1]+0;
            else
                ar[i][j]=Math.max(ar[i][j+1],Math.max(ar[i+1][j],ar[i+1][j+1]));
        }
    }
    //printArray(ar);
    getGlobalAlignment(ar,v,w);
}

public void getGlobalAlignment(int ar[][],String v,String w)
{
    int i=0,j=0,index=0;
    while(i<v.length() && j<w.length())
    {
        if(v.charAt(i)==w.charAt(j))
        {
            System.out.print(v.charAt(i));
            i++;
            j++;
            index++;

        }
        else if(ar[i+1][j]>ar[i][j+1])
        {
            i++;
        }
        else
        {
            j++;
        }
    }

}

誰か助けてください…!

4

2 に答える 2

1

スコア マトリックスが正しくありません。マトリックスを印刷すると、次のようになります。

    A  T  C  A
A [3, 0, 0, 1, 0]
G [3, 0, 0, 1, 0]
C [3, 0, 0, 1, 0]
A [3, 0, 0, 1, 0]
  [3, 0, 0, 1, 0]

問題は、最大で 2 つの隣接する位置 (i および i+1) とのみ比較する必要がある場合に、v[i] をすべての w[j] と比較していることです。

また、最後の列が最初の行であり、最初の列が最終値であると見なされる場合に、最後の列がすべて 0 であることにも気付くでしょう (これが行列が長さ + 1 である理由です)。

最後に、グローバル アラインメントのトレースバック中は、マトリックスの最終位置から開始して後方に移動する必要があると思います (したがって、トレースバックという用語が使用されます。私が正しいとは思わないマトリックスのスコア。

Needleman-Wunsch に関するウィキペディアの記事http://en.wikipedia.org/wiki/Needleman-Wunsch_algorithmを参照するか、アルゴリズムに関する本を読んでください。Durbin らのBiological sequence analysisは、ペアワイズ アラインメントを扱った古典的な (しかし非常に理解しにくい) 本です。

于 2013-08-21T19:21:18.343 に答える
0

このコードを試してください...

public void makeMatrix(String v,String w)
{
    int[][] maxDist=new int[v.length()+1][w.length()+1];
    for(int i=0;i<=v.length();i++)
    {
        for(int j=0;j<=w.length();j++)
        {
            if(i==0)
                maxDist[i][j]=-j;
            else if(j==0)
                maxDist[i][j]=-i;
            else
                maxDist[i][j]=0;
        }
    }
    fillMatrix(maxDist, v, w);
}

public int weight(String v,String w,int i,int j)
{
    if(v.charAt(i-1)==w.charAt(j-1))
        return 1;
    else
        return -1;
}

public void fillMatrix(int[][] ar,String v,String w)
{
    for(int i=1;i<=v.length();i++)
    {
        for(int j=1;j<=w.length();j++)
        {
            int scoreDiagonal=ar[i-1][j-1]+weight(v, w, i, j);
            int scoreLeft=ar[i][j-1]-1;
            int scoreUp=ar[i-1][j]-1;

            ar[i][j]=Math.max(scoreDiagonal, Math.max(scoreLeft, scoreUp));
        }
    }
}

これがあなたが探しているコードであることを願っています...

于 2013-09-01T12:46:13.147 に答える