0

人口が固定する速度を確認するためにシミュレーションを実行しようとしています。母集団は 1 (または p) と 0 (または q) で構成され、各個体は 2 つの要素 (1-1、1-0、または 0-0) を持ちます。

N は人口であり、人口の各メンバーには 2 つの要素があるため、人口プールは 2*N (この場合は 20) になります。

1 の初期頻度は 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 リストに記録しようとしています。

だから私はこれを1つのシミュレーションで機能させましたが、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 に固定されていることは理にかなっています。人口ごとに頻度が変化し(これが私がそれらをリセットした理由です)、それが固定につながります。人口規模は同じままです。

これを複数のシミュレーションで実行するにはどうすればよいですか?

4

1 に答える 1