通过Needleman Wunsch表回溯

时间:2017-02-22 16:58:27

标签: python algorithm dynamic-programming bioinformatics

我试图通过已完成的DP表进行回溯跟踪。假设表格正确填写了正确的值。如果有人愿意,我可以发布表格的片段。 但是这里是我的代码片段,它从backtrace生成字符串

{{1}}

我的逻辑是,它总是通过表格查找并找到最小的值,试图回到表格的0部分的成本。在哪个i& j应该为0并且循环退出。关于NW算法的特殊之处在于间隙,删除,交换的值可以是他们想要的任何数字,而不仅仅是-1,0等

根据检查后跟踪的脚本,我错了。虽然我知道我正在填写表格,因为另一个测试脚本确认了这一点。

2 个答案:

答案 0 :(得分:1)

如果不同操作的成本不同,那么填写数组的代码将类似于:

minCost = min(array[i - 1][j]+C0, array[i][j - 1]+C1, array[i - 1][j- 1]+C2)

其中C0,C1,C2是不同的成本。

在这种情况下,回溯代码还需要将这些成本合并如下:

    if (minCost == array[i - 1][j - 1]+C2):
       StringA += xLine[i - 1]
       StringB += yLine[j - 1]
       array[i - 1][j - 1] = 0
       i -= 1
       j -= 1
    elif (minCost == array[i][j - 1]+C1):
       StringA += '-'
       StringB += yLine[j - 1]
       array[i][j - 1] = 0
       j -= 1
    elif (minCost == array[i - 1][j]+C0):
       StringA += xLine[i - 1]
       StringB += '-'
       array[i - 1][j]= 0
       i -= 1 

仔细检查算法的一种方法是计算回溯步骤的实际成本。在您当前的实现中,我预计回溯成本会高于您计算的成本(因为回溯忽略了成本)。

答案 1 :(得分:1)

想出来,没有考虑从一个细胞到另一个细胞的移动成本

解决方案:

def stringBuilder(array, costBook, xLine, yLine):
  StringA, StringB = "", ""
  i, j = len(xLine), len(yLine)
  totalCost = array[i][j]
  while (i != 0 or j != 0):
    if (array[i][j] == array[i][j - 1] + int(costBook['-' + yLine[j - 1]])):
        StringA += '-'
        StringB += yLine[j - 1]
        array[i][j] = 0
        j -= 1
    elif (array[i][j] == array[i - 1][j] + int(costBook[xLine[i - 1] + '-'])):
        StringA += xLine[i - 1]
        StringB += '-'
        array[i][j] = 0
        i -= 1
    elif (array[i][j] == array[i - 1][j - 1] + int(costBook[xLine[i - 1] + yLine[j - 1]])):
        StringA += xLine[i - 1]
        StringB += yLine[j - 1]
        array[i][j] = 0
        i -= 1
        j -= 1