ミトコンドリア・シミュレータ その1

by たけ(tk)

たけ(tk)のホームページへ


 本論の次の部分をシミュレートします。 (2)現代の人類の全員が一人のイブ(純粋母系の祖先)にたどり着くのは数学 的な必然であって、驚くべきことではない。ある集団の女性の人数が一定(N人) だとすると平均してその人数の4倍の世代数(4N世代)で一人のイブになって しまうらしい。人数に変動がある場合には最も人数が減った時期の集団の人数に よる。
 シミュレータの設定は次のようにします。 $model = 0 $model_ichiyo = false # はじめに一様の遺伝子か、20種類か?。 $model_heni = 0 # 何世代に1回変異するか。0なら変異しない。  この設定でシミュレータを実行すると次のようなものが出力されます。当初、 「a」から「t」までの20人の女性がいたとして、その「純粋母系」の子孫をた どっていくと、何10世代かを経過すると、その集団の全員の「純粋母系の祖先」 はただ一人の女性になってしまいます。↓の場合には90世代目にはすべての人 の「イブ」は「s」さんになっています。 000 a.b.c.d.e.f.g.h.i.j.k.l.n.m.o.p.q.r.s.t. t1,s1,r1,q1,p1,o1,n1,m1,l1,k1,j1,i1,h1,g1,f1,e1,d1,c1,b1,a1 001 a.b.c.c.d.d.e.e.f.f.g.h.k.l.m.m.p.s.s.t. s2,m2,f2,e2,d2,c2,t1,p1,l1,k1,h1,g1,b1,a1 002 a.b.c.c.c.d.d.d.e.e.e.f.g.h.h.l.m.p.p.s. e3,d3,c3,p2,h2,s1,m1,l1,g1,f1,b1,a1 003 b.c.c.c.d.d.e.e.f.g.g.h.h.h.m.p.p.p.p.s. p4,h3,c3,g2,e2,d2,s1,m1,f1,b1 004 b.c.c.c.d.e.e.f.f.g.h.h.h.m.m.p.p.p.p.s. p4,h3,c3,m2,f2,e2,s1,g1,d1,b1 005 b.b.c.c.d.e.e.f.h.h.m.m.m.p.p.p.p.p.p.s. p6,m3,h2,e2,c2,b2,s1,f1,d1 006 c.d.d.e.f.f.h.h.h.m.m.p.p.p.p.p.p.p.s.s. p7,h3,s2,m2,f2,d2,e1,c1 007 d.e.f.f.h.h.h.m.m.p.p.p.p.p.p.p.p.p.p.s. p10,h3,m2,f2,s1,e1,d1 008 d.e.f.f.f.h.h.m.p.p.p.p.p.p.p.p.p.p.s.s. p10,f3,s2,h2,m1,e1,d1 009 d.e.f.f.f.f.h.h.m.p.p.p.p.p.p.p.s.s.s.s. p7,s4,f4,h2,m1,e1,d1 010 e.f.f.h.h.h.h.m.p.p.p.p.p.p.p.s.s.s.s.s. p7,s5,h4,f2,m1,e1 020 f.f.f.f.f.f.f.h.h.h.h.h.s.s.s.s.s.s.s.s. s8,f7,h5 030 f.f.f.f.f.f.f.f.f.f.h.h.s.s.s.s.s.s.s.s. f10,s8,h2 040 f.f.f.f.f.f.s.s.s.s.s.s.s.s.s.s.s.s.s.s. s14,f6 050 f.f.f.f.f.f.f.f.f.s.s.s.s.s.s.s.s.s.s.s. s11,f9 060 f.f.f.f.f.f.f.f.f.f.s.s.s.s.s.s.s.s.s.s. s10,f10 070 f.f.f.f.f.f.f.f.f.f.f.s.s.s.s.s.s.s.s.s. f11,s9 080 f.f.f.f.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s. s16,f4 090 s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s. s20 100 s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s. s20  もう一度やってみましょう。今度は30世代目に全員が「r」さんの子孫にな ってしまいました。 000 a.b.c.d.e.f.g.h.i.j.k.l.n.m.o.p.q.r.s.t. t1,s1,r1,q1,p1,o1,n1,m1,l1,k1,j1,i1,h1,g1,f1,e1,d1,c1,b1,a1 001 a.a.b.b.c.c.d.e.f.g.g.h.k.l.n.m.q.q.r.s. q2,g2,c2,b2,a2,s1,r1,n1,m1,l1,k1,h1,f1,e1,d1 002 a.a.b.b.c.c.c.d.d.e.g.h.k.l.n.m.q.r.s.s. c3,s2,d2,b2,a2,r1,q1,n1,m1,l1,k1,h1,g1,e1 003 c.c.d.e.g.g.h.h.k.k.l.l.n.n.q.r.r.s.s.s. s3,r2,n2,l2,k2,h2,g2,c2,q1,e1,d1 004 c.c.c.d.e.g.g.h.h.k.k.l.l.l.r.r.r.s.s.s. s3,r3,l3,c3,k2,h2,g2,e1,d1 005 c.d.e.e.h.h.k.k.l.l.l.l.r.r.r.r.r.r.s.s. r6,l4,s2,k2,h2,e2,d1,c1 006 e.h.h.h.k.k.l.l.l.l.l.r.r.r.r.r.r.r.s.s. r7,l5,h3,s2,k2,e1 007 e.h.h.h.h.l.l.l.l.r.r.r.r.r.r.r.r.r.s.s. r9,l4,h4,s2,e1 008 h.h.h.l.l.l.l.l.l.r.r.r.r.r.r.r.r.r.r.s. r10,l6,h3,s1 009 h.h.h.l.l.l.l.l.l.l.l.r.r.r.r.r.r.r.r.r. r9,l8,h3 010 h.h.h.h.l.l.l.l.l.l.l.r.r.r.r.r.r.r.r.r. r9,l7,h4 020 h.h.h.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r. r17,h3 030 r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r. r20 040 r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r. r20  もちろん、100世代計算しても、一人のイブにならないこともあります。 「平均してその人数の4倍の世代数(4N世代)で一人のイブになってしまう」 というのは、このようなシミュレーションを何度もやってみれば、「単系化す るまでの世代数」がたくさん集まる。その平均を取れば「人数の4倍の世代数 (4N世代)」つまりこのシミュレーションであれば80世代になるはずだ、 と言うことです。 000 a.b.c.d.e.f.g.h.i.j.k.l.n.m.o.p.q.r.s.t. t1,s1,r1,q1,p1,o1,n1,m1,l1,k1,j1,i1,h1,g1,f1,e1,d1,c1,b1,a1 001 a.a.b.b.f.g.g.h.j.k.l.n.n.m.o.p.q.r.s.t. n2,g2,b2,a2,t1,s1,r1,q1,p1,o1,m1,l1,k1,j1,h1,f1 002 a.a.a.b.b.f.g.g.j.j.k.k.l.n.n.m.o.p.r.t. a3,n2,k2,j2,g2,b2,t1,r1,p1,o1,m1,l1,f1 003 a.a.a.b.b.b.f.g.g.j.k.l.l.n.n.m.m.p.p.t. b3,a3,p2,n2,m2,l2,g2,t1,k1,j1,f1 004 a.a.a.b.b.f.f.g.g.g.j.l.l.n.n.n.m.m.p.p. n3,g3,a3,p2,m2,l2,f2,b2,j1 005 a.a.a.a.a.b.f.f.g.g.g.j.l.l.l.n.n.m.m.p. a5,l3,g3,n2,m2,f2,p1,j1,b1 006 a.a.a.a.a.b.f.g.g.g.j.l.l.l.n.n.n.m.m.p. a5,n3,l3,g3,m2,p1,j1,f1,b1 007 a.a.a.a.a.b.g.g.g.g.g.j.l.l.l.l.n.m.m.p. g5,a5,l4,m2,p1,n1,j1,b1 008 a.a.a.a.a.g.g.g.g.g.j.j.l.l.l.l.l.l.m.m. l6,g5,a5,m2,j2 009 a.a.a.a.a.g.g.j.j.j.l.l.l.l.l.l.m.m.m.m. l6,a5,m4,j3,g2 010 a.a.a.g.g.g.g.j.j.j.l.l.l.l.l.l.m.m.m.m. l6,m4,g4,j3,a3 020 a.a.a.a.a.a.a.g.g.j.j.j.l.l.l.l.l.l.l.m. l7,a7,j3,g2,m1 030 a.a.a.a.a.a.a.a.a.a.a.j.j.j.j.j.j.j.j.j. a11,j9 040 a.a.a.a.a.a.a.a.a.a.a.a.a.a.j.j.j.j.j.j. a14,j6 050 a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.j.j.j.j.j. a15,j5 060 a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.j.j.j.j. a16,j4 070 a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.j.j. a18,j2 080 a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.j.j.j. a17,j3 090 a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.j.j.j. a17,j3 100 a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.j.j. a18,j2
