我正在尝试进行模拟,以查看人口固定的速度。总体由 1s(或 p)和 0s(或 q)组成,而每个个体有 2 个元素(1-1、1-0 或 0-0)。
N 是人口,由于人口的每个成员都有 2 个元素,人口池将为 2*N(在本例中为 20)
1s 的初始频率为 0.1,默认情况下,q 为 1 - 0.1 = 0.9
所以初始种群是 [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
对于下一个种群,我根据频率(p_freq 和 q_freq)随机选择(加权选择)并遍历它,直到种群固定为全 1 或全 0。一旦它固定,我试图在 p_fix 或 q_fix 列表中记录它固定的一代
所以我已经让它适用于一个模拟,但我试图让它适用于 n = 100 个模拟,我不知道如何构造它以让循环继续填充 p_fix 和 q_fix正确列出
#!/usr/bin/env python2.7
import random
N= 10
n= 100
p_freq= 0.1
q_freq= 1 - p_freq
simulation= 0
p_fix= []
q_fix= []
for sim in range(n):
generation= 0
#Current population
p_alleles= int(p_freq * 2*N)*[1]
q_alleles= int(q_freq * 2*N)*[0]
population= p_alleles + q_alleles
while (sum(population) != 2*N) and (sum(population) != 0):
#Checking current population for fixation
#Next generation
next_population= []
for i in range(2*N): next_population.append(random.choice(population))
#Resetting parameters
p_freq= float(sum(next_population))/(2*N)
q_freq= 1 - p_freq
population= next_population
#Counts
generation += 1
if sum(population) == 2*N:
p_fix.append(generation)
if sum(population) == 0:
q_fix.append(generation)
simulation += 1
我打印出 p_fix 和 q_fix 时的结果:
p []
q [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
在第一次模拟之后,它不应该是所有模拟的第 0 代。然而,人口固定为 q 确实是有道理的,因为 90% 的原始人口是 q(即 0s)。每个人群的频率都会发生变化(这就是我重新设置它们的原因)并导致固定。人口规模保持不变。
我怎样才能让它运行多个模拟?