📄 srealgaoptimize.cpp
字号:
// SRealGAOptimize.cpp: implementation of the CSRealGAOptimize class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "sga.h"
#include "SRealGAOptimize.h"
#include "SGAParams.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern int VariableNo;
extern CString str;
extern double zdh5[30],LowerVariable[30],r;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSRealGAOptimize::CSRealGAOptimize()
{
generation=0; // 遗传代数
currentbest=new individual[params.PopSize];
worstindividual=new individual[params.PopSize];
population=new individual[params.PopSize];//遗传个体大小
}
CSRealGAOptimize::~CSRealGAOptimize()
{
delete []population;
}
void CSRealGAOptimize::GenerateInitialPopulation()
{
int i,j;
for (i = 0; i < VariableNo; i++)
{
for (j = 0; j < params.PopSize; j++)
{
population[j].realvalue[i] = randval(zdh5[i],LowerVariable[i]);
//population[j].upper[i]);// 在变量范围内对变量赋随机数值
}
}
}
double CSRealGAOptimize::randval(double low, double high)
{
double val;
val = ((double)(rand()%1000)/1000.0)*(high - low) + low;
return(val);
}
void CSRealGAOptimize::CalculateObjectValue()
{
int mem;
int i;
double *fitness;
fitness=new double[VariableNo];
m_formula1.SetFormula(str.GetBuffer(str.GetLength()));// 重新设置时将所有的清
double sum=0.0;
for (mem = 0; mem < params.PopSize; mem++)
{
for (i = 0; i <VariableNo; i++)
{
fitness[i] = population[mem].realvalue[i];
}
// population[mem].fitness = 100*(x[1]*x[1]-x[2])*(x[1]*x[1]-x[2])+(1-x[1])*(1-x[1]);//目标函数
double k=m_formula1.computer(fitness,VariableNo);
population[mem].fitness=k;//target_function(fitness[0],fitness[1]);
sum+=population[mem].fitness;
}
for(int j=0; j<params.PopSize; j++)
{
population[j].except_fitness=population[j].fitness/sum;
}
delete []fitness;
}
void CSRealGAOptimize::EvaluatePopulation()
{
CalculateObjectValue();
FideBestAndWorstIndividual();
}
void CSRealGAOptimize::FideBestAndWorstIndividual()
{
int i;
worstindividual[0]=population[1];
for(i=1; i<params.PopSize; i++)//把每代的每个个体都比较,存所要求的最好
{
if(population[i].fitness<worstindividual[0].fitness)
{
worstindividual[0]=population[i];
}
}
if(generation==0) // 如果是初始化的0代,那么当前最佳适应度=本代(0)最佳适应度
{
currentbest[0]=worstindividual[0];//只是把指针地址赋予currentbest,currentbest本身是一指针
}
else // 否则比较i-1和i代(i为当前代),取适应度好的染色体
{
if(worstindividual[0].fitness<currentbest[0].fitness)
{
currentbest[0]=worstindividual[0];
}
}
}
void CSRealGAOptimize::GenerateNextPopulation()
{
SelectionOperator();
CrossoverOperator();
MutationOperator();
}
void CSRealGAOptimize::SelectionOperator()
{
int i, index;
double p;
individual *newpopulation=new individual[params.PopSize];
// calculate cumulative fitness
for(i=1; i<params.PopSize; i++)
{
population[i].except_fitness=population[i-1].except_fitness
+population[i].except_fitness;
}
// selection operation
for(i=0; i<params.PopSize; i++)
{
p=rand()%1000/1000.0;
index=0;
while (p>population[index].except_fitness)
{
index++;
}
newpopulation[i]=population[index];
}
for(i=0; i<params.PopSize; i++)
{
population[i]=newpopulation[i];
}
delete []newpopulation;
}
void CSRealGAOptimize::CrossoverOperator()
{
int mem, one;
int first = 0; /* count of the number of members chosen */
double x;
for (mem = 0; mem < params.PopSize; ++mem)
{
x = rand()%1000/1000.0;
if (x < params.blCrossover)
{
++first;
if (first % 2 == 0)
Xover(one, mem);
else
one = mem;
}
}
}
void CSRealGAOptimize::Xover(int one, int two)
{
individual unit;
int i;
int point; /* crossover point */
/* select crossover point */
if(VariableNo > 1)
{
if(VariableNo == 2)
point = 1;
else
point = (rand() % (VariableNo - 1)) + 1;
for (i = 0; i < point; i++)
swap(&population[one].realvalue[i], &population[two].realvalue[i]);
}
}
void CSRealGAOptimize::swap(double *x, double *y)
{
double temp;
temp = *x;
*x = *y;
*y = temp;
}
void CSRealGAOptimize::MutationOperator()
{
int i, j;
double lbound, hbound;
double x;
for (i = 0; i < params.PopSize; i++)
for (j = 0; j <VariableNo; j++)
{
x = rand()%1000/1000.0;
if (x < params.blMutation)
{
/* find the bounds on the variable to be mutated */
lbound = population[i].lower[j];
hbound = population[i].upper[j];
population[i].realvalue[j] = randval(lbound, hbound);
}
}
}
void CSRealGAOptimize::PerformEvolution()
{
if(worstindividual->fitness<currentbest->fitness) // 如果当前代最佳适应度(某个染色体)>历代最大适应度
{
currentbest=&population[worst_index];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -