c语言遗传算法例子,C++遗传算法类文件实例分析
本文所述为C++实现的遗传算法的类文件实例。一般来说遗传算法可以解决许多问题,希望本文所述的C++遗传算法类文件,可帮助你解决更多问题,并且代码中为了便于读者更好的理解,而加入了丰富的注释内容,是新手学习遗传算法不可多得的参考代码。
具体代码如下所示:
#include "stdafx.h"
#include
#include
#include
#include
#include//把日期和时间转换为字符串
using namespace std;
//Parametes setting
#define POPSIZE 200 //population size
#define MAXGENS 1000 //max number of generation
#define NVARS 2 //no of problem variables
#define PXOVER 0.75 //probalility of crossover
#define PMUTATION 0.15 //probalility of mutation
#define TRUE 1
#define FALSE 0
#define LBOUND 0
#define UBOUND 12
#define STOP 0.001
int generation; //current generation no
int cur_best; //best individual
double diff;
FILE *galog; //an output file
struct genotype
{
double gene[NVARS]; //a string of variables基因变量
double upper[NVARS]; //individual's variables upper bound 基因变量取值上确界
double lower[NVARS]; //individual's batiables lower bound 基因变量取值下确界
double fitness; //individual's fitness个体适应值
double rfitness; //relative fitness个体适应值占种群适应值比例
double cfitness; //curmulation fitness个体适应值的累加比例
};
struct genotype population[POPSIZE+1];
//population 当前种群 population[POPSIZE]用于存放个体最优值并假设最优个体能存活下去
//在某些遗传算法中最优值个体并不一定能够存活下去
struct genotype newpopulation[POPSIZE+1]; //new population replaces the old generation 子种群
/*Declaration of procedures used by the gentic algorithm*/
void initialize(void); //初始化函数
double randval(double,double); //随机函数
double funtion(double x1,double x2); //目标函数
void evaluate(void); //评价函数
void keep_the_best(void); //保留最优个体
void elitist(void); //当前种群与子代种群最优值比较
void select(void);
void crossover(void); //基因重组函数
void swap(double *,double *); //交换函数
void mutate(void); //基因突变函数
double report(void); //数据记录函数
void initialize(void)
{
int i,j;
for(i=0;i
{
for(j=0;j
{
if(!i)
{
population[j].fitness=0;
population[j].rfitness=0;
population[j].cfitness=0;
}
population[j].lower[i]=LBOUND;
population[j].upper[i]=UBOUND;
population[j].gene[i]=randval(population[j].lower[i],population[j].upper[i]);
}
}
}
//***************************************************************************
//Random value generator:generates a value within bounds
//***************************************************************************
double randval(double low,double high)
{
double val;
val=((double)(rand()%10000)/10000)*(high-low)+low;
return val;
}
//目标函数
double funtion(double x,double y)
{
double result1=sqrt(x*x+y*y)+sqrt((x-12)*(x-12)+y*y)+sqrt((x-8)*(x-8)+(y-6)*(y-6));
return result1;
}
//***************************************************************************
//Evaluation function:evaluate the individual's fitness.评价函数给出个体适应值
//Each time the function is changes,the code has to be recompl
//***************************************************************************
void evaluate(void)
{
int mem;
int i;
double x[NVARS];
for(mem=0;mem
{
for(i=0;i
x[i]=population[mem].gene[i];
population[mem].fitness=funtion(x[0],x[1]);//将目标函数值作为适应值
}
}
//***************************************************************************************
//Keep_the_best function:This function keeps track of the best member of the population.
//找出种群中的个体最优值并将其移动到最后
//***************************************************************************************
void keep_the_best()
{
int mem;
int i;
cur_best=0;
for(mem=0;mem
{
if(population[mem].fitness
{
cur_best=mem;
}
}
//将最优个体复制至population[POSIZE]
if(population[cur_best].fitness<=population[POPSIZE].fitness||population[POPSIZE].fitness<1)//防止出现种群基因退化 故保留历史最优个体
{
population[POPSIZE].fitness=population[cur_best].fitness;
for(i=0;i
population[POPSIZE].gene[i]=population[cur_best].gene[i];
}
}
//***************************************************************************
//last in the array.If the best individual from the new populatin is better
//than the best individual from the previous population ,then copy the best
//from the new population;else replace the worst individual from the current
//population with the best one from the previous generation.防止种群最优值退化
//***************************************************************************
void elitist()
{
int i;
double best,worst;//适应值
int best_mem,worst_mem;//序号
best_mem=worst_mem=0;
best=population[best_mem].fitness;//最高适应值初始化
worst=population[worst_mem].fitness;//最低适应值初始化
for(i=1;i
{
if(population[i].fitness
{
best=population[i].fitness;
best_mem=i;
}
if(population[i].fitness>worst)
{
worst=population[i].fitness;
worst_mem=i;
}
}
if(best<=population[POPSIZE].fitness)//赋值
{
for(i=0;i
population[POPSIZE].gene[i]=population[best_mem].gene[i];
population[POPSIZE].fitness=population[best_mem].fitness;
}
else
{
for(i=0;i
population[worst_mem].gene[i]=population[POPSIZE].gene[i];
population[worst_mem].fitness=population[POPSIZE].fitness;
}
}
//***************************************************************************
//Select function:Standard proportional selection for maximization problems
//incorporating elitist model--makes sure that the best member survives.筛选函数并产生子代
//***************************************************************************
void select(void)
{
int mem,i,j;
double sum=0;
double p;
for(mem=0;mem
{
sum+=population[mem].fitness;
}
for(mem=0;mem
{
population[mem].rfitness=population[mem].fitness/sum;//个人认为还不如建一个种群类 把sum看成类成员
}
population[0].cfitness=population[0].rfitness;
for(mem=1;mem
{
population[mem].cfitness=population[mem-1].cfitness+population[mem].rfitness;
}
for(i=0;i
{
p=rand()%1000/1000.0;
if(p
{
newpopulation[i]=population[0];
}
else
{
for(j=0;j
if(p>=population[j].cfitness&&p
newpopulation[i]=population[j+1];
}
}
for(i=0;i
population[i]=newpopulation[i];
}
//***************************************************************************
//Crossover:performs crossover of the selected parents.
//***************************************************************************
void Xover(int one,int two)//基因重组函数
{
int i;
int point;
if(NVARS>1)
{
if(NVARS==2)
point=1;
else
point=(rand()%(NVARS-1))+1;//两个都重组吗?
for(i=0;i
swap(&population[one].gene[i],&population[two].gene[i]);
}
}
//***************************************************************************
//Swapp: a swap procedure the helps in swappling 2 variables
//***************************************************************************
void swap(double *x,double *y)
{
double temp;
temp=*x;
*x=*y;
*y=temp;
}
//***************************************************************************
//Crossover function:select two parents that take part in the crossover.
//Implements a single point corssover.杂交函数
//***************************************************************************
void crossover(void)
{
int mem,one;
int first=0;
double x;
for(mem=0;mem
{
x=rand()%1000/1000.0;
if(x
{
++first;
if(first%2==0)//选择杂交的个体对 杂交有待改进 事实上往往是强者与强者杂交 这里没有考虑雌雄与杂交对象的选择
Xover(one,mem);
else
one=mem;
}
}
}
//***************************************************************************
//Mutation function:Random uniform mutation.a variable selected for mutation
//变异函数 事实基因的变异往往具有某种局部性
//is replaced by a random value between lower and upper bounds of the variables.
//***************************************************************************
void mutate(void)
{
int i,j;
double lbound,hbound;
double x;
for(i=0;i
for(j=0;j
{
x=rand()%1000/1000.0;
if(x
{
lbound=population[i].lower[j];
hbound=population[i].upper[j];
population[i].gene[j]=randval(lbound,hbound);
}
}
}
//***************************************************************************
//Report function:Reports progress of the simulation.
//***************************************************************************
double report(void)
{
int i;
double best_val;//种群内最优适应值
double avg;//平均个体适应值
//double stddev;
double sum_square;//种群内个体适应值平方和
//double square_sum;
double sum;//种群适应值
sum=0.0;
sum_square=0.0;
for(i=0;i
{
sum+=population[i].fitness;
sum_square+=population[i].fitness*population[i].fitness;
}
avg=sum/(double)POPSIZE;
//square_sum=avg*avg*(double)POPSIZE;
//stddev=sqrt((sum_square-square_sum)/(POPSIZE-1));
best_val=population[POPSIZE].fitness;
fprintf(galog,"%6d %6.3f %6.3f %6.3f %6.3f %6.3f\n",generation,best_val,population[POPSIZE].gene[0],population[POPSIZE].gene[1],avg,sum);
return avg;
}
//***************************************************************************
//main function:Each generation involves selecting the best members,performing
//crossover & mutation and then evaluating the resulting population,until the
//terminating condition is satisfied.
//***************************************************************************
void main(void)
{
int i;
double temp;
double temp1;
if((galog=fopen("data.txt","w"))==NULL)
{
exit(1);
}
generation=1;
srand(time(NULL));//产生随机数
fprintf(galog,"number value x1 x2 avg sum_value\n");
printf("generation best average standard\n");
initialize();
evaluate();
keep_the_best();
temp=report();//记录,暂存上一代个体平均适应值
do
{
select();//筛选
crossover();//杂交
mutate();//变异
evaluate();//评价
keep_the_best();//elitist();
temp1=report();
diff=fabs(temp-temp1);//求浮点数x的绝对值
temp=temp1;
generation++;
}while(generation=STOP);
//fprintf(galog,"\n\n Simulation completed\n");
//fprintf(galog,"\n Best member:\n");
printf("\nBest member:\ngeneration:%d\n",generation);
for(i=0;i
{
//fprintf(galog,"\n var(%d)=%3.3f",i,population[POPSIZE].gene[i]);
printf("X%d=%3.3f\n",i,population[POPSIZE].gene[i]);
}
//fprintf(galog,"\n\n Best fitness=%3.3f",population[POPSIZE].fitness);
fclose(galog);
printf("\nBest fitness=%3.3f\n",population[POPSIZE].fitness);
}
感兴趣的读者可以动手测试一下代码,希望对大家学习C++算法能有所帮助。
c语言遗传算法例子,C++遗传算法类文件实例分析相关推荐
- php 上传文件 例子,php上传文件实例
[实例简介]php上传实例_开源教程 [实例截图] [核心代码] // 允许上传的图片后缀 $allowedExts = array("gif", "jpeg" ...
- java 线程不安全例子_Java中多线程安全问题实例分析
案例package com.duyang.thread.basic.basethread; /** * @author :jiaolian * @date :Created in 2020-12-16 ...
- C语言树莓派PICO,RP2040(树莓派Pico) PIO – 实例分析编程
这次拿来开刀的是WS2812,具体代码可见 => https://github.com/raspberrypi/pico-examples/blob/master/pio/ws2812/ws28 ...
- gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例子(下)
前两篇文章半年前写的: gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1), gRPC in ASP.NET Core 3.0 -- Protocol Buf ...
- 遗传算法中常见遗传算子
遗传算法中常见遗传算子 常见选择算子 轮盘选择(roulette wheel selection) 随机遍历抽样(Stochastic universal sampling,SUS) 排序选择(ran ...
- 易语言之ocr自动识别验证码dll文件
OCR的dll文件可以在易语言中用于自动识别验证码图片里的数字 达到减少人工输入验证码的过程 首先需要下载 ocr.dll文件 易语言之ocr自动识别验证码dll文件调用及使用教程 - 苏音 ...
- Qt QTranslator多语言翻译例子
Qt QTranslator多语言翻译例子 一.简述 记--使用Q ...
- C语言模块化开发,深入多文件编程
目录 文章目录 目录 多文件编程 项目分割 避免命名冲突 项目生成的过程 预处理 编译 汇编 链接 语言发展的过程 机器语言 汇编语言 C语言 高级语言 编译的本质 目标文件里藏着什么 可执行文件 链 ...
- R语言一次性读入多个csv文件实战:一次导入多个csv形成一个统一的dataframe、原生R方法、readr包、data.table
R语言一次性读入多个csv文件实战:一次导入多个csv形成一个统一的dataframe.原生R方法.readr包.data.table 目录
- R语言dir函数获取目录中文件或者文件夹名称实战
R语言dir函数获取目录中文件或者文件夹名称实战 目录 R语言dir函数获取目录中文件或者文件夹名称实战 #基本语法
最新文章
- 蒸汽机器人布里茨天赋_LoL蒸汽机器人符文天赋_S10机器人辅助出装
- 05-cache相关的系统寄存器
- 牛客网题目——替换空格
- 测试nb信号的软件_NB-IoT和LORA,谁才是真正的低功耗?从数据看真相
- java sql数组_Sql数组类型解决方案
- 龙武2服务器在维护,龙武5.25更新维护时间_龙武5.5更新维护详情_牛游戏网
- Ansible安装MySQL5.7.24
- endnote参考文献排版_高效管理论文参考文献的方法
- IDEA中Ctrl+Shift+f快捷键无效的解决方式
- Jmeter5.0脚本录制
- android手机 办公软件,寻最佳手机Office助手 八大安卓办公软件横评
- mybatis-plus环境搭建
- 身份证号码的严格校验(非正则)
- 机器学习笔试精选 100 题
- codeforces 448CPainting Fence
- 浅析 BloomFilter
- Qt/C++实现多功能计算器
- MediaPlayer详解和使用
- 人生时间计算器_时间计算器
- 避开有道云笔记的充值会员上传图片
热门文章
- mysql not regexp_Mysql必知必会——使用正则表达式搜索(REGEXP)
- Python 廖雪峰Python练习答案
- Linux运维基础入门知识
- 搭建Struts框架
- 高级API 快速入门之第八章 多线程02
- 英特尔 英特尔 显示器音频_英特尔缩小的麻烦
- 2020年CSDN技术人内推活动 千里马专区职位列表
- 初识 InnoDB存储引擎
- 固高板卡mct2008调试轴回零_MCT2008-for-ges 固高所有GE运动控制卡的DEMO软件,用来测试板卡是否正常工作 matlab 238万源代码下载- www.pudn.com...
- 2017年数学建模美赛个人国际一等奖论文