Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 求解局部对齐的算法_String_Algorithm_Dynamic Programming_String Matching_Traceback - Fatal编程技术网

String 求解局部对齐的算法

String 求解局部对齐的算法,string,algorithm,dynamic-programming,string-matching,traceback,String,Algorithm,Dynamic Programming,String Matching,Traceback,X和Y之间的局部对齐,至少有一列对齐C 到W 给定两个长度为n的序列X和长度为m的序列Y,我们 正在寻找得分最高的局部对齐,即对齐 在X的子串X'和Y的子串Y'之间,至少 一列,其中C从X'与W从Y'对齐,如果 存在对齐。作为评分模型,我们使用替代矩阵s 和参数d的线性间隙惩罚 编写一段代码以便有效地解决问题。如果使用动态 编程时,只需给出计算 动态规划矩阵中的项,并指定 追溯开始和结束 我的解决方案: 我已经采取了两个序列,即HCEA和HWEA,并试图解决这个问题。 这是我的密码。我是否完成了

X和Y之间的局部对齐,至少有一列对齐C 到W

给定两个长度为n的序列X和长度为m的序列Y,我们 正在寻找得分最高的局部对齐,即对齐 在X的子串X'和Y的子串Y'之间,至少 一列,其中C从X'与W从Y'对齐,如果 存在对齐。作为评分模型,我们使用替代矩阵s 和参数d的线性间隙惩罚

编写一段代码以便有效地解决问题。如果使用动态 编程时,只需给出计算 动态规划矩阵中的项,并指定 追溯开始和结束

我的解决方案:

我已经采取了两个序列,即HCEA和HWEA,并试图解决这个问题。 这是我的密码。我是否完成了问题中的要求?如果我错了,请告诉我哪里出了错,以便我修改我的代码

还有没有别的办法解决这个问题?如果它可用,任何人都可以发布一个伪代码或算法,这样我就可以为它编码了

public class Q1 {

    public static void main(String[] args) {
        //  Input Protein Sequences 
        String seq1 = "HCEA";  
        String seq2 = "HWEA";

        //  Array to store the score
        int[][] T = new int[seq1.length() + 1][seq2.length() + 1];

        //  initialize seq1
        for (int i = 0; i <= seq1.length(); i++) {
            T[i][0] = i;
        }

        //  Initialize seq2
        for (int i = 0; i <= seq2.length(); i++) {
            T[0][i] = i;
        }

        //  Compute the matrix score
        for (int i = 1; i <= seq1.length(); i++) {
            for (int j = 1; j <= seq2.length(); j++) {
                if ((seq1.charAt(i - 1) == seq2.charAt(j - 1))
                        || (seq1.charAt(i - 1) == 'C') && (seq2.charAt(j - 1) == 'W')) {
                    T[i][j] = T[i - 1][j - 1];
                } else {
                    T[i][j] = Math.min(T[i - 1][j], T[i][j - 1]) + 1;
                }
            }
        }

        //  Strings to store the aligned sequences
        StringBuilder alignedSeq1 = new StringBuilder();
        StringBuilder alignedSeq2 = new StringBuilder();

        //  Build for sequences 1 & 2 from the matrix score
        for (int i = seq1.length(), j = seq2.length(); i > 0 || j > 0;) {
            if (i > 0 && T[i][j] == T[i - 1][j] + 1) {
                alignedSeq1.append(seq1.charAt(--i));
                alignedSeq2.append("-");
            } else if (j > 0 && T[i][j] == T[i][j - 1] + 1) {
                alignedSeq2.append(seq2.charAt(--j));
                alignedSeq1.append("-");
            } else if (i > 0 && j > 0 && T[i][j] == T[i - 1][j - 1]) {
                alignedSeq1.append(seq1.charAt(--i));
                alignedSeq2.append(seq2.charAt(--j));
            }
        }

        //  Display the aligned sequence
        System.out.println(alignedSeq1.reverse().toString());
        System.out.println(alignedSeq2.reverse().toString());
    }
}
一旦我们计算了F和p,我们就会在矩阵F的最下面一行找到最大的值。让F[n][j0]是最大的值。我们从F[n][j0]开始回溯,并继续回溯,直到到达矩阵的第一列。以这种方式构建的路线就是解决方案

将Y与X的子串对齐,Y中没有间隙 给定长度为n的字符串X和长度为m的字符串Y,我们希望计算Y到X的任何子字符串的最高得分对齐,额外的约束是不允许在Y中插入任何间隙。换句话说,输出是X的子字符串X'与字符串Y的对齐,这样,在所有选择的X'中,对齐的分数可能是最大的,并且对齐不会在Y中引入任何间隙,但可能会在X'中引入间隙。作为评分模型,我们再次使用替代矩阵s和带有参数d的线性差距惩罚。 给出了一个有效的动态规划算法,该算法在多项式时间内最优地解决了这个问题。只需给出计算动态规划矩阵所需的方程,解释为回溯存储的信息,以及回溯开始和结束的位置。你的算法的运行时间是多少? 解决方案:

设X_i是长度为i的X的前缀,Y_j表示长度为j的Y的前缀。我们计算矩阵F,使得F[i][j]是任何后缀X_i和字符串Y_j对齐的最佳分数,这样对齐不会在Y中插入间隙。我们还计算回溯矩阵P。F和P的计算可以使用以下等式在Onm时间内完成:

