素数セミのシナリオについて 会社員 2007/12/03 00:06:24 ├個人的見解:予定調和組み 小塚貞典 2007/12/03 16:21:09 │└生成消滅演算子 小塚貞典 2007/12/13 23:08:22 ├蝉の生い立ちを考えると、 山中和義 2007/12/05 15:15:09 │└つづき 山中和義 2007/12/05 15:15:57 └ただいま自力でプログラムを作ってますので 会社員 2007/12/19 00:27:40 ├途中ですが、中間報告です突然変異考慮して... 会社員 2007/12/29 06:50:22 ├!(つづき) 会社員 2007/12/29 06:51:44 ├!(つづき2) 会社員 2007/12/29 06:53:31 └!(つづき3) 会社員 2007/12/29 06:54:31
素数セミのシナリオについて 会社員 2007/12/03 00:06:24 ツリーへ
素数セミのシナリオについて |
返事を書く ノートメニュー |
会社員 <qiekrrepwd> 2007/12/03 00:06:24 | |
こんばんは
素数ゼミとそれに住みつく寄生虫との関係をプログラムできないか試行中です。 そこで、以下のシナリオを考えてみましたが もっとプログラムしやすそうな案があれば教えてください 尚、「素数ゼミの謎」という本がでていますが まだ、読んでいません。 =素数ゼミのシナリオ= 1)最初、セミは、1年セミと2年セミだけが それぞれ1億匹 合計2億匹位いた。 Nse1=1億 Nse2=1億 2)そこへ 1匹の1年周期の寄生虫が現れた。 Nks1=1 寄生虫は、ある一定の寄生確率(Pks=0.5)で、セミに寄生し幾何級数的に増殖していった。 増殖スピードは Mlt=3倍とする。 3)セミは、1万匹に1匹の割合(Ptz)で、突然変異を起こし 1年プラス 又は、 1年マイナス の複数年のセミになっていくとする 4)寄生虫も同じの確率(Ptz)で複数年寄生虫になっていった。 但し、複数年寄生虫は、その宿主がいない場合は、突然変異が起きたとしても死滅した 5)又、基本的条件として 優勢遺伝があるとする 例えば、2年セミと3年セミが交尾すると 通常は、3年セミが発現すると仮定する このとき、セミは、 2年セミと3年セミが存在するが @純粋の2年セミ A2年セミと3年セミの遺伝子をもつ3年セミ B純粋の3年セミ の3つが共存するとする 1〜20年セミまで考えると 遺伝子の確率分布を p1,p2,p3,・・・・p20 として 遺伝子は、2本あるので (p1+p2+p3+・・・・+p20)^2 = 1 の多項定理と同じ原理に則って 一般項の和で定まる分布を示す 具体的には、 3年セミの場合: 2・p1・p3+2・p2・p3+p3^2 4年セミの場合: 2・p1・p4+2・p2・p4+2・p3・p4+p4^2 5年セミの場合: 2・p1・p5+2・p2・p5+2・p3・p5+2・p4・p5+p5^2 尚、寄生虫もセミと同様の優勢遺伝をすることとする 6)セミは、その他の外的条件で 10億匹以上増えることができないとする 10億匹以上になった場合、割合をそのままにして、遺伝子比率を割り振ることにする 7)セミは、1回にSr=100匹分の卵を産み、その年数後、50%が、成虫になれるとする(とりあえずオスメスは無視) 8)寄生虫に取りつかれたセミは、成虫にならず死ぬ 死んだ数のセミの数と同数の寄生虫が発生し、同時に増殖する 9)セミは成虫になっても、50%は、鳥やカマキリに食べられて卵を残せないとする 以上です |
├個人的見解:予定調和組み 小塚貞典 2007/12/03 16:21:09 ツリーへ
Re: 素数セミのシナリオについて |
返事を書く ノートメニュー |
小塚貞典 <lpgxypjsxi> 2007/12/03 16:21:09 | |
個人的見解:予定調和組み
僕も素数の本を買いましたが読んだのはだいぶんと 後のことでした。イデアル派も考えてはどうでしょう。要するに足し算等にも、広義の素数が存在すると考えるに至ってから、素数の本を読んだ。遺伝するにあたり、媒体が必要なセミは違う講義を受けた。確認キーを知っていた小塚はテキストをメモに貼った。 ところで、いつもの会社員さんですか?相変わらず、面白いこと考えますね。とりあえず、雌雄を考えないんですか。そういう僕も2項分布で平均と偏差値がたらないので、結局、素数ゼミの一種になったかもね。確率で来たあたりは生態系のモデルになるかも?最近は義さんのガウスの消去法は感心してみてました。まだ、キーのらないかな |
│└生成消滅演算子 小塚貞典 2007/12/13 23:08:22 ツリーへ
Re: 個人的見解:予定調和組み |
返事を書く ノートメニュー |
小塚貞典 <lpgxypjsxi> 2007/12/13 23:08:22 | |
生成消滅演算子
デイラックのあたりで応用が効くのでは? |
├蝉の生い立ちを考えると、 山中和義 2007/12/05 15:15:09 ツリーへ
Re: 素数セミのシナリオについて |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/12/05 15:15:09 | |
蝉の生い立ちを考えると、
*3年ゼミの場合 0年目 卵 ※蝉の成虫が産卵する 1年目 幼虫 2年目 幼虫 3年目 幼虫→成虫→卵 ※周期発生 4年目 幼虫 5年目 幼虫 6年目 幼虫→成虫→卵 ※周期発生 7年目 幼虫 : : となり、このような蝉の「状態」(状態遷移)がみえる。 この状態に対して(卵→幼虫は考えないとすると) 幼虫 幼虫→成虫 成虫 成虫→卵 の箇所(「状態」とその遷移)で、確率的な「作用(数の増減など)」が考えられる。 たとえば、幼虫なら寄生虫による死滅など。 このように、「状態」ごとにまとめていくことで、シナリオをタイミングも含めて 抜けなく・明確に組み込むことができると思います。 たたき台のサンプルを掲載しておきます。 !素数ゼミのシミュレーション LET N=20 !年数 DIM semi(N),kiseicyu(N) !各年数の蝉、寄生虫の数 MAT semi=ZER FOR i=1 TO N !LET kiseicyu(i)=8E7 !2年蝉 !LET kiseicyu(i)=5E7 !3年蝉 !LET kiseicyu(i)=2E7 !5年蝉 !LET kiseicyu(i)=1E7 !10年蝉 LET kiseicyu(i)=6.5E6 !17年蝉 ※固定 NEXT i DEF p(g)=MOD(g,N)+1 !テーブル内の位置を求める DIM timeTBL(N,N) !発生のタイムテーブル ※(世代,年数)=発生する数 MAT timeTBL=ZER !初期状態 LET timeTBL(1,1)=1E8 !1年蝉1億匹 ※1) LET timeTBL(2,2)=1E8 !2年蝉1億匹 LET g=0 !経過時間(単位:年) DO !時間を経過される !!!PRINT "年=";g, p(g) !!!MAT PRINT USING(REPEAT$("###,###,###,### ",N)): timeTBL !トレース !幼虫の過程 ※1年後、卵は幼虫へ FOR i=1 TO N FOR j=0 TO i-1 !N年間 IF RND<0.5 THEN !寄生確率 LET timeTBL(p(g+j),i)=MAX(timeTBL(p(g+j),i)-kiseicyu(i),0) !※2)、8) END IF NEXT j NEXT i FOR i=1 TO N !羽化(周期発生) LET semi(i)=INT(timeTBL(p(g),i)*0.5) !※7) LET timeTBL(p(g),i)=0 NEXT i |
│└つづき 山中和義 2007/12/05 15:15:57 ツリーへ
Re: 蝉の生い立ちを考えると、 |
返事を書く ノートメニュー |
山中和義 <drdlxujciw> 2007/12/05 15:15:57 | |
つづき
!成虫の過程 DIM heni_semi(N,2) FOR i=1 TO N !突然変異 LET a=INT(semi(i)/1E4) !※3) IF a>0 THEN IF RND<0.5 THEN !1年プラス IF i<N THEN LET heni_semi(i,1)=a !増加分 ELSE !N年蝉は減る LET heni_semi(i,2)=a END IF ELSE !1年マイナス IF i>1 THEN LET heni_semi(i,2)=a ELSE !1年蝉は増える LET heni_semi(i,1)=a END IF END IF LET semi(i)=semi(i)-a !元を減らす END IF NEXT i LET semi(1)=semi(1)+heni_semi(2,2) !増減を反映させる FOR i=2 TO N-1 LET semi(i)=semi(i)+heni_semi(i-1,1)+heni_semi(i+1,2) NEXT i LET semi(N)=semi(N)+heni_semi(N-1,1) FOR i=1 TO N !天敵 LET semi(i)=INT(semi(i)*(1-0.5)) !※9) NEXT i LET sum=0 !その他の外的条件 FOR i=1 TO N LET sum=sum+semi(i) NEXT i IF sum>=1E9 THEN !※6) FOR i=1 TO N LET semi(i)=INT(semi(i)/sum*1E9) NEXT i END IF !IF MOD(g,500)=0 THEN !トレース PRINT "年=";g, p(g) MAT PRINT USING(REPEAT$("#,###,###,### ",N)): semi !END IF LET sum=0 !交配 FOR i=1 TO N LET sum=sum+semi(i) NEXT i IF sum>0 THEN FOR i=1 TO N !卵をタイムテーブルへ(世代交代) FOR j=1 TO N !※5) LET a=INT((semi(i)/2)*100 * semi(j)/sum) !※7) 半分がメス LET y=MAX(i,j) !年数 ※多年が優性遺伝 LET timeTBL(p(g+y),y)=timeTBL(p(g+y),y)+a NEXT j NEXT i ELSE PRINT "すべて死滅!" END IF LET g=g+1 !次へ MAT semi=ZER !蝉の成虫はすべて死滅する LOOP END |
└ただいま自力でプログラムを作ってますので 会社員 2007/12/19 00:27:40 ツリーへ
Re: 素数セミのシナリオについて |
返事を書く ノートメニュー |
会社員 <qiekrrepwd> 2007/12/19 00:27:40 | |
ただいま自力でプログラムを作ってますので
それができたら、来週あたり来ます。 回答ありがとうございます |
├途中ですが、中間報告です突然変異考慮して... 会社員 2007/12/29 06:50:22 ツリーへ
Re: ただいま自力でプログラムを作ってますので |
返事を書く ノートメニュー |
会社員 <qiekrrepwd> 2007/12/29 06:50:22 | |
途中ですが、中間報告です 突然変異考慮していません。
! =素数ゼミのシナリオ= OPTION BASE 0 OPTION ARITHMETIC DECIMAL_HIGH DIM Cimi_N(20),KIL_N(20) !その年のN年セミ・寄生虫の個体数 DIM Cimi_N_Egg_Sleep(20,20) !眠っているN年セミの数 Cimi_N_Egg_Sleep(残り冬眠年数,年ゼミ) DIM KIL_N_Egg_Sleep(20,20) !眠っているN年寄生虫の数 KIL_N_Egg_Sleep(残り冬眠年数,年寄生虫) DIM Cimi_N_Egg(20) DIM KIL_N_Egg(20) ! 初期条件 ! セミは、Mlt_cimi 個の卵を産む ! 寄生虫の増殖スピードは Mlt_KIL倍とする。 LET Mlt_cimi=50 !セミの卵 LET Mlt_KIL=100 !寄生虫の卵 PRINT "最初、セミは、1年セミと2年セミ・・・がいた。" PRINT "そこへ 1匹の寄生虫が現れた。" LET Cimi_N(1)=0 LET Cimi_N(2)=0 LET Cimi_N(3)=10^8 LET Cimi_N(4)=10^8 LET Cimi_N(5)=10^8 LET Cimi_N(0)=Cimi_N(1)+Cimi_N(2)+Cimi_N(3)+Cimi_N(4)+Cimi_N(5) LET KIL_N(1)=1 LET KIL_N(2)=1 LET KIL_N(3)=1 LET KIL_N(4)=0 LET KIL_N(5)=0 LET KIL_N(0)=KIL_N(1)+KIL_N(2)+KIL_N(3)+KIL_N(4)+KIL_N(5) PRINT "■■■■■■■■■0年目■■■■■■■■■" FOR I=1 TO 20 PRINT "発生した";I;"年ゼミ=";Cimi_N(I);"匹 ";STR$(I);"年寄生虫=";KIL_N(I);"匹" NEXT I PRINT "合計";Cimi_N(0);"のセミと";KIL_N(0);"の寄生虫が発生した" ! 寄生虫はセミを捕食し Mlt_KIL 倍に増えた LET Cimi_Nokori=Cimi_N(0)-KIL_N(0) LET KIL_Nokori=Mlt_KIL*KIL_N(0) PRINT "KIL_Nokori=";KIL_Nokori PRINT "初年 ";Cimi_Nokori;"匹が生き残った" PRINT "初年 ";KIL_Nokori;"匹まで寄生虫が増加" PRINT "生き残ったセミは、1匹が";Mlt_cimi;"個の卵を産んだ" LET Cimi_Egg=Mlt_cimi*Cimi_Nokori PRINT "セミの産んだ卵の数=";Cimi_Egg PRINT "これを元に冬眠するセミ・寄生虫を計算すると・・・" !1年ゼミの卵の数は LET Cimi_N_Egg_Sleep(1,1) =INT(Cimi_Egg*(Cimi_N(1)/Cimi_N(0))) LET Cimi_N_Egg_Sleep(2,2) =INT(Cimi_Egg*(Cimi_N(2)/Cimi_N(0))) LET Cimi_N_Egg_Sleep(3,3) =INT(Cimi_Egg*(Cimi_N(3)/Cimi_N(0))) LET Cimi_N_Egg_Sleep(4,4) =INT(Cimi_Egg*(Cimi_N(4)/Cimi_N(0))) LET Cimi_N_Egg_Sleep(5,5) =INT(Cimi_Egg*(Cimi_N(5)/Cimi_N(0))) !寄生虫の数は LET KIL_N_Egg_Sleep(1,1)=INT(KIL_Nokori*KIL_N(1)/KIL_N(0)) LET KIL_N_Egg_Sleep(2,2)=INT(KIL_Nokori*KIL_N(2)/KIL_N(0)) LET KIL_N_Egg_Sleep(3,3)=INT(KIL_Nokori*KIL_N(3)/KIL_N(0)) LET KIL_N_Egg_Sleep(4,4)=INT(KIL_Nokori*KIL_N(4)/KIL_N(0)) LET KIL_N_Egg_Sleep(5,5)=INT(KIL_Nokori*KIL_N(5)/KIL_N(0)) PRINT "1年セミ冬眠数=";Cimi_N_Egg_Sleep(1,1) PRINT "2年セミ冬眠数=";Cimi_N_Egg_Sleep(2,2) PRINT "3年セミ冬眠数=";Cimi_N_Egg_Sleep(3,3) PRINT "4年セミ冬眠数=";Cimi_N_Egg_Sleep(4,4) PRINT "5年セミ冬眠数=";Cimi_N_Egg_Sleep(5,5) PRINT "1年寄生虫冬眠数=";KIL_N_Egg_Sleep(1,1) PRINT "2年寄生虫冬眠数=";KIL_N_Egg_Sleep(2,2) PRINT "3年寄生虫冬眠数=";KIL_N_Egg_Sleep(3,3) PRINT "4年寄生虫冬眠数=";KIL_N_Egg_Sleep(4,4) PRINT "5年寄生虫冬眠数=";KIL_N_Egg_Sleep(5,5) CALL Under_Grand2 ! 土の中の状態 |
├!(つづき) 会社員 2007/12/29 06:51:44 ツリーへ
Re: ただいま自力でプログラムを作ってますので |
返事を書く ノートメニュー |
会社員 <qiekrrepwd> 2007/12/29 06:51:44 | |
!(つづき)
!■■■■■■■■■■■■メインルーチン■■■■■■■■■■■■ FOR JJJ=1 TO 10000 ! JJJ年間のシュミレーション PRINT "" PRINT "■■■■■■■■■";JJJ;"年目■■■■■■■■■" CALL Born_SUM !生まれた合計の計算・表示 CALL STATUS_PRT !その年の発生状態 CALL JOB1 !捕食-生存・繁殖の処理 CALL Under_Grand1 !土の中の状態表示 CALL JOB_1year_SLEEP !1年経過処理(シフト) CALL Under_Grand2 !土の中の状態表示 CALL Worm_die !寄生虫が絶滅したか判定 NEXT JJJ PRINT "終了!" !■■■■■■■■■■■■メインルーチン■■■■■■■■■■■■ !------------------------------以下、サブルーチン---------------------------------------- SUB Under_Grand1 PRINT "■■■■■■■■ 夏 ■■■■■■■■■■" PRINT "-------------土の中の状態-----------------" FOR J=1 TO 5 FOR I=1 TO J IF I=1 THEN PRINT J;"年セミ 残り冬眠数=";I;"年";"---" !(残り冬眠年数,年ゼミ) ELSE PRINT J;"年セミ 残り冬眠数=";I;"年";Cimi_N_Egg_Sleep(I,J) !(残り冬眠年数,年ゼミ) END IF NEXT I NEXT J FOR J=1 TO 5 FOR I=1 TO J IF I=1 THEN PRINT J;"年寄生虫 残り冬眠数=";I;"年";"---" ELSE PRINT J;"年寄生虫 残り冬眠数=";I;"年";KIL_N_Egg_Sleep(I,J) END IF NEXT I NEXT J END SUB SUB JOB_1year_SLEEP !1年経過処理 PRINT "★冬を越す:冬眠期間が、1年減る 20年→19年 19年→18年・・・" FOR I=1 TO 20 !眠る期間が、1年づつ シフトさせる (残り冬眠年数,年ゼミ) FOR K=1 TO I LET Cimi_N_Egg_Sleep(K-1,I)=Cimi_N_Egg_Sleep(K,I) LET KIL_N_Egg_Sleep(K-1,I)=KIL_N_Egg_Sleep(K,I) NEXT K NEXT I PRINT "★新たな冬眠セミ・寄生虫を追加" FOR I=1 TO 20 LET Cimi_N_Egg_Sleep(I,I)=Cimi_N_Egg(I) LET KIL_N_Egg_Sleep(I,I)=KIL_N_Egg(I) NEXT I END SUB |
├!(つづき2) 会社員 2007/12/29 06:53:31 ツリーへ
Re: ただいま自力でプログラムを作ってますので |
返事を書く ノートメニュー |
会社員 <qiekrrepwd> 2007/12/29 06:53:31 | |
!(つづき2)
SUB Under_Grand2 PRINT "■■■■■■■■越冬中■■■■■■■■■■" PRINT "-------------土の中の状態-----------------" FOR J=1 TO 5 FOR I=1 TO J PRINT J;"年セミ 残り冬眠数=";I;"年";Cimi_N_Egg_Sleep(I,J) NEXT I NEXT J FOR J=1 TO 5 FOR I=1 TO J PRINT J;"年寄生虫 残り冬眠数=";I;"年";KIL_N_Egg_Sleep(I,J) NEXT I NEXT J END SUB SUB STATUS_PRT !その年の状態表示 PRINT "その年のN年セミ・寄生虫の個体数構成" FOR I=1 TO 5 PRINT "発生した";I;"年ゼミ=";Cimi_N(I);"匹 ";STR$(I);"年寄生虫=";KIL_N(I);"匹" NEXT I END SUB SUB Born_SUM !★1年経過処理:セミ と 寄生虫 が生まれた! FOR I=1 TO 20 ! 残り冬眠年数1年の セミ と 寄生虫 が生まれる LET Cimi_N(I)=Cimi_N_Egg_Sleep(1,I) LET KIL_N(I)=KIL_N_Egg_Sleep(1,I) !その年のN年セミ・寄生虫の個体数 NEXT I ! その年の生まれるセミは ! 昨年の1年ゼミ、2年前の2年ゼミ 3年前の3年ゼミ ・・・ 20年前の20年ゼミ PRINT "今年の生まれるセミ・寄生虫の数を計算-----" LET Cimi_N(0)=0 ! 初期化 LET KIL_N(0)=0 ! 初期化 FOR I=1 TO 20 LET Cimi_N(0)=Cimi_N(0)+Cimi_N(I) LET KIL_N(0)=KIL_N(0)+KIL_N(I) NEXT I PRINT "セミ: ";Cimi_N(0);"匹" PRINT "寄生虫: ";KIL_N(0);"匹" PRINT "が生まれた" PRINT "" END SUB |
└!(つづき3) 会社員 2007/12/29 06:54:31 ツリーへ
Re: ただいま自力でプログラムを作ってますので |
返事を書く ノートメニュー |
会社員 <qiekrrepwd> 2007/12/29 06:54:31 | |
!(つづき3)
SUB JOB1 !捕食-生存・繁殖の処理 IF Cimi_N(0)-KIL_N(0)=>0 THEN LET Cimi_Nokori=Cimi_N(0)-KIL_N(0) ELSE LET Cimi_Nokori=0 END IF IF Cimi_N(0)-KIL_N(0)=>0 THEN LET KIL_Nokori=Mlt_KIL*KIL_N(0) ELSE LET KIL_Nokori=Mlt_KIL*Cimi_N(0) END IF PRINT "" PRINT "寄生虫";KIL_N(0);"匹に食べられて" PRINT "セミは";Cimi_Nokori;"匹が生き残った" PRINT "寄生虫は";KIL_Nokori;"匹まで増加した" PRINT "" PRINT "生き残ったセミは、";Mlt_cimi;"個/匹のたまごを産んだ" LET Cimi_Egg=Mlt_cimi*Cimi_Nokori PRINT "セミは、産んだ卵の数=";Cimi_Egg;"個" PRINT "これを元に今年から冬眠するセミ・寄生虫を計算すると・・・" FOR I=1 TO 20 IF Cimi_N(0)>0 THEN LET Cimi_N_Egg(I) =INT(Cimi_Egg*(Cimi_N(I)/Cimi_N(0))) ELSE LET Cimi_N_Egg(I) =0 END IF NEXT I FOR I=1 TO 20 IF KIL_N(0)>0 THEN LET KIL_N_Egg(I)=INT(KIL_Nokori*KIL_N(I)/KIL_N(0)) ELSE LET KIL_N_Egg(I)=0 END IF NEXT I PRINT "1年セミ冬眠数=";Cimi_N_Egg(1) PRINT "2年セミ冬眠数=";Cimi_N_Egg(2) PRINT "3年セミ冬眠数=";Cimi_N_Egg(3) PRINT "4年セミ冬眠数=";Cimi_N_Egg(4) PRINT "5年セミ冬眠数=";Cimi_N_Egg(5) PRINT "1年寄生虫冬眠数=";KIL_N_Egg(1) PRINT "2年寄生虫冬眠数=";KIL_N_Egg(2) PRINT "3年寄生虫冬眠数=";KIL_N_Egg(3) PRINT "4年寄生虫冬眠数=";KIL_N_Egg(4) PRINT "5年寄生虫冬眠数=";KIL_N_Egg(5) END SUB SUB Worm_die ! 寄生虫が土にも、地上にもいない場合 終了。 LET FLG=0 FOR J=1 TO 20 FOR I=1 TO J IF KIL_N_Egg_Sleep(I,J)>0 THEN LET FLG=1 !寄生虫が生きていたら、フラグを立てる NEXT I NEXT J IF FLG=0 THEN PRINT "■■■■■■■■■■■■寄生虫は絶滅した!■■■■■■■■■■■" STOP END IF END SUB END |