00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef MOEOEXPBINARYINDICATORBASEDFITNESSASSIGNMENT_H_
00039 #define MOEOEXPBINARYINDICATORBASEDFITNESSASSIGNMENT_H_
00040
00041 #include <math.h>
00042 #include <vector>
00043 #include <eoPop.h>
00044 #include <fitness/moeoBinaryIndicatorBasedFitnessAssignment.h>
00045 #include <metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h>
00046 #include <utils/moeoConvertPopToObjectiveVectors.h>
00047
00053 template < class MOEOT >
00054 class moeoExpBinaryIndicatorBasedFitnessAssignment : public moeoBinaryIndicatorBasedFitnessAssignment < MOEOT >
00055 {
00056 public:
00057
00059 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00060
00061
00067 moeoExpBinaryIndicatorBasedFitnessAssignment(moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa = 0.05) : metric(_metric), kappa(_kappa)
00068 {}
00069
00070
00075 void operator()(eoPop < MOEOT > & _pop)
00076 {
00077
00078 setup(_pop);
00079
00080 computeValues(_pop);
00081
00082 setFitnesses(_pop);
00083 }
00084
00085
00091 void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
00092 {
00093 std::vector < double > v;
00094 v.resize(_pop.size());
00095 for (unsigned int i=0; i<_pop.size(); i++)
00096 {
00097 v[i] = metric(_objVec, _pop[i].objectiveVector());
00098 }
00099 for (unsigned int i=0; i<_pop.size(); i++)
00100 {
00101 _pop[i].fitness( _pop[i].fitness() + exp(-v[i]/kappa) );
00102 }
00103 }
00104
00105
00112 double updateByAdding(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
00113 {
00114 std::vector < double > v;
00115
00116 v.resize(_pop.size());
00117 for (unsigned int i=0; i<_pop.size(); i++)
00118 {
00119 v[i] = metric(_objVec, _pop[i].objectiveVector());
00120 }
00121 for (unsigned int i=0; i<_pop.size(); i++)
00122 {
00123 _pop[i].fitness( _pop[i].fitness() - exp(-v[i]/kappa) );
00124 }
00125
00126 v.clear();
00127 v.resize(_pop.size());
00128 for (unsigned int i=0; i<_pop.size(); i++)
00129 {
00130 v[i] = metric(_pop[i].objectiveVector(), _objVec);
00131 }
00132 double result = 0;
00133 for (unsigned int i=0; i<v.size(); i++)
00134 {
00135 result -= exp(-v[i]/kappa);
00136 }
00137 return result;
00138 }
00139
00140
00141 protected:
00142
00144 moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & metric;
00146 double kappa;
00148 std::vector < std::vector<double> > values;
00149
00150
00155 void setup(const eoPop < MOEOT > & _pop)
00156 {
00157 double min, max;
00158 for (unsigned int i=0; i<ObjectiveVector::Traits::nObjectives(); i++)
00159 {
00160 min = _pop[0].objectiveVector()[i];
00161 max = _pop[0].objectiveVector()[i];
00162 for (unsigned int j=1; j<_pop.size(); j++)
00163 {
00164 min = std::min(min, _pop[j].objectiveVector()[i]);
00165 max = std::max(max, _pop[j].objectiveVector()[i]);
00166 }
00167
00168 metric.setup(min, max, i);
00169 }
00170 }
00171
00172
00177 void computeValues(const eoPop < MOEOT > & _pop)
00178 {
00179 values.clear();
00180 values.resize(_pop.size());
00181 for (unsigned int i=0; i<_pop.size(); i++)
00182 {
00183 values[i].resize(_pop.size());
00184 for (unsigned int j=0; j<_pop.size(); j++)
00185 {
00186 if (i != j)
00187 {
00188 values[i][j] = metric(_pop[i].objectiveVector(), _pop[j].objectiveVector());
00189 }
00190 }
00191 }
00192 }
00193
00194
00199 void setFitnesses(eoPop < MOEOT > & _pop)
00200 {
00201 for (unsigned int i=0; i<_pop.size(); i++)
00202 {
00203 _pop[i].fitness(computeFitness(i));
00204 }
00205 }
00206
00207
00212 double computeFitness(const unsigned int _idx)
00213 {
00214 double result = 0;
00215 for (unsigned int i=0; i<values.size(); i++)
00216 {
00217 if (i != _idx)
00218 {
00219 result -= exp(-values[i][_idx]/kappa);
00220 }
00221 }
00222 return result;
00223 }
00224
00225 };
00226
00227 #endif