Changeset 17134 for branches/2988_ModelsOfModels2/HeuristicLab.Algorithms.EMM/EMMAlgorithm/EMMAlgorithm.cs
- Timestamp:
- 07/11/19 16:30:22 (5 years ago)
- Location:
- branches/2988_ModelsOfModels2/HeuristicLab.Algorithms.EMM/EMMAlgorithm
- Files:
-
- 1 added
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/2988_ModelsOfModels2/HeuristicLab.Algorithms.EMM/EMMAlgorithm/EMMAlgorithm.cs
r17133 r17134 25 25 using HeuristicLab.Data; 26 26 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 27 using HeuristicLab.Problems.DataAnalysis; 27 28 using HeuristicLab.Problems.DataAnalysis.Symbolic; 29 using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression; 28 30 using HeuristicLab.Random; 29 31 using HeuristicLab.Selection; … … 34 36 35 37 namespace HeuristicLab.Algorithms.EvolvmentModelsOfModels { 36 [Item("Evolv ment Models Of Models Algorithm (EMM) ", "EMM implementation")]38 [Item("Evolvement Models Of Models Algorithm (EMM) ", "EMM implementation")] 37 39 [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 125)] 38 40 [StorableType("AD23B21F-089A-4C6C-AD2E-1B01E7939CF5")] 39 41 public class EMMAlgorithm : EvolvmentModelsOfModelsAlgorithmBase { 42 #region Constructors 40 43 public EMMAlgorithm() : base() { } 41 44 protected EMMAlgorithm(EMMAlgorithm original, Cloner cloner) : base(original, cloner) { } … … 46 49 [StorableConstructor] 47 50 protected EMMAlgorithm(StorableConstructorFlag _) : base(_) { } 48 51 #endregion 52 #region Algorithm run 49 53 protected override void Run(CancellationToken cancellationToken) { 54 55 Map.DistanceParametr = DistanceType.Value; 56 50 57 if (AlgorithmImplemetationType.Value == "Read") { 51 Map.MapRead( RandomParameter.Value, trees, "Map.txt");58 Map.MapRead(trees); 52 59 } else { 53 60 Map.MapCreationPrepare(trees); 54 Map.CreateMap(RandomParameter.Value, ClusterNumbersParameter.Value.Value); 55 // Map.WriteMapToTxtFile(RandomParameter.Value); хайв этого не любит.. ворчит 56 } 57 ClusterNumbersShowParameter.Value.Value = Map.Map.Count; 58 59 if (AlgorithmImplemetationType.Value == "OnlyMap") { 60 globalScope = new Scope("Global Scope"); 61 executionContext = new ExecutionContext(null, this, globalScope); 62 } else { 63 if (previousExecutionState != ExecutionState.Paused) { 64 InitializeAlgorithm(cancellationToken); 65 } 66 if (!globalScope.Variables.ContainsKey("TreeModelMap")) 67 globalScope.Variables.Add(new Variable("TreeModelMap", Map)); 68 if (!globalScope.Variables.ContainsKey("Map")) 69 globalScope.Variables.Add(new Variable("Map", Map)); 70 EMMAlgorithmRun(cancellationToken); 71 } 61 Map.CreateMap(RandomParameter.Value, Problem); 62 } 63 if (previousExecutionState != ExecutionState.Paused) { 64 InitializeAlgorithm(cancellationToken); 65 } 66 if (!globalScope.Variables.ContainsKey("TreeModelMap")) 67 globalScope.Variables.Add(new Variable("TreeModelMap", Map)); 68 if (!globalScope.Variables.ContainsKey("Map")) 69 globalScope.Variables.Add(new Variable("Map", Map)); 70 EMMAlgorithmRun(cancellationToken); 72 71 } 73 72 private void EMMAlgorithmRun(CancellationToken cancellationToken) { … … 88 87 var rand = RandomParameter.Value; 89 88 var elites = Elites.Value; 90 91 // cancellation token for the inner operations which should not be immediately cancel led89 var fmd = new InfixExpressionFormatter(); 90 // cancellation token for the inner operations which should not be immediately canceled 92 91 var innerToken = new CancellationToken(); 92 // for future 93 //var mutatorTypes = new SymbolicExpressionTreeManipulator[] 94 //{ 95 // new EMMMultyPointsMutator(), 96 // new EMMMultyPointsMutatorNodeTypeSaving (), 97 // new EMMMutators() 98 //}; 99 //var tuu = MutatorParameter.ValidValues; 100 //var select = SelectorParameter.ValidValues; 93 101 94 102 while (EvaluatedSolutions < maximumEvaluatedSolutions && !cancellationToken.IsCancellationRequested) { … … 113 121 114 122 for (int i = 0; i < selector.NumberOfSelectedSubScopesParameter.Value.Value; i += 2) { 115 // crossover116 123 IScope childScope = null; 124 // for future 125 //var obbbb = CrossoverParameter.ValidValues.ToList(); 126 //int nn = 3; 127 //if (rand.NextDouble() < crossoverProbability) { 128 // childScope = new Scope($"{i}+{i + 1}") { Parent = executionContext.Scope }; 129 // childScope.SubScopes.Add(selected.SubScopes[i]); 130 // childScope.SubScopes.Add(selected.SubScopes[i + 1]); 131 // var op1 = executionContext.CreateChildOperation(obbbb[nn], childScope); 132 // ExecuteOperation(executionContext, innerToken, op1); 133 // childScope.SubScopes.Clear(); 134 //} 135 117 136 if (rand.NextDouble() < crossoverProbability) { 118 137 childScope = new Scope($"{i}+{i + 1}") { Parent = executionContext.Scope }; … … 133 152 // evaluation 134 153 if (childScope != null) { 135 var op3 = executionContext.CreateChildOperation(evaluator, childScope); 136 ExecuteOperation(executionContext, innerToken, op3); 137 //if (Problem.ProblemData is IRegressionProblemData problemData) { 138 // SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(Problem.SymbolicExpressionTreeInterpreter, (ISymbolicExpressionTree)childScope.Variables["SymbolicExpressionTree"].Value, problemData, problemData.TestIndices, true, 100 /*max iterration*/, true); 139 //} 140 ++EvaluatedSolutions; 141 Population.Add(new EMMSolution(childScope)); 154 if (!childScope.Variables.ContainsKey("Quality")) 155 childScope.Variables.Add(new Variable("Quality")); 156 EvaluationComplex(executionContext, innerToken, childScope); 142 157 } else {// no crossover or mutation were applied, a child was not produced, do nothing 143 158 Population.Add(new EMMSolution(selected.SubScopes[i])); … … 146 161 break; 147 162 } 148 149 } 150 if (Map is EMMSucsessMap) { 151 var population = new Dictionary<ISymbolicExpressionTree, double>(); 152 foreach (var individ in Population) { 153 var tree = (ISymbolicExpressionTree)(((IScope)individ.Individual).Variables["SymbolicExpressionTree"].Value); 154 population.Add(tree, individ.Qualities.Value); 155 } 156 Map.MapUpDate(population); 157 population.Clear(); 158 } 159 //List<object> A = new List<object>(); 160 //A.Add(new Scope ()); 161 //A.Add(new SymbolicExpressionTree()); 163 } 164 165 UpDateParameters(); 162 166 163 167 globalScope.SubScopes.Replace(Population.Select(x => (IScope)x.Individual)); … … 165 169 var analyze = executionContext.CreateChildOperation(analyzer, globalScope); 166 170 ExecuteOperation(executionContext, innerToken, analyze); 171 167 172 Results.AddOrUpdateResult("Evaluated Solutions", new IntValue(EvaluatedSolutions)); 168 173 } 169 174 } 175 protected virtual void UpDateParameters() { 176 if (Map is EMMSucsessMap) { 177 var population = new Dictionary<ISymbolicExpressionTree, double>(); 178 foreach (var individ in Population) { 179 var tree = (ISymbolicExpressionTree)(((IScope)individ.Individual).Variables["SymbolicExpressionTree"].Value); 180 population.Add(tree, individ.Qualities.Value); 181 } 182 Map.MapUpDate(population); 183 population.Clear(); 184 } 185 } 186 #endregion 187 #region Initialization 170 188 protected void InitializeAlgorithm(CancellationToken cancellationToken) { 171 189 globalScope = new Scope("Global Scope"); … … 181 199 if (SetSeedRandomly) Seed = RandomSeedGenerator.GetSeed(); 182 200 rand.Reset(Seed); 183 201 EvaluatedSolutions = 0; 202 // InitializeParametrs(); for future 184 203 InitializePopulation(executionContext, cancellationToken, rand); 185 EvaluatedSolutions = PopulationSize.Value; 204 186 205 187 206 base.Initialize(cancellationToken); 188 207 } 208 protected virtual void InitializeParametrs() { } 189 209 190 210 private void InitializePopulation(ExecutionContext executionContext, CancellationToken cancellationToken, IRandom random) { 191 211 Population = new List<IEMMSolution>(); 212 var fmd = new InfixExpressionFormatter(); 192 213 var evaluator = Problem.Evaluator; 193 214 var creator = Problem.SolutionCreator; 215 var parser = new InfixExpressionParser(); 216 194 217 var parentScope = executionContext.Scope; //main scope for the next step work 195 218 // first, create all individuals … … 199 222 var name = ((ISymbolicExpressionTreeCreator)creator).SymbolicExpressionTreeParameter.ActualName; 200 223 var tree = (ISymbolicExpressionTree)childScope.Variables[name].Value; 224 201 225 foreach (var node in tree.IterateNodesPostfix().OfType<TreeModelTreeNode>()) { 202 226 Map.NodeManipulationForInizializtion(random, node); … … 207 231 for (int i = 0; i < PopulationSize.Value; ++i) { 208 232 var childScope = parentScope.SubScopes[i]; 209 ExecuteOperation(executionContext, cancellationToken, executionContext.CreateChildOperation(evaluator, childScope)); 210 Population.Add(new EMMSolution(childScope)); // Create solution and push individual inside. push solution to Population 211 } 212 } 213 233 if (!childScope.Variables.ContainsKey("Quality")) 234 childScope.Variables.Add(new Variable("Quality", new DoubleValue(0))); 235 EvaluationComplex(executionContext, cancellationToken, childScope); 236 } 237 } 238 #endregion 239 #region Evaluators 240 private void EvaluationComplex(ExecutionContext executionContext, CancellationToken cancellationToken, IScope childScope) { 241 var evaluator = Problem.Evaluator; 242 if (evaluator is SymbolicRegressionConstantOptimizationEvaluator eval) { 243 var creator = Problem.SolutionCreator; 244 var name = ((ISymbolicExpressionTreeCreator)creator).SymbolicExpressionTreeParameter.ActualName; 245 var tree = (ISymbolicExpressionTree)childScope.Variables[name].Value; 246 var treeWithModelInside = ModelToTreePusher(tree); 247 248 //ExecuteOperation(executionContext, cancellationToken, executionContext.CreateChildOperation(evaluator, treeScope)); 249 var pd = (IRegressionProblemData)Problem.ProblemData; 250 var estimationLimits = ((SymbolicRegressionSingleObjectiveProblem)Problem).EstimationLimits; 251 var interpreter = new SymbolicDataAnalysisExpressionTreeBatchInterpreter(); 252 var quality = SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(interpreter, treeWithModelInside, pd, pd.TrainingIndices, applyLinearScaling: true, maxIterations: 10, updateVariableWeights: true, lowerEstimationLimit: estimationLimits.Lower, upperEstimationLimit: estimationLimits.Upper, updateConstantsInTree: true); 253 childScope.Variables["Quality"].Value = new DoubleValue(quality); 254 255 int index = 0; 256 ConstuntValuesInTreeUpdate(tree, ConstantValuesFromTreeToListExtruction(treeWithModelInside), ref index); 257 childScope.Variables[name].Value = tree; 258 EvaluatedSolutions += 10; 259 } else { 260 var op3 = executionContext.CreateChildOperation(evaluator, childScope); 261 ExecuteOperation(executionContext, cancellationToken, op3); 262 EvaluatedSolutions += 1; 263 } 264 Population.Add(new EMMSolution(childScope)); 265 } 266 private ISymbolicExpressionTree ModelToTreePusher(ISymbolicExpressionTree tree) { 267 //All model nodes in tree are exchange to trees that are stored in model nodes. 268 // After this function we have deal with usual tree 269 var clone = (ISymbolicExpressionTree)tree.Clone(); 270 foreach (var node in clone.IterateNodesPostfix().OfType<TreeModelTreeNode>()) { 271 var newChild = node.Tree.Root.GetSubtree(0).GetSubtree(0); 272 Swap(node, newChild); 273 } 274 return clone; 275 } 276 protected static void Swap(ISymbolicExpressionTreeNode oldChild, ISymbolicExpressionTreeNode newChild) { 277 var parent = oldChild.Parent; 278 if (parent == null) 279 return; 280 281 var index = parent.IndexOfSubtree(oldChild); 282 parent.RemoveSubtree(index); 283 parent.InsertSubtree(index, newChild); 284 } 285 private List<double> ConstantValuesFromTreeToListExtruction(ISymbolicExpressionTree tree) { 286 //This function stored in a list all constants and coefficients from the tree 287 var constants = new List<double>(); 288 foreach (var node in tree.IterateNodesPostfix()) { 289 if (node is ConstantTreeNode cNode) { 290 constants.Add(cNode.Value); 291 } 292 if (node is VariableTreeNode vNode) { 293 constants.Add(vNode.Weight); 294 } 295 } 296 return constants; 297 } 298 private void ConstuntValuesInTreeUpdate(ISymbolicExpressionTree tree, List<double> constants, ref int index) { 299 foreach (var node in tree.IterateNodesPostfix()) { 300 if (node is ConstantTreeNode cNode) { 301 cNode.Value = constants[index]; 302 index++; 303 } else if (node is VariableTreeNode vNode) { 304 vNode.Weight = constants[index]; 305 index++; 306 } else if (node is TreeModelTreeNode mNode) { 307 ConstuntValuesInTreeUpdate(mNode.Tree, constants, ref index); 308 } 309 310 } 311 } 312 #endregion 313 #region Local Search 214 314 // next function was not tested in real work 215 315 private void LocalDecent(ISymbolicDataAnalysisSingleObjectiveProblem problem, CancellationToken cancellationToken, IScope childScope) { … … 257 357 } 258 358 } 359 #endregion 259 360 } 260 361
Note: See TracChangeset
for help on using the changeset viewer.