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

📄 elitistset.cpp

📁 基于GPS的多目标优化及动态多目标优化源代码 里面 包含MOP, DMOP的程序
💻 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 + -