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

📄 individualmo.cpp

📁 该算法是张青复与周爱民的基于RM-MEDA算法的程序
💻 CPP
字号:
//IndividualMO.cpp

#include "IndividualMO.h"

namespace az
{
namespace mea
{

//Constructor, assign space to parameters
CIndividualMO::CIndividualMO(CParameter& par)
{
	mConstraint	= 0.0;
	pPar			= ∥
	mRank			= 0;
	mID				= 0;
	mvX.resize(pPar->XSize());
	mvF.resize(pPar->FSize());
	mvEq.resize(pPar->ESize());
	mvIneq.resize(pPar->ISize());
}

//Constructor
CIndividualMO::CIndividualMO(CIndividualMO& ind)	
{
	*this = ind;
}

//dominance check
int CIndividualMO::Dominate(CIndividualMO& ind)
{
	unsigned int better = 0, wbetter = 0, worse = 0, wworse = 0;
	for(unsigned int i=0; i<P().FSize(); i++)
	{
		if(	F(i) <= ind.F(i) + P().TolF())
		{
			better++;
			if(F(i) > ind.F(i) - P().TolF()) wbetter ++;
		}
		
		if(ind.F(i) <= F(i) + P().TolF())
		{
			worse++;
			if(ind.F(i) > F(i) - P().TolF()) wworse ++;
		}
	}

	if(better == P().FSize() && wbetter < better)	return  1;
	else if(worse == P().FSize() && wworse < worse)	return -1;
	else return 0;
}

//constratint-dominance check
int CIndividualMO::CDominate(CIndividualMO& ind)
{
	if(mConstraint < ind.mConstraint) return 1;
	if(mConstraint > ind.mConstraint) return -1;
	return Dominate(ind);
}

//Evaluate the individual
void CIndividualMO::Evaluate()
{
	unsigned int i;

	//evaluate
	// with coding
	if(P().XCoding())
	{
		std::vector<double> XX(mvX.size());
		for(i=0; i<mvX.size(); i++) XX[i] = P().XRealLow(i) + (mvX[i]-P().XLow(i))/(P().XUpp(i)-P().XLow(i))*(P().XRealUpp(i)-P().XRealLow(i));
		(*P().Evaluator())(mvF, mvEq, mvIneq, XX);
		XX.clear();
	}
	// without coding
	else
	{
		(*P().Evaluator())(mvF, mvEq, mvIneq, mvX);
	}

	//Evaluate equalities
	mConstraint = 0.0;
	for(i=0; i<P().ESize(); i++) mConstraint += fabs(mvEq[i]);

	//Evaluate inequalities
	for(i=0; i<P().ISize(); i++) mConstraint += mvIneq[i] > 0.0 ? mvIneq[i] : 0.0;
}

//Check the bounds
void CIndividualMO::Check()
{
	for(unsigned int i=0; i<P().XSize(); i++)
		if(X(i) < P().XLow(i)) X(i) = rnd::rand(P().XLow(i), (P().XLow(i)+P().XUpp(i))/2.0);
		else if(X(i) > P().XUpp(i)) X(i) = rnd::rand((P().XLow(i)+P().XUpp(i))/2.0, P().XUpp(i));
		//if(X(i) < P().XLow(i))		X(i) = P().XLow(i);
		//else if(X(i) > P().XUpp(i)) X(i) = P().XUpp(i);
}

CIndividualMO& CIndividualMO::operator= (CIndividualMO& ind)
{
	mRank	= ind.mRank;
	mvX		= ind.mvX;
	mvF		= ind.mvF;
	mvEq	= ind.mvEq;
	mvIneq	= ind.mvIneq;
	pPar	= ind.pPar;
	mID		= ind.mID;
	mConstraint	= ind.mConstraint;

	return *this;
}

bool CIndividualMO::operator==(CIndividualMO& ind)
{
	for(unsigned int i=0; i<P().XSize(); i++)
		if(fabs(X(i) - ind.X(i)) > P().TolX()) return false;
	return true;
}

//check to see which is better
bool CIndividualMO::operator<(CIndividualMO& ind)
{
	return (mRank < ind.mRank) || (mRank == ind.mRank && mConstraint < ind.mConstraint);
}

//Write to stream
std::ostream& operator<<(std::ostream& os, CIndividualMO& ind)
{
	unsigned int i;
	for(i=0; i<ind.P().FSize(); i++)		os<<ind.F(i)<<"\t";
	if(ind.P().XCoding()) // coding
		for(i=0; i<ind.P().XSize(); i++)	os<<ind.P().XRealLow(i) + (ind.X(i)-ind.P().XLow(i))/(ind.P().XUpp(i)-ind.P().XLow(i))*(ind.P().XRealUpp(i)-ind.P().XRealLow(i))<<"\t";
	else	// without coding
		for(i=0; i<ind.P().XSize(); i++)	os<<ind.X(i)<<"\t";
	os<<std::endl;
	return os;
}

//Read from stream
std::istream& operator>>(std::istream& is, CIndividualMO& ind)
{
	unsigned int i;
	for(i=0; i<ind.P().FSize(); i++)	is>>ind.F(i);
	for(i=0; i<ind.P().XSize(); i++)	is>>ind.X(i);
	return is;
}

} //namespace mea
} //namespace az

⌨️ 快捷键说明

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