Artificial Intelligence

Download Report

Transcript Artificial Intelligence

Artificial Intelligence
Practical 2: Forward
Checking
Ian Gent
[email protected]
Artificial Intelligence
Practical 2: Forward
Checking
Part
Part
Part
Part
I:
II:
III:
IV:
Overview
Three ways to implement FC
Other parts of the practical
What I’m looking for
Practical 2: Forward Checking
 Write a program to implement the two
algorithms BT (Backtracking) and FC
(Forward Checking.) Perform an empirical
comparison of the two algorithms.
 Some practical stuff:
 This is practical 2 of 2.
 Each will carry equal weight, I.e. 10% of total credit
 You may use any implementation language you wish
 Deadline(s) are negotiable (can be decided after vacation)
3
Aims and Objectives
 Aims:
 to give experience in implementing important AI search
algorithms
 to give experience in comparing AI techniques empirically
 Objectives:
 after completing the practical, you should have:
 implemented the algorithms BT and FC
 gained an appreciation of some of the basic techniques necessary
 performed and reported on an empirical comparison of different
algorithms
4
What you need to do
 Implement BT and FC for binary CSP’s
 if you can do FC you can do BT
 FC is the hard bit
 implement at least two (static) heuristics for each
 Implement a reader to read in benchmark CSP’s
 format of problems will be provided
 use benchmarks for testing
 Perform empirical comparison of algorithms
 run on benchmark problems
 report on comparative success of algorithm/heuristic
combinations
5
What you can get away with
 Implement BT binary CSP’s
 implement at least one heuristics
 Implement a reader to read in benchmark CSP’s
 format of problems will be provided
 use benchmarks for testing
 Perform empirical comparison of algorithms
 run on benchmark problems
 report on success or otherwise
 Don’t expect too many marks for doing the above
 but don’t expect zero either
6
Three Ways to Implement FC
 You only need one implementation!
 Choose the style that suits you and the language
you like using
 Three ways are:
 using the general search algorithm
 recursive
 from pseudocode using specific data structures
7
Implementing FC (1)
 You can implement FC using the generic search
algorithm presented earlier
 Search states = some representation of current
assignment of values to variables, and current
domains for each variable
 Forward checking done when new states created
 Do search by depth-first
 Main problem is memory management
 not letting space expand endlessly/overwriting existing
states
 easier if you’ve got GC built in
8
FC via general search algorithm
 1. Form a one element list with null state
• null state = state with no decisions = original CSP
 2. Loop Until (either list empty or we have a solution)
 Remove the first state S from the list
 Choose the next decision to make
• which variable x to assign next
 Create a new state for each possible choice of decision
• decisions are all remaining values v in Dx
• to create each new state, assign x=v and forward check
 MERGE the set of new states into the list
 3. If (solution in list) succeed and report solution
 else list must be empty, so fail
9
Implementing FC (2)
 Functional languages are good for search
 e.g. Lisp, Haskell
 Write propagator for forward checking which makes
non destructive changes.
 I.e. original state still exists, but we get a new one for free
 GC done for you
 Write search function recursively
 handles the manipulation of the list for you via the function
calling stack
10
Implementing FC (2)
 Search (CSP):
 choose var
 while (value remains in CDvar)
 Call Search( fc-propagate(CSP[var = value]))
 If call succeeds with solution, return solution
 If all calls failed, return failure
11
Implementing FC(3)
 Follow implementation outlined by Prosser
 Avoids most memory management problems
 Explicit data structures initially set up
 when we remove values from vi to vj we modify them
 reductions[j] contains sequence of sequence
 each one a sequence of values disallowed by past var
 past-fc[j] is a set of variables
 set of variables i which caused value removals from vj
 future-fc[i] is another set
 set of variables in which the current value of vi causes
value removals
12
General pseudocode for bcssp
 Procedure bccsp (n, status)
 consistent := true, status := unknown, ii := 1
 while (status = unknown)
 if (consistent)
• ii := label(ii,consistent)
– need special purpose function fc-label here
• else ii := unlabel(ii,consistent)
– and fc-unlabel here
 if (ii > n)
• status := solution
• else if (ii = 0)
– status := impossible
13
Implementing FC(3.2)
 Use data structure suggested by Bacchus/van Run
 Have a 2D array Domain[ii,k]
 first dimension is variables, second dimension values
 Domain[ii,k] = 0 if value k still possible for variable ii
 I.e. if k still belongs to CD[ii]
 If value k impossible, removed from CD[ii]
 Domain[ii,k] = j, where j is variable that caused removal
 On backtracking, to undo effect of assigning j
 if Domain[ii,k] = j, reset it so that Domain[ii,k] = 0
 either store all changes made by j, or just iterate over 2D
array looking for those equal to j
14
Other parts of the practical
 Input format:
 the APES group has a standard format for sharing binary
CSP’s.
 Allows sharing of benchmarks
 Valuable for testing (all programs should give same
results)
 Write a reader for this format
 translate input to your internal format for CSP
 your representation of variables, domains, constraints
 create small test problems for yourself
 and if you want, share them for others
15
Heuristics
 I am only looking for static variable ordering
heuristics
 implement dynamic ones if you wish
 heuristics are harder in Prosser’s version
 see paper by Bacchus & van Run for pointers
 Heuristics you might consider





lexicographic, v1, v2, v3…
random, v17, v16, v2, v19 …
min degree: var involved in least constraints first
max degree: var involved in most constraints first
other heuristics you find/can think of
16
Empirical Report
 Run your program(s) against benchmark instances I
will provide, and others you might want to try
 From empirical evidence, how do the techniques
perform?
 Is FC better than BT? Worse? varies across problems?
 Are there some problems that you can’t solve in
reasonable cpu time?
 Is min degree better than max degree?
 Are some problems harder than others?
17
Empirical Report
 Write a report on your experiments
 Describe the purpose of each experiment, the
results, and conclusions you draw
 Try to make it a good piece of empirical AI!
 Include results as e.g. tables or graphs
 as appendix if too many results
 Probably a few pages
18
What I am looking for
 A correct functioning program
 speed is not important (within reason)
 should implement at least 4 combinations of
algorithm/heuristic
 A report summarising program and empirical work
 no set word limit, probably needs a few pages to present
good empirical work well
 evidence that your code is correct
 e.g. sample output, correct result on benchmarks
 conclusions on your empirical result
 code (electronically if it’s HUGE)
19
Additional Issues
 Some ways to get more credit …
 create/find problems for which usually worse
algorithm/heuristic does better
 think of different heuristics
 think of interesting hypotheses and test them
 implement FC so that propagation causes a chain
reaction.
 I.e. if you get domain size = 1, redo FC from there
 Since I’ve asked for static heuristics, we may search on
variable x, domain size 4, when variable y has d.s. = 1
 implement dynamic variable ordering heuristics
20
Some pointers
 A tutorial on constraint programming
 Barbara Smith
 Leeds University, 1995
 Hybrid Algorithms for the Constraint Satisfaction
Problem
 Patrick Prosser
 Computational Intelligence, 1993
 Dynamic Variable Ordering in CSPs
 Bacchus & van Run
 CP95, 1995
21