Example #1
0
        public void test_performing_algorithm(int maxIterations, int populationCount, float evaporationRate, Core.JobScheduling.Base.SchedulingProblem schedulingProblem, int expectedResultTimeSpan)
        {
            // Arrange
            var algorithm = new AntColonyOptimizationAlgorithm(maxIterations, populationCount, evaporationRate, schedulingProblem);

            // Act
            var result = algorithm.Perform();

            // Assert
            Assert.AreEqual(expectedResultTimeSpan, result.TimeSpan);

            if (schedulingProblem is Core.JobScheduling.OpenShop.SchedulingProblem)
            {
                return;
            }

            foreach (var job in schedulingProblem.Jobs)
            {
                var scheduledOperations = result.Machines
                                          .Select(m => m.Operations.FindLast(o => o.Operation.JobId == job.Id))
                                          .OrderBy(o => o.StartTime)
                                          .ToList();

                for (int i = 0; i < job.Operations.Count; i++)
                {
                    Assert.AreEqual(job.Operations[i].MachineId, scheduledOperations[i].Operation.MachineId);

                    if (i > 0)
                    {
                        int previousOperationEndTime = scheduledOperations[i - 1].StartTime + scheduledOperations[i - 1].Operation.ProcessingTime;
                        Assert.IsTrue(scheduledOperations[i].StartTime >= previousOperationEndTime);
                    }
                }
            }
        }
        public void test_perform_ant_colony_optimization_algorithm(string directory, string fileName, SchedulingProblemType schedulingProblemType, int maxIterations, int populationCount, float evaporationRate)
        {
            // Arrange
            var path        = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName + "/IntegrationTests/TestInstances/" + directory;
            var resultsPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName + "/IntegrationTests/TestResults/ACO";

            // Act
            var inputData         = FileHelper.ReadFile(path, fileName);
            var schedulingProblem = SchedulingProblemFactory.Create(schedulingProblemType, inputData);
            var algorithm         = new AntColonyOptimizationAlgorithm(maxIterations, populationCount, evaporationRate, schedulingProblem);

            var watch  = System.Diagnostics.Stopwatch.StartNew();
            var result = algorithm.Perform();

            watch.Stop();

            // Assert
            Assert.IsTrue(result.IsCorrect(schedulingProblem.Jobs));

            // Writing result to file
            var executionTime = watch.Elapsed.ToString("hh\\:mm\\:ss");

            FileHelper.WriteToFile(resultsPath + "/" + directory, fileName,
                                   $@"maxIterations: {maxIterations}, populationCount: {populationCount}, evaporationRate: {evaporationRate}, timeSpan: {result.TimeSpan}, time: {executionTime}"
                                   );
        }
Example #3
0
        public void test_initializing_algorithm(int maxIterations, int populationCount, float evaporationRate, Core.JobScheduling.Base.SchedulingProblem schedulingProblem, int expectedNodesCount, int expectedPathsCount)
        {
            // Act
            var algorithm = new AntColonyOptimizationAlgorithm(maxIterations, populationCount, evaporationRate, schedulingProblem);

            // Assert
            Assert.AreEqual(populationCount, algorithm.GetPopulation().Count);
            Assert.AreEqual(expectedNodesCount, algorithm.GetNodes().Count);
            Assert.AreEqual(expectedPathsCount, algorithm.GetPaths().Count);
        }
