Hi, Thanks for the bit of code, it worked perfectly fine ! It helped me found my newbie mistake. I was checking if I found any solution by doing :
if (solutions.next() ==NULL){ os<<"No solutions"<<endl; return false; } while(RMModel *solution = solutions.next()) { solution->print(os); delete solution;} In restrospect that was a very stupid way of doing it. So my code did in fact find the right solutions, it just skipped the first one, while checking if it found a solution in the first place. Another question loosely related to my initial problem of not finding all solutions : is it usual for the BAB search engine to not give the same number of solutions (I have one less) than the DFS. I modified your file to reproduce this"problem", and attached it to this mail. Maybe this is how it is supposed to work. Thanks again for your help, Baptiste
#include <gecode/driver.hh> #include <gecode/int.hh> #include <gecode/minimodel.hh> using namespace Gecode; class CumulativesTest : public MaximizeSpace { public: IntVarArray x; IntVar CostValue; CumulativesTest() : x(*this,6,0,10),CostValue(*this,1,1) { IntVarArgs start(3); IntVarArgs end(3); IntVarArgs CostCoefficient(3); IntArgs m(3); IntArgs p(3); IntArgs u(3); IntArgs c(1); c[0] = 0; int machine[3] = {0,0,0}; int duration[3] = {5,5,10}; int capacity[3] = {-3,-9,10}; int earlyStart[3] = {0,0,0}; int lateStart[3] = {10,10,0}; for(int i = 0;i<3;i++){ m[i] = machine[i]; p[i] = duration[i]; u[i] = capacity[i]; start[i] = x[i]; end[i] = x[i+3]; rel(*this,start[i]<=lateStart[i]); rel(*this,start[i]>=earlyStart[i]); rel(*this, start[i]+p[i]==end[i]); // The cost of source is 0 CostCoefficient[i] = expr(*this, (start[i]+1)*capacity[i]*(earlyStart!=lateStart) ); } cumulatives(*this, m,start,p,end,u,c,false); //Compute cost of the problem CostValue = expr(*this,sum(CostCoefficient)); branch(*this, end, INT_VAR_MAX_MAX, INT_VAL_MAX); branch(*this, start, INT_VAR_MIN_MIN, INT_VAL_MIN); } CumulativesTest(bool share, CumulativesTest& s) : MaximizeSpace(share,s) { x.update(*this, share, s.x); } virtual Space* copy(bool share) { return new CumulativesTest(share,*this); } IntVar cost(void) const { return CostValue;} /// Print solution virtual void print(std::ostream& os) const { os << x <<std::endl; } }; int main(int argc, char* argv[]) { CumulativesTest* DFSmodel = new CumulativesTest; std::cout<<"DFS"<<std::endl; DFS<CumulativesTest> DFSsolutions(DFSmodel); while(CumulativesTest *DFSsolution = DFSsolutions.next()) { DFSsolution->print(std::cout); delete DFSsolution; } delete DFSmodel; std::cout<<"BAB"<<std::endl; CumulativesTest* BABmodel = new CumulativesTest; BAB<CumulativesTest> BABsolutions(BABmodel); while(CumulativesTest *BABsolution = BABsolutions.next()) { BABsolution->print(std::cout); delete BABsolution; } delete BABmodel; return 0; }
_______________________________________________ Gecode users mailing list users@gecode.org https://www.gecode.org/mailman/listinfo/gecode-users