📄 elitistset.cpp
字号:
// ElistSet.cpp: implementation of the CElitistSet class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RTDMOEA.h"
#include "ElitistSet.h"
#include "math.h"
#include "RTCGPS.h"
#include <float.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
double CElitistSet::SlopeDistance[MAX_OBJECTIVENUM];
double CElitistSet::BaseSlope[MAX_OBJECTIVENUM];
double CElitistSet::Baseline[MAX_OBJECTIVENUM];
double CElitistSet::Scale[MAX_OBJECTIVENUM];
double CElitistSet::Location=10000;
/********************************************************/
/***** 指定每个维度需要多少个点 **********/
/********************************************************/
int CElitistSet::PointNum[MAX_OBJECTIVENUM];
/********************************************************/
/***** 是否使用GPS2策略 **********/
/********************************************************/
//int CElitistSet::GPS2Strategy=1;
CElitistSet::CElitistSet()
{
/********************************************************/
/***** 初始化精英空间 **********/
/********************************************************/
int AllPoints=1;
for (int i=0;i< CSolution::OBJectiveNum-1;i++)
{
AllPoints *= PointNum[i];
}
for (i =0; i<AllPoints;i++)
{
CSolution *p=new CSolution(TRUE);
ElitistSpace.Add(p);
}
/********************************************************/
/***** 初始化参数 **********/
/********************************************************/
for (i=0;i< CSolution::OBJectiveNum -1;i++)
{
BaseSlope[i]= (Location - PI /2 ) / (Location+ PI/2);
SlopeDistance[i]= ((Location + PI /2 ) / (Location -PI/2) -(Location - PI /2 ) /( Location +PI/2) ) /(PointNum[i]-1);
}
InitElistSet();
}
CElitistSet::~CElitistSet()
{
for (int i = 0;i<ElitistSpace.GetSize();i++ )
{
CSolution * k= (CSolution *)ElitistSpace[i];
delete k;
}
ElitistSpace.RemoveAll();
}
void CElitistSet::InitElistSet()
{
}
bool CElitistSet::AddSolution(CSolution &newSolution)
{
double AssignFitness[MAX_OBJECTIVENUM];
/** 重新设定适应值 */
for (int i=0; i< CSolution::OBJectiveNum;i++)
{
// if (newSolution.Objective[i]==0) AssignFitness[i]=0;
// else
AssignFitness[i]= atan(PI * (2*newSolution.Objective[i] - 2*Baseline[i] -Scale[i]) / (2*Scale[i])) ;
if (_isnan(AssignFitness[i]))
AssignFitness[i] =0;
}
//************************************************************//
//************** 定 位 ******************//
//************************************************************//
/** 计算斜率 */
double tSlope=0;
int Loc=0;
int PointCount=0;
for (i=1;i< CSolution::OBJectiveNum ;i++)
{
tSlope = (Location -AssignFitness[i]) / (Location-AssignFitness[0]);
PointCount =(int)floor( fabs( (tSlope -BaseSlope[i-1] )) /SlopeDistance[i-1] );
Loc += PointCount;
if (i == CSolution::OBJectiveNum -1)
{
Loc *=1;
}
else
{
Loc *= PointNum[i-1];
}
// if (i != CSolution::OBJectiveNum -1)
// Loc+ =PointCount * PointNum[i-1];
// else
// if (CSolution::OBJectiveNum ==2 ) Loc =PointCount;
// else Loc +=PointCount;
}
//************************************************************//
//************** 比 较 ******************//
//************************************************************//
/** 计算距离 */
double t_Distance=0;
for (i=1;i<CSolution::OBJectiveNum ;i++)
t_Distance = sqrt(pow((Location - AssignFitness[i]),2) + pow((Location - AssignFitness[0]),2) );
newSolution.Distance = t_Distance;
if ( ( *(CSolution*)ElitistSpace[Loc]).Distance< newSolution.Distance )
{
((CSolution*)ElitistSpace[Loc])->Copy(&newSolution);
RTCGPS::StopOK= FALSE;
return true;
}
return false;
}
void CElitistSet::RefreshAll()
{
for (int i=0;i<ElitistSpace.GetSize();i++ )
{
((CSolution*)ElitistSpace[i])->Distance=0;
CSolution *p=((CSolution*)ElitistSpace[i]);
AddSolution(*p);
if ( p !=(CSolution*)ElitistSpace[i] )p->Distance =0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -