📄 individualmo.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 + -