0

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

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

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

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

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

关于最有效的编码方式有什么建议吗?

编辑:我真的不需要为 1000 个序列执行此操作,我只是对我不知道的想法、资源、功能等感兴趣,这可能有助于我理解最有效的方法。

4

4 回答 4

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
...
于 2012-07-14T16:45:40.463 回答
3

20^1000是一个非常 大的数字。您说您需要对每个序列进行一些计算,如果不扩展到多台计算机,这实际上是不可能的。即使每秒进行 100 万次计算,完成计算也需要宇宙年龄的许多倍

于 2012-07-14T15:19:49.647 回答
2

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

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

于 2012-07-14T15:30:47.570 回答
-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

但是请注意其他答案的建议,正如所述,这是一个呈指数增长的问题,因此您需要某种方式来限制您的搜索空间。

于 2012-07-14T16:01:33.107 回答