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 #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
00055 return _p[i*par.b+j];
00056 }
00057
00059 BIBD(const Options& opt)
00060 : _p(this,par.v*par.b,0,1) {
00061
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
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
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
00173