グローバルアラインメント

2つの文字列に対するグローバルアラインメントを、動的計画法によって行う。

2つの文字列に対するグローバルアラインメントを、動的計画法によって行う。

  • タグ:
  • タグはありません
#include<stdio.h>
#include<string.h>
#define SMAX    64
#define MATCH    2
#define UNMATCH -1
#define GAP     -1

int main(void){
    char str1[] = "ATGCGGATTCAGAT";
    char str2[] = "ATGATCCGT";
    char str3[2*SMAX];
    char str4[2*SMAX];
    int m[SMAX][SMAX];
    int w, h, i, j, k;
    
    // 初期化
    w = strlen(str1) + 1;
    h = strlen(str2) + 1;
    for(i = 0; i < w; i++){
        m[i][0] = 0;
    }
    for(j = 0; j < h; j++){
        m[0][j] = 0;
    }
    
    // 動的計画法によるアラインメント
    for(j = 1; j < h; j++){
        for(i = 1; i < w; i++){
            int s = (str1[i-1] == str2[j-1]) ? MATCH : UNMATCH;
            int max = m[i-1][j-1] + s;
            if(max < m[i-1][j] + GAP){
                max = m[i-1][j] + GAP;
            }else if(max < m[i][j-1] + GAP){
                max = m[i][j-1] + GAP;
            }
            m[i][j] = max;
        }
    }
    
    // スコア出力
    for(j = 0; j < h; j++){
        for(i = 0; i < w; i++){
            printf("%2d ", m[i][j]);
        }
        puts("");
    }
    
    // トレースバック
    i = w - 1;
    j = h - 1;
    k = SMAX - 1;
    str3[k] = '';
    str4[k] = '';
    while( !(i == 0 && j == 0) ){
        int s = (str1[i-1] == str2[j-1]) ? MATCH : UNMATCH;
        if(m[i-1][j-1] + s == m[i][j]){
            k--;
            str3[k] = str1[--i];
            str4[k] = str2[--j];
        }else if(m[i-1][j] + GAP == m[i][j] || j == 0){
            k--;
            str3[k] = str1[--i];
            str4[k] = '_';
        }else if(m[i][j-1] + GAP == m[i][j] || i == 0){
            k--;
            str3[k] = '_';
            str4[k] = str2[--j];
        }
    }
    
    // 結果出力
    puts(&str3[k]);
    puts(&str4[k]);
    
    return 0;
}