gpt4 book ai didi

arrays - 使用仿射间隙惩罚函数的全局比对

转载 作者:行者123 更新时间:2023-12-02 02:02:40 26 4
gpt4 key购买 nike

我必须编写一个程序,使用仿射间隙惩罚函数在两个序列之间进行全局比对。动态算法(改进的 Needleman Wunsch)计算两个给定序列 st 的相似性(表示序列相似程度的最大分数)。并且它通过构建三个二维数组来考虑间隙,序列中连续空间的 block ,这些空间比孤立空间更有可能出现。这些数组不能正式描述为:

数组 C:保持以序列 s 字符结尾并与序列 t 字符对齐的 block 的最大分数;
数组 BS:保持最大值以字符序列 t 结尾并与序列 s

中的空格对齐的 block 的分数

array BT:保持以 s 字符结尾的 block 的最大分数与序列 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;
}

最佳答案

好吧,在尝试了很多 printfs 之后,我终于找到了问题所在,因为我不知道如何使用调试器。
我得到的第一个线索是 gcc 在我尝试读取时告诉我的段错误来自文件的序列(具有相对较大的长度)。确实,段错误可能有多种原因,但几乎每次我在我的程序中看到这个错误,都是因为我试图访问数组中实际上不存在的位置。
然后许多printfs在初始化步骤中显示了一些值,这些值与每个数组的第一行和第一列应该具有的值不同。我将段错误与初始化步骤中的奇怪值相关联,并决定检查数组的声明步骤以及所有循环条件。就在那里!我只是忘记了任何数组的一个非常基本的特性:如果数组的大小为 n,您可以从零访问到 n-1
为了解决我的新手错误,我在每个数组中为行和列添加了一个位置(因为位置 (0,0) 不与任何一对对齐的字符相关联),以便每个数组的大小 [m][n],其中m是序列s的(长度+1),n是(长度+1) 的序列t。此外,我更改了所有循环条件以访问直到 [m-1][n-1] 位置。现在程序运行良好。

关于arrays - 使用仿射间隙惩罚函数的全局比对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16432227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com