vlambda博客
学习文章列表

动态规划和双序列比对

动态规划(Dynamic programming)

动态规划 (Dynamic programming, DP) 是通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。[1]

1. 重叠子问题

    下面的三个函数分别使用了递归、递归+列表、迭代方法求解斐波那契数列。后两种方法仅对重叠子问题求解一次,因而时间复杂度急剧下降。其中迭代呈现的自底向上策略就是动态规划处理重叠子问题的思路。

#f(n)=f(n-1)+f(n-2); f(0)=0; f(1)=1
#directly, inefficient, O(2^n)def f(n): if n==0: return 0 elif n==1: return 1 else: return f(n-1)+f(n-2)

#top-down, O(n)def f(n): memo=[-1]*(n+1) if n == 0: return 0 if n == 1: return 1 if memo[n] == -1:     memo[n]=f(n-1)+f(n-2) return memo[n]
#down-top, O(n)def f(n): memo=[-1]*(n+1) memo[0]=0 memo[1]=1 for i in range(2,n+1): memo[i]=memo[i-1]+memo[i-2] return memo[n]

2. 最优子结构
    简单理解就是问题的最优解是子问题最优解的组合。以比对为例,残基之间的比对只有三种情况:相同、替换和空位。在使用替换矩阵和空位罚分对三种情况打分后(公式1,2),得分最高者即是该位置的最优比对。在对所有残基的比对情况打分后,即可获得最优比对。

    基于动态规划,可构建下述的双序列比对算法:Needleman-Wunch和Smith-Waterman。更为详细的推演过程可参考coursera课程:《生物信息学: 导论与方法》。[2]

全局比对(Needleman-Wunch)

    全局是指对两条序列所有残基进行比对。如上所述,分别求三种比对状态的得分,最大值即为该位置最优比对。通过回溯,得到最佳比对结果。

公式1. Needleman-Wunch 算法的状态转移方程

局部比对(Smith-Waterman)

    相较全局比对,局部比对状态转移方程中引入了一个最小值0,这意味着回溯过程可以被最小值中断,也就是说比对是局部的。这更符合只存在部分片段相似的生物学现象,如结构域、内含子等。

公式2. Smith-Waterman算法的状态转移方程


参考资料

[1] https://zh.wikipedia.org/zh-hans/动态规划

[2] https://www.coursera.org/learn/sheng-wu-xin-xi-xue