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

Fixation in population with weighted choices using Python

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

我如何才能将其设为 运行 以进行多次模拟?

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