ミトコンドリア・シミュレータ へもどる ミトコンドリア・シミュレータ その2(新)
ではこのシミュレータのスクリプトを次に掲げておきます。
#!ruby -Ks require "phi" ## ## Ruby_aw mtDNA.rb ## Ruby_aw d:\apollo\mtdna.rb ## ## ミトコンドリアDNA ## 2000-08-30(水)。たけ(tk) ## 2002-02-02(土)。ちょい訂正。 ## ## ---- 設定 ---- $model = 0 $model_ichiyo = false # はじめに一様の遺伝子か、20種類か?。 $model_heni = 0 # 何世代に1回変異するか。0なら変異しない。 $model_ninzu = 20 # 部族の女性の人数(最大20人) $model_sedai = 102 # 何世代まで計算するか?。 $model_disp_all = false # 全ての経過を表示するか、10世代に1回か?。 $disp_second = false ## ---- $model による変更 ---- if $model ==1 ## 単一化のシミュレーション $model_ichiyo = false $model_heni = 0 elsif $model == 2 ## 普通の変異のシミュレーション $model_heni = 1 elsif $model == 3 ## 多様ではじめて、変異もある場合。 $model_ichiyo = false $model_heni = 1 elsif $model == 4 ## 10人。 $model_ninzu = 10 elsif $model == 5 ## 5世代に1回の変異。途中何度も単一化する。 $model_heni = 5 $model_sedai = 502 elsif $model == 6 ## 2世代に1回の変異。 $model_heni = 2 $model_sedai = 202 elsif $model == 7 ## 単一化のシミュレーション。15人 $model_ichiyo = false $model_heni = 0 $model_ninzu = 15 elsif $model == 8 ## nifty のケースで50世代目から分離 $model_sedai = 52 end if $model_ichiyo ## 12345678901234567890 $current = 'aaaaaaaaaaaaaaaaaaaa' $nextchr = ?b else ## 12345678901234567890 $current = 'abcdefghijklnmopqrst' $nextchr = ?u end if $model == 8 ## 12345678901234567890 $current = 'oobjjtttssttvvvmmmaa' $nextchr = ?c end if $model_ninzu < 20 $current = $current[0..($model_ninzu-1)] end ## ---- 設定おわり ---- ## ---- 各遺伝子の数をカウントする ---- $chrcnt = {} def mk_cnt for c in ?a .. ?z $chrcnt[c.chr] = 0 end for i in 0 .. $model_ninzu-1 c = $current[i].chr.downcase $chrcnt[c] = $chrcnt[c] + 1 end end mk_cnt ##p $chrcnt.sort def disp_cnt s1 = [] $chrcnt.each{ |chr,cnt| s1 << [cnt,chr] if cnt > 0 } s2=[] s1.sort.reverse.each{ |cnt,chr| s2 << format("%s%d",chr,cnt) } return s2.join(',') end ## ---- 女性を一つ置きに並べる ---- def mk_disp1 s = '' for i in 0..$model_ninzu-1 s = s+$current[i].chr+'.' end return s end ## ---- 次の変異型の記号を捜す ---- def getnext c = $nextchr m1,m2=1000,1000 for d in ?a .. ?z if $chrcnt[d.chr] == 0 if c < d m2 = d if d < m2 else m1 = d if d < m1 end end end if m2 != 1000 $nextchr = m2 else $nextchr = m1 end return c.chr end ## ---- 子供の遺伝子を複製して、変異型を追加し、男子は「.」にする ---- $changes = [] def mk_disp2 r = rand($model_ninzu) s = '' for i in 0..$model_ninzu-1 c = $current[i].chr if ( r == i ) and ( $model_heni != 0 ) and ( $sedai % $model_heni == 0 ) n = getnext.upcase s = s+n+c $changes << format("%d %s => %s",$sedai,c,n) else s = s+c*2 end end d = 0 while d < $model_ninzu r = rand($model_ninzu*2) c = s[r] if ( c != ?. ) && ( ?a <= c ) && ( c <= ?z ) d=d+1 s[r] = ?. end end $current = '' for d in 0 .. ($model_ninzu*2-1) c = s[d] if ( c != ?. ) $current = $current + c.chr.downcase end end mk_cnt return s end ## ---- メインループ。計算+表示。最後に変異の一覧を表示 ---- $sedai = 0 if $model==8 $sedai = 50 end for i in 1..$model_sedai cnt = disp_cnt disp1 = mk_disp1 disp2 = mk_disp2 if ($model_disp_all) || ($sedai < 10) || ($sedai % 10 == 0 ) print format("%03d " % $sedai),disp1,' ',cnt,"\n" print format("%03d " % $sedai),disp2,"\n" if $disp_second end $sedai += 1 end p $changes raise
ミトコンドリア・シミュレータ へもどる ミトコンドリア・シミュレータ その2(新)