遗传算法求函数最值

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
else
{
temp=0.0;
}
}
else if (functionmode==0)
{
if(population[i].value<cmax)
{
temp=cmax-population[i].value;
}
else{ temp=0.0;}
}
population[i].fitness=temp;
}
}
///////////////////////////////////////////////////////////////////////////////
//void ComprehensiveFunc();//综合函数
void GenerateInitialPopulation(); //种群初始化
void GenerateNextPopulation(); //生成下一代
long DecodeChromosome(char *,int,int);//给染色体解码
{
if (population[i].fitness>bestindividual.fitness)
{
bestindividual=population[i];
best_index=i;
}
else if (population[i].fitness<worstindividual.fitness)
{
int worst_index;//最差个体的数组下标
int generation; //世代数,带参构造函数里赋值为0
struct individual population[POPSIZE];//种群规模,最大规模由POPSIZE(500)指示
double chromtodouble;//染色体转变为自变量范围内的值
void Genetic::ValculateFitnessvalue()//计算适应度
{
int i;
double temp;
for(i=0;i<popsize;i++)
{
if(functionmode==1)
{
if((population[i].value+cmin)>0.0)
{Βιβλιοθήκη Baidu
temp=cmin+population[i].value;
1.genetic
//头文件
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
//符号常量
#define POPSIZE 500
#define cmax 100
#define cmin 0
//群体中的个体,结构体定义
{
int i;
long decimal=0;
char*pointer;
for(i=0,pointer=string+point;i<length;i++,pointer++)
if(*pointer-'0')
{
decimal +=(long)pow(2,i);
}
return (decimal);
}
///////////////////////////////////////////////////////////////////////////////
struct individual bestindividual; //最佳个体
struct individual worstindividual; //最差个体
struct individual currentbest; //当前最优,即这一代中的最优
public:
//函数声明
Genetic();//不带参数的构造函数
}
///////////////////////////////////////////////////////////////////////////////
Genetic::Genetic(int popsizeout,int maxgenerationout,double pcout,
double pmout,double Xfirstout,double Xendout,int chromlengthout,int functionmodeout)//带参数的构造函数
{
int i,j;//分别占据结构体类型individual字符数组成员chrom的前10个元素,和后10个元素
for (i=0;i<popsize; i++)
{
for(j=0;j<chromlength;j++)
{
population[i].chrom[j]=(rand()%10<5)?'0':'1';
{
int i;
long temp1;
double x1;
for (i=0; i<popsize; i++)
{
temp1=DecodeChromosome(population[i].chrom,0,chromlength);
x1=(Xend-Xfirst)*temp1/((pow(2,chromlength)-1)-0.0)+Xfirst;//染色体解码得到的整数(0-1023)到自变量范围(1-10)的转化
chromlength=chromlengthout;//染色体长度
functionmode=functionmodeout;//求函数最大(小)的标记
}
///////////////////////////////////////////////////////////////////////////////
Genetic(int popsizeout,int maxgenerationout,double pcout,double pmout,double Xfirst,double Xend,int chromlengthout,int functionmode=1);//带参数的构造函数
~Genetic();//析构函数
}
population[i].chrom[chromlength]='\0';
}
}
///////////////////////////////////////////////////////////////////////////////
void Genetic::GenerateNextPopulation() //生成下一代
void CalculateObjectValue(int histin[256],double(*p)(int hist[256],double)); //计算函数值
void ValculateFitnessvalue(); //计算适应度
void FindBestandworstIndividual(); //求最佳个体和最差个体
//函数值的求取,始终要放在类的内部,这是不通用的,我还没有解决这个问题???,现在已解决
population[i].value=(*p)(histin,x1);
}
}
///////////////////////////////////////////////////////////////////////////////
worstindividual=population[i];
worst_index=i;
}
sum+=population[i].fitness;
}
if (generation==0)
{
currentbest=bestindividual;
}
else
{
if(bestindividual.fitness>=currentbest.fitness)
{
popsize=popsizeout;//种群规模
maxgeneration=maxgenerationout;//最大世代数
pc=pcout;//交叉率
pm=pmout;//变异率
generation=0;
Xfirst=Xfirstout; //自变量起始值
Xend=Xendout ; //自变量终止值
{
if (bestindividual.fitness>currentbest.fitness)//其实if后的语句得不到执行的机会,每次总是执行else后的语句
{ //求最佳个体时,使b=c,或b<=c,根本没有b>c的时候
currentbest=population[best_index];//若此代最佳个体比上一代(当前)适应度更高,则保留为当前最佳
/*作用:
*计算函数值
*参数:
*p函数指针,这个函数由外部定义,传给形参即可
*返回值:
*十进制的长整形
*/
///////////////////////////////////////////////////////////////////////////////
//计算函数值
void Genetic::CalculateObjectValue(int histin[256],double(*p)(int hist[256],double)) //计算函数值
void PerformEvolution(); //演示评价结果
void SelectOperator(); //比例选择算法
void CrossoverOperator(); //交叉算法
void MutationOperator();//变异算法
void OutputReport(); //数据输出
struct individual
{
char chrom[30];//定义染色体长度数组,留有余地,真实长度由构造函数完成
double value; //函数值
double fitness; //适应度
};
class Genetic
{
public:
int popsize;//种群规模
int maxgeneration;//最大世代数
{
currentbest=bestindividual;
}
}
}
///////////////////////////////////////////////////////////////////////////////
void Genetic::PerformEvolution() //演示评价结果,取代最差个体
{
SelectOperator();
CrossoverOperator();
MutationOperator();
}
///////////////////////////////////////////////////////////////////////////////
/*作用:
*给染色体解码
*参数:
*string字符指针
*point指针的偏移量
*length染色体长度
*返回值:
*十进制的长整形
*/
///////////////////////////////////////////////////////////////////////////////
long Genetic::DecodeChromosome(char *string ,int point,int length)
void Genetic::FindBestandworstIndividual( ) //求最佳个体和最差个体
{
int i;
double sum=0.0;
bestindividual=population[0];
worstindividual=population[0];
for (i=1;i<popsize; i++)
};
2.genetic
#include "stdafx.h"
#include "Genetic.h"
///////////////////////////////////////////////////////////////////////////////
Genetic::Genetic()
{
generation=0;
Genetic::~Genetic()//析构函数
{
}
///////////////////////////////////////////////////////////////////////////////
void Genetic::GenerateInitialPopulation( ) //种群初始化,一个个体包含两个成员(x1,x2),
double pc;//交叉率
double pm;//变异率
double Xfirst ; //自变量起始值
double Xend ; //自变量终止值
int chromlength;//染色体长度
int functionmode;//求函数最大值和函数最小值标记,值为1,求最大值,为0求最小值
int best_index;//最佳个体的数组下标
相关文档
最新文档