private async Task <Assignment <Tval> > Backtrack(ConstraintSatisfactionProblem <Tval> csp, Assignment <Tval> assignment) { if (assignment.IsComplete(csp.GetVariables())) { return(assignment); } Variable <Tval> variable = variableSelectionStrategy.SelectUnassignedVariable(csp, assignment); foreach (Tval value in domainValueSelectionStragety.getOrderedDomainValues(variable, assignment, csp)) { assignment.Assign(variable, value); OnVariableAssigned(variable, value); InferenceResults <Tval> inference = new InferenceResults <Tval>(); inference.StoreDomainForVariable(variable, variable.GetDomain()); variable.UpdateDomain(new Domain <Tval>(value)); // it should already be consistent if it reached this point // since we make a pre-solving inference //bool isConsistent = assignment.IsConsistent(csp.GetAllDiffConstraints()); //if (isConsistent) if (true) { inference = await inferenceStrategy.Infer(csp, variable, value, inference); if (inference.IsAssignmentConsistent()) { Assignment <Tval> result = await Backtrack(csp, assignment); if (result != null) { return(result); } } } assignment.RemoveAssignment(variable); OnAssignmentRemoved(variable, value); inference.RestoreOldDomains(); } return(null); }
public override async Task <Assignment <Tval> > Solve(ConstraintSatisfactionProblem <Tval> csp, Assignment <Tval> initialAssignment = null) { initialAssignment = initialAssignment ?? new Assignment <Tval>(); InferenceResults <Tval> preliminaryResults = await inferenceStrategy.Infer(csp); if (preliminaryResults.IsAssignmentConsistent()) { Assignment <Tval> solution = await Backtrack(csp, initialAssignment); if (solution != null) { OnSolutionFound(solution); return(solution); } } OnNoSolutionFound(); return(null); }