580 likes | 672 Vues
Learn how to define custom constraints for max and subtour elimination in JChoco, offering compact, faster, and efficient propagation. Implement the Max constraint to optimize large integer arrays. Illustrative examples included.
E N D
Specialised (user defined) constraints in JChoco 2 examples: max and subtour elimination
Consider the following contraint This can be implemented in JChoco using primitives as follows
Could I define my own constraint to do this? Why would I want to do that? • Possibly: • more compact • faster • more propagation
V[0] = max(v[1],v[2],…,v[n-1]) Define a constraint called Max that extends AbstractLargeIntConstraint
Methods to be implemented V[0] = max(v[1],v[2],…,v[n-1]) initiation inf: lower bound sup: upper bound removal of value instantiate
V[0] = max(v[1],v[2],…,v[n-1]) A demo Cart before the horse?
V[0] = max(v[1],v[2],…,v[n-1]) Note: output always has a 4 or a 5 in it
We haven’t used them yet, but …. Backtrackable Variables (Stored*)
The single successor model An array of n variables • “single successor” model of a graph • Limits what kind of graph can be modelled • out-degree of 1 But this aint enough
The single successor model NOT A TOUR! 1 2 3 0 5 6 7 4 4 5 6 7 0 1 2 3 We need subtour elimination
Yikes! Show me a picture! Associate with each variable next[i] the following reversible variables • When making an instantiation • next[i] = j • We now join the path that ends in i to path that starts with j • If the path involves less that n vertices/cities • next[e[j]] != s[i] • i.e. we cannot close that loop!
6 s[6] = 8 8 e[8] = 6 s[7] = 5 7 4 e[5] = 7 5 next[1] = 5 1 s[1] = 0 2 3 0 e[0] = 1
6 s[6] = 8 8 e[8] = 6 s[7] = 0 7 4 5 1 2 3 0 e[0] = 7
6 s[6] = 8 8 e[8] = 6 s[7] = 0 7 4 5 next[7] ≠ 0 Otherwise we have a subtour/loop This is the “propagation” . 1 2 3 0 e[0] = 7 Note: this is a constraint that may be used in a richer problem