【发布时间】:2011-07-02 11:50:55
【问题描述】:
假设我有一个如下所示的二维数组:
GACTG
AGATA
TCCGA
每个数组元素都取自一个小的有限集(在我的例子中,是 DNA 核苷酸 -- {A, C, G, T})。我想以某种方式随机打乱这个数组,同时保留行 和 列的核苷酸频率。这可能吗?能不能高效完成?
[编辑]:我的意思是我想生成一个新矩阵,其中每一行都有相同数量的As、Cs、Gs 和 @987654328 @s 作为原始矩阵的对应行,其中每一列的As、Cs、Gs 和Ts 的数量与原始矩阵的对应列相同。 置换原始矩阵的行或列一般不会实现这一点。(例如,对于上面的示例,顶行有 2 个Gs,A、@987654335 各有 1 个@ 和 T;如果此行与第 2 行交换,则结果矩阵的顶行将有 3 个As、1 个G 和 1 个T。)
通过一次改组一列来保留列频率非常简单,对于行也是如此。但这样做通常会改变另一种频率。
到目前为止我的想法:如果可以选择 2 行和 2 列,以便这个矩形角的 4 个元素具有图案
XY
YX
对于一对不同的元素 X 和 Y,然后将这 4 个元素替换为
YX
XY
将保持行频和列频。在顶部的示例中,这可以针对(至少)第 1 行和第 2 行以及第 2 和第 5 列(其角给出 2x2 矩阵AG;GA)以及第 1 行和第 3 行以及第 1 和第 4 列(其角落给GT;TG)。显然,这可以重复多次以产生某种程度的随机化。
概括地说,任何由行子集和列子集诱导的“子矩形”,其中所有行的频率相同,所有列的频率相同,可以同时具有行和列置换以产生一个有效的完整矩形。 (其中,只有那些至少改变了 1 个元素的子矩形才是真正有趣的。)大问题:
- 是否所有有效的完整矩阵都可以通过一系列此类“子矩形重排”得到?我怀疑答案是肯定的。
- 所有有效的子矩形重排都可以分解成一系列 2x2 交换吗? [编辑]:mhum's counterexample 表明答案是否。不幸的是,因为这似乎使提出有效算法变得更加困难,但了解这一点很重要。
- 能否有效计算部分或全部有效重排?
This question 解决了可能元素集为{0, 1} 的特殊情况。人们提出的解决方案与我自己提出的解决方案相似,并且可能可用,但并不理想,因为它们需要任意数量的回溯才能正常工作。我还担心只考虑 2x2 交换。
最后,理想情况下,我希望有一个解决方案,可以证明可以从具有与原始相同行频率和列频率的所有矩阵集中随机均匀地选择一个矩阵。我知道,我要求很多:)
【问题讨论】:
-
似乎很适合遗传算法(没有双关语)。
-
@Paulo:您的意思是生成一组随机矩阵并根据其行和列频率与理想值的距离来对它们的适应度进行评分吗?它可以工作,但你将如何组合 2 个矩阵?我可以看到你如何通过寻找增加一致性的“移动”,从一个单一的起始矩阵爬上山,直到不再有改进的移动是可能的。
-
拆分和合并来自多个个体的列,比如说,就像一个 5 性别的外星种族?
-
当您说要保留行频时,您的意思是要保留每一行的频数吗?换句话说,在您的示例中,您的第一行有 1A、1C、1T 和 2G。你需要你的洗牌矩阵来维持第一行的分布吗?排列行(例如:交换第一行和第二行)是不可接受的改组吗?
-
@mhum:是的,我想保留 each 行的频率。看起来我更新的时间和你的评论差不多,希望现在很清楚。 :)