遗传算法C语言代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// GA.cpp : Defines the entry point for the console application.
//
/*
这是一个非常简单的遗传算法源代码,是由Denis Cormier (North Carolina State University)开发的,
Sita S.Raghavan (University of North Carolina at Charlotte)修正。
代码保证尽可能少,实际上也不必查错。
对一特定的应用修正此代码,用户只需改变常数的定义并且定义“评价函数”即可。
注意代码的设计是求最大值,其中的目标函数只能取正值;且函数值和个体的适应值之间没有区别。
该系统使用比率选择、精华模型、单点杂交和均匀变异。如果用Gaussian变异替换均匀变异,可能得到更好的效果。
代码没有任何图形,甚至也没有屏幕输出,主要是保证在平台之间的高可移植性。
读者可以从, 目录coe/evol中的文件prog.c中获得。
要求输入的文件应该命名为‘gadata.txt’;系统产生的输出文件为‘galog.txt’。
输入的文件由几行组成:数目对应于变量数。且每一行提供次序——对应于变量的上下界。如第一行为第一个变量提供上下界,第二行为第二个变量提供上下界,等等。
*/
#include
#include
#include
/* Change any of these parameters to match your needs */
//请根据你的需要来修改以下参数
#define POPSIZE 50 /* population size 种群大小*/
#define MAXGENS 1000 /* max. number of generations 最大基因个数*/
const int NVARS = 3; /* no. of problem variables 问题变量的个数*/
#define PXOVER 0.8 /* probability of crossover 杂交概率*/
#define PMUTATION 0.15 /* probability of mutation 变异概率*/
#define TRUE 1
#define FALSE 0
int generation; /* current generation no. 当前基因个数*/
int cur_best; /* best individual 最优个体*/
FILE *galog; /* an output file 输出文件指针*/
struct genotype /* genotype (GT), a member of the population 种群的一个基因的结构体类型*/
{
double gene[NVARS]; /* a string of variables 变量*/
double fitness; /* GT's fitness 基因的适应度*/
double upper[NVARS]; /* GT's variables upper bound 基因变量的上界*/ double lower[NVARS]; /* GT's variables lower bound 基因变量的下界*/ double rfitness; /* relative fitness 比较适应度*/
double cfitness; /* cumulative fitness 积累适应度*/
};
struct genotype population[POPSIZE+1]; /* population 种群*/
struct genotype newpopulation[POPSIZE+1]; /* new population; 新种群*/
/* replaces the old generation */
//取代旧的基因
/* Declaration of procedures used by this genetic algorithm */
//以下是一些函数声明
void initialize(void);
double randval(double, double);
void evaluate(void);
void keep_the_best(void);
void elitist(void);
void select(void);
void crossover(void);
void Xover(int,int);
void swap(double *, double *);
void mutate(void);
void report(void);
/***************************************************************/ /* Initialization function: Initializes the values of genes */
/* within the variables bounds. It also initializes (to zero) */
/* all fitness values for each member of the population. It */
/* reads upper and lower bounds of each variable from the */
/* input file `gadata.txt'. It randomly generates values */
/* between these bounds for each gene of each genotype in the */
/* population. The format of the input file `gadata.txt' is */
/* var1_lower_bound var1_upper bound */
/* var2_lower_bound var2_upper bound ... */
/***************************************************************/
void initialize(void)
{
FILE *infile;
int i, j;
double lbound, ubound;
if ((infile = fopen("gadata.txt","r"))==NULL)