예제 #1
0
        /// <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);
        }