I am Patrick Prosser I am a senior lecturer at Glasgow I teach AF2 & CP4 I am a member of the algorithms group the apes (distributed, not disbanded) I.

Similar presentations

Presentation on theme: "I am Patrick Prosser I am a senior lecturer at Glasgow I teach AF2 & CP4 I am a member of the algorithms group the apes (distributed, not disbanded) I."— Presentation transcript:

2
I am Patrick Prosser I am a senior lecturer at Glasgow I teach AF2 & CP4 I am a member of the algorithms group the apes (distributed, not disbanded) I am a Glaswegian This is all that I am allowed to tell you (baby) Bio

6
Plan of the talk Whats a csp? The simplest algorithm (BT) and its behaviour Some improvements (BJ, GBJ) A better way (CBJ) Improvements to CBJ Strange things about CBJ k-inconsistencies the bridge and the long jump value ordering and insolubility So, what about CBJ? some say its good some say its a waste of time whos using it whos not using Wheres it going QBF?

7
Whats a csp? a set of variables each with a domain of values a collection of constraints (Im going to assume binary) assign each variable a value from its domain to satisfy the constraint

34
That was good old fashioned chronological backtracking instantiate a variable check current against past variables to see if okay current? past? Future? If not okay try another value If no values left go back to previous variable

38
BT Assume that when we instantiate the current variable v[i] we check against all past variables from v[1] to v[i-1] to check if consistent consistent := false for x in domain[i] while not(consistent) // find a consistent value begin consistent := true v[i] := x for h in (1.. i-1) while consistent // check backwards begin consistent := (check(v[i],v[h]) end if not(consistent) then delete(x,domain[i]) end // did we find a good value?

39
John Gaschnigs BJ Make a small modification to BT. Remember the last variable we check against If the loop terminates with consistent false then jump back to v[h], where h := lastCheck[i] This is then the deepest variable we failed against consistent := false maxCheck[i] := 0 for x in domain[i] while not(consistent) // find a consistent value begin consistent := true v[i] := x for h in (1.. i-1) while consistent // check backwards begin consistent := (check(v[i],v[h]) maxCheck := max(h,maxCheck[i]) end if not(consistent) then delete(x,domain[i]) end // did we find a good value?

40
John Gaschnigs BJ If the loop terminates with consistent true... lastCheck[i] = i-1 we then step back! consistent := false maxCheck[i] := 0 for x in domain[i] while not(consistent) // find a consistent value begin consistent := true v[i] := x for h in (1.. i-1) while consistent // check backwards begin consistent := (check(v[i],v[h]) maxCheck := max(h,maxCheck[i]) end if not(consistent) then delete(x,domain[i]) end // did we find a good value? BJ jumps then steps back. It can only jump after it has moved forwards!

42
Rina Dechters GBJ If there are no values remaining for v[i] Jump back to v[h], where v[h] is the deepest variable connected to v[i] in the constraint graph If there are no values remaining for v[h] Jump back to v[g], where v[g] is the deepest variable connected to v[h] or v[i] in the constraint graph If there are no values remaining for v[g] Jump back to v[f], where v[f] is the deepest variable connected to v[g] or v[h] or v[i] in the constraint graph Graph-based backjumping, exploits topology of constraint graph What happens if constraint graph is a clique?

43
We want something that can jump and jump again, something that takes into consideration what caused a dead-end, not something that just looks at the topology of the constraint graph Combine BJ and GBJ

44
CBJ Remember your conflicts, and when you have used them forget them. When we instantiate v[i] := x and check(v[i],v[h]) and it fails v[i] is in conflict with v[h] add h to the set confSet[i] confSet[i] is then the set of past variables that conflict with values in the domain of v[i]

45
CBJ If there are no values remaining for v[i] Jump back to v[h], where v[h] is the deepest variable in conflict with v[i] The hope: re-instantiate v[h] will allow us to find a good value for v[i] Conflict-directed backjumping, exploits failures within the search process What happens if: constraint graph is dense, tight, or highly consistent? If there are no values remaining for v[h] Jump back to v[g], where v[g] is the deepest variable in conflict with v[i] or v[h] The hope: re-instantiate v[g] will allow us to find a good value for v[i] or a good value for v[h] that will be good for v[i] If there are no values remaining for v[g] Jump back to v[f], where v[f] is the deepest variable in conflict with v[i] or v[h] or v[g] The hope: re-instantiate v[f] will allow us to find a good value for v[i] or a good value for v[h] that will be good for v[i] or a good value for v[g] that will be good for v[h] and v[i]

47
CBJ When jumping back from v[i] to v[h] update conflict sets confSet[h] := confSet[h] confSet[i] \ {h} confSet[i] := {0} That is, when we jump back from v[h] jump back to a variable that is in conflict with v[h] or with v[i] Throw away everything you new on v[i] Reset all variables from v[h+1] to v[i] (i.e. domain and confSet)

53
Check Forwards, Jump Back! 1 2 3 4 5 6 7 9 8 There are no values in cd[6] compatible with v[9] get more values into cd[9] (undo v[1]?) OR get more values into cd[6] (undo v[4]) … and if that doesnt work? undo v[3] so cd[4] gets value compatible with cd[6] that is then compatible with cd[9]

55
CBJ DkC If we jump from v[i] to v[h] and confSet[i] = {0,h} then remove value(v[h]) from domain(h) value(v[h]) is 2-inconsistent wrt v[i] If we jump from v[h] to v[g] and confSet[h] = {0,g} then remove value(v[g]) from domain(g) value(v[g]) is 3-inconsistent wrt v[i] and v[h] If we jump from v[g] to v[f] and confSet[g] = {0,f} then remove value(v[f]) from domain(f) value(v[f]) is 4-inconsistent wrt v[i] and v[h] and v[g] What happens if the problem is highly consistent? See JAIR 14 2001, Xinguang Chen & Peter van Beek

56
CBJ ATMS If we jump from v[i] to v[g] and confSet[h] {0.. g-1} then do NOT reset domain(h) and do NOT reset confSet(h) Consider the past variables as assumptions and confSet[i] as an explanation Down side, we have more work to do. This is a kind of learning (what kind?)

57
CBJ ~ DB confSet[x,i] gives the past variable in conflict with v[i] := x Finer grained: on jumping back we can deduce better what values to return to domains Down side, we have more work to do. This is an algorithm between CBJ and DB

65
Why is cbj not in CP? Need to propagate laterally (see MAC-CBJ tech report) but this is no big deal Need to get explanations out of constraints! Not just writing a good constraint propagator but a good constraint explainer! Maybe there is not yet the demand for retraction and explanation (but I dont believe that)

66
So? Paper rejected from IJCAI91 (written in 1990) I was a Lisp programmer at the time (it shows) I think the experiments were very good (so there!) Nice study of influence of topological parameter on search cost. In conclusion I forgot to say CBJ was new … why? I like BMJ, it is cool (I was smart for 1 day) I think CBJ is pretty (natural, discovered, not invented) I like FC-CBJ (I can understand it) I identify work to be done (researchers love that (why?)) … and I make errors re-dvos (researchers love that (why?)) I put my results in perspective (trash them :) I got encouragement (Nadel) and help (Ole and Peter) I got a whole load of background (Rina) But it hurt … why did it take 3 years to get somebody to read it? It is still alive! We are not done yet.