アフィン ギャップ ペナルティ関数を使用して 2 つのシーケンス間のグローバル アラインメントを行うプログラムを作成する必要があります。動的アルゴリズム (変更された Needleman Wunsch) は、指定された 2 つのシーケンスsとtの類似度 (シーケンスがどの程度類似しているかを表す最大スコア) を計算します。また、3 つの 2 次元配列を構築することにより、ギャップ、つまり連続するスペースのブロックが考慮されます。これは、孤立したスペースよりも発生する可能性が高くなります。配列は次のように形式的には記述できません。
配列 C:シーケンスtの文字と整列されたシーケンスs の文字で終わるブロックの最大スコアを保持します。配列 BS:シーケンスs内のスペースと整列されたシーケンスtの文字で終わるブロックの最大スコアを保持します
配列 BT: シーケンスs の文字で終わるブロックの最大スコアを、シーケンスtのスペースと整列させて保持します。
このアルゴリズムには、次の再帰関係があります。
C[i,j] = v(s[i],t[j]) + max{C[i-1][j-1], BS[i-1][j-1], BT[i- 1][j-1]}
BS[i,j] = max{C[i][j-1]-(h+g), BS[i][j-1]-g, BT[i][ j-1]-(h+g)}
BT[i,j] = max{C[i-1][j]-(h+g), BS[i-1][j]-(h+g) )、BT[i-1][j]-g}
** v(s[i],t[i]) = 一致 (両方の文字が同一の場合) または不一致 (文字が同一でない場合) の値 類似度は、各配列の最後の値の中で最も高い値です。問題は、プログラムを実行すると奇妙な動作をすることです。
特定のシーケンスのペアに対して、t または s を変更すると、プログラムは同じシーケンスのペアに対して異なる値を返します。では、プログラムがこのような動作をする理由を見つけるのを手伝っていただけませんか? 私が間違っていることを知っていますか?コードについては、次のとおりです。
int main (void){
int mat, mis, h, g,
sim, i, j, m, n;
/* mat = match, mis = mismatch, h = open gap penalty, g = extend gap penalty */
string s, t;
s = malloc(1500);
t = malloc(1500);
scanf("%d %d %d %d", &mat, &mis, &h, &g);
scanf("%s", s);
scanf("%s", t);
m = strlen(s);
n = strlen(t);
int C[m][n], BS[m][n], BT[m][n];
C[0][0] = 0;
for(j = 1; j<= n; j++)
C[0][j] = -32000;
for(i = 1; i<= m; i++)
C[i][0] = -32000;
for(j = 1; j <= n; j++)
BS[0][j] = -(h + g*j);
for(i = 0; i <= m; i++)
BS[i][0] = -32000;
for(j = 0; j <= n; j++)
BT[0][j] = -32000;
for(i = 1; i <= m; i++)
BT[i][0] = -(h + g*i);
for(i = 1; i <= m; i++){
for(j = 1; j <= n; j++){
C[i][j] = align(s[i-1],t[j-1],mat,mis) + max(C[i-1][j-1],BS[i-1][j-1],BT[i-1][j-1]);
BS[i][j] = max((C[i][j-1]-(h+g)),(BS[i][j-1]-g),(BT[i][j-1])-(h+g));
BT[i][j] = max((C[i-1][j]-(h+g)),(BS[i-1][j]-(h+g)),(BT[i-1][j]-g));
}
}
printf("\n");
printf("c[m][n]: %d bs[m][n]:%d bt[m][n]: %d\n", C[m][n], BS[m][n], BT[m][n]);
sim = max(C[m][n], BS[m][n], BT[m][n]);
printf("sim: %d\n", sim);
return 0;
}