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

📄 individual.cpp

📁 一个简单遗传算法
💻 CPP
字号:
// individual.cpp: implementation of the Cindividual class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HeredityDemo.h"
#include "individual.h"
#include "problem.h"
#include "time.h"
#include "stdlib.h"
#include <math.h>
#include <iostream.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Cindividual::Cindividual()
{

}
Cindividual::~Cindividual()
{
	  delete [] m_pParameterValue;
	  delete [] m_pObjectValue;
	  delete [] m_pChromosomeValue;
	  delete [] m_pFitnessValue;

}
void   Cindividual::InitializtionIndividual1(int ObjectNum, int DimensionNum, int ChromosomeLength,int FunctionMode)
{
	   m_ObjectNum=ObjectNum;
	   m_DimensionNum=DimensionNum;
	   m_ChromosomeLength=ChromosomeLength;
	   m_pParameterValue= new double[m_DimensionNum];
	   m_pObjectValue= new double[m_ObjectNum];
	   m_pFitnessValue= new double[m_ObjectNum];
	   m_pChromosomeValue= new int[m_ChromosomeLength*m_DimensionNum];
	   
}

void Cindividual::InitializtionIndividual(int ObjectNum, int DimensionNum, int ChromosomeLength, int FunctionMode)//对个体进行初始化的函数
{
	   m_ObjectNum=ObjectNum;//目标的个数,也就是说是几个目标的问题
	   m_DimensionNum=DimensionNum;//问题的维数,也就是X的个数
	   m_ChromosomeLength=ChromosomeLength;//表示个体的染色体长度,每一维的染色体长度
	   m_pParameterValue= new double[m_DimensionNum];//保存个体的参数值
	   m_pObjectValue= new double[m_ObjectNum];// 保存个体的目标数值
	   m_pFitnessValue= new double[m_ObjectNum];// 保存个体的适应值
	   m_pChromosomeValue= new int[m_ChromosomeLength*m_DimensionNum];//保存个体的染色体
	   DesignChromosome();//随机生成染色体
	   DecodeChromosome();//对染色体解码,得到十进制的数值
	   CalculateObjectValue();//利用得到的十进制数值,计算该个体的目标数值
	   CalculateFitnessValue(FunctionMode);//根据问题是极大问题还是极小问题,计算个体的适应值

	   

}

void   Cindividual::DesignChromosome()//该函数的功能是随机生成每一个个体的染色体,并存放到m_pChromosomeValue数组
{
	   
	   for(int i=0;i<m_ChromosomeLength*m_DimensionNum;i++)
	   {
		   *(m_pChromosomeValue+i)=(rand()%10)<5?0:1;

	   }	   
}
void   Cindividual::DecodeChromosome()//该函数的功能是对得到的染色体进行解码,从而得到X的十进制数值,并存放到m_pChromosomeValue数组中
{
	       double sum=0.0;
		   double    temp;
	  
		   for(int j=0,i=0;j<m_ChromosomeLength*m_DimensionNum;j+=m_ChromosomeLength,i++)
		   {
			   for(int k=j,g=0;g<m_ChromosomeLength;k++,g++)
			   {
                      if(0==*(m_pChromosomeValue+k))
						  sum+=0;
					  if(1==*(m_pChromosomeValue+k))
						  sum+=pow(2,m_ChromosomeLength-g-1);
			   }
                temp=pow(2,m_ChromosomeLength)-1;
			   *(m_pParameterValue+i)=(sum/temp)*4.096-2.048;//将得到的数值转化到所需要的范围内
			   sum=0.0;
		   }
	  
}
void   Cindividual::CalculateObjectValue()//给函数的功能是利用得到的十进制参数计算每个个体对于该问题的目标值,并存放在m_pObjectValue
{
	   Cproblem problem(m_ObjectNum,m_DimensionNum);//声明并初始化一个问题事例
       problem.Calculate(m_pParameterValue,m_pObjectValue);//利用参数计算目标值

}
void   Cindividual::CalculateFitnessValue(int FunctionMode)//该函数的功能是根据问题的类型计算当前个体的适应度,并存放到m_pFitnessValue
{
	   if(0==FunctionMode)//0表示极大化问题,可能不是适用于所有的问题,需要进一步完善
	   {
		   if(*(m_pObjectValue)<0)
			   *(m_pFitnessValue)=0;
		   else
			   *(m_pFitnessValue)=*(m_pObjectValue);
	   }
	   else
	   {
		   if(*(m_pObjectValue)>100)//表示极小化问题
			   *(m_pFitnessValue)=0;
		   else
			   *(m_pFitnessValue)=100-*(m_pObjectValue);	   
	   }	   	
}

