package dkohl.bayes.example.builders; import java.util.LinkedList; import dkohl.bayes.bayesnet.BayesNet; import dkohl.bayes.probability.Assignment; import dkohl.bayes.probability.Probability; import dkohl.bayes.probability.Variable; import dkohl.bayes.probability.distribution.ProbabilityTable; /** * The alarm example for baysian nets. * * Stuart Russel, Peter Norvig: Artificial Intelligence: A Modern Approach, 3ed * Edition, Prentice Hall, 2010 * * @author Daniel Kohlsdorf */ public class AlarmNetBuilderTable { // Variable names public static final String BURGLARY = "Burglary"; public static final String EARTHQUAKE = "Earthquake"; public static final String ALARM = "Alarm"; public static final String JOHN = "John"; public static final String MARRY = "Marry"; // Possible outcomes public static final String TRUE = "true"; public static final String FALSE = "false"; // A variables domain public static final String DOMAIN[] = { TRUE, FALSE }; // A set of variables public static final String VARIABLES[] = { BURGLARY, EARTHQUAKE, ALARM, JOHN, MARRY }; /** * Builds the query from the book: P(B| j, m) */ public static LinkedList completeQueryBulgary() { LinkedList assignment = new LinkedList(); assignment.add(new Assignment(new Variable(JOHN, DOMAIN), TRUE)); assignment.add(new Assignment(new Variable(MARRY, DOMAIN), TRUE)); return new LinkedList(assignment); } /** * Build burglary prior * * @param alarmNet */ private static void burglary(BayesNet alarmNet) { Probability p_bulglary = new Probability(0.001); String names[] = { BURGLARY }; ProbabilityTable burglary = new ProbabilityTable(names); burglary.setProbabilityForAssignment("true;", p_bulglary); burglary.setProbabilityForAssignment("false;", p_bulglary.rest()); alarmNet.setDistribution(new Variable(BURGLARY, DOMAIN), burglary); } /** * Build earthquake prior * * @param alarmNet */ private static void earthquake(BayesNet alarmNet) { Probability p_earthquake = new Probability(0.002); String names[] = { EARTHQUAKE }; ProbabilityTable earthquake = new ProbabilityTable(names); earthquake.setProbabilityForAssignment("true;", p_earthquake); earthquake.setProbabilityForAssignment("false;", p_earthquake.rest()); alarmNet.setDistribution(new Variable(EARTHQUAKE, DOMAIN), earthquake); } /** * Jhon calls! * * @param alarmNet */ private static void jhon(BayesNet alarmNet) { // P(ALARM) == true Probability t = new Probability(.90); // P(ALARM) == false Probability f = new Probability(.05); String names[] = { ALARM, JOHN }; ProbabilityTable jhon = new ProbabilityTable(names); jhon.setProbabilityForAssignment("true;true;", t); jhon.setProbabilityForAssignment("false;true;", f); jhon.setProbabilityForAssignment("true;false", t.rest()); jhon.setProbabilityForAssignment("false;false;", f.rest()); alarmNet.setDistribution(new Variable(JOHN, DOMAIN), jhon); } /** * Marry calls! * * @param alarmNet */ private static void mary(BayesNet alarmNet) { // P(ALARM) == true Probability t = new Probability(.70); // P(ALARM) == false Probability f = new Probability(.01); String names[] = { ALARM, MARRY }; ProbabilityTable marry = new ProbabilityTable(names); marry.setProbabilityForAssignment("true;true;", t); marry.setProbabilityForAssignment("false;true;", f); marry.setProbabilityForAssignment("true;false", t.rest()); marry.setProbabilityForAssignment("false;false;", f.rest()); alarmNet.setDistribution(new Variable(MARRY, DOMAIN), marry); } /** * The alarm goes off! * * @param alarmNet */ private static void alarm(BayesNet alarmNet) { // P(ALARM | BURGLARY = true, EARTHQUAKE = true) Probability tt = new Probability(.95); // P(ALARM | BURGLARY = true, EARTHQUAKE = false) Probability tf = new Probability(.94); // P(ALARM | BURGLARY = false, EARTHQUAKE = true) Probability ft = new Probability(.29); // P(ALARM | BURGLARY = false, EARTHQUAKE = false) Probability ff = new Probability(.001); String names[] = { BURGLARY, EARTHQUAKE, ALARM }; ProbabilityTable alarm = new ProbabilityTable(names); alarm.setProbabilityForAssignment(TRUE + ";" + TRUE + ";" + TRUE + ";", tt); alarm.setProbabilityForAssignment( TRUE + ";" + FALSE + ";" + TRUE + ";", tf); alarm.setProbabilityForAssignment( FALSE + ";" + TRUE + ";" + TRUE + ";", ft); alarm.setProbabilityForAssignment(FALSE + ";" + FALSE + ";" + TRUE + ";", ff); alarm.setProbabilityForAssignment( TRUE + ";" + TRUE + ";" + FALSE + ";", tt.rest()); alarm.setProbabilityForAssignment(TRUE + ";" + FALSE + ";" + FALSE + ";", tf.rest()); alarm.setProbabilityForAssignment(FALSE + ";" + TRUE + ";" + FALSE + ";", ft.rest()); alarm.setProbabilityForAssignment(FALSE + ";" + FALSE + ";" + FALSE + ";", ff.rest()); alarmNet.setDistribution(new Variable(ALARM, DOMAIN), alarm); } public static BayesNet alarm() { BayesNet alarmNet = new BayesNet(VARIABLES); // set probability tables and priors burglary(alarmNet); earthquake(alarmNet); alarm(alarmNet); jhon(alarmNet); mary(alarmNet); // construct the graph alarmNet.connect(ALARM, BURGLARY); alarmNet.connect(ALARM, EARTHQUAKE); alarmNet.connect(JOHN, ALARM); alarmNet.connect(MARRY, ALARM); return alarmNet; } }