/// <summary> /// Configure the Genetic Algorithm. /// </summary> /// <param name="ga">The genetic algorithm.</param> public virtual void ConfigGATermination(IEVA ga) { GA = ga; ga.TerminationReached += (sender, args) => { /*/ * using (var collection = new MagickImageCollection()) * { * var files = Directory.GetFiles(m_destFolder, "*.png"); * * foreach (var image in files) * { * collection.Add(image); * collection[0].AnimationDelay = 100; * } * * var settings = new QuantizeSettings(); * settings.Colors = 256; * collection.Quantize(settings); * * collection.Optimize(); * collection.Write(Path.Combine(m_destFolder, "result.gif")); * } * /**/ Saveinfo(); }; }
/// <summary> /// Configuration GA. /// </summary> /// <param name="problemConfig">Problem represention</param> /// <returns>GA</returns> public static IEVA[] SetGA(IProblemConfig[] problemConfig, bool parlelization) { Console.WriteLine("Custom Genetic algorithm."); var termination = ParameterSetter.SetTermination(problemConfig[0]); var crossover = ParameterSetter.SetXover(problemConfig[0]); var xoverProb = ParameterSetter.SetFloat("Xover Probability", 0, 1); var mutation = ParameterSetter.SetMutation(problemConfig[0]); var mutationProb = ParameterSetter.SetFloat("Mutation Probability", 0, 1); var selection = ParameterSetter.SetSelection(problemConfig[0]); var elitizmus = ParameterSetter.SetElite(problemConfig[0]); var executor = problemConfig[0].CreateExecutor(); var popSize = ParameterSetter.SetPositiveIntParameter("Pop size", 2); IEVA[] evas = new IEVA[problemConfig.Length]; int i = 0; foreach (var config in problemConfig) { // creates population with curr. popSize var population = new Population(popSize, config.CreateIndividual, config.CreateEmptyIndividual); // new operators var fitness = config.CreateFitness(); evas[i++] = new GeneticAlgorithm(population, fitness, selection, crossover, mutation, elitizmus, termination, executor, mutationProb, xoverProb); } return(evas); }
/// <summary> /// Determines whether the specified genetic algorithm fulfilled the termination condition. /// </summary> /// <param name="eva">The genetic algorithm.</param> /// <returns>True if termination has been fulfilled, otherwise false.</returns> public bool IsFulfilled(IEVA eva) { if (eva.TimeEvolving < maxTime) { return(false); } return(true); }
/// <summary> /// Determines whether the specified genetic algorithm fulfilled the termination condition. /// </summary> /// <param name="eva">The genetic algorithm.</param> /// <returns>True if termination has been fulfilled, otherwise false.</returns> public bool IsFulfilled(IEVA eva) { if (eva.CurrentGenerationsNumber < expectedMaxGeneration) { return(false); } return(true); }
/// <summary> /// Console logger. /// </summary> /// <param name="eva">evolutionary alg.</param> /// <param name="consoleProblemConfig">Problem represention</param> /// <param name="logRate">logger rate</param> public void SetGenerationInfoLog(IEVA eva, IProblemConfig consoleProblemConfig, int logRate) { eva.CurrentGenerationInfo += delegate { var bestIndividual = eva.BestIndividual; Console.WriteLine("Generations: {0}", eva.CurrentGenerationsNumber); Console.WriteLine("Fitness: {0,10}", bestIndividual.Fitness); Console.WriteLine("Time: {0}", eva.TimeEvolving); var speed = eva.TimeEvolving.TotalSeconds / eva.CurrentGenerationsNumber; Console.WriteLine("Speed (gen/sec): {0:0.0000}", speed); var best = consoleProblemConfig.ShowBestIndividual(bestIndividual, logRate); var fit = eva.CurrentGenerationsNumber + ";" + (bestIndividual.Fitness); var elapsedTimeSpeed = eva.CurrentGenerationsNumber + ";" + speed; var allInfo = eva.CurrentGenerationsNumber + ";" + (bestIndividual.Fitness) + ";" + eva.TimeEvolving + ";" + speed; consoleProblemConfig.SetGenerationInfo(fit, elapsedTimeSpeed, allInfo); }; }
/// <summary> /// Configuration ES. /// </summary> /// <param name="problemConfig">Problem represention</param> /// <returns>ES</returns> public static IEVA[] SetES(IProblemConfig[] problemConfig, bool parallelization) { Console.WriteLine("Evolutionary Strategy."); var evaName = ParameterSetter.SetEvaES(); // CMAES - internal population size setter var popSize = 20; IEVA[] evas = new IEVA[problemConfig.Length]; int i = 0; foreach (var config in problemConfig) { // creates population with curr. popSize var population = new Population(popSize, config.CreateIndividual, config.CreateEmptyIndividual); // new operators var fitness = config.CreateFitness(); // Delegate.CreateDelegate(consoleProblemConfig.CreateIndividual); evas[i++] = Activator.CreateInstance(evaName, fitness, population) as IEVA; } return(evas); }
/// <summary> /// Parallel EA. /// </summary> /// <param name="problemConfigName">Problem represention.</param> /// <param name="inputFileName">Input image</param> /// <param name="logRate">logger rate</param> public static void RunParallelImage(Type problemConfigName, string inputFileName, int logRate, bool parallelization) { var img = Image.FromFile(inputFileName) as Bitmap; var blockSize = ParameterSetter.SetPositiveIntParameter("Block size", 5); Bitmap[] targets = Split_Concate.SplitImg(img, blockSize); var consoleProblemConfigs = new IImageProblemConfig[targets.Length]; var evas = new IEVA[targets.Length]; var configuration = new Configuration[targets.Length]; for (int i = 0; i < targets.Length; i++) { consoleProblemConfigs[i] = Activator.CreateInstance(problemConfigName) as IImageProblemConfig; consoleProblemConfigs[i].Initialize(i); consoleProblemConfigs[i].Initialize(targets[i], inputFileName); configuration[i] = new Configuration(); } evas = Configuration.SetEVA(consoleProblemConfigs, parallelization); for (int i = 0; i < targets.Length; i++) { configuration[i].SetGenerationInfoLog(evas[i], consoleProblemConfigs[i], logRate); consoleProblemConfigs[i].ConfigGATermination(evas[i]); } IIndividual[] bestInds = new IIndividual[targets.Length]; var stopwatch = Stopwatch.StartNew(); /**/ Parallel.For(0, evas.Length, index => { evas[index].Run(); bestInds[index] = evas[index].BestIndividual; // configuration[index].Saveinfo(inputFileName, index); }); /*/ * * for (var index = 0; index < evas.Length; index++) * { * evas[index].Run(); * * bestInds[index] = evas[index].BestIndividual; * * // Configuration.Saveinfo(inputFileName,); * * } * * * /**/ stopwatch.Stop(); Console.WriteLine("Total time: " + stopwatch.Elapsed); var result = Split_Concate.ConcateImgs(bestInds, blockSize, img.Width, img.Height); var m_destFolder = Configuration.CreateDirectory(inputFileName, "result_final"); var fileName = m_destFolder + "/" + "final" + ".png"; result.Save(fileName); }