00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "examples/support.hh"
00023 #include "gecode/minimodel.hh"
00024
00037 class Golomb : public Example {
00038 protected:
00040 const int n;
00042 IntVarArray m;
00043 public:
00045 int
00046 diag(int i, int j) {
00047 return (i*(2*n-i-1)) / 2 + j - i - 1;
00048 }
00049
00051 Golomb(const Options& opt)
00052 : n(opt.size), m(this,n,0,n*n) {
00053 const int dn = (n*n-n)/2;
00054
00055 IntVarArgs d(dn);
00056
00057
00058 rel(this, m[0], IRT_EQ, 0);
00059
00060
00061 for (int j=1; j<n; j++)
00062 d[diag(0,j)] = m[j];
00063 for (int i=1; i<n-1; i++)
00064 for (int j=i+1; j<n; j++)
00065 d[diag(i,j)] = minus(this, m[j], m[i]);
00066
00067
00068 for (int i=1; i<n; i++)
00069 rel(this, m[i-1], IRT_LE, m[i]);
00070
00071 if (opt.naive) {
00072
00073 for (int i=0; i<n; i++)
00074 for (int j=i+1; j<n; j++)
00075 rel(this, d[diag(i,j)], IRT_GQ, (j-i)*(j-i+1)/2);
00076 } else {
00077 static const int length[] = {
00078
00079 0,0,1,3,6,11,17,25,34,44,
00080
00081 55,72,85,106,127};
00082
00083
00084 for (int i=0; i<n; i++)
00085 for (int j=i+1; j<n; j++)
00086 rel(this, d[diag(i,j)], IRT_GQ, length[j-i+1]);
00087 }
00088 distinct(this, d, opt.icl);
00089
00090 if (n > 2)
00091 rel(this, d[diag(0,1)], IRT_LE, d[diag(n-2,n-1)]);
00092
00093 branch(this, m, BVAR_NONE, BVAL_MIN);
00094 }
00095
00097 void
00098 constrain(Space* s) {
00099 rel(this, m[n-1], IRT_LE, static_cast<Golomb*>(s)->m[n-1].val());
00100 }
00101
00103 virtual void
00104 print(void) {
00105 std::cout << "\tm[" << n << "] = {";
00106 for (int i = 0; i < n; i++)
00107 std::cout << m[i] << ((i<n-1)?",":"};\n");
00108 }
00109
00110
00112 Golomb(bool share, Golomb& s)
00113 : Example(share,s), n(s.n) {
00114 m.update(this, share, s.m);
00115 }
00117 virtual Space*
00118 copy(bool share) {
00119 return new Golomb(share,*this);
00120 }
00121
00122 };
00123
00127 int
00128 main(int argc, char** argv) {
00129 Options o("Golomb");
00130 o.solutions = 0;
00131 o.size = 10;
00132 o.icl = ICL_BND;
00133 o.naive = true;
00134 o.parse(argc,argv);
00135 if (o.size > 0)
00136 Example::run<Golomb,BAB>(o);
00137 return 0;
00138 }
00139
00140
00141