static void MeasureRelativeErrors(Func <Knapsack, KnapsackSolution> solveKnapsack, string directoryPath) { if (!Directory.Exists(directoryPath)) { Console.WriteLine("Directory '{0}' does not exist.", directoryPath); return; } var knapsacksFiles = Directory.EnumerateFiles(directoryPath, "knap_*.dat").ToList(); var relativeErrors = new List <double>(); for (int i = 0; i < knapsacksFiles.Count; i += 2) { var bestPrices = LoadBestPricesFromSolutionFile(knapsacksFiles[i + 1]); var knapsacks = KnapsackLoader.LoadKnapsacks(knapsacksFiles[i], KnapsackLoader.KnapsackPerFile).ToList(); for (int j = 0; j < knapsacks.Count; j++) { var result = solveKnapsack(knapsacks[j]); relativeErrors.Add(ComputeRelativeError(bestPrices[j], result.BestPrice)); } } Console.WriteLine($"Average relative error is {relativeErrors.Average()}."); Console.WriteLine($"Max relative error is {relativeErrors.Max()}."); }
/* args: * [0] - a path to a test file * [1] - a path to a solution file * [2] - how many times repeat a test * [3] - whether to save results * [4 ...] - GA arguments */ static void Main(string[] args) { var genAlgArgs = ParseArguments(args); if (genAlgArgs == null) { Console.ReadLine(); return; } var ga = new GeneticAlgorithm(genAlgArgs); var results = new List <KnapsackSolution>(); foreach (var knapsack in KnapsackLoader.LoadKnapsacks(args[0], KnapsackLoader.KnapsackPerFile)) { Console.WriteLine($"---Starting knapsack {knapsack.Id}---"); results.Add(ga.Solve(knapsack)); } if (bool.Parse(args[3])) { SaveSolutions(results); } var bestPrices = LoadBestPricesFromSolutionFile(args[1]); var relativeErrors = results.Select((result, index) => ComputeRelativeError(bestPrices[index], result.BestPrice)).ToList(); Console.WriteLine($"Average relative error is {relativeErrors.Average()}."); Console.WriteLine($"Max relative error is {relativeErrors.Max()}."); Console.ReadLine(); }
/* args: * [0] - a path to directory with testing files * [1] - how many files to use for testing * [2] - how many times repeat a single file * [3] - bf / sbf / heur * [4] - whether to save results */ static void Main(string[] args) { var testFiles = LoadTestFiles(args); if (testFiles == null) { Console.ReadLine(); return; } int repeatFile = int.Parse(args[2]); var knapsackSets = testFiles.Select(f => KnapsackLoader.LoadKnapsacks(f, KnapsackLoader.KnapsackPerFile)); Func <Knapsack, KnapsackSolution> solver; var method = args[3].Trim().ToLower(); if (method == "bf") { solver = KnapsackProblemSolver.BruteForce; } else if (method == "sbf") { solver = KnapsackProblemSolver.SmarterBruteForce; } else { solver = KnapsackProblemSolver.PriceToWeightRatioHeuristics; } bool saveResults = bool.Parse(args[4]); if (saveResults) { var solutions = new List <KnapsackSolution>(); Benchmark(solver, repeatFile, KnapsackLoader.KnapsackPerFile, knapsackSets, solutions); SaveSolutions(solutions); } else { Benchmark(solver, repeatFile, KnapsackLoader.KnapsackPerFile, knapsackSets); } Console.ReadLine(); }
static void CheckAproximationErrors(string directoryPath, double error) { if (!Directory.Exists(directoryPath)) { Console.WriteLine("Directory '{0}' does not exist.", directoryPath); return; } var knapsacksFiles = Directory.EnumerateFiles(directoryPath, "knap_*.dat").ToList(); var relativeErrors = new List <double>(); for (int i = 0; i < knapsacksFiles.Count; i += 2) { var bestPrices = LoadBestPricesFromSolutionFile(knapsacksFiles[i + 1]); var knapsacks = KnapsackLoader.LoadKnapsacks(knapsacksFiles[i], KnapsackLoader.KnapsackPerFile).ToList(); for (int j = 0; j < knapsacks.Count; j++) { var result = KnapsackProblemSolver.DynamicProgrammingByPrice(knapsacks[j].WithPriceFPTAS(error)); int realBestPrice = 0; for (int k = 0; k < result.Vector.Length; k++) { if (result.Vector[k]) { realBestPrice += knapsacks[j].Items[k].Price; } } relativeErrors.Add(ComputeRelativeError(bestPrices[j], realBestPrice)); } } Console.WriteLine(); Console.WriteLine($"For chosen aproximation error {error}: "); Console.WriteLine($" - average relative error is {relativeErrors.Average()}."); Console.WriteLine($" - max relative error is {relativeErrors.Max()}."); }
/* args: * [0] - a path to directory with testing files * [1] - how many files to use for testing * [2] - how many times repeat a single file * [3] - whether to save results * [4] - fptas - dynamic programming with aproximation * [5] - if fptas is used, what error to count with */ static void Main(string[] args) { var testFiles = LoadTestFiles(args); if (testFiles == null) { Console.ReadLine(); return; } var knapsackSets = testFiles.Select(f => KnapsackLoader.LoadKnapsacks(f, KnapsackLoader.KnapsackPerFile)); bool useAprox = args.Length > 4 && args[4].Trim() == "fptas"; if (useAprox) { double aproxError = double.Parse(args[5]); knapsackSets = knapsackSets.Select(set => set.Select(knapsack => knapsack.WithPriceFPTAS(aproxError))); } int repeatFile = int.Parse(args[2]); bool saveResults = bool.Parse(args[3]); if (saveResults) { var solutions = new List <KnapsackSolution>(); Benchmark(KnapsackProblemSolver.DynamicProgrammingByPrice, repeatFile, KnapsackLoader.KnapsackPerFile, knapsackSets, solutions); SaveSolutions(solutions); } else { Benchmark(KnapsackProblemSolver.DynamicProgrammingByPrice, repeatFile, KnapsackLoader.KnapsackPerFile, knapsackSets); } Console.ReadLine(); }