遗传算法作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);
}