我正在尝试进行模拟以了解人口有多快。人口由1(或p)和0(或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] < / p>
对于下一个群体,我会根据频率(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代。然而,确实有意义的是,由于90%的原始种群是q(即0),因此人口正在固定q。每个人口的频率变化(这就是为什么我重置它们)并导致固定。人口规模保持不变。
如何让它运行多次模拟?
答案 0 :(得分:1)
您的问题是,每次模拟后您都没有重置p_freq= 0.1
和q_freq= 1 - p_freq
。您需要在:for sim in range(n):
循环中重置它们(否则它们会保留上一个SIM卡中的值)。