⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 srealgaoptimize.cpp

📁 vc编程实现bp神经网络
💻 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 + -