golomb-ruler.cpp
Go to the documentation of this file.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 #include <gecode/driver.hh>
00039 #include <gecode/int.hh>
00040 #include <gecode/minimodel.hh>
00041
00042 #include <iomanip>
00043
00044 using namespace Gecode;
00045
00066 class GolombRuler : public MinimizeScript {
00067 protected:
00069 IntVarArray m;
00070 public:
00072 enum {
00073 SEARCH_BAB,
00074 SEARCH_RESTART
00075 };
00077 GolombRuler(const SizeOptions& opt)
00078 : m(*this,opt.size(),0,
00079 (opt.size() < 31) ? (1 << (opt.size()-1))-1 : Int::Limits::max) {
00080
00081
00082 rel(*this, m[0], IRT_EQ, 0);
00083
00084
00085 rel(*this, m, IRT_LE);
00086
00087
00088 const int n = m.size();
00089 const int n_d = (n*n-n)/2;
00090
00091
00092 IntVarArgs d(n_d);
00093
00094
00095 for (int k=0, i=0; i<n-1; i++)
00096 for (int j=i+1; j<n; j++, k++)
00097
00098 rel(*this, d[k] = expr(*this, m[j]-m[i]),
00099 IRT_GQ, (j-i)*(j-i+1)/2);
00100
00101 distinct(*this, d, opt.icl());
00102
00103
00104 if (n > 2)
00105 rel(*this, d[0], IRT_LE, d[n_d-1]);
00106
00107 branch(*this, m, INT_VAR_NONE, INT_VAL_MIN);
00108 }
00109
00111 virtual IntVar cost(void) const {
00112 return m[m.size()-1];
00113 }
00114
00116 virtual void
00117 print(std::ostream& os) const {
00118 os << "\tm[" << m.size() << "] = " << m << std::endl;
00119 }
00120
00122 GolombRuler(bool share, GolombRuler& s)
00123 : MinimizeScript(share,s) {
00124 m.update(*this, share, s.m);
00125 }
00127 virtual Space*
00128 copy(bool share) {
00129 return new GolombRuler(share,*this);
00130 }
00131 };
00132
00136 int
00137 main(int argc, char* argv[]) {
00138 SizeOptions opt("GolombRuler");
00139 opt.solutions(0);
00140 opt.size(10);
00141 opt.icl(ICL_BND);
00142 opt.search(GolombRuler::SEARCH_BAB);
00143 opt.search(GolombRuler::SEARCH_BAB, "bab");
00144 opt.search(GolombRuler::SEARCH_RESTART, "restart");
00145 opt.parse(argc,argv);
00146 if (opt.size() > 0)
00147 switch (opt.search()) {
00148 case GolombRuler::SEARCH_BAB:
00149 MinimizeScript::run<GolombRuler,BAB,SizeOptions>(opt); break;
00150 case GolombRuler::SEARCH_RESTART:
00151 MinimizeScript::run<GolombRuler,Restart,SizeOptions>(opt); break;
00152 }
00153 return 0;
00154 }
00155
00156
00157