00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 #include "qsolver.hh"
00024 #include "implicative.hh"
00025 
00027 
00028 
00029 
00031 
00032 int main() {
00033     for (int N = 10; N<=22;N++)  
00034     {
00035     int* scopeSize = new int[N+2];
00036     bool* qtScope = new bool[N+2];
00037     for (int i=0;i<N+2;i++) {
00038         qtScope[i] = ( i%2 != 0);
00039         scopeSize[i] = 2;
00040     }
00041     Implicative p(N+2,qtScope,scopeSize);
00042     
00043     p.QIntVar(0,1,N-1);
00044     p.QIntVar(1,0,N);
00045     post(p.space(),p.var(0) == p.var(1));
00046     IntVarArgs b(2); b[0] = p.var(0) ; b[1] = p.var(1);
00047     branch(p.space(),b,INT_VAR_SIZE_MIN,INT_VAL_MIN);
00048     p.nextScope();
00049     
00050     for (int i=1;i<N+2;i++) {
00051         p.QIntVar(2*i , 1, N-1);
00052         p.QIntVar(2*i + 1, 0, N);
00053         post(p.space(), p.var(2*i) <= 2*p.var(2*(i-1)));
00054         post(p.space(), p.var(2*i + 1) == p.var(2*i) + p.var(2*i - 1));
00055         IntVarArgs bb(2*i + 2);
00056         for (int plop = 0;plop < (2*i + 2);plop++)
00057             bb[plop] = p.var(plop);
00058         branch(p.space(),bb,INT_VAR_SIZE_MIN,INT_VAL_MIN);
00059         p.nextScope();
00060     }
00061     
00062     p.makeStructure();
00063     QSolver s(&p);
00064     
00065     unsigned long int nodes=0;
00066     
00067     Strategy outcome  = s.solve(nodes);
00068     cout << "For " << N << " matches : "<<endl;
00069     cout << "  outcome: " << ( outcome.isFalse() ? "FALSE" : "TRUE") << endl;
00070     cout << "  nodes visited: " << nodes << endl;
00071     }
00072     return 0;
00073 }