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 }