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

 # 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. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  2. HDU2819-Swap-二分图匹配

    把矩阵上的1建成边,把边建成点 然后跑一个二分图匹配,就找到了主对角线的元素,之后排个序就可以了 /*------------------------------------------------- ...

  3. 【分布式协调器】Paxos的工程实现-cocklebur简介(一)

    初识分布式协调器 分布式协调器的“协调”二字让人摸不到头脑,怎么就协调了,用的着协调吗?实际上这个东西在之前就是为了提供分布式锁服务而设计的,伟大的google公司发明了chubby,雅虎随后也推出了 ...

  4. (二十三)原型模式详解(clone方法源码的简单剖析)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...

  5. Nginx 负载均衡

    Nginx简单实现网站的负载均衡 地址:http://www.cnblogs.com/alvin_xp/p/4161162.html

  6. redis+Keepalived主从热备秒级切换

    一 简介 安装使用centos 5.10 Master 192.168.235.135 Slave 192.168.235.152 Vip 192.168.235.200 编译环境 yum -y in ...

  7. json注意:

    import json #dct="{'1':111}"#json 不认单引号 #dct=str({"1":111})#报错,因为生成的数据还是单引号:{'on ...

  8. 用一条sql语句显示数据百分比并加百分号

    来源于:http://neil-han.iteye.com/blog/1948124 求数值所占比重 关键点:(round(t1.cnt/t2.totalCount*100,2))||'%'

  9. 18位身份证验证--java实现,正则表达式

    简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card)(2)preg_match(&quo ...

  10. Android studio 提高导入项目的速度

    最近在下载了一些开源的项目在学习,在导入as时,速度要好慢,如项目大点,就更慢了,实在是坑啊! 那有没有方法能导入时间快点呀! 分析发现,as在导入项目是首先是读 来自为知笔记(Wiz)