/* * Constraint Programming (M) * Author: Aidan Smeaton (0800972) */ //package samples; import static choco.Choco.abs; import static choco.Choco.allDifferent; import static choco.Choco.eq; import static choco.Choco.makeIntVar; import static choco.Choco.minus; import choco.cp.model.CPModel; import choco.cp.solver.CPSolver; import choco.kernel.model.Model; import choco.kernel.model.variables.integer.IntegerVariable; import choco.kernel.solver.Solver; public class AZebra { // index variables // only used as array indices and for printing a "pretty" answer // house public static final int RED = 0; public static final int BLUE = 1; public static final int YELLOW = 2; public static final int GREEN = 3; public static final int IVORY = 4; public static final String[] colours = {"Red","Blue","Yellow","Green","Ivory"}; // cigarette public static final int OLDGOLD = 0; public static final int PARLIAMENT = 1; public static final int KOOLS = 2; public static final int LUCKY = 3; public static final int CHESTERFIELD = 4; public static final String[] cigarettes = {"Old-Gold","Parliament","Kools","Lucky","Chesterfield"}; // nationality public static final int NORWEGIAN = 0; public static final int UKRANIAN = 1; public static final int ENGLISHMAN = 2; public static final int SPANIARD = 3; public static final int JAPANESE = 4; public static final String[] nationalities = {"Norwegian","Ukranian","Englishman","Spaniard","Japanese"}; // pet public static final int ZEBRA = 0; public static final int DOG = 1; public static final int HORSE = 2; public static final int FOX = 3; public static final int SNAILS = 4; public static final String[] pets = {"Zebra","Dog","Horse","Fox","Snails"}; // drink public static final int COFFEE = 0; public static final int TEA = 1; public static final int WATER = 2; public static final int MILK = 3; public static final int ORANGE = 4; public static final String[] drinks = {"Coffee","Tea","Water","Milk","Orange"}; public static void main(String[] args) { Model m = new CPModel(); IntegerVariable[] colour = new IntegerVariable[5]; IntegerVariable[] cigarette = new IntegerVariable[5]; IntegerVariable[] nationality = new IntegerVariable[5]; IntegerVariable[] pet = new IntegerVariable[5]; IntegerVariable[] drink = new IntegerVariable[5]; for (int i=0;i<5;i++) colour[i] = makeIntVar("house["+ i +"]",0,4); for (int i=0;i<5;i++) cigarette[i] = makeIntVar("cigarette["+ i +"]",0,4); for (int i=0;i<5;i++) nationality[i] = makeIntVar("nationality["+ i +"]",0,4); for (int i=0;i<5;i++) pet[i] = makeIntVar("pet"+ i +"]",0,4); for (int i=0;i<5;i++) drink[i] = makeIntVar("drink["+ i +"]",0,4); m.addConstraint(allDifferent(colour)); m.addConstraint(allDifferent(cigarette)); m.addConstraint(allDifferent(nationality)); m.addConstraint(allDifferent(pet)); m.addConstraint(allDifferent(drink)); m.addConstraint(eq(nationality[ENGLISHMAN], colour[RED])); m.addConstraint(eq(nationality[SPANIARD], pet[DOG])); m.addConstraint(eq(colour[GREEN], drink[COFFEE])); m.addConstraint(eq(nationality[UKRANIAN], drink[TEA])); m.addConstraint(eq(minus(colour[GREEN],colour[IVORY]),1)); // green is to the right of ivory m.addConstraint(eq(cigarette[OLDGOLD], pet[SNAILS])); m.addConstraint(eq(colour[YELLOW], cigarette[KOOLS])); m.addConstraint(eq(drink[MILK], 2)); // milk is drunk in the middle house m.addConstraint(eq(nationality[NORWEGIAN], 0)); // norwegian lives in the first house on the left m.addConstraint(eq(abs(minus(cigarette[CHESTERFIELD],pet[FOX])),1)); // chesterfield smoker lives next to the fox owner m.addConstraint(eq(abs(minus(cigarette[KOOLS],pet[HORSE])),1)); // kools smoker lives next to horse owner m.addConstraint(eq(drink[ORANGE], cigarette[LUCKY])); m.addConstraint(eq(nationality[JAPANESE], cigarette[PARLIAMENT])); m.addConstraint(eq(abs(minus(nationality[NORWEGIAN],colour[BLUE])),1)); // norwegian lives next to blue house Solver s = new CPSolver(); s.read(m); // 5 meaningful strings suitable for printing String houses[][] = new String[5][5]; if (s.solve().booleanValue()){ System.out.println("nbSol: " + s.getNbSolutions()); System.out.println(); for (int i=0;i<5;i++){ // print matrix // System.out.println("[" + s.getVar(colour[i]).getVal() + " : " // + s.getVar(cigarette[i]).getVal() + " : " // + s.getVar(nationality[i]).getVal() + " : " // + s.getVar(pet[i]).getVal() + " : " // + s.getVar(drink[i]).getVal() + "]"); // organise matrix values for printing meaningful string houses[s.getVar(colour[i]).getVal()][0] = colours[i]; houses[s.getVar(cigarette[i]).getVal()][1] = cigarettes[i]; houses[s.getVar(nationality[i]).getVal()][2] = nationalities[i]; houses[s.getVar(pet[i]).getVal()][3] = pets[i]; houses[s.getVar(drink[i]).getVal()][4] = drinks[i]; } // print strings for (int j=0;j<5;j++){ System.out.println("[" + houses[j][0] + " : " + houses[j][1] + " : " + houses[j][2] + " : " + houses[j][3] + " : " + houses[j][4] + "]"); } } } }