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

 # 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. UML类图归纳

    作为一个程序员,掌握UML类图是开发和阅读程序的基础. 转载请注明地址http://www.cnblogs.com/zrtqsk/p/3739288.html,谢谢! 一.基本介绍 UML是一种标准的 ...

  2. 我这样理解js里的this

    关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:k ...

  3. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

  4. 理解JavaScript的作用域链

    上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...

  5. MATLAB读取和写入Excel文件

    1. 读取Excel文件 (a) 命令方式xlsread:  读取命令:[data,text]  = xlsread(FileName, SheetName, Range); data保存的是数据单元 ...

  6. ajax 跨域提交数据

    $.ajax({ url:"http://my.demo.com/jsonp/server.php",//不同域的文件; cache: false, //是否使用缓存; error ...

  7. Ubuntu backlight

    我们可以通过键盘来调节亮度,但是那样亮度无法微调,每次变亮变得太多. 在 /sys/class/backlight/nv_backlight 这个目录下,brightness 是最主要的.backli ...

  8. DLL编写教程

    本文对通用的DLL技术做了一个总结,并提供了源代码打包下载,下载地址为: http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rar   DLL的优点 简单的 ...

  9. void与void之间没有隐式转换(纯属恶搞,请勿在意)

    强大的vs弹出了这个提示:.有没有觉得强大的vs不应该出现该提示. 但就是出现了. 看客,您知道怎么让vs弹出这个提示吗^~^

  10. 安装myeclipse10后破解时发现没有common文件夹

    今天重新安装了myeclipse10软件,然后在破解的时候发现安装目录下没有common,这是因为以前安装过myeclipse,卸载时没有完全清除,再次安装时,myeclipse会自动找到以前安装的c ...