Esempio n. 1
0
 internal OneStepSolver(IPenaltyCalculator injectedPenalty)
 {
     if (injectedPenalty == null)
     {
         injectedPenalty = new NeighborPenaltyCalculator();
     }
     penaltyCalculator = injectedPenalty;
 }
 internal WeightedMultiStepsSolver(IPenaltyCalculator injectedPenalty)
 {
     if (injectedPenalty == null)
     {
         injectedPenalty = new NeighborPenaltyCalculator();
     }
     penalty       = injectedPenalty;
     oneStepSolver = new OneStepSolver(penalty);
 }
Esempio n. 3
0
        public GRASPManager(List <Instance> dataset, int vehicleCount, float vehicleCapacity)
        {
            this.vehicleCapacity = vehicleCapacity;
            this.vehicleCount    = vehicleCount;
            this.dataset         = dataset;
            InitVehicleCapacityAndTW();

            distanceCalculator = new DistanceCalculator();
            evaluator          = new Evaluator();
            greedyAlgorithm    = new GreedyAlgorithm(dataset, distanceCalculator, evaluator);
            penaltyCalculator  = new PenaltyCalculator();
            localSearchTwoOpt  = new LocalSearchTwoOpt();
            localSearchSwap    = new LocalSearchSwap();
        }
Esempio n. 4
0
        public static ISolver Generate(SolverType type, IPenaltyCalculator calc)
        {
            switch (type)
            {
            case SolverType.Simple:
                return(new SimpleSolver());

            case SolverType.OneStep:
                return(new OneStepSolver(calc));

            case SolverType.MultiSteps:
                return(new MultiStepsSolver(calc));

            case SolverType.DynamicMultiSteps:
                return(new DynamicMultiStepsSolver(calc));

            case SolverType.WeightedMultiSteps:
                return(new WeightedMultiStepsSolver(calc));

            default:
                throw new InvalidOperationException("What solver type?");
            }
        }
Esempio n. 5
0
        public List <List <int> > Run(List <Instance> dataset, List <List <int> > currentRoute,
                                      IEvaluator evaluator, IDistanceCalculator distanceCalculator, IPenaltyCalculator penaltyCalculator)
        {
            int k = 0;

            while (k < Parameters.MAX_LOCAL_SEARCH_TWO_OPT_ITERATION)
            {
                var oldRouteBeforeLocalSearch = GRASPHelper.CopySolution(currentRoute);
                for (int g = 0; g < currentRoute.Count; g++)
                {
                    for (int i = 1; i < currentRoute[g].Count - 2; i++)
                    {
                        for (int j = i + 1; j < currentRoute[g].Count; j++)
                        {
                            double oldRouteQuality = evaluator.EvaluateRoute(dataset, currentRoute[g], distanceCalculator, penaltyCalculator);

                            var newRoute = twoOptSwap(currentRoute[g], i, j);

                            double newRouteQuality = evaluator.EvaluateRoute(dataset, newRoute, distanceCalculator, penaltyCalculator);

                            if (newRouteQuality < oldRouteQuality && evaluator.CanExistWithCurrentTimeWindows(dataset, newRoute, distanceCalculator))
                            {
                                currentRoute[g] = newRoute;
                            }
                        }
                    }
                }

                if (evaluator.isRoutesSame(currentRoute, oldRouteBeforeLocalSearch))
                {
                    break;
                }
                k++;
            }

            return(currentRoute);
        }
Esempio n. 6
0
        private void InitSolver()
        {
            IPenaltyCalculator calc = CalculatorFactory.Generate(CalculatorType.NeighborMergeAndCorner);

            solver = SolverFactory.Generate(SolverType.WeightedMultiSteps, calc);
        }
Esempio n. 7
0
 public CountryController()
 {
     this.PenaltyCalculator = BindingConfig.GetPenaltyCalculator();
 }
        public List <List <int> > Run(List <Instance> dataset, List <List <int> > currentRoute,
                                      IEvaluator evaluator, IDistanceCalculator distanceCalculator, IPenaltyCalculator penaltyCalculator)
        {
            int k = 0;

            while (k < Parameters.MAX_LOCAL_SEARCH_SWAP_ITERATION)
            {
                var    oldRouteBeforeLocalSearchCopy = GRASPHelper.CopySolution(currentRoute);
                double oldQuality = evaluator.EvaluateGlobalRoute(dataset, oldRouteBeforeLocalSearchCopy, distanceCalculator, penaltyCalculator);

                bool WasIpmroved = false;
                for (int g = 0; g < currentRoute.Count && !WasIpmroved; g++)
                {
                    if (currentRoute[g].Count <= 2)
                    {
                        continue;
                    }

                    for (int z = 0; z < currentRoute.Count && !WasIpmroved; z++)
                    {
                        if (g == z)
                        {
                            continue;
                        }

                        //current route
                        for (int i = 1; i < currentRoute[g].Count && !WasIpmroved; i++)
                        {
                            int pointFromDiffRoute = currentRoute[g][i];
                            //next route
                            for (int j = 1; j < currentRoute[z].Count && !WasIpmroved; j++)
                            {
                                var tmp_copy = GRASPHelper.CopySolution(oldRouteBeforeLocalSearchCopy);

                                tmp_copy[z].Insert(j, pointFromDiffRoute);

                                if (!evaluator.CanExistWithCurrentTimeWindows(dataset, tmp_copy[z], distanceCalculator))
                                {
                                    continue;
                                }

                                tmp_copy[g].RemoveAt(i);
                                double localQuality = evaluator.EvaluateGlobalRoute(dataset, tmp_copy, distanceCalculator, penaltyCalculator);

                                if (localQuality < oldQuality)
                                {
                                    currentRoute = tmp_copy;
                                    WasIpmroved  = true;
                                }
                            }
                        }
                    }
                }

                if (!WasIpmroved)
                {
                    break;
                }
                k++;
            }

            return(currentRoute);
        }