【问题标题】:Compute all possible sequences up to a given length计算给定长度的所有可能序列
【发布时间】:2012-07-14 15:10:09
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 本书"Higher Order Perl" 有一些使用迭代器的有趣解决方案。请参阅链接章节,尤其是第 22 页的 4.3.2
  • SO 旨在帮助人们解决特定的编程问题。我在这里看不到任何代码,您尝试过的任何内容,或者这个问题将来对其他人有什么帮助。
  • 你应该再想一想。您不能“对每个长度的每个序列进行另一次计算”。这将永远需要好几次!
  • 谢谢您,是的,您是正确的,我将再次编辑我的帖子以使其更清晰。

标签: string perl combinations bioinformatics


【解决方案1】:

推荐的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
...

【讨论】:

  • 太棒了,我一直在尝试让 Math::Combinatorics 在过去的一个小时内进行重复!这正是我想要的,明确地编码会导致各种各样的问题,我希望有一些东西可以用于这个确切的目的。谢谢!
【解决方案2】:

20^1000 是一个真的 large number。您说您需要对每个序列进行一些计算,如果不扩展到多台计算机,这实际上是不可能的。即使每秒进行 100 万次计算,您也需要 many times the age of the universe 才能完成计算。

【讨论】:

  • 感谢您的回复。是的,我意识到这是一个很大的数字。我真的不需要做这么高的数字,我希望做到一个合理的值,然后估计高于这个值的值。我只是想知道人们在概念上会如何处理这个问题。
【解决方案3】:

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

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

【讨论】:

  • 感谢您的 cmets。我已经计算了整个已知蛋白质宇宙的计算,但是,我只是想看看给定长度的所有可能性的分布是什么。我希望能够从合理的长度推断。你说的一切都是正确的,我纯粹是好奇,也想看看是否有人提出一些可以帮助我在 Perl 中使用的资源。
  • 嗯,通常的答案是使用标准库中相对健壮的实现来强行计算,例如使用 Perl 的 List::Gen 或 python 的 itertools.product 创建生成器。通常,您会希望使用生成器一次生成一个元素,而不是同时计算内存中的每个元素。
  • 谢谢,我没听说过generator,我会研究一下。再次感谢您。
【解决方案4】:

为了在perl 中生成排列,我通常求助于Math::Combinatorics,这是一个程序 sn-p,它一次返回 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-02-24
    • 2018-10-10
    相关资源
    最近更新 更多