Example #1
0
        static float Score <T>(DataMatrices data, IEnumerable <T> permutation)
        {
            var permutationArray = permutation.Cast <int>().Select(x => x - 1).ToArray();
            var score            = 0f;
            var maxIndex         = permutation.Count() - 1;

            foreach (var i in QapMath.Range(0, maxIndex))
            {
                foreach (var j in QapMath.Range(0, maxIndex))
                {
                    score += data.MatrixA[i, j] * data.MatrixB[permutationArray[i], permutationArray[j]];
                }
            }
            return(score);
        }
Example #2
0
        static void Main(string[] args)
        {
            if (args.Contains("-h"))
            {
                HandleHelp();
            }


            var file    = args[0];
            var timeout = int.Parse(args[1]);
            var runs    = int.Parse(args[2]);
            var output  = args.Count() == 4
                ? args[3]
                : string.Empty;

            System.Console.WriteLine($"Input params:");
            System.Console.WriteLine($"File: {file}");
            System.Console.WriteLine($"Timeout: {timeout}[s]");
            System.Console.WriteLine($"Runs: {runs}");
            System.Console.WriteLine($"Output: {output}");


            System.Console.WriteLine($"Reading data from input file");
            var data = ReadData(file);

            System.Console.WriteLine("OK");

            var randomResults   = new List <QapResult <int> >();
            var steepestResults = new List <QapResult <int> >();
            var greedyResults   = new List <QapResult <int> >();


            for (var currentRun = 1; currentRun <= runs; currentRun++)
            {
                System.Console.WriteLine();
                System.Console.WriteLine($"### Run: {currentRun} ###");

                var initialPermutation = QapMath.Permutate(QapMath.Range(1, data.MatricesSize));
                System.Console.WriteLine($"Initial permutation: {string.Join(",",initialPermutation)}");

                var cancelationToken = new CancelationToken();

                var randomStrategy   = new RandomStrategy();
                var steepestStrategy = new SteepestStrategy();
                var greedyStrategy   = new GreedyStrategy();

                Func <IEnumerable <int>, float> scoringFunction = (x) => Score(data, x);

                var timer = new Timer(timeout * millisecondsInSeconds);
                timer.Elapsed += (sender, eargs) => cancelationToken.Cancel();

                System.Console.WriteLine("Starting tasks");
                var randomStartegyTask   = Task.Run(() => randomStrategy.SearchBest(scoringFunction, initialPermutation, cancelationToken));
                var steepestStrategyTask = Task.Run(() => randomStrategy.SearchBest(scoringFunction, initialPermutation, cancelationToken));
                var greedyStrategyTask   = Task.Run(() => greedyStrategy.SearchBest(scoringFunction, initialPermutation, cancelationToken));

                System.Console.WriteLine("OK");

                System.Console.WriteLine("Starting timer");
                timer.Start();
                System.Console.WriteLine("OK");

                System.Console.WriteLine("Awaiting tasks to finish");
                Task.WaitAll(new [] { randomStartegyTask, steepestStrategyTask, greedyStrategyTask });
                System.Console.WriteLine("OK");

                System.Console.WriteLine("Collecting results");
                QapResult <int> randomResult   = randomStartegyTask.Result as QapResult <int> ?? null;
                QapResult <int> steepestResult = steepestStrategyTask.Result as QapResult <int> ?? null;
                QapResult <int> greedyResult   = greedyStrategyTask.Result as QapResult <int> ?? null;

                randomResults.Add(randomResult);
                steepestResults.Add(steepestResult);
                greedyResults.Add(greedyResult);

                System.Console.WriteLine("OK");

                System.Console.WriteLine();
                System.Console.WriteLine($"# Results for run: {currentRun}");
                System.Console.WriteLine("Results in format <foundIntime>:<solution>/<ofTotalSeen>:<steps>:<score>:<Permutation>");
                System.Console.WriteLine($"Best random: {randomResult.FoundIn.TotalMilliseconds}:{randomResult.SeenAsSolutionNumber}/{randomResult.TotalSolutionsSeen}:{randomResult.Steps}:{randomResult.Score}:[{String.Join(",",randomResult.Solution)}]");
                System.Console.WriteLine($"Best steepest: {steepestResult.FoundIn.TotalMilliseconds}:{steepestResult.SeenAsSolutionNumber}/{steepestResult.TotalSolutionsSeen}:{steepestResult.Steps}:{steepestResult.Score}:[{String.Join(",",steepestResult.Solution)}]");
                System.Console.WriteLine($"Best greedy: {greedyResult.FoundIn.TotalMilliseconds}:{greedyResult.SeenAsSolutionNumber}/{greedyResult.TotalSolutionsSeen}:{greedyResult.Steps}:{greedyResult.Score}:[{String.Join(",",greedyResult.Solution)}]");
            }

            if (!string.IsNullOrEmpty(output))
            {
                using (var writer = new StreamWriter(File.OpenWrite(output)))
                {
                    writer.WriteLine("algorithm,time,solutionNr,totalSolutions,steps,score,solution");

                    foreach (var solution in randomResults)
                    {
                        writer.WriteLine($"random,{solution.ToCsvLine()}");
                    }
                    foreach (var solution in steepestResults)
                    {
                        writer.WriteLine($"steepest,{solution.ToCsvLine()}");
                    }
                    foreach (var solution in greedyResults)
                    {
                        writer.WriteLine($"greedy,{solution.ToCsvLine()}");
                    }
                }
            }
        }