void   Cindividual::OutputObjectValue()//该函数功能将目标数值输出到屏幕,便于进行检查
{
	   for(int i=0;i<m_ObjectNum;i++)
	   {
		   cout.precision(8);
		   cout<<*(m_pObjectValue+i)<<" ";
	   }
}
void   Cindividual::GetObjectValue(double *ObjectValue)//功能是得到个体的目标数值,保存到ObjectValue
{
	   for(int i=0;i<m_ObjectNum;i++)
	   {
		   *(ObjectValue+i)=*(m_pObjectValue+i);

	   }
}
void   Cindividual::SetObjectValue(double *ObjectValue)
{
	   for(int i=0;i<m_ObjectNum;i++)
	   {
		   
		   *(m_pObjectValue+i)=*(ObjectValue+i);

	   }
}
void   Cindividual::OutputParameterValue()
{
	   cout.precision(10);
	   for(int i=0;i<m_DimensionNum;i++)
	   {
		   cout<<*(m_pParameterValue+i)<<" ";
	   }
}
void   Cindividual::OutputCode()
{
	   for(int i=0;i<m_ChromosomeLength*m_DimensionNum;i++)
	   {
		   cout<<*(m_pChromosomeValue+i)<<"";
	   }
	   
}


void   Cindividual::SetParameterValue(double *ParameterValue)
{
	   for(int i=0;i<m_DimensionNum;i++)
	   {
		   *(m_pParameterValue+i)=*(ParameterValue+i);

	   }

}
void   Cindividual::GetParameterValue(double *ParameterValue)
{
	   for(int i=0;i<m_DimensionNum;i++)
	   {
		   *(ParameterValue+i)=*(m_pParameterValue+i);

	   }
}
void   Cindividual::OutputFitnessValue()
{
	   for(int i=0;i<m_ObjectNum;i++)
	   {
		   cout.precision(8);
		   cout<<*(m_pFitnessValue+i)<<" ";
	   }
	   
}
void   Cindividual::GetFitnessValue(double *FitnessValue)
{
	   for(int i=0;i<m_ObjectNum;i++)
	   {
		   *(FitnessValue+i)=*(m_pFitnessValue+i);

	   }
}
void    Cindividual::SetSelectionRate(double SelectionRate)
{
	    m_SelectionRate=SelectionRate;
}
void    Cindividual::SetAddSelectionRate(double AddSelectionRate)
{
	    m_AddSelectionRate=AddSelectionRate;
}
void   Cindividual::OutputSelectionRate()
{
	   cout.precision(8);
	   cout<<m_SelectionRate<<" ";
}
void   Cindividual::OutputAddSelectionRate()
{
	   cout.precision(8);
	   cout<<m_AddSelectionRate<<" ";	   
}
double Cindividual::GetSelectionRate()
{
	   return m_SelectionRate;
}
double Cindividual::GetAddSelectionRate()
{
	   return m_AddSelectionRate;
}
void   Cindividual::GetChromosomeValue(int * ChromosomeValue)
{
	   for(int i=0;i<m_ChromosomeLength*m_DimensionNum;i++)
	   {
           *(ChromosomeValue+i)=*(m_pChromosomeValue+i);
	   }
}
void   Cindividual::SetChromosome(int *ChromosomeValue)
{
	   for(int i=0;i<m_ChromosomeLength*m_DimensionNum;i++)
	   {
           *(m_pChromosomeValue+i)=*(ChromosomeValue+i);
	   }
	   
}
void   Cindividual::OutputDetailInformation()
{
	   cout<<"Y=";
	   OutputObjectValue();
	   OutputFitnessValue();
	   OutputSelectionRate();
	   OutputAddSelectionRate();
       cout<<"X1,X2=";
	   OutputParameterValue();
	   cout<<"Code:";
	   OutputCode();
	   cout<<endl;
	   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -