[gecode-users] Adding restart-based search to ECLiPSe's interface to Gecode

Christian Schulte cschulte at kth.se
Wed Aug 21 10:53:35 CEST 2013


Yes, that can be done.  There is even a virtual base class for it (so a type
for all engines). It is Gecode::Search::Engine.

Cheers
Christian

--
Christian Schulte, Professor of Computer Science, KTH,
www.ict.kth.se/~cschulte/


-----Original Message-----
From: Kish Shen [mailto:kisshen at cisco.com] 
Sent: Wednesday, August 21, 2013 6:53 AM
To: cschulte at kth.se
Cc: users at gecode.org
Subject: Re: [gecode-users] Adding restart-based search to ECLiPSe's
interface to Gecode

Hi Christian,

Thanks for your reply!

On 20/08/2013 20:51, Christian Schulte wrote:
> Hi Kish,
>
> Sorry for the delay, I was on holidays and I am still catching up.
>
> You are basically on your own. The stuff in the Search namespace is 
> not documented in MPG for a reason ;-)

I don't mind changing the existing code more extensively, but I think I
probably would need to have a pointer to a 'search engine' thingy (currently
I have a class -- GecodeSearch for this, sengine is not visible outside the
class), which I can set to the appropriate search or
meta- search engine, and for which I can call a next() function to get the
next solution. Can this be done?


> Having said that, the stuff you are doing might work and I have an 
> idea where the problem is: the meta engine deletes the engine that you 
> pass to it (so sengine0 in your example). That means you are not 
> allowed to delete it yourself in your code. But as said, just an idea.

I actually do not delete sengine0 already, i.e. in ~GecodeSearch, I only
delete sengine. This was because deleting segine0 crashed.

Cheers,

Kish

> Cheers
> Christian
>
> --
> Christian Schulte, www.ict.kth.se/~cschulte/
>
>> -----Original Message-----
>> From: users-bounces at gecode.org [mailto:users-bounces at gecode.org] On 
>> Behalf Of Kish Shen
>> Sent: Friday, August 16, 2013 10:17 PM
>> To: users at gecode.org
>> Subject: [gecode-users] Adding restart-based search to ECLiPSe's 
>> interface
> to
>> Gecode
>>
>> Hi,
>>
>> I am still trying to figure out how to add restart based search to
> ECLiPSe's
>> interface to Gecode. I tried modifying my existing code (which does 
>> not
> support
>> restart-based search), and managed to get a restarted based bab 
>> search to return the optimal answer, but the code then crashes, 
>> probably because I
> am
>> not doing things correctly.
>>
>> If someone can point me in the right direction, I would be very grateful.
> I sent a
>> message about this about 2 weeks ago to this mailing list, but 
>> perhaps I
> did not
>> give the correct information to get any help, so I will try again.
>>
>> An outline of what I am doing now:
>>
>> The user defines the problem to be solved in ECLiPSe, and the 
>> interface
> maps
>> this to Gecode. At the Gecode level, the problem is represented in
> GecodeSpace,
>> which is derived from Gecode::MinimizeSpace
>>
>> Searching can be done with a Gecode search engine, or it can be done 
>> at
> the
>> ECLiPSe level (in which case search engines are not used).
>>
>> To do the search with a search engine, I have a GecodeSearch class, 
>> which
> has a
>> Search::Engine* sengine, which is then dynamically assigned with the
> problem
>> and search engine type when the user specify that a search is to be 
>> done
> by
>> Gecode with a particular search method (like bab), e.g.
>>
>> solver->vCost = <Cost variable>
>> sengine = Search::bab(solver, option)
>>
>> where solver is a GecodeSpace*, and vCost is the cost variable (for 
>> MinimizeSpace).
>>
>> The MPG describes the search engine classes such as BAB, which I 
>> don't use directly. I think the reason is that I want to be able to 
>> assign different
> types of
>> search engines to sengine, as the search type is only known at 
>> run-time,
> and in
>> fact the user can call search as often as they like on the same problem.
>>
>> My problem is that I cannot extend this current scheme to work with
> restart-
>> based search. What I tried was to use Search::rbs, which is also of 
>> class
> Engine*,
>> and so can be assigned to sengine, but this crashed after returning 
>> the
> solution:
>>
>> sengine0 = Search::bab(solver, option); sengine = Search::rbs(solver, 
>> metastop, sengine0, metaoption);
>>
>> I needed to use an extra Engine* sengine0, because using the same 
>> engine
> in
>> bab and rbs crashed immediately.
>>
>> The crash seems to happen when the rbs engine is destroyed, and it 
>> looks
> like it
>> is related to using 2 search engines.
>>
>> Is rbs supposed to be used by the user? I found it by looking for rbs 
>> in
> the
>> documentation, but I noticed that although it is listed, it doesn't 
>> seem
> to have
>> any description associated with it.
>>
>> Can I use Engine* in this way if I want to use restart-based search, 
>> or do
> I need
>> to use something else (i.e. not a Engine*)?
>>
>> Thanks in advance for any help!
>>
>> Cheers,
>>
>> Kish
>>
>> _______________________________________________
>> Gecode users mailing list
>> users at gecode.org
>> https://www.gecode.org/mailman/listinfo/gecode-users
>





More information about the users mailing list