[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