0

我正在尝试进行模拟,以查看人口固定的速度。总体由 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)。每个人群的频率都会发生变化(这就是我重新设置它们的原因)并导致固定。人口规模保持不变。

我怎样才能让它运行多个模拟?

4

1 回答 1

1

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

于 2015-01-14T20:27:55.063 回答