一年前写的代码,偶然翻出来。发现自己当时水平还不赖吗。

 # include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <stdbool.h>
# include <windows.h> # define N0 //初始时刻种群数量为1000
# define Nmax //种群最大数量为100000
# define R //最低繁殖年龄为8
# define B //老死年龄即位串长度为32
# define b //每次繁殖子代个数为1
# define T //最大疾病次数为2
# define M //突变强度为2
# define LEN sizeof(GENE) //宏替换一个结构体的大小
clock_t start, finish;
double duration;
int t;
typedef struct Gene
{
bool Gene[B]; //用布尔类型数组表示位串
int Age; //年龄
int SickNum; //患病次数
struct Gene *next; //存放一个连接链表的节点指针
}GENE;
int Nt = N0; //定义一个全局变量,表示t时刻种群的数量
double M_rate = (double)M/B; //M_rate表示基因遗传突变率
GENE *pHead = NULL, *pFore = NULL, *pNext = NULL, *p = NULL, *pTail = NULL;
//定义五个指针:pHead指向头节点pFore为节点的前驱指针,pNext建立新节点,p游标指针,pTail尾节点指针
GENE Gene_Str; //定义一个GENE类型的结构体Gene_Str void Initialize(void) //构造链表及种群初始状态
{
pHead = (GENE *)malloc(LEN);//为头节点指针分配空间
p = pHead; //头节点指针赋值给游标指针
for (int i=; i<N0; i++)
{
p->Age = ; //初始时刻年龄为0(t=0)
p->SickNum = ; //患病次数为0
for (int j=; j<B; j++)
{
p->Gene[j] = (rand()%); // 对第一代个体基因随机规定
}
pNext = (GENE *)malloc(LEN); //为新节点开辟存储空间
p->next = pNext; //将前驱节点指向下一结构体地址
p = pNext; //将新节点赋值给游标指针
}
pTail = p;
pNext = p = NULL;
pTail->next = NULL; //尾节点下一指向为空
}
void Aging(void) //执行年龄增长机制,每次调用,所有个体年龄加一
{
p = pHead; //游标指针指向头指针
while (p != NULL) //遍历每个个体
{
if (p->Gene[p->Age] == )
{
p->SickNum++;
} //如果该年龄位置为坏基因,则患病次数加一
p->Age++; //每个个体年龄加一
p = p->next; //游标指针指向下一个体
}
}
void Die(void) //执行死亡机制,每次调用,满足条件的个体死去,链表节点删除
{
pFore = p = pHead; //游标指针指向头指针,并创建一个和游标指针同步的前驱指针
while (p != NULL) //遍历每个个体
{
double RandOfLive = (double)rand()/(double)RAND_MAX; //构造一个随机概率
if (p->SickNum>=T || p->Age>=(B-) || RandOfLive>=(-(double)Nt/Nmax))
//满足三种情况之一即死亡:年龄到达老死年龄,达到最大患病次数,因环境压力随机死亡
{
Nt--; //每次死亡导致种群数量减一
if (p == pHead)//当p为头节点
{
pHead = p->next;
free(p); //节点删除后释放占用的空间
pFore = p = pHead;
p = p->next; //重新初始化
}
else if (p->next == NULL)//当p为尾节点
{
pFore->next = NULL; //将前一个节点设置为尾节点
free(p); //释放删除后的节点
p = NULL;
}
else //既不是头节点又不是尾节点
{
pFore->next = p->next; //跳过p节点,前后相连接
free(p); //释放删除了的节点
p = pFore;
pFore = p;
p = p->next; //重新初始化
}
}
else //如果个体不满足死亡条件
{
pFore = p;
p = p->next; //指针向下一节点移动并始终存储前一节点以备删除中间节点
}
} //结束后p == NULL,是尾节点的节点指针
pNext = NULL;
pFore = NULL; //遍历之后将这两个指针置为空,防止错误调用
}
void RePreduction(void) //执行繁殖机制
{
p = pHead; //p指向链表的头指针
while (p != NULL) //遍历每个个体
{
double RandOfChange = (double)rand()/(double)RAND_MAX; //构造一个随机数
if (p->Age >= R) //如果年龄达到最低繁殖年龄
{
pNext = p; //为了方便操作,将每一个新生个体对应的节点连在尾节点后
while (pNext->next != NULL)
pNext = pNext->next; //此时pNext为尾节点 for (int k=; k<b; k++) //每次繁殖将产生b个新个体
{
while (pNext->next != NULL)
pNext = pNext->next; pTail = (GENE *)malloc(LEN); //开辟一个存储空间
pNext->next = pTail; //尾节点的next指向该存储空间
pTail->next = NULL; //将这个新节点设为尾节点
for (int i=; i<B; i++)
{
if (RandOfChange < M_rate) //达到要求则发生突变
pTail->Gene[i] = !p->Gene[i];
else //否则执行拷贝复制
pTail->Gene[i] = p->Gene[i];
}
pTail->Age = ;
pTail->SickNum = ; //新生个体的这两项也要初始化,开始一直忘了!!!!!!!!
Nt+=; //个体数加一
}
p = p->next;
}
else
p = p->next; //执行完继续下一个体
}
} int main(void)
{
FILE* fp = fopen("resultr6.txt", "w");
if (fp == NULL)
printf("error\n");
Sleep(); //挂起两秒钟
srand((unsigned)time(NULL)); //随机种子
Initialize(); //对初始个体进行初始化操作
for (t=; t<; t++) //种群在该机制下演化一千个时间步
{
Aging(); //执行年龄增长机制
Die(); //执行死亡机制
RePreduction(); //执行繁殖机制
printf("A");
fprintf(fp, "%d\t", Nt);
}
fclose(fp);
return ;
}

  附图

