/** * Template method, which can be configured by overriding the three * primitive operations below. */ private Assignment recursiveBackTrackingSearch(CSP csp, Assignment assignment) { Assignment result = null; if (assignment.isComplete(csp.getVariables())) { result = assignment; } else { Variable var = selectUnassignedVariable(assignment, csp); foreach (Object value in orderDomainValues(var, assignment, csp)) { assignment.setAssignment(var, value); fireStateChanged(assignment, csp); if (assignment.isConsistent(csp.getConstraints(var))) { DomainRestoreInfo info = inference(var, assignment, csp); if (!info.isEmpty()) fireStateChanged(csp); if (!info.isEmptyDomainFound()) { result = recursiveBackTrackingSearch(csp, assignment); if (result != null) break; } info.restoreDomains(csp); } assignment.removeAssignment(var); } } return result; }
/** * Makes a CSP consisting of binary constraints arc-consistent. * @return An object which indicates success/failure and contains * data to undo the operation. */ public DomainRestoreInfo reduceDomains(CSP csp) { DomainRestoreInfo result = new DomainRestoreInfo(); FIFOQueue<Variable> queue = new FIFOQueue<Variable>(); foreach (Variable var in csp.getVariables()) queue.Add(var); reduceDomains(queue, csp, result); return result.compactify(); }
private Assignment generateRandomAssignment(CSP csp) { Assignment assignment = new Assignment(); foreach (Variable var in csp.getVariables()) { Object randomValue = Util.selectRandomlyFromList(csp.getDomain(var) .asList()); assignment.setAssignment(var, randomValue); } return assignment; }
/** * Primitive operation, selecting a not yet assigned variable. This default * implementation just selects the first in the ordered list of variables * provided by the CSP. */ protected Variable selectUnassignedVariable(Assignment assignment, CSP csp) { foreach (Variable var in csp.getVariables()) { if (!(assignment.hasAssignmentFor(var))) { return(var); } } return(null); }
private Assignment generateRandomAssignment(CSP csp) { Assignment assignment = new Assignment(); foreach (Variable var in csp.getVariables()) { Object randomValue = Util.selectRandomlyFromList(csp.getDomain(var) .asList()); assignment.setAssignment(var, randomValue); } return(assignment); }
/** * Makes a CSP consisting of binary constraints arc-consistent. * @return An object which indicates success/failure and contains * data to undo the operation. */ public DomainRestoreInfo reduceDomains(CSP csp) { DomainRestoreInfo result = new DomainRestoreInfo(); FIFOQueue <Variable> queue = new FIFOQueue <Variable>(); foreach (Variable var in csp.getVariables()) { queue.Add(var); } reduceDomains(queue, csp, result); return(result.compactify()); }
/** * Primitive operation, selecting a not yet assigned variable. */ protected override Variable selectUnassignedVariable(Assignment assignment, CSP csp) { switch (selectionStrategy) { case MRV: return applyMRVHeuristic(csp, assignment).get(0); case MRV_DEG: List<Variable> vars = applyMRVHeuristic(csp, assignment); return applyDegreeHeuristic(vars, assignment, csp).get(0); default: foreach (Variable var in csp.getVariables()) { if (!(assignment.hasAssignmentFor(var))) return var; } } return null; }
/** * Primitive operation, selecting a not yet assigned variable. */ protected override Variable selectUnassignedVariable(Assignment assignment, CSP csp) { switch (selectionStrategy) { case MRV: return(applyMRVHeuristic(csp, assignment).get(0)); case MRV_DEG: List <Variable> vars = applyMRVHeuristic(csp, assignment); return(applyDegreeHeuristic(vars, assignment, csp).get(0)); default: foreach (Variable var in csp.getVariables()) { if (!(assignment.hasAssignmentFor(var))) { return(var); } } } return(null); }
/** * Template method, which can be configured by overriding the three * primitive operations below. */ private Assignment recursiveBackTrackingSearch(CSP csp, Assignment assignment) { Assignment result = null; if (assignment.isComplete(csp.getVariables())) { result = assignment; } else { Variable var = selectUnassignedVariable(assignment, csp); foreach (Object value in orderDomainValues(var, assignment, csp)) { assignment.setAssignment(var, value); fireStateChanged(assignment, csp); if (assignment.isConsistent(csp.getConstraints(var))) { DomainRestoreInfo info = inference(var, assignment, csp); if (!info.isEmpty()) { fireStateChanged(csp); } if (!info.isEmptyDomainFound()) { result = recursiveBackTrackingSearch(csp, assignment); if (result != null) { break; } } info.restoreDomains(csp); } assignment.removeAssignment(var); } } return(result); }
// ////////////////////////////////////////////////////////////// // heuristics for selecting the next unassigned variable and domain ordering /** : the minimum-remaining-values heuristic. */ private List <Variable> applyMRVHeuristic(CSP csp, Assignment assignment) { List <Variable> result = new List <Variable>(); int mrv = int.MAX_VALUE; foreach (Variable var in csp.getVariables()) { if (!assignment.hasAssignmentFor(var)) { int num = csp.getDomain(var).Count; if (num <= mrv) { if (num < mrv) { result.clear(); mrv = num; } result.Add(var); } } } return(result); }
/** * Returns true if this assignment is consistent as well as complete with * respect to the given CSP. */ public bool isSolution(CSP csp) { return(isConsistent(csp.getConstraints()) && isComplete(csp.getVariables())); }
/** * Primitive operation, selecting a not yet assigned variable. This default * implementation just selects the first in the ordered list of variables * provided by the CSP. */ protected Variable selectUnassignedVariable(Assignment assignment, CSP csp) { foreach (Variable var in csp.getVariables()) { if (!(assignment.hasAssignmentFor(var))) return var; } return null; }
/** * Returns true if this assignment is consistent as well as complete with * respect to the given CSP. */ public bool isSolution(CSP csp) { return isConsistent(csp.getConstraints()) && isComplete(csp.getVariables()); }
// ////////////////////////////////////////////////////////////// // heuristics for selecting the next unassigned variable and domain ordering /** : the minimum-remaining-values heuristic. */ private List<Variable> applyMRVHeuristic(CSP csp, Assignment assignment) { List<Variable> result = new List<Variable>(); int mrv = int.MAX_VALUE; foreach (Variable var in csp.getVariables()) { if (!assignment.hasAssignmentFor(var)) { int num = csp.getDomain(var).Count; if (num <= mrv) { if (num < mrv) { result.clear(); mrv = num; } result.Add(var); } } } return result; }