00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef MOEOCONTRIBUTIONMETRIC_H_
00014 #define MOEOCONTRIBUTIONMETRIC_H_
00015
00016 #include <metric/moeoMetric.h>
00017
00022 template < class ObjectiveVector >
00023 class moeoContributionMetric : public moeoVectorVsVectorBinaryMetric < ObjectiveVector, double >
00024 {
00025 public:
00026
00032 double operator()(const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
00033 unsigned c = card_C(_set1, _set2);
00034 unsigned w1 = card_W(_set1, _set2);
00035 unsigned n1 = card_N(_set1, _set2);
00036 unsigned w2 = card_W(_set2, _set1);
00037 unsigned n2 = card_N(_set2, _set1);
00038 return (double) (c / 2.0 + w1 + n1) / (c + w1 + n1 + w2 + n2);
00039 }
00040
00041
00042 private:
00043
00049 unsigned card_C (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
00050 unsigned c=0;
00051 for (unsigned i=0; i<_set1.size(); i++)
00052 for (unsigned j=0; j<_set2.size(); j++)
00053 if (_set1[i] == _set2[j]) {
00054 c++;
00055 break;
00056 }
00057 return c;
00058 }
00059
00065 unsigned card_W (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
00066 unsigned w=0;
00067 for (unsigned i=0; i<_set1.size(); i++)
00068 for (unsigned j=0; j<_set2.size(); j++)
00069 if (_set1[i].dominates(_set2[j])) {
00070 w++;
00071 break;
00072 }
00073 return w;
00074 }
00075
00081 unsigned card_N (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
00082 unsigned n=0;
00083 for (unsigned i=0; i<_set1.size(); i++) {
00084 bool domin_rel = false;
00085 for (unsigned j=0; j<_set2.size(); j++)
00086 if (_set1[i].dominates(_set2[j]) || _set2[j].dominates(_set1 [i])) {
00087 domin_rel = true;
00088 break;
00089 }
00090 if (! domin_rel)
00091 n++;
00092 }
00093 return n;
00094 }
00095
00096 };
00097
00098 #endif