C语言实现penna模型的更多相关文章

  1. R语言︱LDA主题模型——最优主题...

    R语言︱LDA主题模型——最优主题...:https://blog.csdn.net/sinat_26917383/article/details/51547298#comments

  2. 基于R语言的ARIMA模型

    A IMA模型是一种著名的时间序列预测方法,主要是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型.ARIMA模型根据原序列是否平稳以及 ...

  3. 11 The Go Memory Model go语言内置模型

    The Go Memory Model go语言内置模型 Version of May 31, 2014 Introduction 介绍 Advice 建议 Happens Before 在发生之前 ...

  4. Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置

    8.1 M语言控制模型的仿真 M语言与Simulink结合的方式: 在Simulink模型或模块中使用回调函数 在M语言中调用与模型相关的命令,控制模型的建立,设置模块的属性,增删信号线,以及运行模型 ...

  5. C语言与内存模型初探

    #include<stdio.h> #include<string.h> int main(){ long long int a = 2<<30; char str ...

  6. R语言︱LDA主题模型——最优主题数选取(topicmodels)+LDAvis可视化(lda+LDAvis)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:在自己学LDA主题模型时候,发现该模 ...

  7. C语言复习:内存模型1

    数据类型本质分析 数据类型概念 "类型"是对数据的抽象; 类型相同的数据有相同的表现形式/存储格式以及相关的操作; 程序中使用的所有数据都必定属于某一种数据类型; 数据类型本质思考 ...

  8. Go语言 | CSP并发模型与Goroutine的基本使用

    今天是golang专题的第13篇文章,我们一起来聊聊golang当中的并发与Goroutine. 在之前的文章当中我们介绍完了golang当中常用的使用方法和规范,在接下来的文章当中和大家聊聊gola ...

  9. 有 va_arg宏 中数组下标-1 引发的思考 - C 语言中内存模型

    va_arg宏,是头文件 stdarg.h 中定义的,获取可变参数的当前参数. #define va_arg(list, mode) ((mode*)(list+=sizeof(mode)))[-1] ...

随机推荐

  1. Linux学习笔记-Ubuntu添加右键菜单打开终端

    1.进入个人目录(如/home/batsing,下文缩写成 ~ ):设置显示隐藏文件,或使用命令行:2.进入 ~/.gnome2/nautilus-scripts 文件夹,新建一个文件,名为 term ...

  2. Ace - Responsive Admin Template

    Ace简介: Ace 是一个轻量.功能丰富.HTML5.响应式.支持手机及平板电脑上浏览的管理后台模板,基于CSS框架Bootstrap制作,Bootstrap版本更新至 3.0,Ace – Resp ...

  3. 使用Redis做预定库存缓存功能

    最近在自己的工作中,把其中一个PHP项目的缓存从以前的APC缓存逐渐切换到Redis中,并且根据Redis所支持的数据结构做了库存维护功能.缓存是在业务层做的,准确讲应该是在MVC模型中Model的O ...

  4. NPOI2.0学习(二)

    如果你要编辑的行和单元格,原本没有值,或者从未创建过的,就必须先创建. //在第二行创建行 IRow row = sheet.CreateRow(); //在第二行的第一列创建单元格 ICell ce ...

  5. nios II--实验3——led 100M硬件部分

    led_100M 硬件开发 新建原理图 参照实验二(led) QSys调用模块 参照实验二(led) 原理图添加IP模块 参照实验二(led),在调用PLL的时候需要修改系统和SDRAM的时钟频率为1 ...

  6. [BZOJ1143][CTSC2008]祭祀river(最长反链)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1143 分析: 最长反链==最小路径覆盖==n-二分图最大匹配数 某神犇对二分图的总结: ...

  7. sFlow

    http://www.sflow.org/developers/specifications.php http://www.inmon.com/technology/index.php sFlow s ...

  8. 分布式拒绝服务攻击 DDoS

    分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒 ...

  9. springmvc整合fastjson

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  10. C++11的default和delete关键字

    C11的新特性实在是太多了,这2个关键字关注的人倒是少了很多,其中有一个原因便是编译器支持得太慢了(VS到VS2013才支持上),不过这2个关键字那真是极为有用的,下面我们来看看. [default关 ...