Download Presentation
## Non-binary constraints

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -

**Non-binary constraints**Toby Walsh Cork Constraint Computation Center tw@4c.ucc.ie**Global constraints**Toby Walsh Cork Constraint Computation Center tw@4c.ucc.ie**Non-exhaustive catalog**• Order constraints • Constraints on values • Partitioning constraints • Timetabling constraints • Graph constraints • Scheduling constraints • Bin-packing constraints**Global constraints**• It isn’t just all-different! • Many constraints specialized to application domains • Scheduling • Packing • ..**Order constraints**• min(X,[Y1,..,Yn]) and max(X,[Y1,..Yn]) X <= minimum(Y1,..,Yn) X >= maximum(Y1,..Yn) n.b. min is relational not functional**Order constraints**• min(X,[Y1,..,Yn]) and max(X,[Y1,..Yn]) X <= minimum(Y1,..,Yn) X <= maximum(Y1,..Yn) n.b. min is relational not functional • min_mod(X,[Y1,..,Yn],m) and max_mod(X,[Y1,..Yn],m) X mod m <= minimum(Y1 mod m,..,Yn mod m) X mod m <= maximum(Y1 mod m,..,Yn mod m)**Order constraints**• min_n(X,n,[Y1,..Ym]) and max_n(X,n,[Y1,..,Ym) X is nth smallest value in Y1,..Ym X is nth largest value in Y1,..Ym**Order constraints**• min_n(X,n,[Y1,..Ym]) and max_n(X,n,[Y1,..,Ym) X is nth smallest value in Y1,..Ym X is nth largest value in Y1,..Ym min_n(X,1,[Y1,..,Ym]) => min(X,[Y1,..,Yn]) max_n(X,1,[Y1,..,Ym]) => max(X,[Y1,..,Ym]) n.b. min_n is functional but min is relational (any X smaller than min will do!**Value constraints**• among(N,[Y1,..,Yn],[val1,..,valm]) N vars in [Y1,..,Yn] take values val1,..valm e.g. among(2,[1,2,1,3,1,5],[3,4,5])**Value constraints**• among(N,[Y1,..,Yn],[val1,..,valm]) N vars in [Y1,..,Yn] take values val1,..valm e.g. among(2,[1,2,1,3,1,5],[3,4,5]) • count(n,[Y1,..,Ym],op,X) where op is =,<,>,=/,<= or >= relation “Yi op X” holds n times E.g. among(n,[Y1,..,Ym],[k]) = count(n,[Y1,..,Ym],=,k)**Value constraints**• balance(N,[Y1,..,Yn]) N = occurrence of more frequent value - occurrence of least frequent value E.g balance(2,[1,1,1,3,4,2])**Value constraints**• balance(N,[Y1,..,Yn]) N = occurrence of more frequent value - occurrence of least frequent value E.g balance(2,[1,1,1,3,4,2]) all-different([Y1,..,Yn]) => balance(0,[Y1,..,Yn])**Value constraints**• min_nvalue(N,[Y1,..,Yn]) and max_nvalue(N,[Y1,..,Yn]) least (most) common value in Y1,..,Yn occurs N times E.g. min_nvalue(2,[1,1,2,2,2,3,3,5,5]) Can replace multiple count or among constraints**Value constraints**• common(X,Y,[X1,..,Xn],[Y1,..,Ym]) X vars in Xi take a value in Yi Y vars in Yi take a value in Xi E.g. common(3,4,[1,9,1,5],[2,1,9,9,6,9])**Value constraints**• common(X,Y,[X1,..,Xn],[Y1,..,Ym]) X vars in Xi take a value in Yi Y vars in Yi take a value in Xi E.g. common(3,4,[1,9,1,5],[2,1,9,9,6,9]) among(X,[Y1,..,Yn],[val1,..,valm]) = common(X,Y,[X1,..,Yn],[val1,..,valm])**Value constraints**• same([X1,..,Xn],[Y1,..,Yn]) Yi is a permutation of Xi**Value constraints**• same([X1,..,Xn],[Y1,..,Yn]) Yi is a permutation of Xi • used_by([X1,..,Xn],[Y1,..,Ym]) all values in Yi are used by vars in Xi m>=m**Value constraints**• same([X1,..,Xn],[Y1,..,Yn]) Yi is a permutation of Xi • used_by([X1,..,Xn],[Y1,..,Ym]) all values in Yi are used by vars in Xi m>=m • on n values: alldifferent([X1,..,Xn])=same([X1,..,Xn],[1,..,n]) =used_by([X1,..,Xn],[1,..,n])**Partitioning constraints**• all-different([X1,..,Xn])**Partitioning constraints**• all-different([X1,..,Xn]) • Other flavours all-different_except_0([X1,..,Xn]) Xi=/Xj unless Xi=Xj=0 • 0 is often used for modelling purposes as “dummy” value • Don’t use this slab • Don’t open this bin ..**Partitioning constraints**• all-different([X1,..,Xn]) • Other flavours symmetric-all-different([X1,..,Xn]) Xi=/Xj and Xi=j iff Xj=i • Very common in practice • Team i plays j iff Team j plays i..**Partitioning constraints**• all-different([X1,..,Xn]) • Other flavours symmetric-all-different([X1,..,Xn]) Xi=/Xj and Xi=j iff Xj=i • Very common in practice • Team i plays j iff Team j plays i.. • Regin has proposed very efficient algorithm**Partitioning constraints**• nvalue(N,[X1,..,Xn]) Xi takes N different values all-different([X1,..,Xn]) = nvalue(n,[X1,..,Xn)**Partitioning constraints**• nvalue(N,[X1,..,Xn]) Xi takes N different values all-different([X1,..,Xn]) = nvalue(n,[X1,..,Xn) • gcc([X1,..,Xn],Lo,Hi) values in Xi occur between Lo and Hi times all-different([X1,..,Xn])=gcc([X1,..,Xn],1,1)**Timetabling constraints**• change(N,[X1,..,Xn]),op) where op is {=,<,>,<=,>=,/=} “Xi op Xi+1” holds N times E.g. change(3,[4,4,3,4,1],/=) • You may wish to limit the number of changes of classroom, shifts, …**Timetabling constraints**• longest_changes(N,[X1,..,Xn]),op) where op is {=,<,>,<=,>=,/=} longest sequence “Xi op Xi+1” is of length N E.g. longest_changes(2,[4,4,4,3,3,2,4,1,1,1],=) • You may wish to limit the length of a shift without break, …**Graph constraints**• Tours in graph a often represented by the successors: • [X1,..,Xn] means from node i we go to node Xi**Graph constraints**• Tours in graph a often represented by the successors: • [X1,..,Xn] means from node i we go to node Xi • E.g. [2,1,5,3,4] represents the 2 cycles (1)->(2)->(1) and (3)->(5)->(4)->(3)**Graph constraints**• cycle(N,[X1,..,Xn]) there are N cycles in Xi e.g. cycle(2,[2,1,5,3,4]) as we have the 2 cycles (1)->(2)->(1) and (3)->(5)->(4)->(3) Useful for TSP like problems (e.g. sending engineers out to repair phones)**Graph constraints**• derangement(N,[X1,..,Xn]) there are no length 1 cycles in Xi**Graph constraints**• derangement(N,[X1,..,Xn]) there are no length 1 cycles in Xi e.g. derangement([2,1,5,3,4]) as the 2 cycles (1)->(2)->(1) and (3)->(5)->(4)->(3) have length 2 and 3**Graph constraints**• derangement(N,[X1,..,Xn]) there are no length 1 cycles in Xi e.g. derangement([2,1,5,3,4]) as the 2 cycles (1)->(2)->(1) and (3)->(5)->(4)->(3) have length 2 and 3 e.g. derangement([3,1,2,4]) as the 2 cycles (1)->(3)->(2)->(1) and (4)->(4) are of length 3 and 1**Graph constraints**• We may also wish to represent predecessors • For good labelling heuristics • For ease of statement of constraints • [X1,..,Xn] means we came to node i from node Xi**Graph constraints**• We may also wish to represent predecessors • For good labelling heuristics • For ease of statement of constraints • [X1,..,Xn] means we came to node i from node Xi • E.g. [2,1,4,5,3] now represents the 2 cycles (1)->(2)->(1) and (3)->(5)->(4)->(3)**Graph constraints**• We may also wish to represent predecessors • For good labelling heuristics • For ease of statement of constraints • [X1,..,Xn] means we came to node i from node Xi • E.g. [2,1,4,5,3] now represents the 2 cycles (1)->(2)->(1) and (3)->(5)->(4)->(3) • In successor notation this was [2,1,5,3,4]**Graph constraints**• We may also wish to represent predecessors • For good labelling heuristics • For ease of statement of constraints • [X1,..,Xn] means we came to node i from node Xi • E.g. [2,1,4,5,3] now represents the 2 cycles (1)->(2)->(1) and (3)->(5)->(4)->(3) • In successor notation this was [2,1,5,3,4] • How do we know they are the same?**Graph constraints**• We may also wish to represent predecessors • For good labelling heuristics • For ease of statement of constraints • [X1,..,Xn] means we came to node i from node Xi • E.g. [2,1,4,5,3] now represents the 2 cycles (1)->(2)->(1) and (3)->(5)->(4)->(3) • In successor notation this was [2,1,5,3,4] • How do we know they are the same? • With a channelling constraint!**Graph constraints**• Inverse([X1,..,Xn],[Y1,..,Yn]) Where [X1,..,Xn] is a successor representation of a path, and [Y1,..,Yn] is a predecessor Thus inverse([2,1,4,5,3],[2,1,5,3,4])**Graph constraints**• Inverse([X1,..,Xn],[Y1,..,Yn]) Where [X1,..,Xn] is a successor representation of a path, and [Y1,..,Yn] is a predecessor Thus inverse([2,1,4,5,3],[2,1,5,3,4]) And inverse([2,1,5,3,4],[2,1,4,5,3])**Scheduling constraints**• cummulative([S1,..,Sn],[D1,..,Dn],[E1,..,En],[H1,..,Hn],L) • schedules n (concurrent) jobs, each with a height Hi • ith job starts at Si, runs for Di and ends at Ei • Ei=Si+Di • at any time, accumulated height of running jobs is less than L 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25**Scheduling constraints**• coloured_cummulative([S1,..,Sn],[D1,..,Dn],[E1,..,En],[C1,..,Cn],L) • schedules n (concurrent) each with a colour Ci • no more than L colours running at any one time 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25**Scheduling constraints**• cycle_cummulative(m,[S1,..,Sn],[D1,..,Dn],[E1,..,En],[H1,..,Hn],L) • schedules n (concurrent) jobs, each with a height Hi onto a cyclic schedule of length m**Scheduling constraints**• cummulatives([M1,,,Mn],[S1,..,Sn],[D1,..,Dn],[E1,..,En],[H1,..,Hn],[L1,..,Lm]) • schedules n (concurrent) jobs, each with a height Hi onto one of m machines • ith runs on Mi • accumulated height of running jobs on machine i <= Li**Scheduling constraints**• cummulatives([M1,..Mn],[S1,..,Sn],[D1,..,Dn],[E1,..,En],[H1,..,Hn],[L1,..,Lm]) Machine 1 Machine 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25**Scheduling constraints**• coloured_cummulatives([M1,,,Mn],[S1,..,Sn],[D1,..,Dn],[E1,..,En],[C1,..,Cn],[L1,..,Lm]) • schedules n (concurrent) jobs, each with a colour i onto one of m machines • ith runs on Mi • number of colours of running jobs on machine i <= Li**Bin-packing constraints**• bin_packing(capacity,[B1,..,Bn],[w1,..,wn]) for each bin j, sum_Bi=j wi <= capacity**Bin-packing constraints**• bin_packing(capacity,[B1,..,Bn],[w1,..,wn]) for each bin j, sum_Bi=j wi <= capacity special case of cummulative with task durations=1**Bin-packing constraints**• bin_packing(capacity,[B1,..,Bn],[w1,..,wn]) for each bin j, sum_Bi=j wi <= capacity special case of cummulative with task durations=1 unlike normal bin-packing, does not minimize the number of open bins**Bin-packing constraints**• bin_packing(capacity,[B1,..,Bn],[w1,..,wn]) for each bin j, sum_Bi=j wi <= capacity special case of cummulative with task durations=1! unlike normal bin-packing, does not minimize the number of open bins how could we do this?**Bin-packing constraints**• bin_packing(capacity,[B1,..,Bn],[w1,..,wn]) for each bin j, sum_Bi=j wi <= capacity special case of cummulative with task durations=1! unlike normal bin-packing, does not minimize the number of open bins Bi=j implies Open_j=1 Minimize sum_j Open_j