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 MOEOCONTRIBUTIONMETRIC_H_
00039 #define MOEOCONTRIBUTIONMETRIC_H_
00040
00041 #include <comparator/moeoParetoObjectiveVectorComparator.h>
00042 #include <metric/moeoMetric.h>
00043
00048 template < class ObjectiveVector >
00049 class moeoContributionMetric : public moeoVectorVsVectorBinaryMetric < ObjectiveVector, double >
00050 {
00051 public:
00052
00058 double operator()(const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
00059 unsigned int c = card_C(_set1, _set2);
00060 unsigned int w1 = card_W(_set1, _set2);
00061 unsigned int n1 = card_N(_set1, _set2);
00062 unsigned int w2 = card_W(_set2, _set1);
00063 unsigned int n2 = card_N(_set2, _set1);
00064 return (double) (c / 2.0 + w1 + n1) / (c + w1 + n1 + w2 + n2);
00065 }
00066
00067
00068 private:
00069
00071 moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
00072
00073
00079 unsigned int card_C (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
00080 unsigned int c=0;
00081 for (unsigned int i=0; i<_set1.size(); i++)
00082 for (unsigned int j=0; j<_set2.size(); j++)
00083 if (_set1[i] == _set2[j]) {
00084 c++;
00085 break;
00086 }
00087 return c;
00088 }
00089
00090
00096 unsigned int card_W (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
00097 unsigned int w=0;
00098 for (unsigned int i=0; i<_set1.size(); i++)
00099 for (unsigned int j=0; j<_set2.size(); j++)
00100 if (paretoComparator(_set2[j], _set1[i]))
00101 {
00102 w++;
00103 break;
00104 }
00105 return w;
00106 }
00107
00108
00114 unsigned int card_N (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
00115 unsigned int n=0;
00116 for (unsigned int i=0; i<_set1.size(); i++) {
00117 bool domin_rel = false;
00118 for (unsigned int j=0; j<_set2.size(); j++)
00119 if ( (paretoComparator(_set2[j], _set1[i])) || (paretoComparator(_set1[i], _set2[j])) )
00120 {
00121 domin_rel = true;
00122 break;
00123 }
00124 if (! domin_rel)
00125 n++;
00126 }
00127 return n;
00128 }
00129
00130 };
00131
00132 #endif