[gecode-users] Customised static variable ordering

Guido Tack tack at ps.uni-sb.de
Sun Sep 27 22:46:58 CEST 2009


Chris Mears wrote:

> Hello Gecoders,
>
> I'd like to perform a depth first search with a specific static  
> variable
> ordering.  I have a matrix of integer variables and I want to label  
> the
> top row first, then the left column, then the rest of the matrix in
> standard top-to-bottom, left-to-right order.
[...]
> I have managed to achieve the ordering I want, like this (with the new
> bits marked with comments):
>
>    class Problem : public Space {
>        IntVarArray cells;
>        IntVarArray ordering;   // *** added this array ***
>        Problem(int n) {
>            Matrix<IntVarArray> m(cells, n, n);
>            // ...
>            // set up constraints on cells via m
>            // ...
>            // *** added this block ***
>            int index = 0;
>            for (int c = 0 ; c < n ; c++)
>                ordering[index++] = m(c,0);
>            for (int r = 1 ; r < n ; r++)
>                ordering[index++] = m(0,r);

You can use m.row and m.col here, like this:
branch(*this, m.row(0), ...);
branch(*this, m.col(0), ...);

>            for (int r = 1 ; r < n ; r++)
>                for (int c = 1 ; c < n ; c++)
>                    ordering[index++] = m(c,r);
>            // *** search on "ordering" instead of "cells" ***
>            branch(*this, cells, INT_VAR_NONE, INT_VAR_MIN);

Here you could just branch over the whole thing, as at this point the  
first row and column will already be assigned and thus ignored in the  
branching:
branch(*this, cells, ...);

> This seems to work.  My question: is this the best way to do it?  (It
> just occurred to me that maybe it could be done using Slices -- is  
> that
> right?)

It's merely a matter of taste, not of efficiency, really.

Cheers,
	Guido





More information about the gecode-users mailing list