Example #1
0
        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()}.");
        }
Example #2
0
        /* 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();
        }
Example #3
0
        /* 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();
        }
Example #4
0
        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()}.");
        }
Example #5
0
        /* 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();
        }