Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs @ 5110

Last change on this file since 5110 was 5110, checked in by cneumuel, 13 years ago

#1215

  • optional parameter values now can be null
  • problem type can now be set specifically
  • values are constrained to the encoding of the Problem
  • moved repetitions parameter to MetaOptimizationProblem
File size: 19.1 KB
Line 
1using System.Collections.Generic;
2using System.Diagnostics;
3using System.Linq;
4using HeuristicLab.Algorithms.GeneticAlgorithm;
5using HeuristicLab.Core;
6using HeuristicLab.PluginInfrastructure;
7using HeuristicLab.Parameters;
8using HeuristicLab.Problems.MetaOptimization;
9using HeuristicLab.Data;
10using System;
11using System.Threading;
12using HeuristicLab.Random;
13using HeuristicLab.Optimization;
14using HeuristicLab.Common;
15using System.IO;
16using HeuristicLab.Problems.TestFunctions;
17using System.Text;
18using HeuristicLab.Selection;
19using HeuristicLab.Algorithms.EvolutionStrategy;
20using HeuristicLab.PluginInfrastructure.Manager;
21
22namespace HeuristicLab.MetaOptimization.Test {
23  class Program {
24    private static int metaAlgorithmPopulationSize = 3;
25    private static int metaAlgorithmMaxGenerations = 30;
26    private static int metaProblemRepetitions = 3;
27
28    private static int baseAlgorithmMaxGenerations = 3;
29
30    static void Main(string[] args) {
31      //TestShorten();
32
33      //TestIntSampling();
34      //TestDoubleSampling();
35      //TestTypeDiscovery();
36     
37      GeneticAlgorithm baseLevelAlgorithm = new GeneticAlgorithm();
38
39      MetaOptimizationProblem metaOptimizationProblem = new MetaOptimizationProblem();
40      metaOptimizationProblem.Repetitions = new IntValue(metaProblemRepetitions);
41      GeneticAlgorithm metaLevelAlgorithm = GetMetaGA(metaOptimizationProblem);
42      //EvolutionStrategy metaLevelAlgorithm = GetMetaES(metaOptimizationProblem);
43
44      IValueConfiguration algorithmVc = SetupGAAlgorithm(baseLevelAlgorithm, metaOptimizationProblem);
45
46      //Console.WriteLine("Press enter to start");
47      //Console.ReadLine();
48      //TestConfiguration(algorithmVc, baseLevelAlgorithm);
49     
50      //Console.WriteLine("Press enter to start");
51      //Console.ReadLine();
52      TestOptimization(metaLevelAlgorithm);
53
54      //TestMemoryLeak(metaLevelAlgorithm);
55
56      Console.ReadLine();
57    }
58
59    private static void TestTypeDiscovery() {
60      PluginLoader.pluginAssemblies.Any();
61     
62      var items = ApplicationManager.Manager.GetInstances(typeof(DoubleArray)).ToArray();
63
64      foreach (var item in items) {
65        Console.WriteLine(item.ToString());
66      }
67    }
68
69    private static void TestMemoryLeak(GeneticAlgorithm metaLevelAlgorithm) {
70      IValueConfiguration algorithmVc = ((MetaOptimizationProblem)metaLevelAlgorithm.Problem).AlgorithmParameterConfiguration;
71
72      Console.WriteLine("Starting Memory Test...");
73      Console.ReadLine();
74
75      var clones = new List<object>();
76      for (int i = 0; i < 1000; i++) {
77        var clone = algorithmVc.Clone();
78        clones.Add(clone);
79      }
80
81      Console.WriteLine("Finished. Now GC...");
82      Console.ReadLine();
83
84      GC.Collect();
85
86      Console.WriteLine("Finished!");
87      Console.ReadLine();
88    }
89
90    private static GeneticAlgorithm GetMetaGA(MetaOptimizationProblem metaOptimizationProblem) {
91      GeneticAlgorithm metaLevelAlgorithm = new GeneticAlgorithm();
92      metaLevelAlgorithm.PopulationSize.Value = metaAlgorithmPopulationSize;
93      metaLevelAlgorithm.MaximumGenerations.Value = metaAlgorithmMaxGenerations;
94
95      metaLevelAlgorithm.Problem = metaOptimizationProblem;
96      metaLevelAlgorithm.Engine = new SequentialEngine.SequentialEngine();
97
98      metaLevelAlgorithm.Mutator = new ParameterConfigurationManipulator();
99      metaLevelAlgorithm.MutationProbability.Value = 0.15;
100
101      return metaLevelAlgorithm;
102    }
103
104    private static EvolutionStrategy GetMetaES(MetaOptimizationProblem metaOptimizationProblem) {
105      EvolutionStrategy metaLevelAlgorithm = new EvolutionStrategy();
106      metaLevelAlgorithm.PopulationSize.Value = metaAlgorithmPopulationSize;
107      metaLevelAlgorithm.MaximumGenerations.Value = metaAlgorithmMaxGenerations;
108
109      metaLevelAlgorithm.Problem = metaOptimizationProblem;
110      metaLevelAlgorithm.Engine = new SequentialEngine.SequentialEngine();
111
112      metaLevelAlgorithm.Mutator = new ParameterConfigurationManipulator();
113      //metaLevelAlgorithm.MutationProbability.Value = 0.15;
114
115      return metaLevelAlgorithm;
116    }
117
118    private static IValueConfiguration SetupGAAlgorithm(GeneticAlgorithm baseLevelAlgorithm, MetaOptimizationProblem metaOptimizationProblem) {
119      baseLevelAlgorithm.Problem = new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem();
120      baseLevelAlgorithm.MaximumGenerations.Value = baseAlgorithmMaxGenerations;
121
122      metaOptimizationProblem.Algorithm = baseLevelAlgorithm;
123      IValueConfiguration algorithmVc = metaOptimizationProblem.AlgorithmParameterConfiguration;
124
125      metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
126        Evaluator = new GriewankEvaluator(),
127        ProblemSize = new IntValue(500)
128      });
129      metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
130        Evaluator = new GriewankEvaluator(),
131        ProblemSize = new IntValue(1000)
132      });
133
134      ConfigurePopulationSize(algorithmVc);
135      ConfigureMutationRate(algorithmVc);
136      ConfigureMutationOperator(algorithmVc);
137      ConfigureElites(algorithmVc);
138      ConfigureSelectionOperator(algorithmVc);
139      return algorithmVc;
140    }
141
142    private static void TestConfiguration(IValueConfiguration algorithmVc, GeneticAlgorithm baseLevelAlgorithm) {
143      IRandom rand = new FastRandom(0);
144      // set random values
145      for (int i = 0; i < 10; i++) {
146        IValueConfiguration clonedVc = (IValueConfiguration)algorithmVc.Clone();
147        clonedVc.Randomize(rand);
148        clonedVc.Parameterize((GeneticAlgorithm)clonedVc.ActualValue.Value);
149        GeneticAlgorithm newAlg = (GeneticAlgorithm)clonedVc.ActualValue.Value;
150        Console.WriteLine(string.Format("PopSize: original: {0}, randomized: {1}", baseLevelAlgorithm.PopulationSize, newAlg.PopulationSize));
151        Console.WriteLine(string.Format("MutRate: original: {0}, randomized: {1}", baseLevelAlgorithm.MutationProbability, newAlg.MutationProbability));
152        Console.WriteLine(string.Format("MutOp: original: {0}, randomized: {1}", baseLevelAlgorithm.Mutator, newAlg.Mutator));
153        Console.WriteLine(string.Format("SelOp: original: {0}, randomized: {1}", baseLevelAlgorithm.Selector, newAlg.Selector));
154        Console.WriteLine(string.Format("GrSi: original: {0}, randomized: {1}", "?", ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
155        Console.WriteLine("---");
156      }
157
158      Console.WriteLine("=======================");
159      algorithmVc.Randomize(rand);
160      algorithmVc.Parameterize(baseLevelAlgorithm);
161      // mutate
162      for (int i = 0; i < 10; i++) {
163        IValueConfiguration clonedVc = (IValueConfiguration)algorithmVc.Clone();
164        clonedVc.Mutate(rand);
165        clonedVc.Parameterize((GeneticAlgorithm)clonedVc.ActualValue.Value);
166        GeneticAlgorithm newAlg = (GeneticAlgorithm)clonedVc.ActualValue.Value;
167        Console.WriteLine(string.Format("PopSize: original: {0}, mutated: {1}", baseLevelAlgorithm.PopulationSize, newAlg.PopulationSize));
168        Console.WriteLine(string.Format("MutRate: original: {0}, mutated: {1}", baseLevelAlgorithm.MutationProbability, newAlg.MutationProbability));
169        Console.WriteLine(string.Format("MutOp: original: {0}, mutated: {1}", baseLevelAlgorithm.Mutator, newAlg.Mutator));
170        Console.WriteLine(string.Format("SelOp: original: {0}, mutated: {1}", baseLevelAlgorithm.Selector, newAlg.Selector));
171        Console.WriteLine(string.Format("GrSi: original: {0}, mutated: {1}", ((TournamentSelector)baseLevelAlgorithm.Selector).GroupSizeParameter.Value, ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
172        Console.WriteLine("---");
173      }
174
175      Console.WriteLine("=======================");
176      // cross
177      for (int i = 0; i < 10; i++) {
178        IValueConfiguration clonedVc1 = (IValueConfiguration)algorithmVc.Clone();
179        IValueConfiguration clonedVc2 = (IValueConfiguration)algorithmVc.Clone();
180
181        GeneticAlgorithm first = (GeneticAlgorithm)clonedVc1.ActualValue.Value.Clone();
182        GeneticAlgorithm second = (GeneticAlgorithm)clonedVc2.ActualValue.Value.Clone();
183
184        clonedVc1.Randomize(rand);
185        clonedVc1.Parameterize(first);
186
187        clonedVc2.Randomize(rand);
188        clonedVc2.Parameterize(second);
189
190        var popSizeBefore = first.PopulationSize.Value;
191        var mutRateBefore = first.MutationProbability.Value;
192        var mutOpBefore = first.Mutator;
193        var selOpBefore = first.Selector;
194        var groupSizeBefore = ((TournamentSelector)first.Selector).GroupSizeParameter.Value.Value;
195
196        clonedVc1.Cross(clonedVc2, rand);
197        clonedVc1.Parameterize(first);
198
199        Console.WriteLine(string.Format("PopSize: first: {0}, second: {1}, crossed: {2}", popSizeBefore, second.PopulationSize, first.PopulationSize));
200        Console.WriteLine(string.Format("MutRate: first: {0}, second: {1}, crossed: {2}", mutRateBefore, second.MutationProbability, first.MutationProbability));
201        Console.WriteLine(string.Format("MutOp: first: {0}, second: {1}, crossed: {2}", mutOpBefore, second.Mutator, first.Mutator));
202        Console.WriteLine(string.Format("SelOp: first: {0}, second: {1}, crossed: {2}", selOpBefore, second.Selector, first.Selector));
203        Console.WriteLine(string.Format("GrSi: first: {0}, second: {1}, crossed: {2}", groupSizeBefore, ((TournamentSelector)second.Selector).GroupSizeParameter.Value, ((TournamentSelector)first.Selector).GroupSizeParameter.Value));
204        Console.WriteLine("---");
205      }
206      Console.WriteLine("=======================");
207    }
208
209    private static void ConfigureMutationOperator(IValueConfiguration algorithmVc) {
210      var mutationOperator = algorithmVc.ParameterConfigurations.Where(x => x.Name == "Mutator").SingleOrDefault();
211      mutationOperator.Optimize = true;
212
213      // uncheck multiMutator to avoid Michalewicz issue
214      var multiMutator = mutationOperator.ValueConfigurations.Where(x => x.ActualValue.Value != null && x.ActualValue.Value.ItemName.StartsWith("Multi")).SingleOrDefault();
215      if (multiMutator != null) {
216        mutationOperator.ValueConfigurations.SetItemCheckedState(multiMutator, false);
217      }
218    }
219
220    private static void ConfigureSelectionOperator(IValueConfiguration algorithmVc) {
221      var selectionOperatorPc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "Selector").SingleOrDefault();
222      selectionOperatorPc.Optimize = true;
223
224      foreach (var vc in selectionOperatorPc.ValueConfigurations) {
225        if (vc.ActualValue.ValueDataType == typeof(TournamentSelector)) {
226          selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
227          vc.Optimize = true;
228          ConfigureTournamentGroupSize(vc);
229        } else if (vc.ActualValue.ValueDataType == typeof(RandomSelector)) {
230          selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
231        } else {
232          selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
233        }
234      }
235    }
236
237    private static void ConfigureTournamentGroupSize(IValueConfiguration tournamentVc) {
238      var groupSizePc = tournamentVc.ParameterConfigurations.Where(x => x.ParameterName == "GroupSize").SingleOrDefault();
239      groupSizePc.Optimize = true;
240
241      groupSizePc.ValueConfigurations.First().Optimize = true;
242      groupSizePc.ValueConfigurations.First().RangeConstraint.LowerBound = new IntValue(0);
243      groupSizePc.ValueConfigurations.First().RangeConstraint.UpperBound = new IntValue(100);
244      groupSizePc.ValueConfigurations.First().RangeConstraint.StepSize = new IntValue(1);
245    }
246
247    private static void ConfigurePopulationSize(IValueConfiguration algorithmVc) {
248      var populationSizePc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "PopulationSize").SingleOrDefault();
249      populationSizePc.Optimize = true;
250      var populationSizeVc = populationSizePc.ValueConfigurations.First();
251      populationSizeVc.Optimize = true;
252      populationSizeVc.RangeConstraint.LowerBound = new IntValue(20);
253      populationSizeVc.RangeConstraint.UpperBound = new IntValue(100);
254      populationSizeVc.RangeConstraint.StepSize = new IntValue(1);
255    }
256
257    private static void ConfigureMutationRate(IValueConfiguration algorithmVc) {
258      var mutationRatePc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "MutationProbability").SingleOrDefault();
259      mutationRatePc.Optimize = true;
260      var mutationRateVc = mutationRatePc.ValueConfigurations.First();
261      mutationRateVc.Optimize = true;
262      mutationRateVc.RangeConstraint.LowerBound = new PercentValue(0.0);
263      mutationRateVc.RangeConstraint.UpperBound = new PercentValue(1.0);
264      mutationRateVc.RangeConstraint.StepSize = new PercentValue(0.01);
265    }
266
267    private static void ConfigureElites(IValueConfiguration algorithmVc) {
268      var elitesPc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "Elites").SingleOrDefault();
269      elitesPc.Optimize = true;
270      var elitesVc = elitesPc.ValueConfigurations.First();
271      elitesVc.Optimize = true;
272      elitesVc.RangeConstraint.LowerBound = new IntValue(0);
273      elitesVc.RangeConstraint.UpperBound = new IntValue(20);
274      elitesVc.RangeConstraint.StepSize = new IntValue(1);
275    }
276
277    private static void TestOptimization(EngineAlgorithm metaLevelAlgorithm) {
278      ContentManager.Initialize(new PersistenceContentManager());
279      string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Results");
280      if (!Directory.Exists(path))
281        Directory.CreateDirectory(path);
282      string id = DateTime.Now.ToString("yyyy.MM.dd - HH;mm;ss,ffff");
283      string resultPath = Path.Combine(path, string.Format("{0} - Result.hl", id));
284      string outputPath = Path.Combine(path, string.Format("{0} - Console.txt", id));
285
286      using (var sw = new StreamWriter(outputPath)) {
287        sw.AutoFlush = true;
288
289        StringBuilder sb1 = new StringBuilder();
290        sb1.AppendLine(string.Format("Meta.PopulationSize: {0}", metaAlgorithmPopulationSize));
291        sb1.AppendLine(string.Format("Meta.MaxGenerations: {0}", metaAlgorithmMaxGenerations));
292        sb1.AppendLine(string.Format("Meta.Repetitions   : {0}", metaProblemRepetitions));
293        sb1.AppendLine(string.Format("Base.MaxGenerations: {0}", baseAlgorithmMaxGenerations));
294        sw.WriteLine(sb1.ToString());
295        Console.WriteLine(sb1.ToString());
296
297        metaLevelAlgorithm.Start();
298        int i = 0;
299        int currentGeneration = -1;
300        do {
301          Thread.Sleep(500);
302          if (metaLevelAlgorithm.Results.ContainsKey("Generations") && ((IntValue)metaLevelAlgorithm.Results["Generations"].Value).Value != currentGeneration) {
303            while (metaLevelAlgorithm.Results.Count < 3) Thread.Sleep(100);
304            StringBuilder sb = new StringBuilder();
305            sb.AppendLine(DateTime.Now.ToLongTimeString());
306            sb.AppendLine("=================================");
307
308            foreach (var result in metaLevelAlgorithm.Results) {
309              sb.AppendLine(result.ToString());
310              if (result.Name == "Population") {
311                RunCollection rc = (RunCollection)result.Value;
312                var orderedRuns = rc.OrderBy(x => x.Results["RunsAverageQuality"]);
313
314                sb.AppendLine("Qual.  PoSi MutRa Eli SelOp MutOp");
315                foreach (IRun run in orderedRuns) {
316                  string selector;
317                  if (run.Parameters["Selector"] is TournamentSelector) {
318                    selector = string.Format("{0} ({1})", run.Parameters["Selector"].ToString(), ((TournamentSelector)run.Parameters["Selector"]).GroupSizeParameter.Value.ToString());
319                  } else {
320                    selector = string.Format("{0}", run.Parameters["Selector"].ToString());
321                  }
322
323                  sb.AppendLine(string.Format("{0} {1} {2} {3} {4} {5}",
324                    ((DoubleValue)run.Results["RunsAverageQuality"]).Value.ToString("#0.00").PadLeft(7, ' '),
325                    ((IntValue)run.Parameters["PopulationSize"]).Value.ToString().PadLeft(3, ' ').PadRight(3, ' '),
326                    ((DoubleValue)run.Parameters["MutationProbability"]).Value.ToString("0.00").PadLeft(5, ' '),
327                    ((IntValue)run.Parameters["Elites"]).Value.ToString().PadLeft(3, ' '),
328                    Shorten(selector, 20).PadRight(20, ' '),
329                    run.Parameters.ContainsKey("Mutator") ? run.Parameters["Mutator"].ToString() : "null"));
330                }
331              }
332            } // foreach
333            Console.Clear();
334            Console.WriteLine(sb.ToString());
335            sw.WriteLine(sb.ToString());
336            currentGeneration = ((IntValue)metaLevelAlgorithm.Results["Generations"].Value).Value;
337          } // if
338          if (i % 30 == 0) GC.Collect();
339          i++;
340        } while (metaLevelAlgorithm.ExecutionState != ExecutionState.Stopped);
341      }
342
343      Console.WriteLine();
344      Console.WriteLine("Storing...");
345
346      ContentManager.Save((IStorableContent)metaLevelAlgorithm, resultPath, true);
347      Console.WriteLine("Finished");
348    }
349
350    private static void TestShorten() {
351      int n = 8;
352      Console.WriteLine(Shorten("1", n));
353      Console.WriteLine(Shorten("12", n));
354      Console.WriteLine(Shorten("123", n));
355      Console.WriteLine(Shorten("1234", n));
356      Console.WriteLine(Shorten("12345", n));
357      Console.WriteLine(Shorten("123456", n));
358      Console.WriteLine(Shorten("1234567", n));
359      Console.WriteLine(Shorten("12345678", n));
360      Console.WriteLine(Shorten("123456789", n));
361      Console.WriteLine(Shorten("1234567890", n));
362      Console.WriteLine(Shorten("12345678901", n));
363    }
364
365    private static string Shorten(string s, int n) {
366      string placeholder = "..";
367      if (s.Length <= n) return s;
368      int len = n / 2 - placeholder.Length / 2;
369      string start = s.Substring(0, len);
370      string end = s.Substring(s.Length - len, len);
371      return start + placeholder + end;
372    }
373
374    private static void TestIntSampling() {
375      System.Random rand = new System.Random();
376      int lower = 10;
377      int upper = 20;
378      int stepsize = 7;
379      for (int i = 0; i < 100; i++) {
380        int val;
381        do {
382          val = rand.Next(lower / stepsize, upper / stepsize + 1) * stepsize;
383        } while (val < lower || val > upper);
384        Console.WriteLine(val);
385      }
386    }
387
388    private static void TestDoubleSampling() {
389      System.Random rand = new System.Random();
390      double lower = 2;
391      double upper = 3;
392      double stepsize = 0.6;
393      for (int i = 0; i < 100; i++) {
394        double val;
395        do {
396          val = Math.Round((rand.NextDouble() * (upper - lower) + lower) / stepsize, 0) * stepsize;
397        } while (val < lower || val > upper);
398        Console.WriteLine(val);
399      }
400    }
401
402    private static IEnumerable<IItem> GetValidValues(IValueParameter valueParameter) {
403      return ApplicationManager.Manager.GetInstances(valueParameter.DataType).Select(x => (IItem)x).OrderBy(x => x.ItemName);
404    }
405  }
406}
Note: See TracBrowser for help on using the repository browser.