使用Python加权选择人口中的固定

时间:2015-01-14 20:09:04

标签: python iteration frequency choice population

我正在尝试进行模拟以了解人口有多快。人口由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。每个人口的频率变化(这就是为什么我重置它们)并导致固定。人口规模保持不变。

如何让它运行多次模拟?

1 个答案:

答案 0 :(得分:1)

您的问题是,每次模拟后您都没有重置p_freq= 0.1q_freq= 1 - p_freq。您需要在:for sim in range(n):循环中重置它们(否则它们会保留上一个SIM卡中的值)。