|
ReadMe
AIMA JAVA Notes By Ravi(magesmail@yahoo.com) and Ciaran (ctjoreilly@gmail.com). #summary some notes IntroductionThe latest (and ever evolving) code can be found at http://code.google.com/p/aima-java/. if you notice a bug please try checking out the latest version from the svn repository to see if it persists. Current release is 0.95: - aima.gui.applications.VacuumAppDemo This will also be our last full release based on the 2nd edition of AIMA. We are currently in the planning phases to re-organize this project based on the 3rd edition of AIMA, which should be available soon. Previous release is 0.94: - Fixed subtle defect in Model Elimination inference algorithm, which caused it to miss portions of the search space. Previous release is 0.93: - a completion of the First Order Logic concepts from Chapter 9. Note: If running the unit tests be sure to include the vm arguments: -Xms256m -Xmx1024m as some of the First Order Logic algorithms (i.e. FOLTFMResolution) are memory hungry. Previous release is 0.92: It includes a rewrite of the neural network algorithms (in the earlier version the nn s were getting saturated because the data was not pre processed) + more algorithms from chapter 4.Heuristics are now doubles (vs ints in the old version). One minor change is that I've dropped the make file. Please use ant Bug Reports - acknowledgmentThe following people sent in excellent comments and bug reports. Thank you!!!!
DetailsBuild InstructionsIf you just want to use the classes, all you need to do is put the aima-java/build directory on your CLASSPATH. if you want to rebuild from source, run the unit tests etc follow the instructions below. you need ant to build from source. Many IDE's have built in ant versions. So you may want to try that first. To build from the command line,
I have included the eclipse.classpath and .projectfiles for those who use eclipse . Code Navigation
Notes on SearchTo solve a problem with (non CSP )Search .
that is all you need to do (unless you plan to write a different search than is available in the code base ). To actually search you need to
A good example (from the NQueens Demo ) is
private static void nQueensWithDepthFirstSearch() {
System.out.println("\nNQueensDemo DFS -->");
try {
//Step a
Problem problem = new Problem(new NQueensBoard(8),new NQueensSuccessorFunction(), new NQueensGoalTest());
//Step b
Search search = new DepthFirstSearch(new GraphSearch());
//Step c
SearchAgent agent = new SearchAgent(problem, search);
//Step d
printActions(agent.getActions());
printInstrumentation(agent.getInstrumentation());
} catch (Exception e) {
e.printStackTrace();
}
}Search Inheritance Treesthere are two inheritance trees in Search. one deals with "mechanism" of search. This inheritance hierarchy looks like this
The second tree deals with the search instances you can use to solve a problem.These implement the aima.search.framework.Search interface.
etc So if you see a declaration like "SimulatedAnnealingSearch extends NodeExpander implements Search" , do not be confused. the superclass (NodeExpander) provides the mechanism of the search and the interface (Search) makes it suitable for use in solving actual problems . Searches like DepthFirstSearch which need to be used as a search (so implementing the Search interface) and can be configured with either Graphseach or TreeSearch (the mechanism) have a constructor like public DepthFirstSearch(QueueSearch search) . Again, if you get confused, look at the demos. Logic NotesThe ONE thing you need to watch out for is that the Parsers are VERY finicky . If you get a lexing or parsing error, there is a high probability there is an error in your logic string. To use First Order Logic, first you need to create a subclass of aima.logic.fol.FOLDomain which collects the constants, predicates, functions etc that you use to solve a particular problem. A parser (that understands the Grammar in figure 8.3 (page 247 in my copy) ) needs to be instantiated with this domain (eg: FOLDomain weaponsDomain = DomainFactory.weaponsDomain(); FOLParser parser = new FOLParser(weaponsDomain); ). the basic design of all the logic code is that the parser creates a Composite (Design Patterns by Gamma, et al) parse tree over which various Visitors(Design Patterns by Gamma, et al) traverse . the key difference between the Visitor elucidated in the GOF book and the code is that in the former the visit() methods have a void visit(ConcreteNode) signature while the visitors used in the logic code have a Object visit(ConcreteNode,Object arg) signature. This makes testing easier and allows some recursive code that is hard with the former . Probability NotesExcept elimination-ask, the rest of the algorithms from chapter 13 and 14 have been implemented. I have tried to make the code stick very closely to Dr.Norvig's' pseudocode . Looking at the demo and tests will reveal how to use the code . LearningNotesMain Classes and responsibilitiesA <dataset> is a collection of <example>s .Wherever you see "examples" in plural in the text , the code uses a DataSet . This makes it easy to aggregate operations that work on collections of examples in one place. An Example is a collection of Attributes. Each example is a data point for Supervised Learning . DataSetSpecification and AttributeSpecification do some error checking on the attributes when they are read in from a file or string .At present there are two types of Attributes - A sring attribute, used for datasets like "restaurant" and a NUmeric Attribute which represents attributes which are numbers . These are presently modelled as Doubles. A Numerizer specifies how a particular DataSet's examples may be converted to Lists of DOubles so they can be used in Neural Networks . There is presently one numerizer in the codebase (IrisDataSetNumerizer) but it is trivial to write more by implementing the Numerizer interface. how to apply learnersThe DecisionTreeLearner and DecisionList Learner work only on datasets with ordinal attributes (no numbers).Numbers are treated as distinct strings. The Perceptron and DecisionTreeLearners work on numerized datasets .If you intend to work with these, you need to write a DataSetSpecific Numerizer by implementing the Numerizer interface. 1.To import a dataset into a system so that learners can be applied to it , first add a public static DataSet getXDataSet(where "x" is the name of the DataSet you want to import) to the DataSetFactory 2.Learners all implement the Learner interface with 3 methods, train, predict and test. If you want to add a new type of Learner (a partitioning Decision Tree learner perhaps? ) you need to implement this interface . LearningDemo.java contains examples of how to use all the learners . LearnerTests may be of help too. There are specific test files for Decison Trees, Decision Lists and Neural networks. #Probabilistic Decision Making and reinforcement learning TBD Final ThoughtsIf you need any help with the java code, do write to me at magesmail@yahoo.com. I am happy to receive any mails/bug reports and generally respond within a day, unless I am travelling .The only mails I do NOT respond to are those asking me to do your homework! Don't even try ! :-) These mails are rejected without even reading them! Bug Reports are greatly appreciated! when you send in a bug report please include
A bug report that says "there is some bug in Search" (I actually got a mail like this) is next to useless. |
Sign in to add a comment