public BacktrackingSolver(ICombinatoricsProblem <TPart> problem)
        {
            if (problem == null)
            {
                throw new ArgumentNullException("problem");
            }

            this.problem = problem;
        }
        static double GetPosition(ICombinatoricsProblem <TPart> problem, IEnumerable <TPart> configuration)
        {
            if (!configuration.Any())
            {
                return(0);
            }

            double headFraction = (double)problem.Parts.GetIndex(configuration.First()) / (double)problem.Parts.Count();
            double tailFraction = GetPosition(problem, configuration.Skip(1).ToArray()) / (double)problem.Parts.Count();

            return(headFraction + tailFraction);
        }