private List <RouteSet> BuildSolutionPool <TProcedure, TParameters>(double overloadFactor, int shakings, Exploration expCondition, Random rdObj, List <Func <RouteSet, Exploration, Random, RouteSet> > neighborhoods, List <Func <RouteSet, Random, RouteSet> > shakingProcedures, TProcedure procedure, TParameters parameters, List <RouteSet> initialPool) where TProcedure : LocalSearchProcedure <RouteSet, TParameters>
        {
            List <RouteSet> solutionPool = new List <RouteSet>();

            foreach (var solution in initialPool)
            {
                overloadFactor = 0;
                RouteSet current = solution;
                for (int i = 0; i < shakings; i++)
                {
                    current = shakingProcedures[rdObj.Next(shakingProcedures.Count)](current, rdObj);
                    current = procedure.Solve(parameters, current, neighborhoods, expCondition, GetCost, rdObj);
                    var clone = (RouteSet)current.Clone();
                    clone.CleanUnusedRoutes();
                    solutionPool.Add(clone);
                    if (!ProblemData.IsStrongFeasible(current))
                    {
                        OverloadFactor += overloadFactor;
                    }
                }
            }
            return(solutionPool);
        }