人口が固定する速度を確認するためにシミュレーションを実行しようとしています。母集団は 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 に固定されていることは理にかなっています。人口ごとに頻度が変化し(これが私がそれらをリセットした理由です)、それが固定につながります。人口規模は同じままです。
これを複数のシミュレーションで実行するにはどうすればよいですか?