[gecode-users] Multiple separate searches

Guido Tack tack at gecode.org
Mon Apr 23 03:45:38 CEST 2012


-- 
Guido Tack
http://www.csse.monash.edu/~guidot/



On 20/04/2012, at 10:16 PM, Milton Friedman wrote:
> The function code is:
> 
> void DoOneDFS(int argc, char* argv[],const char* ModelName){
>        SizeOptions optModel(ModelName);          
>        optModel.iterations(1);           
>        optModel.size(3);           
>        optModel.parse(argc,argv);      
>        ModelB* s = new ModelB(optModel);
>        //call once
>        DFS<ModelB> e(s);
>        bool wasBranch = SS_BRANCH==s->status();
>        bool wasSolved = SS_SOLVED==s->status();
>        bool wasFailed = SS_FAILED==s->status();
>        //loop while wasBranch and not null, wasSolved or wasFailed
>        while (wasBranch && s) {        
>                cout<<"Branch"<<endl;
>                s->myprint();
>                delete s;       //in while loop...deletes space we branched from
>                //calls Gecode...then done with this next space
>                Packing2DRectTopology* s = e.next();    
>                wasBranch = SS_BRANCH==s->status();
>                wasSolved = SS_SOLVED==s->status();
>                wasFailed = SS_FAILED==s->status();
>        }              
>        if (wasSolved){                 //record it
>                cout<<"Solved"<<endl;
>                s->myprint();
>                s->mydebugprint();
>                system("PAUSE");
>        }
>        else if (wasFailed){            //ignore it
>                //system("PAUSE");
>        }
>        else {                          //unexpected   
>                cout<<"Shouldn't arrive here. status: "<<s->status()<<endl;
>                system("PAUSE");
>        }
>        //delete s;     //<<<---Works if commented out; fails otherwise...why?
> }
> 

When you construct DFS from a space, DFS takes ownership of that space, unless you give it a search options argument where you set clone to false (see the reference documentation for the DFS class).  So here it depends on whether s is still the initial space (in which case you mustn't delete it) or a space returned from e.next (in which case you must delete it).

But that's not the main problem with the code above: a space returned from e.next() is always NULL or SS_SOLVED.

What you probably want to do is to implement your own Brancher that runs a DFS internally.  There is code that does more or less that in gecode/flatzinc/flatzinc.cpp in the current svn trunk, it's called "AuxVarBrancher".  Perhaps that can help you to get started.

Cheers,
Guido


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.gecode.org/pipermail/users/attachments/20120423/e68c607a/attachment.htm>


More information about the users mailing list