以下问题专门适用于生物技术应用,但可能会说明其他领域类似问题的一般原则。这是一个NP难问题,可能与旅行商问题有关,我很好奇可以用什么算法来解决问题。
简要生物背景:蛋白质由20个氨基酸组成。 DNA由4个碱基组成--A,C,G,T。蛋白质的DNA序列决定了氨基酸的序列 - 每个连续的3个DNA碱基序列(该单位称为密码子)编码一个氨基酸。单个氨基酸可以由多个密码子编码,例如缬氨酸有4种编码方式。
并非所有密码子都相同 - 其中一些密码子的处理速度比其他密码子快。此外,并非所有密码子PAIRS都相同 - 有些对比其他密码子慢。
这意味着对于100个氨基酸(300个DNA碱基)的特定基因,有许多编码相同氨基酸序列的方法,但具有非常不同的特性,例如处理速度。
给定一个具有相应速度值的密码子对表,我们想编写一个可以输出所需速度序列的算法,例如:最快和最慢的可能序列,以及两者之间的梯度。输入是编码基因的DNA序列,密码子对的字典及其各自的速度分数(-1至1)。输出是优化的DNA序列及其整体速度分数(可以表示为所有密码子对分数的总和)。氨基酸序列必须保持不变。
示例:如果我们的序列AAATTTGGG编码3个氨基酸,我们的密码子对得分:
AAATTT = -0.5
TTTGGG = -0.5
那么这个序列可能得分为-1。
现在,如果我们也有替代品,我们可以评估不同的可能性:
AAATTG = -0.7 AAATTC = -0.3
TTGGGC = +0.2 TTCGGA = -1.0
人们会发现基于此信息的最佳序列是AAATTCGGA,因为它的总体值为-1.3。
这个问题的复杂性当然在于密码子对对所有周围密码子对的影响。
完整的密码子对图表将有61 * 61个条目(因为3个密码子会停止阅读基因)。
====
问题
我认为这是一个NP难问题,与TSP有关系。我见过一种方法使用模拟退火算法。我很好奇是否有其他有见地的方法来考虑这个问题以及相应的算法和启发式方法来产生所需的输出。
如果是动态编程,哪种方法适合?
另外,我们如何使用算法创建速度分数的梯度,而不仅仅是最大值和最小值?
答案 0 :(得分:1)
使用遗传算法,您应该能够获得达到预期目标的序列。假设您的目标是x的速度,您可以创建一个基因群 - 每个基因编码相同的基因但由不同的密码子编码。然后选择,交配和变异几代直到达到x(或足够接近)。突变/重组的元素必须处于密码子水平(与核苷酸水平相反)。要获得具有不同速度的一系列序列,请使用不同的目标x多次运行算法。
答案 1 :(得分:0)
获取特定序列的最快(或最慢)编码应该是一个简单的动态编程问题。将每个3个氨基酸组视为64个字符的字母。然后在结果字符串中的每个点上,您将选择产生所需氨基酸的几个字母,并且您希望最大化(最小化)与每个相邻字母对相关的总和。
对于每个可能的字符,在每个点从左到右工作,计算出终止于该字符的最大(最小)序列。每个角色最多有64种可能性。给出n个字符的解决方案,你可以在这里使用这个答案来计算出n + 1字符的解决方案 - 只需取字符n和n + 1的分数,然后将其添加到已计算的最佳答案中最多n个字符 - 为n + 1中的每个可能字符保留最佳答案。
要获得中间分数的答案,一种方法是生成产生正确氨基酸序列的随机答案。另一种方法是将产生最大分数的部分答案与产生最低分数的答案混合。