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 MOEOACHIEVEMENTFITNESSASSIGNMENT_H_
00039 #define MOEOACHIEVEMENTFITNESSASSIGNMENT_H_
00040
00041 #include <vector>
00042 #include <eoPop.h>
00043 #include <fitness/moeoScalarFitnessAssignment.h>
00044
00048 template < class MOEOT >
00049 class moeoAchievementFitnessAssignment : public moeoScalarFitnessAssignment < MOEOT >
00050 {
00051 public:
00052
00054 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00055
00056
00063 moeoAchievementFitnessAssignment(ObjectiveVector & _reference, std::vector < double > & _lambdas, double _spn=0.0001) : reference(_reference), lambdas(_lambdas), spn(_spn)
00064 {
00065
00066 if ((spn < 0.0) || (spn > 1.0))
00067 {
00068 std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n";
00069 spn = 0.0001;
00070 }
00071 }
00072
00073
00079 moeoAchievementFitnessAssignment(ObjectiveVector & _reference, double _spn=0.0001) : reference(_reference), spn(_spn)
00080 {
00081
00082 lambdas = std::vector < double > (ObjectiveVector::nObjectives());
00083 for (unsigned int i=0 ; i<lambdas.size(); i++)
00084 {
00085 lambdas[i] = 1.0 / ObjectiveVector::nObjectives();
00086 }
00087
00088 if ((spn < 0.0) || (spn > 1.0))
00089 {
00090 std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n";
00091 spn = 0.0001;
00092 }
00093 }
00094
00095
00100 virtual void operator()(eoPop < MOEOT > & _pop)
00101 {
00102 for (unsigned int i=0; i<_pop.size() ; i++)
00103 {
00104 compute(_pop[i]);
00105 }
00106 }
00107
00108
00114 void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
00115 {
00116
00117 }
00118
00119
00124 void setReference(const ObjectiveVector & _reference)
00125 {
00126 reference = _reference;
00127 }
00128
00129
00130 private:
00131
00133 ObjectiveVector reference;
00135 std::vector < double > lambdas;
00137 double spn;
00138
00139
00143 double inf() const
00144 {
00145 return std::numeric_limits<double>::max();
00146 }
00147
00148
00153 void compute(MOEOT & _moeo)
00154 {
00155 unsigned int nobj = MOEOT::ObjectiveVector::nObjectives();
00156 double temp;
00157 double min = inf();
00158 double sum = 0;
00159 for (unsigned int obj=0; obj<nobj; obj++)
00160 {
00161 temp = lambdas[obj] * (reference[obj] - _moeo.objectiveVector()[obj]);
00162 min = std::min(min, temp);
00163 sum += temp;
00164 }
00165 _moeo.fitness(min + spn*sum);
00166 }
00167
00168 };
00169
00170 #endif