Correct the last commit of Fuzzy distance
This commit is contained in:
parent
a71a273a15
commit
286dd256de
1 changed files with 95 additions and 0 deletions
95
moeo/src/distance/moeoBertDistance.h
Normal file
95
moeo/src/distance/moeoBertDistance.h
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
/*
|
||||
<moeoBertDistance.h>
|
||||
Oumayma BAHRI
|
||||
|
||||
Author:
|
||||
Oumayma BAHRI <oumaymabahri.com>
|
||||
|
||||
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
|
||||
*/
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef MOEOBERTDISTANCE_H_
|
||||
#define MOEOBERTDISTANCE_H_
|
||||
|
||||
#include <math.h>
|
||||
#include <distance/moeoObjSpaceDistance.h>
|
||||
#include "ObjectiveVectorNormalizer.h"
|
||||
|
||||
/**
|
||||
* A class allowing to compute an Bert distance between two fuzzy solutions in the objective space
|
||||
with normalized objective values (i.e. between 0 and 1).
|
||||
* A distance value then lies between 0 and sqrt(nObjectives).
|
||||
*/
|
||||
template < class MOEOT>
|
||||
class moeoBertDistance : public moeoObjSpaceDistance < MOEOT >
|
||||
{
|
||||
public:
|
||||
|
||||
/** the objective vector type of the solutions */
|
||||
typedef typename MOEOT::ObjectiveVector ObjectiveVector;
|
||||
/** the fitness type of the solutions */
|
||||
typedef typename MOEOT::Fitness Fitness;
|
||||
|
||||
/**
|
||||
default ctr
|
||||
*/
|
||||
/* moeoBertDistance ()
|
||||
{}*/
|
||||
/**
|
||||
ctr with a normalizer
|
||||
@param _normalizer the normalizer used for every ObjectiveVector
|
||||
*/
|
||||
/**
|
||||
default ctr
|
||||
*/
|
||||
moeoBertDistance ():normalizer(defaultNormalizer)
|
||||
{}
|
||||
|
||||
|
||||
double calculateBertDistance(std::triple<double, double, double> A, std::triple<double, double, double> B)
|
||||
{
|
||||
double midA = 0.5 * (A.first + A.third);
|
||||
double midB = 0.5 * (B.first + B.third);
|
||||
double sprA = 0.5 * (A.first - A.third);
|
||||
double sprB = 0.5 * (B.first - B.third);
|
||||
|
||||
double theta = 0.5;
|
||||
|
||||
return sqrt((midA -midB) * (midA -midB) + theta * (sprA - sprB) * (sprA - sprB));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* tmp1 and tmp2 take the Expected values of Objective vectors
|
||||
* Returns the Bert distance between _obj1 and _obj2 in the objective space
|
||||
* @param _obj1 the first objective vector
|
||||
* @param _obj2 the second objective vector
|
||||
*/
|
||||
const Fitness operator()(const ObjectiveVector & _obj1, const ObjectiveVector & _obj2)
|
||||
{
|
||||
vector<double> v_BD;
|
||||
double dist=0.0;
|
||||
|
||||
for (unsigned int i=0; i<ObjectiveVector::nObjectives(); i++)
|
||||
{
|
||||
dist +=calculateBertDistance(normalizer(_obj1)[i], normalizer(_obj2)[i]);
|
||||
}
|
||||
|
||||
//dist += normalizer(v_BD);
|
||||
|
||||
return dist/ObjectiveVector::nObjectives();
|
||||
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
ObjectiveVectorNormalizer<MOEOT> Normalizer;
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif /*MOEOBERTDISTANCE_H_*/
|
||||
Loading…
Add table
Add a link
Reference in a new issue