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); }
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(); }
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?"); } }
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); }
private void InitSolver() { IPenaltyCalculator calc = CalculatorFactory.Generate(CalculatorType.NeighborMergeAndCorner); solver = SolverFactory.Generate(SolverType.WeightedMultiSteps, calc); }
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); }