private Assignment recursiveBackTrackingSearch(Assignment anAssignment) { if (anAssignment.isComplete()) { return anAssignment; } string variable = anAssignment.selectFirstUnassignedVariable(); ArrayList domainValues = defaultOrderDomainOf(variable); for (int i = 0; i < domainValues.Count; i++) { Object value = domainValues[i]; if (constraints.isSatisfiedWith(anAssignment, variable, value)) { anAssignment.setAssignment(variable, value); Assignment result = recursiveBackTrackingSearch(anAssignment); if (result != null) { return result; } anAssignment.remove(variable); } } return null;//failure }
public bool isSatisfiedWith(Assignment assignment, string variable, Object value) { ArrayList variableNeighbors = (ArrayList) neighbors[variable]; for (int i = 0; i < variableNeighbors.Count; i++) { string neighbor = variableNeighbors[i].ToString(); if (assignment.hasAssignmentFor(neighbor)) { string neighborColor = assignment.getAssignment(neighbor).ToString(); if (neighborColor.Equals(value)) { return false; } } } return true; }
public Assignment copy() { Assignment _copy = new Assignment(); for (int i = 0; i < variables.Count; i++) { _copy.variables.Add(variables[i]); } //Iterator iter = hash.keySet().iterator(); IEnumerator iter = hash.Keys.GetEnumerator(); while (iter.MoveNext()) { Object key = iter.Current; //copy.hash.put(key, hash.get(key)); _copy.hash.Add(key,hash[key]); } return _copy; }
private bool passesUnique(string s1, string s2, Assignment a2) { if (a2.hasAssignmentFor(s1) && a2.hasAssignmentFor(s2)) if (a2.getAssignment(s1).Equals(a2.getAssignment(s2))) return false; return true; }
/* * returns false if the assignment has more than one of each class assigned to it * (ie color, cigarette, drink, etc) */ private bool passesUniqueClass(string s1, string s2,string s3, string s4, string s5, Assignment assignment) { if (!passesUnique(s1,s2,assignment))return false; if (!passesUnique(s1,s3,assignment))return false; if (!passesUnique(s1,s4,assignment))return false; if (!passesUnique(s1,s5,assignment))return false; if (!passesUnique(s2,s3,assignment))return false; if (!passesUnique(s2,s4,assignment))return false; if (!passesUnique(s2,s5,assignment))return false; if (!passesUnique(s3,s4,assignment))return false; if (!passesUnique(s3,s5,assignment))return false; if (!passesUnique(s4,s5,assignment))return false; return true; }
public bool isSatisfiedWith( Assignment assignment, string variable, Object value) { //Checking constraints int intVal = int.Parse(value.ToString()); Assignment a2 = assignment.copy(); a2.setAssignment(variable, value); //uniqueness constraints //colours if (!passesUniqueClass("blue","yellow","red","green","ivory",a2))return false; //drinks if (!passesUniqueClass("coffee","tea","milk","juice","water",a2))return false; //nationality if (!passesUniqueClass("norwegian","englishman","japanese","ukrainian","spaniard",a2))return false; // pets if (!passesUniqueClass("fox","horse","dog","snails","zebra",a2))return false; // cigarettes if (!passesUniqueClass("parliament","kools","lucky-strike","chesterfield","old-gold",a2))return false; //14 constraints: //1 if (a2.hasAssignmentFor("englishman") && a2.hasAssignmentFor("red")) if (!a2.getAssignment("englishman").Equals(a2.getAssignment("red"))) return false; //2 if (a2.hasAssignmentFor("spaniard") && a2.hasAssignmentFor("dog")) if (!a2.getAssignment("spaniard").Equals(a2.getAssignment("dog"))) return false; //3 if (a2.hasAssignmentFor("coffee") && a2.hasAssignmentFor("green")) if (!a2.getAssignment("coffee").Equals(a2.getAssignment("green"))) return false; //4 if (a2.hasAssignmentFor("ukrainian") && a2.hasAssignmentFor("tea")) if (!a2.getAssignment("ukrainian").Equals(a2.getAssignment("tea"))) return false; //5 if (a2.hasAssignmentFor("green") && a2.hasAssignmentFor("ivory")) { //green must be directly to the right of ivory int intGreen = int.Parse(a2.getAssignment("green").ToString()); int intIvory = int.Parse(a2.getAssignment("ivory").ToString()); if ((intGreen - intIvory) != 1) return false; } //6 if (a2.hasAssignmentFor("old-gold") && a2.hasAssignmentFor("snails")) if (!a2.getAssignment("old-gold").Equals(a2.getAssignment("snails"))) return false; //7 if (a2.hasAssignmentFor("kools") && a2.hasAssignmentFor("yellow")) if (!a2.getAssignment("kools").Equals(a2.getAssignment("yellow"))) return false; //8 if (a2.hasAssignmentFor("milk")) { int intMilk = int.Parse(a2.getAssignment("milk").ToString()); if (intMilk != 3) return false; } //9 if (a2.hasAssignmentFor("norwegian")) { int intNorwegian = int.Parse(a2.getAssignment("norwegian").ToString()); if (intNorwegian != 1) return false; } //10. if (a2.hasAssignmentFor("chesterfield") && a2.hasAssignmentFor("fox")) { int int1 = int.Parse( a2.getAssignment("chesterfield").ToString()); int int2 = int.Parse(a2.getAssignment("fox").ToString()); if (System.Math.Abs(int1 - int2) != 1) return false; } //11. if (a2.hasAssignmentFor("kools") && a2.hasAssignmentFor("horse")) { int int1 = int.Parse((String) a2.getAssignment("kools").ToString()); int int2 = int.Parse((String) a2.getAssignment("horse").ToString()); if (System.Math.Abs(int1 - int2) != 1) return false; } //12 if (a2.hasAssignmentFor("lucky-strike") && a2.hasAssignmentFor("juice")) if (!a2.getAssignment("lucky-strike").Equals(a2.getAssignment("juice"))) return false; //13. if (a2.hasAssignmentFor("japanese") && a2.hasAssignmentFor("parliament")) if (!a2.getAssignment("japanese").Equals(a2.getAssignment("parliament"))) return false; //14. if (a2.hasAssignmentFor("norwegian") && a2.hasAssignmentFor("blue")) { int int1 = int.Parse(a2.getAssignment("norwegian").ToString()); int int2 = int.Parse(a2.getAssignment("blue").ToString()); if (System.Math.Abs(int1 - int2) != 1) return false; } return true; }
private Assignment generateRandomAssignment() { ArrayList vars = new ArrayList(); for (int i = 0; i < variables.Count; i++) { vars.Add(variables[i]); } Assignment assignment = new Assignment(vars); for (int i = 0; i < variables.Count; i++) { string variable = variables[i].ToString(); Object randomValue = Util.selectRandomlyFromList(domains .getDomainOf(variable)); //System.out.println("in generate Assignment setting"); assignment.setAssignment(variable, randomValue); } return assignment; }