using System; using System.Linq; namespace HeuristicLab.Tests.Problem { using System.Threading; using HeuristicLab.Algorithms.GeneticAlgorithm; using HeuristicLab.BenchmarkSuite.Problems; using HeuristicLab.Data; using HeuristicLab.Encodings.IntegerVectorEncoding; using HeuristicLab.Optimization; using HeuristicLab.ParallelEngine; using HeuristicLab.Problems.ProgramSynthesis; using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public class DeterministicTests { [TestMethod] [TestCategory("Problem")] [TestProperty("Time", "long")] public void TestMedian() { var ga = GetAlgorithm(); RunAlgorithm(ga); } [TestMethod] [TestCategory("Problem")] [TestProperty("Time", "long")] public void TestSimilarResult() { var ga1 = GetAlgorithm(); var ga2 = GetAlgorithm(); RunAlgorithm(ga1); RunAlgorithm(ga2); var bestQuality1 = GetDoubleResult(ga1, "BestQuality"); var bestQuality2 = GetDoubleResult(ga2, "BestQuality"); Assert.AreEqual(bestQuality1, bestQuality2, 0.000001); //var currentAverageQuality1 = GetDoubleResult(ga1, "CurrentAverageQuality"); //var currentAverageQuality2 = GetDoubleResult(ga2, "CurrentAverageQuality"); //Assert.AreEqual(currentAverageQuality1, currentAverageQuality2, 0.01); var currentWorstQuality1 = GetDoubleResult(ga1, "CurrentWorstQuality"); var currentWorstQuality2 = GetDoubleResult(ga2, "CurrentWorstQuality"); Assert.AreEqual(currentWorstQuality1, currentWorstQuality2, 0.000001); } public static IAlgorithm GetAlgorithm() { var ga = new GeneticAlgorithm(); var instance = new Median(); var problemData = instance.CreateProblemData(); var pushProblem = new IntegerVectorPushBenchmarkSuiteProblem(); pushProblem.Load(problemData); ga.Problem = pushProblem; pushProblem.Encoding.Length = 100; ga.Crossover = ga.CrossoverParameter.ValidValues.OfType().First(); ga.Selector = ga.SelectorParameter.ValidValues.OfType().First(); ga.Mutator = ga.MutatorParameter.ValidValues.OfType().First(); ga.Seed.Value = 1337; ga.SetSeedRandomly.Value = false; ga.MutationProbability.Value = 0.05; ga.PopulationSize.Value = 1000; ga.MaximumGenerations.Value = 10; ga.Engine = new ParallelEngine(); return ga; } public static void RunAlgorithm(IAlgorithm a) { var trigger = new EventWaitHandle(false, EventResetMode.ManualReset); Exception ex = null; a.Stopped += (src, e) => trigger.Set(); a.ExceptionOccurred += (src, e) => { ex = e.Value; trigger.Set(); }; a.Prepare(); a.Start(); trigger.WaitOne(); Assert.AreEqual(ex, null); } public static double GetDoubleResult(IAlgorithm a, string resultName) { return ((DoubleValue)a.Results[resultName].Value).Value; } } }