无性繁殖Penna模型 一、 设计思路(包括规则说明 参数设定) 1. 模型规则: 生物体由基因构成,基因可以分类,最简单的分类方式为两类,以好坏界定,用0,1表示,构成方式为有限长串结构.. 规则: (1) 死亡机制: 老死:B 活到B岁(最大年龄),下一步死亡 疾病: 活到当前年龄,累计的“疾病”次数达到 Tc次,下一时刻死亡 环境压力: 每个个体以概率 (Verhulst因子) 生存 (2) 繁殖机制: 最低繁殖年龄:R 每个个体活到R岁时,开始繁殖,繁殖时,采用拷贝加突变的方式形成子代 突变:M 突变强度为M,此处为M个位置 个数:b 每次繁殖b个子代; 二、 代码(关键部分加注释) #include #include #include int i,j,t; double x,y; FILE *fp; #define GeneSize 32 #define N0 1000 #define Nmax 100000 #define TIME 1000 #define ReproductionAge 8 #define T 2 struct { int Gene[GeneSize];// int Age; int BadGeneNum; int LiveOrDie;//活着是0;死的是1 }Agent[Nmax]; //定义结构体数组表示每个个体 int Nt=N0; void Intial() //初始化函数 { for(i=0;i { Agent.Age=0; Agent.BadGeneNum=0; for (j=0;j { x=rand(); y=x/32767; if(y<0.01) //初始基因串随机给出,坏基因比例0.01 { Agent.Gene[j]=1; } else { Agent.Gene[j]=0; }
5 t" h% w) ?+ ` q) B% t} if (i { Agent.LiveOrDie=0; } else { Agent.LiveOrDie=1; } } } void Age(int i) //年龄机制函数 { if (Agent.Gene[Agent.Age]==1) Agent.BadGeneNum++; Agent.Age++; } void Die(int i) //死亡机制函数 { double v; v=(double)rand()/RAND_MAX; if (Agent.BadGeneNum>=T) { Nt-=1; Agent.LiveOrDie==1; } else if (v<((double)Nt/Nmax)) { Nt-=1; Agent.LiveOrDie==1; } else if (Agent.Age>=GeneSize) { Nt-=1; Agent.LiveOrDie==1; } } void Reproduction(int i) { k=0; int z1,z2; z1=rand()2; z2=rand()2; while(Agent[k].LiveOrDie==0) //将b个原本死亡的格子变活,b=1 k=k++; Agent[k].Age=0; //对新生的个体赋予年龄值 Agent[k].BadGeneNum=0; for (j=0;j { Agent[k].Gene[j]=Agent.Gene[j]; if( Agent.Gene[z1]==1) Agent[k].Gene[z1]=0; else Agent[k].Gene[z1]=1; if( Agent[k].Gene[z2]==0) Agent[k].Gene[z2]=1; else Agent[k].Gene[z2]=0; } Nt=Nt+1; Agent[k].LiveOrDie=0; } //z1,z2突变位置 void main() { srand((unsigned)time(NULL)); Intial(); //初始化 //时间步迭代 fp=fopen("penna.txt","w"); for(t=0;t { for (i=0;i { if (Agent.LiveOrDie==0) { Age(i);//年龄加1;更新坏基因数 Die(i);//判断死亡1.坏基因致死,2.环境压力致死.3老死 } } for (j=0;j { if (Agent[j].LiveOrDie==0 && Agent[j].Age>=ReproductionAge) { Reproduction(j); } }
1 l$ B& P: m* j+ r t g5 |fprintf(fp,"%d\t",Nt); } } 三、 结果及分析(包括图及分析) (1)对P(B=32, 105, 2, 8, 1, M) 最大年龄B=32岁,最大种群数Nmax=105,疾病次数Tc=2,最低繁殖年龄R=8,每次繁殖子代个数b=1,突变:M=0,t=1000;100,种群规模随时间的变化图 图一 M=2,t=1000;
: s$ R: l [8 K, q图二 M=2,t=1003 o8 x' i7 w% _: Y( q' X7 s4 X6 p
2 ]0 [% _& V( W1 _% E1 U h5 H% v& C+ d8 Z6 K0 |' |- m3 ^. g
图三 M=2,t=1000; # W+ P8 n7 z9 o$ v2 `
图四 M=2,t=1000;
; Z% J2 C4 e! G (2) 对P(32, 105, 4, R, 1, 2) R取2、4、6作稳定后的年龄结构图。 由(1)知,t=200以后种群数量已经稳定,所以考虑t=200时的年龄组成即可。 / N, g- a7 C8 ^$ i4 C: @. d& c. P
图六 R=4,t=200年龄结构图 图七 R=6,t=200年龄结构图 + l7 w' t$ D7 x+ S
1 r( u7 s( ~- ]4 d2 X2 }
|