[gecode-users] Channeling between SetVarArrays

Guido Tack tack at gecode.org
Tue Jun 21 14:19:14 CEST 2011


On 21 Jun 2011, at 13:51, Johannes Inführ wrote:
> Is it possible in Gecode to channel two SetVarArrays A and B, so that when A[3] contains 5, B[5] contains 3?

There is no specialized propagator for this, but you can implement a decomposition using element intersection constraints:

    for (int i=0; i<A.size(); i++) {
      SetVar z0(*this, i,i, Set::Limits::min, Set::Limits::max);
      element(*this, SOT_INTER, B, A[i], z0);
    }

This propagates that the intersection of all B[j] for j in A[i] is z0, which contains at least i.

Note that the reverse implication is not propagated: if A[3] does not contain 5, then B[5] can still contain 3.  You can add
      SetVar z1(*this, i,i, Set::Limits::min, Set::Limits::max);
      element(*this, SOT_INTER, A, B[i], z1);
inside the loop to get both directions.

Cheers,
	Guido

-- 
Guido Tack, http://people.cs.kuleuven.be/~guido.tack/







More information about the users mailing list