高考生物遗传题中概率计算的一种优化方法

License: CC BY-NC-SA 4.0

实际上是用生成函数的类似物优化了配子法的运算.

有一点优化,但不多.

这种方法主要适用于群体自由交配的情况.相同基因型的个体自交可以等效于两个大小为 \(1\) 的群体;一个基因型不确定的个体可以按各基因型的概率看作一个群体.

先考虑最普通的情况.对于一个基因型为 \(AA\) 的生物,它的「生成函数」(这里直接借用生成函数的称呼了)为 \(F(x) = A(x) \cdot A(x) = A^2(x)\);对于基因型为 \(Aa\) 的生物,它的生成函数为 \(A(x)\cdot a(x)\)

上式中的 \(x\) 用来区别(同源)染色体,在非同源染色体上的基因就对应了不同的变量.你可能会问为什么不直接用 \(A\)\(a\) 做变量,但如果看作两个单独的变量就无法看出它们在同一条染色体上的关系,也不方便后续的计算.

对于一个群体,只要对每个个体的生成函数求和即可.系数是否归一取决于个人喜好,只要自己记着系数的实际意义就行了.例如,一个群体中有 \(2/3\)\(Aa\)\(1/3\)\(aa\),则这个群体的生成函数可写成 \(2Aa + aa\),这里 \(Aa\)\(aa\) 的系数比就表示它们的数量比是 \(2 : 1\).当然,你完全可以写成 \(\dfrac23 Aa + \dfrac13 aa\)

对于多基因的情况也类似.比如看到 \(AaBbX^CY + 2AAbbX^CX^c + 3aaBbX^cX^c\),你不难看出它代表了三种不同的基因型按 \(1:2:3\) 的比例混合.注意,这里两条性染色体对应同样的变量.如果不省略地写就是 \(F(x,y,z) = A(x)a(x)B(y)b(y)X^C(z)Y(z) + 2A(x)A(x)b(y)b(y)X^C(z)X^c(z) + 3a(x)a(x)B(y)b(y)X^c(z)X^c(z)\)

好的,我们得到了生成函数,然后呢?

若你不会刻画问题,学再多分析也无用武之地;若你得到了生成函数,但不会进行处理,那么生成函数的形式本身对解决问题毫无帮助。

—— command_block 《多项式计数杂谈》

回到之前单基因的例子上.在描述群体后,我们关心的是如何用生成函数刻画产生配子并得到下一代(群体内部或两个群体之间自由交配)的过程.

那么,如何刻画产生配子的过程呢?对群体中不同个体,它们产生的配子应该相加.这启发我们这种操作应该是线性的.实际上,一种可行的操作就是求导.

\(Aa\) 的个体为例,令 \(A'(x) = a'(x) = 1\),求导相当于把两个等位基因各放进了一个配子,结果是 \(A+a\).这本质上就是基因的分离定律.

由于求导是线性算子,它对群体的作用等于先对每个个体求配子再加起来,这符合自由交配的情况.

相应地,得到子代的方法就是将两个配子(对应的生成函数)相乘.例如 \(Aa\) 自交就是 \((A+a)(A+a) = AA + 2Aa + aa\)

在处理多基因时,这种操作对不同基因应该是互不影响的.一种可行的操作是求偏导.

\(AaBb\) 的个体为例,它的配子就是 \(\dfrac{\partial}{\partial x}\dfrac{\partial}{\partial y} A(x)a(x)B(y)b(y) = (\dfrac{\partial}{\partial x}A(x)a(x))(\dfrac{\partial}{\partial y}B(y)b(y)) = (A+a)(B+b)\)(为计算方便,令它们的导数为 \(1\)),这本质上就是基因的自由组合定律.

这样做真的能简化运算吗?为什么非要用求导这种东西,不能直接肉眼看出配子吗?

你说的对,但简化运算要靠这些数学工具的运算律.

例如,对于两个群体分别写出配子并相乘得到 \(F_1 = (A+2a)(2A+3a)\),若想使 \(F_1\) 自由交配得到 \(F_2\),不必算出 \(F_1\) 中各基因型占比,只要直接求导即可:\(F_1' = 3(2A+3a) + 5(A+2a) = 11A + 19a\),这代表 \(F_1\) 的配子中 \(A\)\(a\) 的比例是 \(11:9\),于是 \(F_2 = (11A+9a)^2\)

更一般地,在常染色体单基因的情况下设某群体 \(P\) 的生成函数为 \(P(x)\),它的配子是 \(P'(x)\)\(F_1\) 代为 \(F_1 = (P')^2\)\(F_1\) 代的配子为 \((P')\)(约掉了系数 \(2P''\)),下一代 \(F_2=(P')^2\).于是我们证明了哈迪-温伯格定律.

在多基因的情况下,乘法分配律可帮助判断两对基因能否独立计算.对于某群体自由交配的情况,如果你算出来配子形如 \(f(x)g(y)\),那么子代为 \((f(x)g(y))^2 = f^2(x) g^2(y)\),也就是可以独立计算.更一般地,如果某基因在配子中是一个单独的因式,那么这种基因可以单独计算.例如群体 \(AABb + 2AAbb + 2AaBb + 4Aabb\),可以写作 \((AA+2Aa)(Bb+2bb)\),因此配子是 \((2A+a)(B+5b)\),可以对每对基因分开计算.

即使遇到不能分开的情况,简化运算仍然是可能的.假如上面的群体中 \(Aabb\) 少了 \(1/4\) 的个体,则该群体可以写作 \((AA+2Aa)(Bb+2bb)-Aabb\),你会发现其实只要在上面的配子上减掉这部分就行了,配子是 \((2A+a)(B+5b)-2(A+a)b\).如果你想统计某种基因型占子代的比例,可以和通常的配子法一样,在这个生成函数里直接统计相应配子的数目(别忘了有些系数是负的).如果想得到子代基因型及比例,可以先把配子乘开再平方,也可以先平方再乘开,具体要看哪个比较好算.

要注意的一点是,在伴性遗传求群体自由交配时不能简单粗暴地给群体求导然后将配子平方,而是要将不同性别的个体分成两个群体,分别求导再将配子相乘.

对于致死的情况,可以在写完配子/个体后手动统计个数并在生成函数里减去相应的部分,也可以在导数上做手脚(我自己实践上没怎么用过它,就不详细讲了).

如果在考场上想不起来该怎么化简,暴力乘开永远是可行的:它等价于不简化运算的配子法.

真的有人会在考场上用我的这种方法吗?

posted @ 2025-05-25 22:37  383494  阅读(51)  评论(0)    收藏  举报