F[0][0]=0
  for i = 1..n: F[i][0]=0
  for j = 1..m: F[0][j]=-j*d, P[0][j]=L
  for i = 1..n, j = 1..m:
      F[i][j] = max{ F[i-1][j-1]+s(X[i-1],Y[j-1]), F[i-1][j]-d, F[i][j-1]-d }
      P[i][j] = D, T or L according to which of the three expressions above is the maximum
F[0][0]=0
  for i = 1..n: F[i][0]=0
  for j = 1..m: F[0][j]=-j*d, P[0][j]=L
  for i = 1..n, j = 1..m:
      F[i][j] = max{ F[i-1][j-1]+s(X[i-1],Y[j-1]), F[i][j-1]-d }
      P[i][j] = D or L according to which of the two expressions above is the maximum
一旦我们计算了F和p,我们就在矩阵F最右边的列中找到了最大的值。让F[i0][m]为最大的值。我们从F[i0][m]开始回溯,并继续回溯,直到到达矩阵的第一列。以这种方式构建的路线就是解决方案


希望你能了解我真正需要的东西

我认为谷歌很容易找到资源甚至答案……因为搜索的第一个结果已经是一个彻底的解决方案

不过,我很感激您愿意自己考虑解决方案,并要求提供一些提示

在给出一些提示之前,我想谈谈设计DP解决方案 我想你知道这可以通过DP解决方案来解决

dp解决方案基本上由四部分组成:

一,。DP状态,您必须自行定义一个状态的物理含义,例如: 第i个人拥有的钱; a[i][j]:=时间i与时间j之间的电视节目数量;等

二,。过渡方程

三,。初始状态/基本情况

四,。如何查询答案,例如:答案是a[n]?或者答案是maxa[i]

DP解决方案只需2美分,让我们回到问题:

以下是我能想到的一些提示:

dp状态是什么?有多少维度足以定义这种状态? 考虑到你正在解决的问题与两个字符串上的普通子字符串问题非常相似, 一维似乎太少,三维似乎太多,对吗

正如第1点所提到的,这个问题非常类似于常见的子字符串问题,也许你应该看看这些问题,让自己有一些想法? ,等等

补充部分:与OP无直接关系

DP易学难掌握。我知道的很少,真的不能分享太多。我认为算法导论是一本非常标准的书,你可以从中找到很多资源,特别是一些学院/大学的ppt/pdf教程来学习DP的一些基本示例。学习这些示例非常有用,我将在下面解释

一个问题可以用许多不同的方法来解决 nt DP解决方案,由于定义良好的DP状态,其中一些解决方案的时间/空间复杂度要低得多

那么,如何设计一个更好的DP状态,甚至让人觉得DP可以解决一个问题?我会说这是一个经验和知识的问题。有一组众所周知的DP问题,我想说,许多其他DP问题可以通过修改一点来解决。这是一篇我刚刚被接受的关于另一个DP问题的文章,正如那篇文章中所说的,这个问题非常类似于一个著名的问题,叫做矩阵链乘法。所以,你不能对经验部分做太多,因为它没有明确的方式,但是你可以通过先研究这些标准DP问题来处理知识部分,也许

最后,让我们回到你最初的问题来说明我的观点:

因为我以前知道LCS问题,我有一种感觉,对于类似的问题,我可以通过设计类似的DP状态和过渡方程来解决它?状态si,j:=A1..i和B1..j的最佳成本,给定两个字符串A和B

什么是最优的取决于问题,如何在每个状态下实现这个最优值是由过渡方程完成的

定义了这个状态后,很容易看到我想要查询的最终答案就是slenA,lenB

基本情况?s0,0=0!我们不能在两个空字符串上做太多,对吗


因此,根据我所掌握的知识,我大致了解了设计DP解决方案的4个主要组成部分。我知道它有点长,但我希望它有帮助,干杯。

我建议你自己做硬件,我可以建议你搜索计算生物学材料/algs@DOLBI是的,我知道这是我的工作。我没有要求任何人解决这个问题。我只是被要求帮助我开始做这件事。我真的无法得到可以帮助我解决问题的材料。你能举一个替代矩阵和差距惩罚的例子吗???这两件事不是DP中需要的一般术语,所以我以前不知道它们的含义。。。替换矩阵是否会给出任意2个字符匹配的分数?例如:“A”和“C”比赛给你3分等,那么差距惩罚是什么?如果你能简单地向我解释这两件事是什么,我会给你一个更精确的答案…@shole。。。是的,你是对的。。。替换矩阵为我们提供了任何2个字符匹配的分数,如您所说。当我们将一个序列中的一个字符与另一个序列中的一个空格进行匹配,反之亦然时,会添加空格惩罚。。。如示例解决方案中的F[0][j]=-jd…@shole。。。非常感谢你!!!很高兴看到你的答复。虽然我无法理解你答案的所有部分,但与这个问题相比,还是要好得多。我将学习您提到的所有内容,并向解决方案靠拢。如果您能给我推荐一本涵盖一般概念的教科书或链接,那将非常有帮助。我已经尽了最大努力添加了一个补充部分,我希望它能有所帮助。@shole。。。我已经添加了我的实现。。。你能检查一下并告诉我应该改进的地方吗…?你能说得更多吗:'作为评分模型,我们使用替代矩阵s和带有参数d的线性差距惩罚。'如果你能提供一个关于这方面的eg,那将是最好的