理解小的简约,Sankoff的算法

时间:2013-11-21 08:45:17

标签: algorithm binary-tree evolutionary-algorithm phylogeny

小的简约问题: 找到进化树中内部顶点的最简约标记。 输入:树T,每个叶子用m字符串标记。 输出:标记树T的内部顶点,最小化简约分数。

我指的是这篇文章底部的图片。我只是想按照提供的例子。我理解第一步是标记四个叶子A,C,T,G(因为我们提供了这个输入),我们这样做是通过将适当的一个字符设置为0而将字符的其余部分设置为无穷大在每片叶子的数组中。

在图像的下一步中,我们分析了不是根的两个内部节点。我也理解这个过程。例如,在左内部节点中,我们得到阵列A / 9,T / 7,G / 8,C / 9。这四个值中的每一个都计算为左孩子(A)和右孩子(C),加上分数罚分。例如,A / 9被视为0 + 0(左儿童得分为0 + A-> A的罚分),加上0 + 9(右儿童得分为0 + C-> A的惩罚)。 / p>

然而,我感到困惑的是如何计算根。这是一种不同于考虑具有无穷大值的叶子的情况(这样添加一个小的惩罚没有区别,甚至没有考虑无穷大分数。)

当我把它画出来时,似乎根的A / 14,T / 9,10 / G,15 / c是这样计算的:对于A / 14,我们采用最少四个可能的值。第一个值是左右儿童是A(9 + 7 + 2(0)= 16)的情况,第二个值是左右儿童为T的情况(7 + 2 + 2(3)= 14 ),第三个值是左右儿童是G的(8 + 2 + 2(4)= 18),第四个值是左右儿童是C的情况(9 + 8 + 2(9) = 35)。这四个值中的最小值是min(16,14,18,35)= 14,这意味着如果根是A,则左右子节点为T.

如果我以这种方式继续,我会获得与根(14,9,10,15)的书相同的值,其中最小值为9,表示根是T(并且它的两个孩子也是T)。

然而,这是正确的逻辑吗?我觉得可以有更多的组合,而不仅仅是探索根的每个字符的四个值。我特别感到奇怪的是,我只会考虑这四种情况,即儿童必须是同一个角色(A和A,T和T,G和G,C和C)。

所以我的问题是,这只是一个巧合,这可以解决这个问题吗?如果它是正确的,为什么我不需要考虑这两个孩子角色不同的情况?如果它不正确,在这个例子中计算根的正确方法是什么(我更喜欢看到与这个特定问题相关的数字,因为我仍然试图找出复杂的方程式。)

谢谢。

enter image description here
如果难以阅读,后序中的顶点数组为[0,inf,inf,inf],[inf,inf,inf,0],[9,7,8,9],[inf ,0,inf,inf],[inf,inf,0,inf],[7,2,2,8],[14,19,10,15]

1 个答案:

答案 0 :(得分:3)

嗯,这个答案有点晚,但无论如何我都会说话。

是的,您的解决方案恰好可行,这只是巧合。要计算树中内部节点的A值,您应该考虑左分支中从A到{A,C,T,G}的最小成本,加上从A到{A,C的最小成本,T,G}在右侧分支。

因此对于根节点,要计算A:

的值
LEFT            RIGHT

0 3 4 9         0 3 4 9
9 7 8 9         7 2 2 8
-------        ---------
9 10 12 18      7 5 6 17     min = 9+5 = 14 (A)

然后,对{C,T,G}重复此过程以获取其他值。

 LEFT            RIGHT

3 0 2 4         3 0 2 4
9 7 8 9         7 2 2 8 
-------        ---------
12 7 10 13      10 2 4 12    min = 7+2 = 9  (T)

4 2 0 4         4 2 0 4
9 7 8 9         7 2 2 8
-------        ---------
13 9 8 13       11 4 2 12    min = 8+2 = 10 (G)

9 4 4 0         9 4 4 0
9 7 8 9         7 2 2 8
-------        ---------
18 11 12 9      16 6 6 8     min = 9+6 = 15 (C)