【发布时间】:2019-12-05 17:37:17
【问题描述】:
我有一组N 染色体,它们都可以用大小为L 的二进制字符串来表示。 N 通常大小为 1e4(正负两个数量级)。 L 可以变化很大,但可以上升到 1e7。目前,我正在为每个N 染色体使用L 位记录所有这些信息,但这会消耗太多内存。我正在寻找更好的数据结构。
我们可以利用N 染色体不是随机分散在2^L 可能性空间中的事实。它们往往非常聚集。换句话说,平均汉明距离通常远小于 L/2。让我们想象一下对我们的染色体进行 PCA,它可能看起来像这样
在离散的时间步长上,所有N 染色体都被其他N 染色体替换。有“突变”(一个突变一次改变一位)。因此,染色体的种群会进化,以便稍后它们看起来更像这样
现在,问题是N 染色体形成两个(或更多)组并非不可能
另外,一些“后代”染色体可能是从两个“父”染色体“杂交”产生的。如果两条父染色体属于两个不同的组(PCA 图上的组),那么事情就会变得更难一些。例如,假设L=15,我们可能有两条父染色体
[0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0] // Let's call it 'Alice'
[1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1] // Let's call it 'Bob'
“生”出染色体
[0,0,0,1,0,0,0,0,1,0,0,1,1,1,1,1] // This is Charlie, son of a mixture of Alice and Bob
// Alice <- ^ -> Bob
在实践中,我们可以有很多这些不同的混合体。杂交种可以进一步杂交。但与 2^L 的可能性相比,参数空间探索仍然非常小,因此应该有一种方法可以不必使用 N*L 位来表示 N 条染色体。
我可以使用什么数据结构来表示N 染色体以最大限度地减少内存使用?
我在想我可以有一些参考染色体,并通过它们与参考染色体携带多少差异来参考所有其他染色体。
我还可以将所有染色体放在 B+ 树的顶端,树的每个分支都列出了它与参考染色体有多少差异。例如,B+ 树的最基础可能是[0,0,0,0,...0,0]。每隔几个时间步,我就可以重新计算整个 B+ 树以进行清理。现在混合的存在将成为这个解决方案的一个问题。另外,我想知道在 B+ 树中是否允许反转突变。也许,我应该允许 B+ 树的某些分支只考虑染色体的子部分(如前 L/5 位)。在所有情况下,我都不确定如何实现所有这些细节(例如如何重新计算 B+ 树以清理它)。
【问题讨论】:
标签: c++ data-structures tree hamming-distance