Hi Juan Carlos,
I think the “solution” suggested by me was a little bit too elegant, in fact it is buggy and that’s why you experience segfaults… Reminds of an Einstein quote: Everything should be made as simple as possible, but not simpler. The problem is as follows: variables in Gecode belong to just one space and they are deleted when the space is deleted. However in the constrain() function a new propagator is created with both variables from the *this space as well as from the space for the so-far best solution b. Now what can happen is that b might already be deleted while *this is still alive: hence the access to variables which are already did and kaboom: segfault! The problem is easy to fix, though: when the constrain() function is called you create new variables, one for each variable from b, but now in *this! The variables in b must be assigned, so creating new variables in *this must happen with the variables assigned to the value of the respective variable in b. The code should look this, roughly: IntVarArgs bo(*this, mycpSolver.objectives.size(), Int::Limits::min, Int::Limits::max); for (int i=0; i< mycpSolver.objectives.size(), i++) rel(*this, bo[i], IRT_EQ, mycpSolver.objectives[i].val()); rel(*this, objectives, IRT_LE, bo); Sorry for not thinking about this in the first place. I’ll add a tip and a warning in MPG. Cheers Christian -- Christian Schulte, <http://www.gecode.org/~schulte> www.gecode.org/~schulte Professor of Computer Science, KTH, <mailto:cschu...@kth.se> cschu...@kth.se Expert Researcher, SICS, <mailto:cschu...@sics.se> cschu...@sics.se From: Juan Carlos Hernandez [mailto:jchernandez.mad...@gmail.com] Sent: Monday, February 1, 2016 06:25 PM To: Christian Schulte <cschu...@kth.se> Cc: Alexander Schiendorfer <alexander.schiendor...@informatik.uni-augsburg.de>; users@gecode.org Subject: Re: [gecode-users] users Digest, Vol 124, Issue 6 Dear Alex and Christian, thanks a lot! A very elegant solution - it works well, but I am now battling with two problems 1. I get a segmentation fault when I try to run it in parallel mode (say, using 8 threads). The error happens irregularly, but more often when I increase the thread count. Here is what my constrain function looks like for a maximization problem virtual void constrain(const Space& _b){ const cpSolver& mycpSolver = static_cast<const cpSolver&>(_b); rel(*this, objectives, IRT_GR, mycpSolver.objectives); } Since this does not really look like the other examples in the Gecode manual, I guess that it is not correct. But I was unable to come up with any other solution that rel would accept (that is, for which there is a matching version of rel). 2. Ideally, I would like to have more than two objectives and have the search to first try to maximize the first objective, then the second, etc. But I do not manage, not matter which variable selection rule I use. Typically, I get a little advancement in the first objective (say, it goes from 0 to 1, and perhaps to two), and then the search makes progress on the third or fourth objective in order. Thanks, JC 2016-01-29 12:15 GMT+01:00 Christian Schulte <cschu...@kth.se <mailto:cschu...@kth.se> >: Alex is spot on here: but let me expand a little. You might have used the cost() member function for B&B. However the cost() member function is just implemented in terms of the constrain() member function. So what I would do is the following: - Have a integer variable array cost containing the two cost variables you have in mind. - implement a constrain(const Space& _b) member function: _b refers to the so-far best solution. Cast this to your script type, say b. Then this just posts rel(*this, cost, IRT_LQ, b.cost); This enforces that this->cost is lexicographically smaller then the so far best cost b.cost. That's it. More on the constrain() function you can find in Chapter 2 of MPG. Cheers Christian -- Christian Schulte, www.gecode.org/~schulte <http://www.gecode.org/~schulte> Professor of Computer Science, KTH, cschu...@kth.se <mailto:cschu...@kth.se> Expert Researcher, SICS, cschu...@sics.se <mailto:cschu...@sics.se> -----Original Message----- From: users-boun...@gecode.org <mailto:users-boun...@gecode.org> [mailto:users-boun...@gecode.org <mailto:users-boun...@gecode.org> ] On Behalf Of Alexander Schiendorfer Sent: Friday, January 29, 2016 12:06 PM To: users@gecode.org <mailto:users@gecode.org> Subject: Re: [gecode-users] users Digest, Vol 124, Issue 6 Hi Juan, it seems to me that you're searching for lexicographic branch-and-bound. There is a global constraint lex_lesseq that you might want to consider for posting in the constrain method of a Space. Cheers, Alex On 29.01.2016 12:00, users-requ...@gecode.org <mailto:users-requ...@gecode.org> wrote: > Send users mailing list submissions to > users@gecode.org <mailto:users@gecode.org> > > To subscribe or unsubscribe via the World Wide Web, visit > http://www.gecode.org/cgi-bin/mailman/listinfo/users > or, via email, send a message with subject or body 'help' to > users-requ...@gecode.org <mailto:users-requ...@gecode.org> > > You can reach the person managing the list at > users-ow...@gecode.org <mailto:users-ow...@gecode.org> > > When replying, please edit your Subject line so it is more specific > than "Re: Contents of users digest..." > > > Today's Topics: > > 1. Best way to implement multi-criterion optimization in Gecode? > (Juan Carlos Hernandez) > > > ---------------------------------------------------------------------- > > Message: 1 > Date: Thu, 28 Jan 2016 12:30:54 +0100 > From: Juan Carlos Hernandez <jchernandez.mad...@gmail.com > <mailto:jchernandez.mad...@gmail.com> > > To: users@gecode.org <mailto:users@gecode.org> > Subject: [gecode-users] Best way to implement multi-criterion > optimization in Gecode? > Message-ID: > <CAFd=f3eau+xpqjo02kpt9swibpjxkifw-f2so-4me+x4kv7...@mail.gmail.com > <mailto:f3eau%2bxpqjo02kpt9swibpjxkifw-f2so-4me%2bx4kv7...@mail.gmail.com> > > Content-Type: text/plain; charset="utf-8" > > Hi everyone, > > > I am trying to use Gecode to solve a multi-criterion problem > > > minimize (F1(x,z), F2(x,z) ) > > subject to constraints on x,z > > > The objectives are ordered in order of importance, so I would like to > first solve the problem P1 > > > minimize F1(x,z) > > subject to original constraints on x,z > > > and then consider the modified problem P2 > > > minimize F2(x,z) > > subject to original constraints on x,z > > F1(x,z) = F1opt > > > where F1opt is the optimal value of P1. > > > What is the most efficient way to implement this in Gecode? > > > > I am now doing two completely separate searches, in the sense that I > create a new Space and run BAB on it for each of the problems. I am > sure that this cannot be the most efficient way of dealing with the > problem, but am unable to figure out how to do it "the right way". > Essentially, when solving P2 I should be able to make use of the work done while solving P1... > > > Any feedback is very much appreciated! > > > Thanks, > > JC > -------------- next part -------------- An HTML attachment was > scrubbed... > URL: > <http://www.gecode.org/pipermail/users/attachments/20160128/06e6ff75/a > ttachment-0001.html> > > ------------------------------ > > _______________________________________________ > Gecode users mailing list > users@gecode.org <mailto:users@gecode.org> > https://www.gecode.org/mailman/listinfo/gecode-users > > > End of users Digest, Vol 124, Issue 6 > ************************************* -- Alexander Schiendorfer, M.Sc. Institute for Software & Systems Engineering Raum 3043, Gebäude N Universität Augsburg Web: http://www.informatik.uni-augsburg.de/lehrstuehle/swt/se/staff/aschiendorfer / Tel.: +49 (821) 598 - 2196 <tel:%2B49%20%28821%29%20598%20-%202196> E-Mail: alexander.schiendor...@informatik.uni-augsburg.de <mailto:alexander.schiendor...@informatik.uni-augsburg.de> _______________________________________________ Gecode users mailing list users@gecode.org <mailto:users@gecode.org> https://www.gecode.org/mailman/listinfo/gecode-users _______________________________________________ Gecode users mailing list users@gecode.org <mailto:users@gecode.org> https://www.gecode.org/mailman/listinfo/gecode-users
_______________________________________________ Gecode users mailing list users@gecode.org https://www.gecode.org/mailman/listinfo/gecode-users