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 #ifndef _CSP_HEURISTICS_VARIABLE_DomainWeightedDegreeRatio_H
00026 #define _CSP_HEURISTICS_VARIABLE_DomainWeightedDegreeRatio_H
00027
00028
00029 #include "../../caches/DomainWeightedDegreeRatios.h"
00030
00031
00032 CSP_NAMESPACE_BEGIN(csp);
00033 CSP_NAMESPACE_BEGIN(heuristics);
00034 CSP_NAMESPACE_BEGIN(variables);
00035
00036
00037 class DomainWeightedDegreeRatioLT :
00038 public StrictWeakVariableOrdering
00039 {
00040 public:
00041 DomainWeightedDegreeRatioLT(caches::DomainWeightedDegreeRatios& ratios) :
00042 m_ratios(ratios) {}
00043
00044 bool operator()(const Variable* variable0, const Variable* variable1)
00045 {
00046 return
00047 m_ratios.domainWeightedDegreeRatio(*variable0) <
00048 m_ratios.domainWeightedDegreeRatio(*variable1);
00049 }
00050
00051 private:
00052 caches::DomainWeightedDegreeRatios& m_ratios;
00053 };
00054
00055
00056 class DomainWeightedDegreeRatioGT :
00057 public StrictWeakVariableOrdering
00058 {
00059 public:
00060 DomainWeightedDegreeRatioGT(caches::DomainWeightedDegreeRatios& ratios) :
00061 m_ratios(ratios) {}
00062
00063 bool operator()(const Variable* variable0, const Variable* variable1)
00064 {
00065 return
00066 m_ratios.domainWeightedDegreeRatio(*variable0) >
00067 m_ratios.domainWeightedDegreeRatio(*variable1);
00068 }
00069
00070 private:
00071 caches::DomainWeightedDegreeRatios& m_ratios;
00072 };
00073
00074
00075 class DomainWeightedDegreeRatioEQ :
00076 public StrictWeakVariableOrdering
00077 {
00078 public:
00079 DomainWeightedDegreeRatioEQ(caches::DomainWeightedDegreeRatios& ratios) :
00080 m_ratios(ratios),
00081 m_previousVariable0(0),
00082 m_previousVariable1(0),
00083 m_previousRatio0(0),
00084 m_previousRatio1(0) {}
00085
00086 bool operator()(const Variable* variable0, const Variable* variable1);
00087
00088 void reset()
00089 {
00090 m_previousVariable0 = 0;
00091 m_previousVariable1 = 0;
00092 m_previousRatio0 = 0;
00093 m_previousRatio1 = 0;
00094 }
00095
00096 private:
00097 caches::DomainWeightedDegreeRatios& m_ratios;
00098
00099 const Variable* m_previousVariable0;
00100 const Variable* m_previousVariable1;
00101
00102 double m_previousRatio0;
00103 double m_previousRatio1;
00104 };
00105
00106
00111 class CSP_API DomainWeightedDegreeRatio :
00112 public VariableOH
00113 {
00114 public:
00115 enum Preference
00116 {
00118 Minimum,
00119
00121 Maximum
00122 };
00123
00133 DomainWeightedDegreeRatio(
00134 Decomposition& decomposition,
00135 const vector<pair<double, double> >& intervals,
00136 double quality = 1,
00137 Preference preference = Minimum);
00138
00146 virtual void select(vlist_type& selectable, vlist_type& selected);
00147
00148 private:
00150 DomainWeightedDegreeRatio(const DomainWeightedDegreeRatio&);
00151
00153 DomainWeightedDegreeRatio& operator=(const DomainWeightedDegreeRatio&);
00154
00156 Preference m_preference;
00157
00159 caches::DomainWeightedDegreeRatios m_values;
00160
00165 DomainWeightedDegreeRatioLT m_compareLT;
00166
00171 DomainWeightedDegreeRatioGT m_compareGT;
00172
00177 DomainWeightedDegreeRatioEQ m_compareEQ;
00178 };
00179
00180
00181 CSP_NAMESPACE_END(variables);
00182 CSP_NAMESPACE_END(heuristics);
00183 CSP_NAMESPACE_END(csp);
00184
00185
00186 #endif // _CSP_HEURISTICS_VARIABLE_DomainWeightedDegreeRatio_H
00187
00188
00189
00190