【问题标题】:Backtrace through Needleman Wunsch table通过 Needleman Wunsch 表回溯
【发布时间】:2017-02-22 16:58:26
【问题描述】:

我正在尝试通过已完成的 DP 表进行回溯。假设表格正确填写了正确的值。如果愿意,我可以发布表格的 sn-p。 但这是我的代码的 sn-p,它从回溯生成字符串

def stringBuilder(array, xLine, yLine):        
     StringA, StringB = "", ""
     i, j = len(xLine), len(yLine)
     minCost = array[i][j]
     while (i != 0 and j != 0):
        minCost = min(array[i - 1][j], array[i][j - 1], array[i - 1][j- 1])
        if (minCost == array[i - 1][j - 1]):
           StringA += xLine[i - 1]
           StringB += yLine[j - 1]
           array[i - 1][j - 1] = 0
           i -= 1
           j -= 1
        elif (minCost == array[i][j - 1]):
           StringA += '-'
           StringB += yLine[j - 1]
           array[i][j - 1] = 0
           j -= 1
        elif (minCost == array[i - 1][j]):
           StringA += xLine[i - 1]
           StringB += '-'
           array[i - 1][j]= 0
           i -= 1 

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

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

【问题讨论】:

  • 您好,问题可能是有多个相邻的正方形具有相同的minCost?如果是这种情况,您的最终对齐方式会有所不同,具体取决于您通过 if 语句检查的顺序
  • 问题仅仅是你正在反向生成字符串吗?如果是,则添加 StringA=StringA[::-1] 和 StringB=StringB[::-1]
  • 再次感谢 nbryans,我摆弄了订单以及循环如何终止并自己解决。但是对于它的价值,我没有包括它,但我确实在最后翻转了字符串。我在下面发布了解决方案

标签: python algorithm dynamic-programming bioinformatics


【解决方案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 

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

【讨论】:

  • 啊,这还不算,但它确实让我找到了最终的解决方案,所以谢谢!
【解决方案2】:

想通了,没有考虑从一个单元移动到另一个单元的成本

解决办法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多