ミトコンドリア・シミュレータ その2(旧)

by たけ(tk)

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


 本論の意見(1)の補足をします。 》(1)「現代のある人」の母親は一人だが、父母は2人。祖母は2人で祖父母は 》4人居る、曾祖母は4人、曾祖父母は8人居る。10代前(約300年前)の祖 》先は計算上1024人。30代前(約1000年前)の祖先は計算上10億7374万 》1824人となる(※1)。「現代のある人」の祖先は時代が遡ると計算上膨大な人 》数になり、その時代の全人口を上回ることは確実である。したがって、大昔の人 》間のうち、その後子孫を残した人の大半が「現代のある人」の祖先であったと考 》えた方が合理的だろう(※2)。 の(※2)のシミュレーションです。スクリプトは最後に置きました。  シミュレーションの前提は次の通り: (1)40人=20家族の集団で、 (2)それぞれの家族が2人づつの子どもをもうける。 (3)子どもの性別はランダム。 (4)子どもは必ず成人して結婚する。 (5)結婚の相手は「隣の家族」の異性である。  * 結婚相手が「隣の家族」なので、3世代目以降は原則として「いとこ婚」 になります。
 【試行結果からの結論】  5回試行した結果は次の通り。12世代から15世代で「全員の祖先が同じ」 になっています。純粋母系/純粋父系の単系化よりもずっと早く全員の遺伝的祖 先が同じになってしまいます。  1回目: "15世代目で全員の祖先が同じになった" "28世代目で女が単系化した" "92世代目で男が単系化した"  2回目: "15世代目で全員の祖先が同じになった" "28世代目で男が単系化した"  * 女は100世代目でも単系化しなかった。  3回目: "12世代目で全員の祖先が同じになった" "57世代目で男が単系化した" "73世代目で女が単系化した"  4回目: "12世代目で全員の祖先が同じになった" "85世代目で女が単系化した" "95世代目で男が単系化した"  5回目: "12世代目で全員の祖先が同じになった" "46世代目で男が単系化した" "62世代目で女が単系化した"  なお、このスクリプトでは遺伝的祖先の断絶がないようになっているので、祖 先が同じになって時点で、当初の全員が祖先となりますが、実際には遺伝的祖先 の断絶が考えられるので、これより早い段階で祖先が同一になります。また、 「いとこ婚」を前提としているので実際より遅い結果が出ています。ただし、階 級/身分/地域などの違いで通婚が阻害される場合には遅くなります。
