/// <summary> /// Backtrack through a variable's value sets until one is found that is arc consistent. /// </summary> /// <param name="currentVariableIndex">Current variable index.</param> /// <param name="snapshotAssignment">Current snapshot of value sets.</param> /// <param name="constraintNetwork">Constraint network.</param> /// <returns>True if a value is found to be consistent, False if a value is not found.</returns> private bool Backtrack(int currentVariableIndex, SnapshotLabelAssignment snapshotAssignment, ConstraintNetwork constraintNetwork) { // Label assignment has been successful... if (snapshotAssignment.IsComplete() && AllVariablesTested(currentVariableIndex)) { return(true); } // The unassigned variable may be a regular variable or an encapsulated variable var currentVariable = SelectUnassignedVariable(currentVariableIndex, constraintNetwork, snapshotAssignment); foreach (var value in OrderDomainValues(currentVariable, snapshotAssignment, constraintNetwork)) { if (IsConsistent(value, snapshotAssignment)) { snapshotAssignment.AssignTo(value); // Is this the final variable? if (AllVariablesTested(currentVariableIndex)) { return(true); } if (Backtrack(currentVariableIndex + 1, snapshotAssignment, constraintNetwork)) { return(true); } } snapshotAssignment.Remove(value); } return(false); }