无性繁殖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; } ' L$ R( E; \. N# n7 v5 q
} 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); } } 2 L+ L; B$ L) Z! h& n) @& { w' r
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; & J% E( L/ j- J: |
图二 M=2,t=100
9 s- T) `: J' A# E4 {) \& m
5 y) ]1 X; d U; Q
; G, s: y) O/ C6 l/ {8 C 图三 M=2,t=1000;
* n- N9 N9 B2 I; _- Y2 K2 y& L0 Q 图四 M=2,t=1000;
- a' G! h$ Y h0 a$ X k9 P (2) 对P(32, 105, 4, R, 1, 2) R取2、4、6作稳定后的年龄结构图。 由(1)知,t=200以后种群数量已经稳定,所以考虑t=200时的年龄组成即可。
' H; k, W4 B# _; \1 v 图六 R=4,t=200年龄结构图 图七 R=6,t=200年龄结构图
# @1 o7 i1 I3 b
3 g Z: N% W J5 O5 r; Z- b: w |