private Assignment <Var, Val> Backtrack(CSP <Var, Val> csp, Assignment <Var, Val> assignment) { if (assignment.IsComplete(csp.Variables)) { return(assignment); } Assignment <Var, Val> result = null; var var = SelectUnassignedVariable(csp, assignment); foreach (var value in OrderDomainValues(csp, assignment, var)) { assignment.Add(var, value); if (assignment.IsConsistent(csp.GetConstraints(var))) { var log = Inference(csp, assignment, var); if (!log.IsConsistencyFound()) { result = Backtrack(csp, assignment); if (result != null) { break; } } log.Undo(csp); } assignment.Remove(var); } return(result); }
private static int CountLostValues(CSP <Var, Val> csp, Assignment <Var, Val> assignment, Var var, Val value) { var result = 0; var assign = new Assignment <Var, Val>(); assign.Add(var, value); foreach (var constraint in csp.GetConstraints(var)) { if (constraint.GetScope().Count() == 2) { Var neighbor = csp.GetNeighbor(var, constraint); if (!assignment.Contains(neighbor)) { foreach (var val in csp.GetDomain(neighbor)) { assign.Add(neighbor, val); if (!constraint.IsSatisfiedWith(assign)) { ++result; } } } } } return(result); }
public IEnumerable <Var> Apply(CSP <Var, Val> csp, IEnumerable <Var> vars) { var result = new List <Var>(); var maxDegree = -1; foreach (var var in vars) { var degree = csp.GetConstraints(var).Count(); if (degree > maxDegree) { result.Clear(); maxDegree = degree; } if (degree == maxDegree) { result.Add(var); } } return(result); }