00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "qsolver.hh"
00025 #include "implicative.hh"
00026
00027
00028 QSolver::QSolver(QSpace* qs, ScoreAttribuer* ev, valueHeuristic* ve) {
00029 debug=false;
00030 eval=ev;
00031 valEval = ve;
00032 sp=qs;
00033 n=sp->nv();
00034 bh=new BranchingHeuristic(sp,eval);
00035 sp->indicateBranchingHeuristic(bh);
00036 nbRanges = new int;
00037 }
00038
00039
00040 bool QSolver::solve(unsigned long int& nodes, unsigned long int& propsteps) {
00041 int ret = sp->status(0,propsteps);
00042 return rSolve(sp,nodes,propsteps,0);
00043 }
00044
00045
00046 bool QSolver::rSolve(QSpace* qs, unsigned long int& nodes, unsigned long int& propsteps, int curvar) {
00047 unsigned int rien=0;
00048 nodes++;
00049
00050
00051
00052
00053
00054 int branchon = bh->nextVar(qs);
00056
00057
00058
00059 if (branchon == n) {
00060 int ret=qs->status(curvar,propsteps);
00061 int fret=qs->finalStatus(propsteps);
00062
00063 #ifdef QDEBUG
00064 cout<<"Solver : finalstatus appelé, résultat = "<<fret<<endl;
00065 qs->print();
00066 #endif
00067 qs->backtrack();
00068 bh->backtrack(qs);
00069 #ifdef QDEBUG
00070 cout<<"Solver : backtracking"<<endl;
00071 #endif
00072 return (fret==1)?true:false;
00073 }
00075
00076
00077
00078 int ret = qs->status(curvar,propsteps);
00079 #ifdef QDEBUG
00080 cout<<"Solver : status appelé, résultat = "<<ret<<endl;
00081 qs->print();
00082 #endif
00083 if (ret==1) {
00084 qs->backtrack();
00085 bh->backtrack(qs);
00086 #ifdef QDEBUG
00087 cout<<"Solver : backtracking"<<endl;
00088 #endif
00089 return true;
00090 }
00091
00092 if (ret==0) {
00093 qs->backtrack();
00094 bh->backtrack(qs);
00095 #ifdef QDEBUG
00096 cout<<"Solver : backtracking"<<endl;
00097 #endif
00098 return false;
00099 }
00101
00102
00103
00104 int** tab = valEval->subSet(static_cast<Implicative*>(qs),branchon,nbRanges);
00105 QSpace* subspace;
00106 subspace=qs->clone();
00107 subspace->assign(branchon,tab,*nbRanges);
00108 #ifdef QDEBUG
00109 cout<<"Solver : first branch : v"<<branchon<<" = "<<the_set<<endl;
00110 #endif
00111 if ( rSolve(subspace,nodes, propsteps,branchon) ^ qs->quantification(branchon)) {
00112 delete subspace;
00113 qs->backtrack();
00114 bh->backtrack(qs);
00115 #ifdef QDEBUG
00116 cout<<"Solver : Backtrack"<<endl;
00117 #endif
00118 delete [] tab[0];
00119 delete [] tab[1];
00120 delete [] tab;
00121 return (!qs->quantification(branchon));
00122 }
00123 delete subspace;
00124 subspace=qs->clone();
00125 subspace->remove(branchon,tab,*nbRanges);
00126 #ifdef QDEBUG
00127 cout<<"Solver : second branch : v"<<branchon<<" != "<<the_set<<endl;
00128 #endif
00129 if ( rSolve(subspace,nodes, propsteps, branchon) ^ qs->quantification(branchon)) {
00130 delete subspace;
00131 qs->backtrack();
00132 bh->backtrack(qs);
00133 #ifdef QDEBUG
00134 cout<<"Solver : Backtrack"<<endl;
00135 #endif
00136 delete [] tab[0];
00137 delete [] tab[1];
00138 delete [] tab;
00139 return (!qs->quantification(branchon));
00140 }
00141 delete subspace;
00142 qs->backtrack();
00143 bh->backtrack(qs);
00144 #ifdef QDEBUG
00145 cout<<"Solver : Backtrack"<<endl;
00146 #endif
00147 delete [] tab[0];
00148 delete [] tab[1];
00149 delete [] tab;
00150 return (qs->quantification(branchon));
00152 }
00153