bugfix: clear previous pop when calling split
This commit is contained in:
parent
1544d7d18f
commit
83673d48b2
1 changed files with 38 additions and 31 deletions
|
|
@ -19,27 +19,12 @@ public:
|
||||||
const double kappa = 0.05
|
const double kappa = 0.05
|
||||||
) : moeoExpBinaryIndicatorBasedFitnessAssignment<MOEOT>( metric, kappa ) {}
|
) : moeoExpBinaryIndicatorBasedFitnessAssignment<MOEOT>( metric, kappa ) {}
|
||||||
|
|
||||||
//! Split up the population in two: in one pop the feasible individual, in the other the feasible ones
|
|
||||||
virtual void split( eoPop<MOEOT> & pop )
|
|
||||||
{
|
|
||||||
_feasible_pop.reserve(pop.size());
|
|
||||||
_unfeasible_pop.reserve(pop.size());
|
|
||||||
|
|
||||||
for( typename eoPop<MOEOT>::iterator it=pop.begin(), end=pop.end(); it != end; ++it ) {
|
|
||||||
// The ObjectiveVector should implement "is_feasible"
|
|
||||||
if( it->objectiveVector().is_feasible() ) {
|
|
||||||
_feasible_pop.push_back( *it );
|
|
||||||
} else {
|
|
||||||
_unfeasible_pop.push_back( *it );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! If the population is homogeneous (only composed of feasible individuals or unfeasible ones),
|
/*! If the population is homogeneous (only composed of feasible individuals or unfeasible ones),
|
||||||
* then apply the operators on the whole population.
|
* then apply the operators on the whole population.
|
||||||
* But, if there is at least one feasible individual, then apply them only on the feasible individuals.
|
* But, if there is at least one feasible individual, then apply them only on the feasible individuals.
|
||||||
*/
|
*/
|
||||||
virtual void operator()(eoPop < MOEOT > & pop)
|
virtual void operator()( eoPop<MOEOT>& pop )
|
||||||
{
|
{
|
||||||
// separate the pop in the members
|
// separate the pop in the members
|
||||||
split( pop );
|
split( pop );
|
||||||
|
|
@ -57,26 +42,48 @@ public:
|
||||||
this->setFitnesses(*ppop);
|
this->setFitnesses(*ppop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
//! Split up the population in two: in one pop the feasible individual, in the other the feasible ones
|
||||||
|
virtual void split( eoPop<MOEOT> & pop )
|
||||||
|
{
|
||||||
|
// clear previously used populations
|
||||||
|
_feasible_pop.clear();
|
||||||
|
_unfeasible_pop.clear();
|
||||||
|
_feasible_pop.reserve(pop.size());
|
||||||
|
_unfeasible_pop.reserve(pop.size());
|
||||||
|
|
||||||
|
for( typename eoPop<MOEOT>::iterator it=pop.begin(), end=pop.end(); it != end; ++it ) {
|
||||||
|
// The ObjectiveVector should implement "is_feasible"
|
||||||
|
if( it->objectiveVector().is_feasible() ) {
|
||||||
|
_feasible_pop.push_back( *it );
|
||||||
|
} else {
|
||||||
|
_unfeasible_pop.push_back( *it );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute every indicator value in values (values[i] = I(_v[i], _o))
|
* Compute every indicator value in values (values[i] = I(_v[i], _o))
|
||||||
* @param _pop the population
|
* @param _pop the population
|
||||||
*/
|
*/
|
||||||
void computeValues(const eoPop < MOEOT > & _pop)
|
virtual void computeValues(const eoPop < MOEOT > & pop)
|
||||||
{
|
{
|
||||||
values.clear();
|
values.clear();
|
||||||
values.resize(_pop.size());
|
values.resize(pop.size());
|
||||||
for (unsigned int i=0; i<_pop.size(); i++)
|
for (unsigned int i=0; i<pop.size(); i++) {
|
||||||
{
|
values[i].resize(pop.size());
|
||||||
values[i].resize(_pop.size());
|
// the metric may not be symetric, thus neither is the matrix
|
||||||
// the metric may not be symetric, thus neither is the matrix
|
for (unsigned int j=0; j<pop.size(); j++) {
|
||||||
for (unsigned int j=0; j<_pop.size(); j++)
|
if (i != j) {
|
||||||
{
|
values[i][j] = Type(
|
||||||
if (i != j)
|
metric( pop[i].objectiveVector(), pop[j].objectiveVector() ),
|
||||||
{
|
pop[i].objectiveVector().is_feasible()
|
||||||
values[i][j] = Type( metric(_pop[i].objectiveVector(), _pop[j].objectiveVector()), _pop[i].objectiveVector().is_feasible() );
|
);
|
||||||
}
|
} // if i != j
|
||||||
}
|
} // for j in pop
|
||||||
}
|
} // for i in pop
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setFitnesses(eoPop < MOEOT > & pop)
|
virtual void setFitnesses(eoPop < MOEOT > & pop)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue