Generated on Wed Nov 1 15:04:27 2006 for Gecode by doxygen 1.4.5

bibd.cc

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Christian Schulte <schulte@gecode.org>
00004  *
00005  *  Copyright:
00006  *     Christian Schulte, 2004
00007  *
00008  *  Bugfixes provided by:
00009  *     Olof Sivertsson <olsi0767@student.uu.se>
00010  *
00011  *  Last modified:
00012  *     $Date: 2006-08-31 17:36:38 +0200 (Thu, 31 Aug 2006) $ by $Author: schulte $
00013  *     $Revision: 3579 $
00014  *
00015  *  This file is part of Gecode, the generic constraint
00016  *  development environment:
00017  *     http://www.gecode.org
00018  *
00019  *  See the file "LICENSE" for information on usage and
00020  *  redistribution of this file, and for a
00021  *     DISCLAIMER OF ALL WARRANTIES.
00022  *
00023  */
00024 
00025 #include "examples/support.hh"
00026 
00035 class BIBD : public Example {
00036 protected:
00038   BoolVarArray _p;
00039 public:
00041   class Par {
00042   public:
00043     int v, k, lambda, b, r;
00044     Par(int v0, int k0, int l0)
00045       : v(v0), k(k0), lambda(l0),
00046         b((v*(v-1)*lambda)/(k*(k-1))),
00047         r((lambda*(v-1)) / (k-1)) {}
00048     Par(void) {}
00049   };
00050   static Par par;
00051 
00053   BoolVar& p(int i, int j) {
00054     // row, column
00055     return _p[i*par.b+j];
00056   }
00057 
00059   BIBD(const Options& opt)
00060     : _p(this,par.v*par.b,0,1) {
00061     // r ones per row
00062     for (int i=par.v; i--; ) {
00063       BoolVarArgs row(par.b);
00064       for (int j=par.b; j--; )
00065         row[j] = p(i,j);
00066       linear(this, row, IRT_EQ, par.r);
00067     }
00068     // k ones per column
00069     for (int j=par.b; j--; ) {
00070       BoolVarArgs col(par.v);
00071       for (int i=par.v; i--; )
00072         col[i] = p(i,j);
00073       linear(this, col, IRT_EQ, par.k);
00074     }
00075     // Exactly lambda ones in scalar product between two different rows
00076     for (int i1=0; i1<par.v; i1++)
00077       for (int i2=i1+1; i2<par.v; i2++) {
00078         BoolVarArgs row(par.b);
00079         for (int j=par.b; j--; ) {
00080           BoolVar b(this,0,1);
00081           bool_and(this,p(i1,j),p(i2,j),b);
00082           row[j] = b;
00083         }
00084         linear(this, row, IRT_EQ, par.lambda);
00085       }
00086 
00087     for (int i=1;i<par.v;i++) {
00088       BoolVarArgs row1(par.b);
00089       BoolVarArgs row2(par.b);
00090       for (int j=par.b; j--; ) {
00091         row1[j] = p(i-1,j);
00092         row2[j] = p(i,j);
00093       }
00094       rel(this, row1, IRT_GQ, row2);
00095     }
00096     for (int j=1;j<par.b;j++) {
00097       BoolVarArgs col1(par.v);
00098       BoolVarArgs col2(par.v);
00099       for (int i=par.v; i--; ) {
00100         col1[i] = p(i,j-1);
00101         col2[i] = p(i,j);
00102       }
00103       rel(this, col1, IRT_GQ, col2);
00104     }
00105 
00106     branch(this, _p, BVAR_NONE,
00107            (opt.naive ? BVAL_MIN : BVAL_MAX));
00108   }
00109 
00111   virtual void
00112   print(void) {
00113     std::cout << "\tBIBD("
00114               << par.v << "," << par.k << ","
00115               << par.lambda << ")" << std::endl;
00116     for (int i = 0; i < par.v; i++) {
00117       std::cout << "\t\t";
00118       for (int j = 0; j< par.b; j++)
00119         std::cout << p(i,j) << " ";
00120       std::cout << std::endl;
00121     }
00122     std::cout << std::endl;
00123   }
00124 
00126   BIBD(bool share, BIBD& s)
00127     : Example(share,s) {
00128     _p.update(this,share,s._p);
00129   }
00130 
00132   virtual Space*
00133   copy(bool share) {
00134     return new BIBD(share,*this);
00135   }
00136 
00137 };
00138 
00139 
00140 BIBD::Par BIBD::par;
00141 
00145 int
00146 main(int argc, char** argv) {
00147   Options opt("BIBD");
00148   opt.solutions = 1;
00149   opt.size      = 9;
00150   opt.naive     = true;
00151   opt.parse(argc,argv);
00152   switch (opt.size) {
00153   case 0: { BIBD::Par p(7,3,1);  BIBD::par = p; break; }
00154   case 1: { BIBD::Par p(6,3,2);  BIBD::par = p; break; }
00155   case 2: { BIBD::Par p(8,4,3);  BIBD::par = p; break; }
00156   case 3: { BIBD::Par p(7,3,20); BIBD::par = p; break; }
00157   case 4: { BIBD::Par p(7,3,30); BIBD::par = p; break; }
00158   case 5: { BIBD::Par p(7,3,40); BIBD::par = p; break; }
00159   case 6: { BIBD::Par p(7,3,45); BIBD::par = p; break; }
00160   case 7: { BIBD::Par p(7,3,50); BIBD::par = p; break; }
00161   case 8: { BIBD::Par p(7,3,55); BIBD::par = p; break; }
00162   case 9: { BIBD::Par p(7,3,60); BIBD::par = p; break; }
00163   default:
00164     std::cerr << "Error: size must be between 0 and 9" << std::endl;
00165     return 1;
00166   }
00167 
00168   Example::run<BIBD,DFS>(opt);
00169   return 0;
00170 }
00171 
00172 // STATISTICS: example-any
00173