- Timestamp:
- 02/02/15 20:41:11 (10 years ago)
- Location:
- branches/HeuristicLab.Problems.GrammaticalOptimization
- Files:
-
- 1 deleted
- 9 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Problems.GrammaticalOptimization/GrammaticalOptimization.sln
r11851 r11865 72 72 HideSolutionNode = FALSE 73 73 EndGlobalSection 74 GlobalSection(Performance) = preSolution75 HasPerformanceSessions = true76 EndGlobalSection77 74 EndGlobal -
branches/HeuristicLab.Problems.GrammaticalOptimization/HeuristicLab.Problems.GrammaticalOptimization/HeuristicLab.Problems.GrammaticalOptimization.csproj
r11857 r11865 78 78 <Compile Include="Interfaces\IGrammar.cs" /> 79 79 <Compile Include="Interfaces\IProblem.cs" /> 80 <Compile Include="Interfaces\ISymbolicExpressionTreeProblem.cs" /> 80 81 <Compile Include="Problems\EvenParityProblem.cs" /> 81 82 <Compile Include="Problems\FindPhrasesProblem.cs" /> … … 95 96 <Compile Include="Sequence.cs" /> 96 97 <Compile Include="Properties\AssemblyInfo.cs" /> 97 <Compile Include="TreeRepresentation\ISymbolicExpressionTreeProblem.cs" />98 98 </ItemGroup> 99 99 <ItemGroup> -
branches/HeuristicLab.Problems.GrammaticalOptimization/HeuristicLab.Problems.GrammaticalOptimization/Problems/FindPhrasesProblem.cs
r11851 r11865 3 3 using System.Diagnostics; 4 4 using System.Linq; 5 using System.Text; 5 6 using HeuristicLab.Common; 7 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 6 8 7 9 namespace HeuristicLab.Problems.GrammaticalOptimization { … … 19 21 // this problem should be similar to symbolic regression and should be easier for approaches using a state esimation value and the canoncial state 20 22 // when phrases are symbol sets instead of sequences then value-estimation routines should be better (TD) 21 public class FindPhrasesProblem : I Problem {23 public class FindPhrasesProblem : ISymbolicExpressionTreeProblem { 22 24 23 25 private readonly IGrammar grammar; … … 45 47 this.phrasesAsSets = phrasesAsSets; 46 48 47 // create grammar48 49 var sentenceSymbol = 'S'; 49 50 var terminalSymbols = Enumerable.Range(0, alphabetSize).Select(off => (char)((byte)'a' + off)).ToArray(); 50 var nonTerminalSymbols = new char[] { 'S' }; 51 var rules = terminalSymbols.Select(t => Tuple.Create('S', t.ToString())) 52 .Concat(terminalSymbols.Select(t => Tuple.Create('S', t + "S"))); 51 var nonTerminalSymbols = new char[] { sentenceSymbol }; 53 52 54 this.grammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 53 { 54 // create grammar 55 // S -> a..z | aS .. zS 56 var rules = terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t.ToString())) 57 .Concat(terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t + sentenceSymbol.ToString()))); 58 59 this.grammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 60 } 61 { 62 // create grammar for tree-based GP 63 // S -> a..z | SS 64 var rules = terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t.ToString())) 65 .Concat(new Tuple<char, string>[] { Tuple.Create(sentenceSymbol, sentenceSymbol.ToString() + sentenceSymbol) }); 66 67 this.TreeBasedGPGrammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 68 } 55 69 56 70 // generate optimal phrases … … 144 158 } 145 159 146 public IEnumerable<Feature> GetFeatures(string phrase) 147 { 160 public IEnumerable<Feature> GetFeatures(string phrase) { 148 161 throw new NotImplementedException(); 149 162 } … … 153 166 optimalPhrases.Count, correctReward, decoyPhrases.Count, decoyReward, phrasesAsSets); 154 167 } 168 169 public IGrammar TreeBasedGPGrammar { get; private set; } 170 public string ConvertTreeToSentence(ISymbolicExpressionTree tree) { 171 var sb = new StringBuilder(); 172 foreach (var s in tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix()) { 173 if (s.Symbol.Name == "S") continue; 174 sb.Append(s.Symbol.Name); 175 } 176 return sb.ToString(); 177 } 155 178 } 156 179 } -
branches/HeuristicLab.Problems.GrammaticalOptimization/HeuristicLab.Problems.GrammaticalOptimization/Problems/RoyalPhraseSequenceProblem.cs
r11832 r11865 6 6 using System.Text.RegularExpressions; 7 7 using HeuristicLab.Common; 8 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 8 9 9 10 namespace HeuristicLab.Problems.GrammaticalOptimization { … … 21 22 // for phraseLen > 1 this should be harder than RoyalSymbolProblem 22 23 // when phrases are symbol sets instead of sequences then value-estimation routines should be better (TD) 23 public class RoyalPhraseSequenceProblem : I Problem {24 public class RoyalPhraseSequenceProblem : ISymbolicExpressionTreeProblem { 24 25 25 26 private readonly IGrammar grammar; … … 43 44 this.incorrectReward = incorrectReward; 44 45 this.phrasesAsSets = phrasesAsSets; 46 45 47 var sentenceSymbol = 'S'; 46 48 var terminalSymbols = Enumerable.Range(0, alphabetSize).Select(off => (char)((byte)'a' + off)).ToArray(); 47 var nonTerminalSymbols = new char[] { 'S' }; 48 var rules = terminalSymbols.Select(t => Tuple.Create('S', t.ToString())) 49 .Concat(terminalSymbols.Select(t => Tuple.Create('S', t + "S"))); 49 var nonTerminalSymbols = new char[] { sentenceSymbol }; 50 50 51 this.grammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 51 { 52 // create grammar 53 // S -> a..z | aS .. zS 54 var rules = terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t.ToString())) 55 .Concat(terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t + sentenceSymbol.ToString()))); 56 57 this.grammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 58 } 59 { 60 // create grammar for tree-based GP 61 // S -> a..z | SS 62 var rules = terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t.ToString())) 63 .Concat(new Tuple<char, string>[] { Tuple.Create(sentenceSymbol, sentenceSymbol.ToString() + sentenceSymbol) }); 64 65 this.TreeBasedGPGrammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 66 } 52 67 53 68 this.optimalPhrasesForPos = new SortedSet<string>[sequenceLen]; … … 133 148 } 134 149 135 public IEnumerable<Feature> GetFeatures(string phrase) 136 { 150 public IEnumerable<Feature> GetFeatures(string phrase) { 137 151 throw new NotImplementedException(); 152 } 153 154 public IGrammar TreeBasedGPGrammar { get; private set; } 155 public string ConvertTreeToSentence(ISymbolicExpressionTree tree) { 156 var sb = new StringBuilder(); 157 foreach (var s in tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix()) { 158 if (s.Symbol.Name == "S") continue; 159 sb.Append(s.Symbol.Name); 160 } 161 return sb.ToString(); 138 162 } 139 163 } -
branches/HeuristicLab.Problems.GrammaticalOptimization/HeuristicLab.Problems.GrammaticalOptimization/Problems/RoyalSequenceProblem.cs
r11832 r11865 6 6 using System.Text.RegularExpressions; 7 7 using HeuristicLab.Common; 8 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 8 9 9 10 namespace HeuristicLab.Problems.GrammaticalOptimization { … … 15 16 // 16 17 // this problem should be hard for GP and easy for MCTS (TD should not have an advantage compared to MCTS) 17 public class RoyalSequenceProblem : I Problem {18 public class RoyalSequenceProblem : ISymbolicExpressionTreeProblem { 18 19 19 20 private readonly IGrammar grammar; … … 31 32 this.correctReward = correctReward; 32 33 this.incorrectReward = incorrectReward; 34 33 35 const char sentenceSymbol = 'S'; 34 36 var terminalSymbols = Enumerable.Range(0, alphabetSize).Select(off => (char)((byte)'a' + off)).ToArray(); 35 37 var nonTerminalSymbols = new char[] { sentenceSymbol }; 36 var rules = terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t.ToString())) 37 .Concat(terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t + sentenceSymbol.ToString()))); 38 //var rules = terminalSymbols.Select(t => Tuple.Create('S', t + "S")) 39 // .Concat(terminalSymbols.Select(t => Tuple.Create('S', t.ToString()))); 40 this.grammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 38 39 { 40 // create grammar for sequential search 41 // S -> a..z | aS .. zS 42 var rules = terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t.ToString())) 43 .Concat(terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t + sentenceSymbol.ToString()))); 44 this.grammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 45 } 46 { 47 // create grammar for sequential search 48 // S -> a..z | SS 49 var rules = terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t.ToString())) 50 .Concat(terminalSymbols.Select(t => Tuple.Create(sentenceSymbol, t + sentenceSymbol.ToString()))); 51 this.grammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols, rules); 52 } 41 53 42 54 this.optimalSymbolsForPos = new SortedSet<char>[sequenceLen]; … … 89 101 } 90 102 91 public IEnumerable<Feature> GetFeatures(string phrase) 92 { 103 public IEnumerable<Feature> GetFeatures(string phrase) { 93 104 throw new NotImplementedException(); 105 } 106 107 public IGrammar TreeBasedGPGrammar { get; private set; } 108 public string ConvertTreeToSentence(ISymbolicExpressionTree tree) { 109 var sb = new StringBuilder(); 110 foreach (var s in tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix()) { 111 if (s.Symbol.Name == "S") continue; 112 sb.Append(s.Symbol.Name); 113 } 114 return sb.ToString(); 94 115 } 95 116 } -
branches/HeuristicLab.Problems.GrammaticalOptimization/HeuristicLab.Problems.GrammaticalOptimization/Problems/RoyalTreeProblem.cs
r11832 r11865 1 1 using System; 2 2 using System.Collections.Generic; 3 using System.Diagnostics; 3 4 using System.Linq; 4 5 using System.Text; 6 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 5 7 6 8 namespace HeuristicLab.Problems.GrammaticalOptimization { 7 public class RoyalTreeProblem : I Problem {9 public class RoyalTreeProblem : ISymbolicExpressionTreeProblem { 8 10 // Punch: "How Effective Are Multiple Populations in Genetic Programming", 1998 9 private const string grammarString = @" 10 G(S): 11 S -> 0 12 "; 11 // In fact, for a new GP system it is dicult to judge whether it is performing 12 // as intended or not, since the programs it generates are not necessarily identical to 13 // those generated by other GP systems. This raised two questions: what constitutes 14 // a "standard" problem in GP, and how do we rate the performance of a system on 15 // such a problem. 16 // One of the goals of this research was to create a benchmark problem to test how 17 // well a particular GP configuration would perform as compared to other configurations. 18 // ... 19 // We were interested in addressing the same issues, showing how GP could address 20 // difficult problems as well as providing a tunable benchmark for comparing GP con- 21 // figurations. Furthermore, we were interested in creating and using this benchmark 22 // to test the effectiveness of coarse-grain parallel GP's as compared to single population 23 // GP's. 24 // ... 25 // A suitable benchmark problem which has only a single, unique tree as an answer can remove this obstruction. 13 26 14 27 private readonly IGrammar grammar; 15 public RoyalTreeProblem() { 16 this.grammar = new Grammar(grammarString); 17 } 28 private readonly char targetRootSymbol; 29 // the number of levels determines the number of non-terminal symbols 30 // non-terminal A has only one argument, non-terminal B has two arguments ... 31 // optimal level-e tree has quality 122880, 32 // level-a (a) tree has 33 // level-f (6) tree "is extremely difficult" 34 // level-g (7) tree "never succeeded" 35 public RoyalTreeProblem(int levels) { 36 if (levels < 1 || levels > 7) throw new ArgumentException(); 37 var sentenceSymbol = 'S'; 38 var terminalSymbols = new char[] { 'x', 'y', 'z' }; 39 // originally non-terminal-symbols (but for the sequential search grammar these are only alternatives 40 var nonTerminalSymbols = Enumerable.Range(0, levels).Select(lvl => (char)(lvl + (byte)'A')).ToArray(); // [A, B ... ] 41 var arities = Enumerable.Range(1, levels).ToArray(); // [1, 2, ... levels] 42 this.targetRootSymbol = char.ToLower(nonTerminalSymbols.Last()); 43 { 44 // grammar for sequential search 45 // S -> x | y | z | aS | bSS | cSSS ... 46 47 var rules = new List<Tuple<char, string>>(); 48 foreach (var symb in terminalSymbols) { 49 rules.Add(Tuple.Create('S', symb.ToString())); 50 } 51 for (int ntIdx = 0; ntIdx < nonTerminalSymbols.Length; ntIdx++) { 52 var opSymb = char.ToLower(nonTerminalSymbols[ntIdx]); 53 var remChain = string.Join("", Enumerable.Repeat('S', arities[ntIdx])); 54 rules.Add(Tuple.Create('S', opSymb + remChain)); 55 } 56 57 this.grammar = new Grammar(sentenceSymbol, terminalSymbols.Concat(nonTerminalSymbols.Select(char.ToLower)), new char[] { 'S' }, rules); 58 } 59 60 { 61 // grammar for tree-based GP 62 // S -> x | y | z | A | B | C ... 63 // A -> S 64 // B -> SS 65 // C -> SSS 66 var rules = new List<Tuple<char, string>>(); 67 foreach (var symb in terminalSymbols.Concat(nonTerminalSymbols)) { 68 rules.Add(Tuple.Create('S', symb.ToString())); 69 } 70 71 for (int ntIdx = 0; ntIdx < nonTerminalSymbols.Length; ntIdx++) { 72 var ntSymb = nonTerminalSymbols[ntIdx]; 73 var alt = string.Join("", Enumerable.Repeat('S', arities[ntIdx])); 74 rules.Add(Tuple.Create(ntSymb, alt)); 75 } 76 this.TreeBasedGPGrammar = new Grammar(sentenceSymbol, terminalSymbols, nonTerminalSymbols.Concat(new char[] { 'S' }), rules); 77 } 78 79 maxSizeForLevel = new int[8]; 80 optimalSentencesForLevel = new string[8]; 81 optimalQualityForLevel = new double[8]; 82 maxSizeForLevel[0] = 1; // lvl-0 (x | y) 83 maxSizeForLevel[1] = 2; // lvl-1 (e.g. ax) 84 optimalSentencesForLevel[0] = "x"; 85 optimalQualityForLevel[0] = 1; 86 //optimalSentencesForLevel[1] = "ax"; 87 //optimalQualityForLevel[1] = 4; 88 89 for (int i = 1; i < maxSizeForLevel.Length; i++) { 90 maxSizeForLevel[i] = i * maxSizeForLevel[i - 1] + 1; // e.g. lvl-2: baxax 91 92 var opSymb = char.ToLower(nonTerminalSymbols[i - 1]); 93 optimalSentencesForLevel[i] = opSymb + 94 string.Join("", 95 Enumerable.Repeat(optimalSentencesForLevel[i - 1], arities[i - 1])); 96 97 optimalQualityForLevel[i] = Evaluate(optimalSentencesForLevel[i]); 98 } 99 100 // from the paper 101 Debug.Assert(maxSizeForLevel[5] == 326); 102 Debug.Assert(maxSizeForLevel[6] == 1957); 103 } 104 105 private readonly string[] optimalSentencesForLevel; 106 private readonly double[] optimalQualityForLevel; 107 private readonly int[] maxSizeForLevel; 18 108 19 109 public double BestKnownQuality(int maxLen) { 20 // for now only an upper bound is returned, ideally all fitness cases are predicted correctly 21 throw new NotImplementedException(); 110 // search for corresponding level 111 int level = 0; 112 while (maxSizeForLevel[level + 1] < maxLen) level++; 113 // ASSERT: maxSizeForLevel[level + 1] >= maxLen 114 return optimalQualityForLevel[level]; 22 115 } 23 116 … … 27 120 28 121 public double Evaluate(string sentence) { 29 throw new NotImplementedException(); 30 } 122 int pos = 0; 123 bool perfect; 124 return Evaluate(sentence, ref pos, out perfect); 125 } 126 127 private double Evaluate(string sentence, ref int pos, out bool perfect) { 128 const double completeBonus = 2.0; 129 double t = 0.0; 130 double weight = 0.0; 131 double sum = 0.0; 132 bool correctRoot = false; 133 bool allPerfect = true, tPerfect; 134 int arity; 135 switch (sentence[pos]) { 136 case 'a': 137 pos++; 138 correctRoot = (sentence[pos] == 'x'); 139 t = Evaluate(sentence, ref pos, out tPerfect); // ignores the perfect flag (false for terminals) 140 weight = GetWeight(correctRoot, true); 141 sum = weight * t; 142 perfect = correctRoot; 143 if (correctRoot) sum *= completeBonus; 144 return sum; 145 case 'b': { 146 arity = 2; 147 pos++; 148 for (int i = 0; i < arity; i++) { 149 correctRoot = (sentence[pos] == 'a'); 150 t = Evaluate(sentence, ref pos, out tPerfect); 151 weight = GetWeight(correctRoot, tPerfect); 152 allPerfect &= correctRoot & tPerfect; 153 sum += weight * t; 154 } 155 perfect = allPerfect; 156 if (allPerfect) sum *= completeBonus; 157 return sum; 158 } 159 case 'c': { 160 arity = 3; 161 sum = 0.0; 162 pos++; 163 for (int i = 0; i < arity; i++) { 164 correctRoot = (sentence[pos] == 'b'); 165 t = Evaluate(sentence, ref pos, out tPerfect); 166 weight = GetWeight(correctRoot, tPerfect); 167 allPerfect &= correctRoot & tPerfect; 168 sum += weight * t; 169 } 170 perfect = allPerfect; 171 if (allPerfect) sum *= completeBonus; 172 return sum; 173 } 174 case 'd': { 175 arity = 4; 176 sum = 0.0; 177 pos++; 178 for (int i = 0; i < arity; i++) { 179 correctRoot = (sentence[pos] == 'c'); 180 t = Evaluate(sentence, ref pos, out tPerfect); 181 weight = GetWeight(correctRoot, tPerfect); 182 allPerfect &= correctRoot & tPerfect; 183 sum += weight * t; 184 } 185 perfect = allPerfect; 186 if (allPerfect) sum *= completeBonus; 187 return sum; 188 } 189 case 'e': { 190 arity = 5; 191 sum = 0.0; 192 pos++; 193 for (int i = 0; i < arity; i++) { 194 correctRoot = (sentence[pos] == 'd'); 195 t = Evaluate(sentence, ref pos, out tPerfect); 196 weight = GetWeight(correctRoot, tPerfect); 197 allPerfect &= correctRoot & tPerfect; 198 sum += weight * t; 199 } 200 perfect = allPerfect; 201 if (allPerfect) sum *= completeBonus; 202 return sum; 203 } 204 case 'f': { 205 arity = 6; 206 sum = 0.0; 207 pos++; 208 for (int i = 0; i < arity; i++) { 209 correctRoot = (sentence[pos] == 'e'); 210 t = Evaluate(sentence, ref pos, out tPerfect); 211 weight = GetWeight(correctRoot, tPerfect); 212 allPerfect &= correctRoot & tPerfect; 213 sum += weight * t; 214 } 215 perfect = allPerfect; 216 if (allPerfect) sum *= completeBonus; 217 return sum; 218 } 219 case 'g': { 220 arity = 7; 221 sum = 0.0; 222 pos++; 223 for (int i = 0; i < arity; i++) { 224 correctRoot = (sentence[pos] == 'f'); 225 t = Evaluate(sentence, ref pos, out tPerfect); 226 weight = GetWeight(correctRoot, tPerfect); 227 allPerfect &= correctRoot & tPerfect; 228 sum += weight * t; 229 } 230 perfect = allPerfect; 231 if (allPerfect) sum *= completeBonus; 232 return sum; 233 } 234 case 'x': 235 pos++; 236 perfect = false; 237 return 1.0; 238 case 'y': 239 case 'z': 240 pos++; 241 perfect = false; 242 return 0.0; 243 default: throw new ArgumentException(); 244 } 245 } 246 247 private double GetWeight(bool correctRoot, bool perfect) { 248 const double fullBonus = 2.0; 249 const double partialBonus = 1.0; 250 const double penalty = 0.33; 251 if (correctRoot && perfect) return fullBonus; 252 else if (correctRoot) return partialBonus; 253 else return penalty; 254 } 255 31 256 public string CanonicalRepresentation(string phrase) { 32 257 throw new NotImplementedException(); … … 34 259 } 35 260 36 public IEnumerable<Feature> GetFeatures(string phrase) 37 { 261 public IEnumerable<Feature> GetFeatures(string phrase) { 38 262 throw new NotImplementedException(); 263 } 264 265 public IGrammar TreeBasedGPGrammar { get; private set; } 266 public string ConvertTreeToSentence(ISymbolicExpressionTree tree) { 267 var sb = new StringBuilder(); 268 foreach (var s in tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix()) { 269 if (s.Symbol.Name == "S") continue; 270 sb.Append(s.Symbol.Name.ToLower()); 271 } 272 return sb.ToString(); 39 273 } 40 274 } -
branches/HeuristicLab.Problems.GrammaticalOptimization/HeuristicLab.Problems.GrammaticalOptimization/SentenceSetStatistics.cs
r11847 r11865 23 23 public SentenceSetStatistics(double bestKnownQuality = 1.0) { 24 24 this.bestKnownQuality = bestKnownQuality; 25 BestSentenceQuality = double.NegativeInfinity; 26 BestSentence = string.Empty; 27 FirstSentence = string.Empty; 28 LastSentence = string.Empty; 25 29 } 26 30 -
branches/HeuristicLab.Problems.GrammaticalOptimization/Main/Program.cs
r11847 r11865 25 25 26 26 //RunDemo(); 27 RunGpDemo();27 //RunGpDemo(); 28 28 // RunGridTest(); 29 RunGpGridTest(); 29 30 } 30 31 … … 174 175 175 176 private static void RunDemo() { 176 // TODO: implement bridge to HL-GP177 177 // TODO: unify MCTS, TD and ContextMCTS Solvers (stateInfos) 178 178 // TODO: test with eps-greedy using max instead of average as value (seems to work well for symb-reg! explore further!) 179 179 // TODO: separate value function from policy 180 // TODO: in contextual MCTS store a bandit info for each node in the _graph_ and also update all bandit infos of all parents181 // TODO: exhaustive search with priority list182 180 // TODO: warum funktioniert die alte Implementierung von GaussianThompson besser fÃŒr SantaFe als neue? Siehe Vergleich: alte vs. neue implementierung GaussianThompsonSampling 183 181 // TODO: why does GaussianThompsonSampling work so well with MCTS for the artificial ant problem? 184 182 // TODO: research thompson sampling for max bandit? 185 // TODO: ausfÃŒhrlicher test von strategien fÃŒr numCorrectPhrases-armed max bandit186 183 // TODO: verify TA implementation using example from the original paper 187 // TODO: separate policy from MCTS tree data structure to allow sharing of information over disconnected parts of the tree (semantic equivalence)188 184 // TODO: implement thompson sampling for gaussian mixture models 189 // TODO: implement inspection for MCTS (eventuell interactive command line fÃŒr statistiken aus dem baum anzeigen)190 // TODO: implement ACO-style bandit policy191 185 // TODO: gleichzeitige modellierung von transformierter zielvariable (y, 1/y, log(y), exp(y), sqrt(y), ...) 192 186 // TODO: vergleich bei complete-randomly möglichst kurze sÀtze generieren vs. einfach zufÀllig alternativen wÀhlen … … 299 293 300 294 public static void RunGpDemo() { 301 302 295 int iterations = 0; 296 const int seed = 31415; 303 297 const int maxIterations = 100000; 298 299 } 300 301 302 private static void RunGpGridTest() { 303 const int nReps = 20; 304 304 const int seed = 31415; 305 var globalStatistics = new SentenceSetStatistics(512); 306 307 var gp = new StandardGP(new HardPalindromeProblem(), new Random(seed)); 308 gp.FoundNewBestSolution += (sentence, quality) => { 309 Console.WriteLine("{0}", globalStatistics); 310 }; 305 const int maxIters = 100000; 306 var rand = new Random(seed); 307 var problemFactories = new Func<ISymbolicExpressionTreeProblem>[] 308 { 309 () => new SantaFeAntProblem(), 310 () => new SymbolicRegressionPoly10Problem(), 311 }; 312 foreach (var popSize in new int[] { 50, 100, 250, 500, 1000, 2500, 5000 }) { 313 foreach (var mutationRate in new double[] {/* 0.05, 0.10, */ 0.15, /* 0.25, 0.3 */ }) { 314 foreach (var maxSize in new int[] { 30, 50, 100 }) { 315 foreach (var problemFactory in problemFactories) 316 for (int i = 0; i < nReps; i++) { 317 var solverSeed = rand.Next(); 318 { 319 var prob = problemFactory(); 320 RunStandardGP(prob, solverSeed, maxIters, popSize, mutationRate, maxSize); 321 } 322 { 323 var prob = problemFactory(); 324 RunOSGP(prob, solverSeed, maxIters, popSize, mutationRate, maxSize); 325 } 326 } 327 } 328 } 329 } 330 } 331 332 private static void RunStandardGP(ISymbolicExpressionTreeProblem prob, int solverSeed, int maxIters, int popSize, double mutationRate, int maxSize) { 333 int iterations = 0; 334 var globalStatistics = new SentenceSetStatistics(prob.BestKnownQuality(maxSize)); 335 336 var gp = new StandardGP(prob, new Random(solverSeed)); 311 337 gp.SolutionEvaluated += (sentence, quality) => { 312 338 iterations++; … … 314 340 315 341 if (iterations % 10000 == 0) { 316 Console.WriteLine("{0}", globalStatistics); 317 } 318 }; 319 320 gp.PopulationSize = 1000; 321 gp.MaxSolutionSize = 31 + 2; 322 gp.MaxSolutionDepth = 20; 342 Console.WriteLine("\"{0,25}\" \"{1,25}\" {2}", gp, prob, globalStatistics); 343 } 344 }; 345 346 gp.PopulationSize = popSize; 347 gp.MutationRate = mutationRate; 348 gp.MaxSolutionSize = maxSize + 2; 349 gp.MaxSolutionDepth = maxSize + 2; 323 350 324 351 var sw = new Stopwatch(); 325 352 326 353 sw.Start(); 327 gp.Run(maxIter ations);354 gp.Run(maxIters); 328 355 sw.Stop(); 329 356 330 Console.WriteLine(globalStatistics); 331 Console.WriteLine("{0:F2} sec {1,10:F1} sols/sec {2,10:F1} ns/sol", 332 sw.Elapsed.TotalSeconds, 333 maxIterations / (double)sw.Elapsed.TotalSeconds, 334 (double)sw.ElapsedMilliseconds * 1000 / maxIterations); 357 Console.WriteLine("\"{0,25}\" \"{1,25}\" {2}", gp, prob, globalStatistics); 358 359 // Console.WriteLine("{0:F2} sec {1,10:F1} sols/sec {2,10:F1} ns/sol", 360 // sw.Elapsed.TotalSeconds, 361 // maxIters / (double)sw.Elapsed.TotalSeconds, 362 // (double)sw.ElapsedMilliseconds * 1000 / maxIters); 363 } 364 365 private static void RunOSGP(ISymbolicExpressionTreeProblem prob, int solverSeed, int maxIters, int popSize, double mutationRate, int maxSize) { 366 int iterations = 0; 367 var globalStatistics = new SentenceSetStatistics(prob.BestKnownQuality(maxSize)); 368 369 var gp = new OffspringSelectionGP(prob, new Random(solverSeed)); 370 gp.SolutionEvaluated += (sentence, quality) => { 371 iterations++; 372 globalStatistics.AddSentence(sentence, quality); 373 374 if (iterations % 10000 == 0) { 375 Console.WriteLine("\"{0,25}\" \"{1,25}\" {2}", gp, prob, globalStatistics); 376 } 377 }; 378 379 gp.PopulationSize = popSize; 380 gp.MutationRate = mutationRate; 381 gp.MaxSolutionSize = maxSize + 2; 382 gp.MaxSolutionDepth = maxSize + 2; 383 384 var sw = new Stopwatch(); 385 386 sw.Start(); 387 gp.Run(maxIters); 388 sw.Stop(); 389 390 Console.WriteLine("\"{0,25}\" \"{1,25}\" {2}", gp, prob, globalStatistics); 391 392 // Console.WriteLine("{0:F2} sec {1,10:F1} sols/sec {2,10:F1} ns/sol", 393 // sw.Elapsed.TotalSeconds, 394 // maxIters / (double)sw.Elapsed.TotalSeconds, 395 // (double)sw.ElapsedMilliseconds * 1000 / maxIters); 335 396 } 336 397 } -
branches/HeuristicLab.Problems.GrammaticalOptimization/Test/TestInstances.cs
r11747 r11865 146 146 Assert.AreEqual(89, p.Evaluate("?(m)(ll?(m)(r))mr")); 147 147 } 148 [TestMethod] 149 public void TestRoyalTreeProblem() { 150 var p = new RoyalTreeProblem(); 151 Console.WriteLine(p.Grammar); 152 153 } 148 154 149 [TestMethod] 155 150 public void TestRoyalRoadProblem() { … … 261 256 Assert.AreEqual(1.0, p.Evaluate("a*b+c*d+e*f+a*g*i+c*f*j"), 1.0E-7); 262 257 } 258 259 [TestMethod] 260 public void TestRoyalTreeProblem() { 261 var p = new RoyalTreeProblem(7); 262 Console.WriteLine(p.Grammar); 263 264 // examples from The Royal Tree Problem, a Benchmark for Single and Multi-population Genetic Programming (Punch, Zongker, Goodman) 265 Assert.AreEqual(4, p.Evaluate("ax"), 1.0E-7); 266 Assert.AreEqual(384.0, p.Evaluate("cbaxaxbaxaxbaxax"), 1.0E-7); 267 Assert.AreEqual(128.66, p.Evaluate("cbaxaxbaxaxbxx"), 1.0E-7); 268 Assert.AreEqual(64.66, p.Evaluate("cbaxaxxx"), 1.0E-7); 269 270 } 263 271 } 264 272 }
Note: See TracChangeset
for help on using the changeset viewer.