数学建模社区-数学中国

标题: penna模型论文以及代码 [打印本页]

作者: ▉ΝβκS    时间: 2014-7-25 11:43
标题: penna模型论文以及代码
无性繁殖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;
}

8 `5 _. X2 K. _' P( M# F( b! y* X
}
        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);
}
}

/ K0 y9 h7 W  z$ [9 s+ h
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;   
% y# l, ~2 y# a图二     M=2,t=100
2 Y* K8 v. ^' ]- C  W9 I; @% s* X7 H: [4 C/ a  L7 T( v- c

' o6 U( i+ V$ i# e: Y
               图三    M=2,t=1000;                              
$ T+ S  t0 Q) B
                                                                     图四    M=2,t=1000;                                                                       
& w( z2 a0 y7 s) B$ b1 d' f/ Y& Q
(2) 对P(32, 105, 4, R, 1, 2)
R取2、4、6作稳定后的年龄结构图。
由(1)知,t=200以后种群数量已经稳定,所以考虑t=200时的年龄组成即可。
                                        图五  
R=2
,
t=200
年龄结构图        
               
1 G) r+ O0 `; i. L/ x
                    图六 R=4,t=200年龄结构图
                                 图七  R=6,t=200年龄结构图

* P+ P! s* y! s/ q1 Y9 f% r) ]- |; J* i





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5