Changeset 18065 for branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/StructuredSymbolicRegressionSingleObjectiveProblem.cs
- Timestamp:
- 10/08/21 16:28:53 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3136_Structural_GP/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/StructuredSymbolicRegressionSingleObjectiveProblem.cs
r18063 r18065 24 24 private const string GrammarParameterName = "Grammar"; 25 25 private const string StructureTemplateParameterName = "Structure Template"; 26 26 private const string MainTreeResultParameterName = "Main Tree"; 27 27 #endregion 28 28 … … 31 31 public IFixedValueParameter<StringValue> StructureDefinitionParameter => (IFixedValueParameter<StringValue>)Parameters[StructureDefinitionParameterName]; 32 32 public IFixedValueParameter<StructureTemplate> StructureTemplateParameter => (IFixedValueParameter<StructureTemplate>)Parameters[StructureTemplateParameterName]; 33 public IValueParameter<ISymbolicDataAnalysisGrammar> GrammarParameter => (IValueParameter<ISymbolicDataAnalysisGrammar>)Parameters[GrammarParameterName]; // könnte auch weg? 33 public IValueParameter<ISymbolicDataAnalysisGrammar> GrammarParameter => (IValueParameter<ISymbolicDataAnalysisGrammar>)Parameters[GrammarParameterName]; 34 public IResultParameter<ISymbolicExpressionTree> MainTreeResultParameter => (IResultParameter<ISymbolicExpressionTree>)Parameters[MainTreeResultParameterName]; 34 35 #endregion 35 36 … … 76 77 varSym.Enabled = true; 77 78 79 var structureTemplate = new StructureTemplate(); 80 structureTemplate.Changed += (sender, args) => { 81 foreach (var e in Encoding.Encodings.ToArray()) 82 Encoding.Remove(e); 83 84 foreach(var sf in structureTemplate.SubFunctions.Values) { 85 Encoding.Add(new SymbolicExpressionTreeEncoding(sf.Name, sf.Grammar, sf.MaximumSymbolicExpressionTreeLength, sf.MaximumSymbolicExpressionTreeDepth)); 86 } 87 }; 88 78 89 Parameters.Add(new ValueParameter<RegressionProblemData>(ProblemDataParameterName, problemData)); 79 Parameters.Add(new FixedValueParameter<StringValue>(StructureDefinitionParameterName, new StringValue("e^f(x)/F(y)"))); 80 Parameters.Add(new FixedValueParameter<StructureTemplate>(StructureTemplateParameterName, new StructureTemplate())); 90 Parameters.Add(new FixedValueParameter<StructureTemplate>(StructureTemplateParameterName, structureTemplate)); 81 91 Parameters.Add(new ValueParameter<ISymbolicDataAnalysisGrammar>(GrammarParameterName, grammar)); 82 var parser = new InfixExpressionParser(); 83 var tree = parser.Parse(StructureDefinition); 84 85 GetSubFunctions(tree); 92 Parameters.Add(new ResultParameter<ISymbolicExpressionTree>(MainTreeResultParameterName, "")); 93 MainTreeResultParameter.DefaultValue = new SymbolicExpressionTree(); 86 94 } 87 95 … … 90 98 [StorableConstructor] 91 99 protected StructuredSymbolicRegressionSingleObjectiveProblem(StorableConstructorFlag _) : base(_) { } 100 #endregion 92 101 102 #region Cloning 93 103 public override IDeepCloneable Clone(Cloner cloner) => 94 104 new StructuredSymbolicRegressionSingleObjectiveProblem(this, cloner); 95 105 #endregion 96 106 97 public void GetSubFunctions(ISymbolicExpressionTree tree) { 98 int count = 1; 99 foreach(var node in tree.IterateNodesPrefix()) 100 if(node.Symbol is SubFunctionSymbol) 101 Encoding.Add(new SymbolicExpressionTreeEncoding($"f{count++}", Grammar/*new LinearScalingGrammar()*/, 25, 8)); 102 } 107 public override double Evaluate(Individual individual, IRandom random) { 108 var templateTree = (ISymbolicExpressionTree)StructureTemplate.Tree.Clone(); 109 var subFunctionDict = StructureTemplate.SubFunctions; 110 111 // build main tree 112 foreach (var n in templateTree.IterateNodesPrefix()) { 113 if(n is SubFunctionTreeNode subFunctionTreeNode) { 114 if(subFunctionDict.TryGetValue(subFunctionTreeNode, out SubFunction subFunction)) { 115 var subFunctionTree = individual.SymbolicExpressionTree(subFunction.Name); 116 var parent = n.Parent; 117 // remove all subtrees 103 118 104 public override double Evaluate(Individual individual, IRandom random) { 105 Console.WriteLine(StructureTemplate.Template); 119 var subtreeCount = parent.SubtreeCount; 120 for (int idx = 0; idx < subtreeCount; ++idx) 121 parent.RemoveSubtree(idx); 122 123 // add new tree 124 parent.AddSubtree(subFunctionTree.Root); 125 } 126 } 127 } 128 129 MainTreeResultParameter.ActualValue = templateTree; 130 /* 106 131 foreach (var kvp in individual.Values) { 107 132 if(kvp.Value is SymbolicExpressionTree tree) { … … 111 136 } 112 137 } 113 Console.WriteLine(tree);114 138 } 115 139 } 140 */ 116 141 return 0.0; 117 142 }
Note: See TracChangeset
for help on using the changeset viewer.