遗传算法作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:

利用遗传算法求shaffer ’s F6函数()()222222001.015.0sin 5.0),(y x y x y x f +⋅+-+-

=的

最优解()100,100<<-y x 。

要求给出源代码,求出最优解和最优值,给出进化代数、种群规模、交叉率及变异率。 1 求解思路

在程序中将种群规模、进化代数、交叉率及变异率分别取为不同数值,发现计算结果将收敛到不同的极大点。该函数的根据下,x 和y 的取值可以得到无穷多个极大点。

首先需要建立一个文件在里面写上两个变量的最大值及最小值。即:

-100 100

-100 100

在程序中取种群规模为50,进化代数为1500,交叉率为0.8,变异率为0.15,该函数的最优解为0=x ,0=y ,对应的最优值为1。实际上,对应于这个最优解,种群规模、进化代数、交叉率及变异率可以取多组不同数值。如:取种群规模为500,进化代数为1000,交叉率为0.8,变异率为0.15时仍可以得到这个最优解。

2程序的源代码

#include

#include

#include

#define POPSIZE 50 /* 种群规模*/

#define MAXGENS 2000 /* 最大进化代数*/

#define NV ARS 2 /*变量数*/

#define PXOVER 0.8 /* 交叉率*/

#define PMUTATION 0.15 /* 变异率*/

#define TRUE 1

#define FALSE 0

int generation; /* 当前代*/

int cur_best; /* 最佳个体*/

FILE *galog; /* 输出文件*/

struct genotype /* genotype (GT), a member of the population */

{

double gene[NV ARS]; /* 基因数组*/

double fitness; /* 适应度*/

double upper[NV ARS]; /* 变量取值上限*/

double lower[NV ARS]; /*变量取值上限*/

double rfitness; /* 相对适应度*/

double cfitness; /* 累积适应度*/

};

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)

{

fprintf(galog,"\nCannot open input file!\n");

exit(1);

}

/* initialize variables within the bounds */

for (i = 0; i < NV ARS; i++)

{

fscanf(infile, "%lf",&lbound);

fscanf(infile, "%lf",&ubound);

for (j = 0; j < POPSIZE; j++)

{

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]);

}

}

fclose(infile);

}

相关文档
最新文档