【发布时间】:2011-08-25 08:35:32
【问题描述】:
我需要优化种群中配子频率的计算。
我在每个群体中有np 个群体和Ne 个个体。每个个体由两个配子(雄性和雌性)组成。每个配子包含三个基因。每一代可能是0 或1。所以每个人都是一个 2x3 矩阵。矩阵的每一行都是一个父母给的一个配子。每个种群中的个体集可能是任意的(但总是Ne 长度)。为简单起见,具有个体的初始种群可以如下给出:
Ne = 300; np = 3^7;
(*This table may be arbitrary with the same shape*)
ind = Table[{{0, 0, 0}, {1, 1, 1}}, {np}, {Ne}]
全套所有可能的配子:
allGam = Tuples[{0, 1}, 3]
每个人可以通过 8 种可能的方式以相等的概率生成一个配子。这些配子是:Tuples@Transpose@ind[[iPop, iInd]](其中iPop 和iInd - 人口指数和人口指数)。我需要计算每个人口中个体产生的配子的频率。
此时我的解决方案如下。
首先,我将每个个体转化为它可以产生的配子:
gamsInPop = Map[Sequence @@ Tuples@Transpose@# &, ind, {2}]
但更有效的方法是:
gamsInPop =
Table[Join @@ Table[Tuples@Transpose@ind[[i, j]], {j, 1, Ne}], {i, 1, np}]
其次,我计算了产生的配子的频率,包括可能但在种群中不存在的配子的零频率:
gamFrq = Table[Count[pop, gam]/(8 Ne), {pop, gamInPop}, {gam, allGam}]
此代码的更高效版本:
gamFrq = Total[
Developer`ToPackedArray[
gamInPop /. Table[
allGam[[i]] -> Insert[{0, 0, 0, 0, 0, 0, 0}, 1, i], {i, 1,
8}]], {2}]/(8 Ne)
不幸的是,代码仍然太慢。谁能帮我加快速度?
【问题讨论】:
-
我添加了combinatorics标签;我认为这会有所帮助。我现在没有时间做这个。
标签: performance optimization combinatorics wolfram-mathematica