计算所有可能的序列,直到给定的长度

时间:2012-07-14 15:10:10

标签: string perl combinations bioinformatics

我的问题涉及生物信息学,特别是蛋白质序列,但实际上并不需要生物学知识。我试图在Perl中找到解决这个问题的有效方法:

蛋白质序列基本上是序列或字符串,长度不同,由20个氨基酸或字符的组合组成。

长度为1时,将有20种可能性。问题是,每增加1个字符,可能性的数量就会大大增加。

我想计算每个长度的每个序列的另一个计算。蛋白质序列可以是数百甚至数千个氨基酸。我只需要获得所有可能的序列来执行此操作。

编辑:我意识到不可能计算每一个长度,我不需要这样做,但我想做一个合理的长度,不会接近宇宙的长度。

有关最有效的代码编码方法的任何建议吗?

编辑:对于1000的序列我真的不需要这样做,我只是对我不了解的想法,资源,功能等感兴趣,这可能有助于我理解最有效的方法。

4 个答案:

答案 0 :(得分:4)

推荐的Math::Combinatorics模块不支持替换排列,这是您想要解决的问题,否则您的蛋白质永远不会超过20种氨基酸。

Algorithm::Combinatorics将完成这项工作,并且部分用C编写,因此它应该表现良好。

以下是生成所有氨基酸对的示例。我只显示了前几行的输出,因为这样会产生400种变化!

use strict;
use warnings;

use Algorithm::Combinatorics 'variations_with_repetition';

my @acids = qw/ ala arg asn asp cys gln glu gly his ile leu lys met phe pro ser thr trp tyr val /;

my @proteins = variations_with_repetition(\@acids, 2);

print "@$_\n" for @proteins;

<强>输出

ala ala
ala arg
ala asn
ala asp
ala cys
ala gln
ala glu
ala gly
ala his
ala ile
ala leu
ala lys
ala met
ala phe
ala pro
ala ser
ala thr
ala trp
ala tyr
ala val
arg ala
arg arg
arg asn
arg asp
arg cys
arg gln
arg glu
arg gly
...

答案 1 :(得分:3)

20^1000真的 large number。你说你需要为每个序列做一些计算,如果没有扩展到多台计算机,这是不可能的。即使每秒计算一百万次,也需要many times the age of the universe完成计算。

答案 2 :(得分:2)

鉴于你的短语涉及每个已知长度的每个序列,这个问题永远不会收敛到一个合理的结果 - 你将保持一个无限长度。此外,您的计算将包括许多与现实无关的序列,或二肽与千兆分子之间的比较。即使你将你的计算限制在最大的已知蛋白质(titin,~34,350个氨基酸)的长度,它仍然是一个非常昂贵的计算。

作为替代提案:您是否考虑将其限制为实际已知存在的蛋白质,或者可以从遗传数据库中预测?这将使工作量减少到几千个与生物学相关的序列,对于大多数生物信息学应用,遗传或序列数据可以从结构良好的数据库中广泛获得。

答案 3 :(得分:-1)

要在perl中生成排列,我通常会转到Math::Combinatorics,这是一个程序片段,一次返回1,2,3的所有排列:

#!/usr/bin/perl -l

use Math::Combinatorics;

$, = " ";

@n = (1 .. 3);
$permuter = Math::Combinatorics->new(data => \@n);

while(@perm = $permuter->next_permutation())
{
  print @perm;
}

输出:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

但是听从其他答案的建议,这是一个指数级增长的问题,因为它已经说明了,所以你需要一些方法来限制你的搜索空间。