Example #4
0
        static void Main(string[] args)
        {
            var runner = new Runner();
            var app    = new CommandLineApplication();

            app.Description = "Nature-inspired algorithms in jobs scheduling problems";

            app.HelpOption("-?|-h|--help");

            app.Command("get-test-instances", (command) => {
                command.Description = "Download Taillard tests instances";
                command.HelpOption("-?|-h|--help");

                command.OnExecute(() => {
                    Console.WriteLine("Downloading...");
                    runner.DownloadTestInstances();
                    Console.WriteLine("Downloading finished.");
                    return(0);
                });
            });

            app.Command("co", (command) => {
                command.Description = "Solve job scheduling problem using Cockroach Optimization algorithm.";
                command.HelpOption("-?|-h|--help");

                var populationSizeOption   = command.Option("-s|--size", "Specify population size", CommandOptionType.SingleValue);
                var iterationsNumberOption = command.Option("-i|--iterations", "Specify number of iterations", CommandOptionType.SingleValue);
                var visualOption           = command.Option("-v|--visual", "Specify visual parameter", CommandOptionType.SingleValue);
                var maxStepOption          = command.Option("-ms|--max-step", "Specify max step size", CommandOptionType.SingleValue);
                var jobTypeOption          = command.Option("-js|--jobs-system", "Specify jobs system: \"f\", \"j\" or \"o\"", CommandOptionType.SingleValue);
                var inputFileOption        = command.Option("-if|--input-file", "Specify input file", CommandOptionType.SingleValue);
                var saveResultOption       = command.Option("-sr|--save-result", "Specify if save result", CommandOptionType.NoValue);
                var executionsNumberOption = command.Option("-e|--executions", "Specify number of executions", CommandOptionType.SingleValue);

                command.OnExecute(() => {
                    var populationSize  = populationSizeOption.HasValue()   ? Int16.Parse(populationSizeOption.Value())   : 10;
                    var iterationNumber = iterationsNumberOption.HasValue() ? Int16.Parse(iterationsNumberOption.Value()) : 20;
                    var visual          = visualOption.HasValue()           ? Int16.Parse(visualOption.Value())           : 10;
                    var maxStep         = maxStepOption.HasValue()          ? Int16.Parse(maxStepOption.Value())          : 4;
                    var jobType         = jobTypeOption.HasValue()          ? jobTypeOption.Value()                         : "f";
                    var inputFile       = inputFileOption.HasValue()        ? inputFileOption.Value()                       : "TestInstances/flowshop/tai20_5/0.txt";
                    var saveResult      = saveResultOption.HasValue()       ? true                                          : false;
                    var executions      = executionsNumberOption.HasValue() ? Int16.Parse(executionsNumberOption.Value()) : 1;

                    var optionsString =
                        $" - population size:\t {populationSize}, {Environment.NewLine}"
                        + $" - iterations number:\t {iterationNumber}. {Environment.NewLine}"
                        + $" - visual parameter:\t {visual}, {Environment.NewLine}"
                        + $" - max step paramter:\t {maxStep}, {Environment.NewLine}"
                        + $" - job scheduling type:\t {jobType}, {Environment.NewLine}"
                        + $" - input file:\t\t {inputFile} {Environment.NewLine}"
                        + $" - save results:\t {saveResult} {Environment.NewLine}"
                        + $" - executions number:\t {executions} {Environment.NewLine}";

                    Console.WriteLine($"{Environment.NewLine}"
                                      + $"Starting perform CO algorithm with given options: {Environment.NewLine}"
                                      + optionsString
                                      );

                    var inputData         = FileHelper.ReadFile(_inputDataDirectory, inputFile);
                    var schedulingProblem = SchedulingProblemFactory.Create(jobType, inputData);
                    var algorithm         = new CockroachAlgorithm(maxStep, visual, iterationNumber, populationSize, schedulingProblem);
                    var stringResult      = optionsString.Replace("\t", "") + Environment.NewLine;

                    for (int i = 0; i < executions; i++)
                    {
                        if (executions > 0)
                        {
                            Console.WriteLine("Execution number: " + (i + 1));
                        }

                        var result    = algorithm.Perform();
                        stringResult += Environment.NewLine + result.TimeSpan;
                        Console.WriteLine(Environment.NewLine + "Result: " + result.TimeSpan);
                    }

                    if (saveResult)
                    {
                        DateTime time = DateTime.Now;
                        string format = "dd.MM.yyyy_HH:mm:ss";
                        var fileName  = "CO_" + time.ToString(format) + ".txt";
                        Console.WriteLine("Saving results to " + fileName);
                        FileHelper.CreateFile(_resultsDirectory, fileName, stringResult);
                    }

                    Console.WriteLine(Environment.NewLine + "Calculations finished.");
                    return(0);
                });
            });

            app.Command("aco", (command) => {
                command.Description = "Solve job scheduling problem using Ant Colony Optimization algorithm.";
                command.HelpOption("-?|-h|--help");

                var populationSizeOption   = command.Option("-s|--size", "Specify population size", CommandOptionType.SingleValue);
                var iterationsNumberOption = command.Option("-i|--iterations", "Specify number of iterations", CommandOptionType.SingleValue);
                var evaporationRateOption  = command.Option("-p|--evaporation", "Specify value of evaporation rate parameter", CommandOptionType.SingleValue);
                var laidPheromoneOption    = command.Option("-q", "Specify value of laid pheromone parameter Q", CommandOptionType.SingleValue);
                var jobTypeOption          = command.Option("-js|--jobs-system", "Specify jobs system: \"f\", \"j\" or \"o\"", CommandOptionType.SingleValue);
                var inputFileOption        = command.Option("-if|--input-file", "Specify input file", CommandOptionType.SingleValue);
                var saveResultOption       = command.Option("-sr|--save-result", "Specify if save result", CommandOptionType.NoValue);
                var executionsNumberOption = command.Option("-e|--executions", "Specify number of executions", CommandOptionType.SingleValue);

                command.OnExecute(() => {
                    var populationSize  = populationSizeOption.HasValue()   ? Int16.Parse(populationSizeOption.Value())   : 10;
                    var iterationNumber = iterationsNumberOption.HasValue() ? Int16.Parse(iterationsNumberOption.Value()) : 5;
                    var evaporationRate = evaporationRateOption.HasValue()  ? float.Parse(evaporationRateOption.Value())  : 0.2F;
                    var laidPheromone   = laidPheromoneOption.HasValue()    ? float.Parse(laidPheromoneOption.Value())    : 1F;
                    var jobType         = jobTypeOption.HasValue()          ? jobTypeOption.Value()                         : "f";
                    var inputFile       = inputFileOption.HasValue()        ? inputFileOption.Value()                       : "TestInstances/flowshop/tai20_5/0.txt";
                    var saveResult      = saveResultOption.HasValue()       ? true                                          : false;
                    var executions      = executionsNumberOption.HasValue() ? Int16.Parse(executionsNumberOption.Value()) : 1;

                    var optionsString =
                        $" - population size:\t {populationSize}, {Environment.NewLine}"
                        + $" - iterations number:\t {iterationNumber}. {Environment.NewLine}"
                        + $" - evaporation rate:\t {evaporationRate}, {Environment.NewLine}"
                        + $" - laid pheromone parameter Q:\t {laidPheromone}, {Environment.NewLine}"
                        + $" - job scheduling type:\t {jobType}, {Environment.NewLine}"
                        + $" - input file:\t\t {inputFile} {Environment.NewLine}"
                        + $" - save results:\t {saveResult} {Environment.NewLine}"
                        + $" - executions number:\t {executions} {Environment.NewLine}";

                    Console.WriteLine($"{Environment.NewLine}"
                                      + $"Starting perform ACO algorithm with given options: {Environment.NewLine}"
                                      + optionsString
                                      );

                    var inputData         = FileHelper.ReadFile(_inputDataDirectory, inputFile);
                    var schedulingProblem = SchedulingProblemFactory.Create(jobType, inputData);
                    var algorithm         = new AntColonyOptimizationAlgorithm(iterationNumber, populationSize, evaporationRate, schedulingProblem, laidPheromone);
                    var stringResult      = optionsString.Replace("\t", "") + Environment.NewLine;

                    for (int i = 0; i < executions; i++)
                    {
                        if (executions > 0)
                        {
                            Console.WriteLine("Execution number: " + (i + 1));
                        }

                        var result    = algorithm.Perform();
                        stringResult += Environment.NewLine + result.TimeSpan;
                        Console.WriteLine(Environment.NewLine + "Result: " + result.TimeSpan);
                    }

                    if (saveResult)
                    {
                        DateTime time = DateTime.Now;
                        string format = "dd.MM.yyyy_HH:mm:ss";
                        var fileName  = "ACO_" + time.ToString(format) + ".txt";
                        Console.WriteLine("Saving results to " + fileName);
                        FileHelper.CreateFile(_resultsDirectory, fileName, stringResult);
                    }

                    Console.WriteLine(Environment.NewLine + "Calculations finished.");

                    return(0);
                });
            });

            app.Command("ga", (command) => {
                command.Description = "Solve job scheduling problem using Genetic Algorithm.";
                command.HelpOption("-?|-h|--help");

                var populationSizeOption      = command.Option("-s|--size", "Specify population size", CommandOptionType.SingleValue);
                var iterationsNumberOption    = command.Option("-i|--iterations", "Specify number of iterations", CommandOptionType.SingleValue);
                var mutationProbabilityOption = command.Option("-mp", "Specify probability of mutation (0<=p<=100)", CommandOptionType.SingleValue);
                var jobTypeOption             = command.Option("-js|--jobs-system", "Specify jobs system: \"f\", \"j\" or \"o\"", CommandOptionType.SingleValue);
                var inputFileOption           = command.Option("-if|--input-file", "Specify input file", CommandOptionType.SingleValue);
                var saveResultOption          = command.Option("-sr|--save-result", "Specify if save result", CommandOptionType.NoValue);
                var executionsNumberOption    = command.Option("-e|--executions", "Specify number of executions", CommandOptionType.SingleValue);

                command.OnExecute(() => {
                    var populationSize      = populationSizeOption.HasValue()       ? Int16.Parse(populationSizeOption.Value())       : 10;
                    var iterationNumber     = iterationsNumberOption.HasValue()     ? Int16.Parse(iterationsNumberOption.Value())     : 5;
                    var mutationProbability = mutationProbabilityOption.HasValue()  ? float.Parse(mutationProbabilityOption.Value())  : 1F;
                    var jobType             = jobTypeOption.HasValue()              ? jobTypeOption.Value()                             : "f";
                    var inputFile           = inputFileOption.HasValue()            ? inputFileOption.Value()                           : "TestInstances/flowshop/tai20_5/0.txt";
                    var saveResult          = saveResultOption.HasValue()           ? true                                              : false;
                    var executions          = executionsNumberOption.HasValue()     ? Int16.Parse(executionsNumberOption.Value())     : 1;

                    var optionsString =
                        $" - population size:\t {populationSize}, {Environment.NewLine}"
                        + $" - iterations number:\t {iterationNumber}. {Environment.NewLine}"
                        + $" - mutation probability:\t {mutationProbability}. {Environment.NewLine}"
                        + $" - job scheduling type:\t {jobType}, {Environment.NewLine}"
                        + $" - input file:\t\t {inputFile} {Environment.NewLine}"
                        + $" - save results:\t {saveResult} {Environment.NewLine}"
                        + $" - executions number:\t {executions} {Environment.NewLine}";

                    Console.WriteLine($"{Environment.NewLine}"
                                      + $"Starting perform GA algorithm with given options: {Environment.NewLine}"
                                      + optionsString
                                      );

                    var inputData         = FileHelper.ReadFile(_inputDataDirectory, inputFile);
                    var schedulingProblem = SchedulingProblemFactory.Create(jobType, inputData);
                    var algorithm         = new GeneticAlgorithm(iterationNumber, populationSize, schedulingProblem, mutationProbability);
                    var stringResult      = optionsString.Replace("\t", "") + Environment.NewLine;

                    for (int i = 0; i < executions; i++)
                    {
                        if (executions > 0)
                        {
                            Console.WriteLine("Execution number: " + (i + 1));
                        }

                        var result    = algorithm.Perform();
                        stringResult += Environment.NewLine + result.TimeSpan;
                        Console.WriteLine(Environment.NewLine + "Result: " + result.TimeSpan);
                    }

                    if (saveResult)
                    {
                        DateTime time = DateTime.Now;
                        string format = "dd.MM.yyyy_HH:mm:ss";
                        var fileName  = "GA_" + time.ToString(format) + ".txt";
                        Console.WriteLine("Saving results to " + fileName);
                        FileHelper.CreateFile(_resultsDirectory, fileName, stringResult);
                    }

                    Console.WriteLine(Environment.NewLine + "Calculations finished.");

                    return(0);
                });
            });

            app.Execute(args);
        }