Добавление терминальных зазоров в коде C ++ для оптимальной оценки выравнивания последовательности - PullRequest
0 голосов
/ 12 февраля 2020

Здравствуйте. Я пытался добавить схему оценки: 11 для внутренних промежутков, 8 для клемм на 5-ом конце, 7 для промежутков на 3 ', 4 для несовпадений, 0 для совпадений. В настоящее время код учитывает только внутренний разрыв (= 11), несовпадения (= 4) и совпадения (= 0), но не для терминальных разрывов. Я довольно новичок в кодировании, поэтому заранее прошу прощения, если мой код запутан, любые рекомендации приветствуются. Я должен получить оценку 275. Две последовательности, которые я использовал, включены в код.

#include <iostream>

#include <fstream>


#include <bits/stdc++.h> 

using namespace std; 

void getscore(string x, string y, int pxy, int pgap) 
{ 
    int i, j; 

    int m = x.length(); 
    int n = y.length(); 


    int dp[n+m+1][n+m+1] = {0}; 


    for (i = 0; i <= (n+m); i++) 
    { 
        dp[i][0] = i * pgap; 
        dp[0][i] = i * pgap; 
    }    


    for (i = 1; i <= m; i++) 
    { 
        for (j = 1; j <= n; j++) 
        { 
            if (x[i - 1] == y[j - 1]) 
            { 
                dp[i][j] = dp[i - 1][j - 1]; 
            } 
            else
            { 
                dp[i][j] = min({dp[i - 1][j - 1] + pxy , 
                                dp[i - 1][j] + pgap , 
                                dp[i][j - 1] + pgap }); 
            } 
        } 
    } 


    int l = n + m; 

    i = m; j = n; 

    int xpos = l; 
    int ypos = l; 


    int xans[l+1], yans[l+1]; 

    while ( !(i == 0 || j == 0)) 
    { 
        if (x[i - 1] == y[j - 1]) 
        { 
            xans[xpos--] = (int)x[i - 1]; 
            yans[ypos--] = (int)y[j - 1]; 
            i--; j--; 
        } 
        else if (dp[i - 1][j - 1] + pxy == dp[i][j]) 
        { 
            xans[xpos--] = (int)x[i - 1]; 
            yans[ypos--] = (int)y[j - 1]; 
            i--; j--; 
        } 
        else if (dp[i - 1][j] + pgap == dp[i][j]) 
        { 
            xans[xpos--] = (int)x[i - 1]; 
            yans[ypos--] = (int)'_'; 
            i--; 
        } 
        else if (dp[i][j - 1] + pgap == dp[i][j]) 
        { 
            xans[xpos--] = (int)'_'; 
            yans[ypos--] = (int)y[j - 1]; 
            j--; 
        } 
    } 
    while (xpos > 0) 
    { 
        if (i > 0) xans[xpos--] = (int)x[--i]; 
        else xans[xpos--] = (int)'_'; 
    } 
    while (ypos > 0) 
    { 
        if (j > 0) yans[ypos--] = (int)y[--j]; 
        else yans[ypos--] = (int)'_'; 
    } 


    int id = 1; 
    for (i = l; i >= 1; i--) 
    { 
        if ((char)yans[i] == '_' && (char)xans[i] == '_') 
        { 
            id = i + 1; 
            break; 
        } 
    } 

    // Printing the final answer 
    cout << "Optimal score = "; 
    cout << dp[m][n] << "\n"; 
    cout << "Optimal alignment :\n"; 
    for (i = id; i <= l; i++) 
    { 
        cout<<(char)xans[i]; 
    } 
    cout << "\n"; 
    for (i = id; i <= l; i++) 
    { 
        cout << (char)yans[i]; 
    } 
    return; 
} 



int main(){ 

    string geneA = "TCTGGTGTCCTAGGCGTAGAGGAACCACACCAATCCATCCCGAACTCTGGTGGTTAAACTCTACTGCGGTGACGATACT "; 
    string geneB = "TGGTGCGGTCATACCAGCGCTAATGCACCGGATCCCATCAGAACTCCGCAGTTAAGCGCGCTTGGGCCAGAACAGTACTGGGATGGGTGTCC "; 


    int misMatchPenalty = 4; 
    int gapPenalty = 11;
    int tPenalty=7;
    int fPenalty=8;


    getscore(geneA, geneB, 
        misMatchPenalty, gapPenalty); 
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...