新しく発言する  EXIT  インデックスへ
素数セミのシナリオについて

  素数セミのシナリオについて 会社員 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


 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。