ミトコンドリア・シミュレータ その2(新) へ戻る ミトコンドリア・シミュレータ その3
 【出力結果の読み方】  「夫婦」行1行と「子ども」行2行、「遺伝的祖先の数の平均」行1行で1世 代の情報が出力されます。  男は大文字、女は小文字で表現されます。  夫婦行: ↓世代数 000: Ta:Ab:Bc:Cd:De:Ef:Fg:Gh:Hi:Ij:Jk:Kl:Lm:Mn:No:Op:Pq:Qr:Rs:St ↑T:男、a:女 で一組の夫婦。 ↑「隣の家族」と婚姻する ↑「T」は前世代の最後に記述された家族の男子  子ども行: ↓上の夫婦から生まれた子どもの性別。 男 0.. 2 ["T:Ta", "A:Ab", "B:Bc"]   ↑↓男は1〜3番目を表示、女は11番目から13番目を表示 女 10..12 ["k:Jk", "k:Jk", "l:Kl"] ↑「Jk」の夫婦から生まれた子ども(女子)の純粋母系の祖先 ↑「Jk」はその遺伝的祖先の全員。 ↑「k:Jk」「k:Jk」は姉妹。 ↑姉妹の場合には、この家族には男の子が無いことになる。  「遺伝的祖先の数の平均」行: 2.0 ↑1世代目では直近の父母だけが遺伝的祖先。全員そうなので平均も2人。  2世代目: 001: Ra:Tb:Ac:Bd:Dd:Df:Eg:Fh:Gi:Ii:Ik:Lk:Ml:Ml:Nm:Oo:Pp:Pr:Qt:Rt 男 0.. 2 ["R:RTas", "A:ABbc", "D:CDde"] 女 10..12 ["k:IJjk", "k:IJjk", "k:JLkm"] 4.0 ↑いとこ婚でも2代目までは祖先の重複はない。  3世代目: 002: Ra:Rb:Ab:Dc:Dd:Dd:Ef:Eh:Fi:Ii:Ik:Mk:Mk:Mk:Mo:No:Np:Pp:Qr:Qt             ↓この男子の親は Rb で、             ↓遺伝的祖先は R:RTas と b:A?b? で祖先の重複がある。 男 0.. 2 ["R:RSTast", "R:ARTabs", "R:ARTabs"] 女 10..12 ["k:JKLMklmn", "k:JKLMklmn", "o:KMNOlnop"] 6.7 ↑祖先の重複が出たので8人より少なくなる。  ・・・ "15世代目で全員の祖先が同じになった" 015: Mb:Mb:Mf:Mf:Mf:Mf:Mf:Mf:Mk:Mk:Nk:Nk:No:Ro:Ro:Ro:Ro:Eo:Eo:Mo 男 0.. 2 ["M:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "M:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "M: 女 10..12 ["k:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "k:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "k: 40.0 ↑このシミュレーションでは遺伝的断絶が無いようになっているので、当初の4 0人全員が遺伝的祖先になっている。しかし、実際の場合には遺伝的断絶がある ので当初の全員にはならない。その場合には、「全員の祖先が同一になる」世代 数はこれより速くなる。 また、「いとこ婚」というのも「全員の祖先が同一になる」世代数を長くする要 素なので、「いとこ婚」を避ける場合には世代数がもっと少なくなる。  ・・・  ↓【系統の単一化のシミュレーション】に対応する結果 "28世代目で女が単系化した" 028: Mk:Mk:Mk:Mk:Rk:Rk:Rk:Ek:Ek:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk "92世代目で男が単系化した" 092: Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk
 1回目: 000: Ta:Ab:Bc:Cd:De:Ef:Fg:Gh:Hi:Ij:Jk:Kl:Lm:Mn:No:Op:Pq:Qr:Rs:St 男 0.. 2 ["T:Ta", "A:Ab", "B:Bc"] 女 10..12 ["k:Jk", "k:Jk", "l:Kl"] 2.0 001: Ra:Tb:Ac:Bd:Dd:Df:Eg:Fh:Gi:Ii:Ik:Lk:Ml:Ml:Nm:Oo:Pp:Pr:Qt:Rt 男 0.. 2 ["R:RTas", "A:ABbc", "D:CDde"] 女 10..12 ["k:IJjk", "k:IJjk", "k:JLkm"] 4.0 002: Ra:Rb:Ab:Dc:Dd:Dd:Ef:Eh:Fi:Ii:Ik:Mk:Mk:Mk:Mo:No:Np:Pp:Qr:Qt 男 0.. 2 ["R:RSTast", "R:ARTabs", "R:ARTabs"] 女 10..12 ["k:JKLMklmn", "k:JKLMklmn", "o:KMNOlnop"] 6.7 004: Qb:Qb:Qd:Rd:Rd:Rf:Rh:Dk:Dk:Ek:Ek:Fo:Fo:Fo:Io:Mp:Mp:Mp:Mr:Nt 男 0.. 2 ["Q:ABPQRSTabcqrst", "R:ABCDRSTabcdest", "R:ABCDERTabcdefs"] 女 10..12 ["k:EFGHIJKLMfghijklmn", "o:FGHIJKLMNOghijklmnop", "o:FGHIJKLMNOghijklmnop"] 17.0 010: Mb:Mb:Mb:Mb:Nb:Rb:Rb:Rf:Rf:Rk:Ek:Ek:Ek:Ek:Mo:Mo:Mo:Mo:Mo:Mo 男 0.. 2 ["M:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "N:ABCDEFGIJKLMNOPQRSTabcdefghjklmnopqrst", 女 10..12 ["f:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "k:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "k: 36.6 "15世代目で全員の祖先が同じになった" 015: Mb:Mb:Mf:Mf:Mf:Mf:Mf:Mf:Mk:Mk:Nk:Nk:No:Ro:Ro:Ro:Ro:Eo:Eo:Mo 男 0.. 2 ["M:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "M:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "M: 女 10..12 ["k:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "k:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "k: 40.0 020: Rf:Rf:Rk:Rk:Rk:Ek:Ek:Ek:Ek:Mk:Mk:Mk:Mo:Mo:Mo:Mo:No:Ro:Ro:Ro "28世代目で女が単系化した" 028: Mk:Mk:Mk:Mk:Rk:Rk:Rk:Ek:Ek:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk 030: Mk:Mk:Mk:Mk:Mk:Mk:Mk:Rk:Rk:Rk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk 040: Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Rk:Rk 050: Mk:Mk:Mk:Mk:Mk:Rk:Rk:Rk:Rk:Rk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk 060: Rk:Rk:Rk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Mk:Rk:Rk:Rk 070: Mk:Mk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk 080: Rk:Rk:Rk:Rk:Mk:Mk:Mk:Mk:Mk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk 090: Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Mk:Mk:Mk:Rk:Rk:Rk:Rk "92世代目で男が単系化した" 092: Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk:Rk
 2回目: 000: Ta:Ab:Bc:Cd:De:Ef:Fg:Gh:Hi:Ij:Jk:Kl:Lm:Mn:No:Op:Pq:Qr:Rs:St 男 0.. 2 ["T:Ta", "T:Ta", "A:Ab"] 女 10..12 ["k:Jk", "l:Kl", "m:Lm"] 2.0 001: Sb:Tc:Td:Ad:Be:Df:Eg:Fh:Gj:Hk:Hk:Il:Km:Lo:Mo:Mp:Or:Pr:Ps:Ss 男 0.. 2 ["S:ASbt", "T:BTac", "T:CTad"] 女 10..12 ["l:IKjl", "l:IKjl", "m:KLlm"] 4.0 010: Ke:Ke:Ke:Me:Oe:Oe:Ah:Ah:Ah:Ah:Ah:Ah:Ak:Fk:Hk:Hk:Hk:Km:Km:Km 男 0.. 2 ["K:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "K:ABCDEKLMNOPQRSTabcdeflmnopqrst", "K: 女 10..12 ["h:ABCDEFGHIJKLNOPQRSTabcdefghijklmopqrst", "h:ABCDEFGHIJKLNSTabcdefghijklmot", "k: 35.2 "15世代目で全員の祖先が同じになった" 015: Ae:Fe:Fe:Ke:Ke:Ke:Kh:Kh:Kh:Kh:Kh:Kk:Ak:Ak:Ak:Am:Am:Am:Am:Am 男 0.. 2 ["A:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "A:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "F: 女 10..12 ["h:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "h:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "k: 40.0 "28世代目で男が単系化した" 028: Ae:Ae:Ah:Ah:Ah:Ah:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak 100: Ae:Ae:Ae:Ae:Ae:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak:Ak  * 女は100世代目でも単系化しなかった。
 3回目: 000: Ta:Ab:Bc:Cd:De:Ef:Fg:Gh:Hi:Ij:Jk:Kl:Lm:Mn:No:Op:Pq:Qr:Rs:St 男 0.. 2 ["T:Ta", "T:Ta", "A:Ab"] 女 10..12 ["m:Lm", "n:Mn", "o:No"] 2.0 001: Sb:Td:Tf:Ah:Bi:Bj:Ck:Dl:Dl:Em:Fm:Fn:Go:Ho:Iq:Jq:Mr:Os:Os:Qt 男 0.. 2 ["S:ASbt", "T:CTad", "T:CTad"] 女 10..12 ["m:FLgm", "n:FMgn", "o:GNho"] 4.0 010: Hb:Mb:Mb:Mj:Oj:Oj:Ok:Ok:Sk:Sk:Sk:Cl:Dl:Dl:En:Hn:Hn:Ho:Ho:Hr 男 0.. 2 ["H:ADEFGHIJKLMNOPQRSbefghijklmnopqrst", "M:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "M: 女 10..12 ["l:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "n:ABCDEFGHIJKLMNOPQRTabcdefghijklmnopqrs", "n: 38.5 "12世代目で全員の祖先が同じになった" 012: Hb:Hj:Hj:Hj:Mj:Mj:Mk:Mk:Ok:Ok:Ol:Sn:Sn:Sn:Co:Co:Co:Dr:Dr:Dr 男 0.. 2 ["H:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "H:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "H: 女 10..12 ["n:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "n:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "o: 40.0 "57世代目で男が単系化した" 057: Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Dr:Dr:Dr:Dr "73世代目で女が単系化した" 073: Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do:Do
 4回目: 000: Ta:Ab:Bc:Cd:De:Ef:Fg:Gh:Hi:Ij:Jk:Kl:Lm:Mn:No:Op:Pq:Qr:Rs:St 男 0.. 2 ["T:Ta", "T:Ta", "C:Cd"] 女 10..12 ["i:Hi", "j:Ij", "l:Kl"] 2.0 001: Sb:Tb:Tc:Cc:Ed:Fe:Ge:Gf:Ig:Ji:Ji:Lj:Ml:Nl:Om:On:Po:Qq:Rr:Rt 男 0.. 2 ["S:ASbt", "S:ASbt", "T:ATab"] 女 10..12 ["g:FIgj", "i:HJik", "m:LOmp"] 4.0 010: Jb:Jb:Lb:Sb:Fc:Fc:Fc:Fc:Ge:Ge:Gn:Gn:Gn:Gq:Gq:Gq:Jt:Jt:Jt:Jt 男 0.. 2 ["J:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "J:ABDEFGHIJKLMNOPQRSTabcefghijklmnopqrst", "J: 女 10..12 ["n:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "n:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "n: 39.9 "12世代目で全員の祖先が同じになった" 012: Jb:Jb:Jb:Jc:Jc:Jc:Sc:Fe:Fe:Fn:Fn:Fn:Gq:Gq:Gt:Gt:Gt:Gt:Gt:Gt 男 0.. 2 ["J:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "J:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "J: 女 10..12 ["q:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "q:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "t: 40.0 "85世代目で女が単系化した" 085: Jc:Jc:Jc:Jc:Jc:Jc:Jc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Jc "95世代目で男が単系化した" 095: Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc:Fc
 5回目: 000: Ta:Ab:Bc:Cd:De:Ef:Fg:Gh:Hi:Ij:Jk:Kl:Lm:Mn:No:Op:Pq:Qr:Rs:St 男 0.. 2 ["T:Ta", "T:Ta", "A:Ab"] 女 10..12 ["k:Jk", "m:Lm", "n:Mn"] 2.0 001: Rb:Tc:Td:Ae:Bf:Cg:Dh:Eh:Fj:Hj:Hk:Jm:Kn:Ko:Lp:Mq:Nr:Os:Pt:Qt 男 0.. 2 ["R:ARbs", "T:BTac", "T:BTac"] 女 10..12 ["n:KMln", "o:KNlo", "o:KNlo"] 4.0 010: Hb:Hb:Lb:Lb:Ld:Bj:Bj:Bj:Bj:Bj:Bo:Bo:Bo:Bo:Bo:Bq:Bq:Hq:Hq:Hq 男 0.. 2 ["H:ACDEFGHIJKLMNOPQRSbdefghijklmnopqrst", "H:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "L: 女 10..12 ["o:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "o:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "q: 39.8 "12世代目で全員の祖先が同じになった" 012: Bj:Hj:Hj:Hj:Hj:Lj:Lj:Lj:Bj:Bo:Bo:Bq:Bq:Bq:Bq:Bq:Bq:Bq:Bq:Bq 男 0.. 2 ["B:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "B:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "H: 女 10..12 ["o:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "o:ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst", "q: 40.0 "46世代目で男が単系化した" 046: Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bq:Bq:Bq:Bq:Bq "62世代目で女が単系化した" 062: Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo:Bo
ミトコンドリア・シミュレータ その2(新) へ戻る ミトコンドリア・シミュレータ その3
 【スクリプト】 #!ruby -Ks require 'phi' include Phi ## 私の祖先は何人?。 ## ## 40人とする。男:大文字(A..T)、女:小文字(a..t) ## 男:純粋父系の祖先:すべての祖先、女:純粋母系の祖先:すべての祖先。 ## "A:" + "c:" → "A:Ac" "c:Ac" ## 祖先の数の平均 ## 全員が共通の祖先を持つに至る世代数。 ##"U","V","W","X","Y","Z","u","v","w","x","y","z", ## @otoko = [ "A:","B:","C:","D:","E:","F:","G:","H:","I:","J:","K:","L:","M:","N:","O:","P:","Q:","R:","S:","T:" ] @onnna = [ "a:","b:","c:","d:","e:","f:","g:","h:","i:","j:","k:","l:","m:","n:","o:","p:","q:","r:","s:","t:" ] @ninzuu = 20 def kyotu? idensi = @otoko[0][2..-1] return false if idensi=='' @otoko.each{|i| return if i[2..-1] != idensi} @onnna.each{|i| return if i[2..-1] != idensi} return true end ## ## 純粋母系・純粋父系が単系化したか? ## def tankei? array c = array[0][0] array.each{|i| return false if i[0] != c } return true end ## ## 平均の祖先の人数 ## def heikin sum = 0.0 @otoko.each{|s| sum += ( s.size - 2 )} @onnna.each{|s| sum += ( s.size - 2 )} return sum / @ninzuu / 2.0 end def kodomo seibetus = onna_otoko otoko = [] onnna = [] idensi = nil (0...@ninzuu).each{|i| haha = @onnna[i] titi = @otoko[i-1] idensi=(haha+titi).split('').sort.uniq.join if seibetus[i*2+0] == ?+ otoko << titi[0,1]+idensi else onnna << haha[0,1]+idensi end if seibetus[i*2+1] == ?+ otoko << titi[0,1]+idensi else onnna << haha[0,1]+idensi end } @otoko = otoko @onnna = onnna end def onna_otoko s = "+"*40 onna = 0 begin r = rand(@ninzuu*2) if s[r] == ?+ onna += 1 s[r] = ?- end end while onna < 20 return s end def fuufu s = "" (0...@ninzuu).each{|i| s += @otoko[i-1][0,1] + @onnna[i][0,1]+":" } return s[0..-2] end def disp sedai,fuufu puts format("%03d: %s " , sedai , fuufu ) print "男 0.. 2 " p @otoko[00,3] print "女 10..12 " p @onnna[10,3] p heikin end @otoko_tankei = false @onnna_tankei = false @kyotu = false (0..100).each{|sedai| dsp = (sedai < 5) dsp = true if ( sedai % 10 ) == 0 if ( not @otoko_tankei ) and tankei?(@otoko) p "#{sedai}世代目で男が単系化した" dsp = true @otoko_tankei = true end if ( not @onnna_tankei ) and tankei?(@onnna) p "#{sedai}世代目で女が単系化した" dsp = true @onnna_tankei = true end if ( not @kyotu ) and kyotu? p "#{sedai}世代目で全員の祖先が同じになった" dsp = true @kyotu = true end f = fuufu kodomo disp sedai,f if dsp break if @otoko_tankei && @onnna_tankei && @kyotu }
ミトコンドリア・シミュレータ その2(新) へ戻る ミトコンドリア・シミュレータ その3