- Timestamp:
- 05/06/19 14:20:06 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2988_ModelsOfModels2/HeuristicLab.Algorithms.EMM/EMMAlgorithm.cs
r16760 r16899 28 28 using HeuristicLab.Random; 29 29 using HeuristicLab.Selection; 30 using System;31 30 using System.Collections.Generic; 32 31 using System.IO; … … 40 39 [StorableType("AD23B21F-089A-4C6C-AD2E-1B01E7939CF5")] 41 40 public class EMMAlgorithm : EvolvmentModelsOfModelsAlgorithmBase { 42 public EMMMapTreeModel Map { get; private set; }43 44 41 public EMMAlgorithm() : base() { } 45 42 protected EMMAlgorithm(EMMAlgorithm original, Cloner cloner) : base(original, cloner) { 46 if (original.Map != null) {47 Map = cloner.Clone(original.Map);48 }43 //if (original.Map != null) { 44 // Map = cloner.Clone(original.Map); 45 //} 49 46 } 50 47 public override IDeepCloneable Clone(Cloner cloner) { … … 58 55 InfixExpressionParser parser = new InfixExpressionParser(); 59 56 var trees = File.ReadAllLines(InputFileParameter.Value.Value).Select(parser.Parse); 60 // this.Problem.SymbolicExpressionTreeGrammar; 61 /* Problem.ProblemData.Dataset.ColumnNames.Take(2).ToList(); 62 trees.First().Root.Grammar.ContainsSymbol((IVariable)a). 63 = this.Problem.SymbolicExpressionTreeGrammar;*/ 64 int neghboorNumber = 10; 65 switch (MapCreationType.Value) { // Configure Map type and it's parameters: IslandMap, FullMap and Percent, Number 66 case "IslandMap": break; 67 case "FullMap": 68 ClusterNumbersParameter.Value.Value = trees.Count(); 69 switch (NegbourType.Value) { 70 case "Percent": neghboorNumber = Convert.ToInt32((Convert.ToDouble(ClusterNumbersParameter.Value.Value)) * (Convert.ToDouble(NegbourNumber.Value)) / 100.0); break; 71 case "Number": neghboorNumber = NegbourNumber.Value; break; 72 default: neghboorNumber = NegbourNumber.Value; break; 73 } 74 break; 75 default: MapCreationType.Value = "IslandMap"; break; 76 } 77 switch (AlgorithmImplemetationType.Value) { //Configure type of algorithm application 78 case "OnlyMapCreation": // for case when we want only create map, and do not want made somting also. OnlyMapCreation, CrateMapAndGo, ReadMapAndGo 79 Map = new EMMMapTreeModel(RandomParameter.Value, trees, ClusterNumbersParameter.Value.Value, neghboorNumber); 80 ClusterNumbersParameter.Value.Value = Map.K; 81 File.WriteAllLines("Map.txt", Map.MapToString()); 82 File.WriteAllLines("MapToSee.txt", Map.MapToSee()); 83 globalScope = new Scope("Global Scope"); 84 executionContext = new ExecutionContext(null, this, globalScope); 85 break; 86 case "ReadMapAndGo": // for case when we want read existed map and work with it; 87 Map = new EMMMapTreeModel(RandomParameter.Value, trees); 88 ClusterNumbersParameter.Value.Value = Map.K; 89 if (previousExecutionState != ExecutionState.Paused) { 90 InitializeAlgorithm(cancellationToken); 91 } 57 if (AlgorithmImplemetationType.Value == "Read") { 58 Map.MapRead(RandomParameter.Value, trees, "Map.txt"); 59 } else { 60 Map.MapCreationPrepare(RandomParameter.Value, trees, ClusterNumbersParameter.Value.Value); 61 Map.CreateMap(RandomParameter.Value, ClusterNumbersParameter.Value.Value); 62 // Map.WriteMapToTxtFile(RandomParameter.Value); 63 } 64 65 ClusterNumbersShowParameter.Value.Value = Map.K; 66 67 if (AlgorithmImplemetationType.Value == "OnlyMap") { 68 globalScope = new Scope("Global Scope"); 69 executionContext = new ExecutionContext(null, this, globalScope); 70 } else { 71 if (previousExecutionState != ExecutionState.Paused) { 72 InitializeAlgorithm(cancellationToken); 73 } 74 if (!globalScope.Variables.ContainsKey("TreeModelMap")) 92 75 globalScope.Variables.Add(new Variable("TreeModelMap", Map)); 93 EMMAlgorithmRun(cancellationToken); 94 break; 95 case "CreateMapAndGo": 96 Map = new EMMMapTreeModel(RandomParameter.Value, trees, ClusterNumbersParameter.Value.Value, neghboorNumber); 97 ClusterNumbersParameter.Value.Value = Map.K; 98 if (previousExecutionState != ExecutionState.Paused) { 99 InitializeAlgorithm(cancellationToken); 100 } 101 globalScope.Variables.Add(new Variable("TreeModelMap", Map)); 102 File.WriteAllLines("Map.txt", Map.MapToString()); 103 File.WriteAllLines("MapToSee.txt", Map.MapToSee()); 104 EMMAlgorithmRun(cancellationToken); 105 break; 106 default: //for case of usial from zero step starting 107 AlgorithmImplemetationType.Value = "CreateMapAndGo"; 108 Map = new EMMMapTreeModel(RandomParameter.Value, trees, ClusterNumbersParameter.Value.Value, neghboorNumber); 109 ClusterNumbersParameter.Value.Value = Map.K; 110 File.WriteAllLines("Map.txt", Map.MapToString()); 111 File.WriteAllLines("MapToSee.txt", Map.MapToSee()); 112 if (previousExecutionState != ExecutionState.Paused) { 113 InitializeAlgorithm(cancellationToken); 114 } 115 globalScope.Variables.Add(new Variable("TreeModelMap", Map)); 116 EMMAlgorithmRun(cancellationToken); 117 break; 118 } 119 76 EMMAlgorithmRun(cancellationToken); 77 } 120 78 } 121 79 private void EMMAlgorithmRun(CancellationToken cancellationToken) { … … 227 185 228 186 // initialize data structures for map clustering 229 var models = new ItemList<ISymbolicExpressionTree>(Map.ModelSet);230 var map = new ItemList<ItemList<IntValue>>();231 foreach (var list in Map.Map) {232 map.Add(new ItemList<IntValue>(list.Select(x => new IntValue(x))));233 }234 var clusterNumber = new ItemList<IntValue>(Map.ClusterNumber.Select(x => new IntValue(x)));235 globalScope.Variables.Add(new Core.Variable("Models", models));236 globalScope.Variables.Add(new Core.Variable("Map", map));237 globalScope.Variables.Add(new Core.Variable("ClusterNumber", clusterNumber));187 //var models = new ItemList<ISymbolicExpressionTree>(Map.ModelSet); 188 //var map = new ItemList<ItemList<IntValue>>(); 189 //foreach (var list in Map.Map) { 190 // map.Add(new ItemList<IntValue>(list.Select(x => new IntValue(x)))); 191 //} 192 //var clusterNumber = new ItemList<IntValue>(Map.ClusterNumber.Select(x => new IntValue(x))); 193 //globalScope.Variables.Add(new Variable("Models", models)); 194 //globalScope.Variables.Add(new Variable("Map", map)); 195 //globalScope.Variables.Add(new Variable("ClusterNumber", clusterNumber)); 238 196 239 197 EvaluatedSolutions = populationSize; … … 274 232 } 275 233 } 234 private void LocalDecent(ISymbolicDataAnalysisSingleObjectiveProblem problem, CancellationToken cancellationToken, IScope childScope) { 235 int maxStepNumber = 100; 236 var creator = Problem.SolutionCreator; 237 var name = ((ISymbolicExpressionTreeCreator)creator).SymbolicExpressionTreeParameter.ActualName; 238 var tree = (ISymbolicExpressionTree)childScope.Variables[name].Value; 239 var evaluator = problem.Evaluator; 240 var oldTree = tree.Clone(); 241 ExecuteOperation(executionContext, cancellationToken, executionContext.CreateChildOperation(evaluator, childScope)); 242 var rand = RandomParameter.Value; 243 if (SetSeedRandomly) Seed = RandomSeedGenerator.GetSeed(); 244 rand.Reset(Seed); 245 while (maxStepNumber > 0) { 246 maxStepNumber = TreeIterator(tree.Root, rand, cancellationToken, childScope, maxStepNumber); 247 } 248 } 249 int TreeIterator(ISymbolicExpressionTreeNode a, IRandom rand, CancellationToken cancellationToken, IScope childScope, int maxStepNumber) { 250 if (a is TreeModelTreeNode modelNode) { 251 ModelChange(modelNode, rand, cancellationToken, childScope); 252 maxStepNumber--; 253 } 254 if (a.Subtrees != null) { 255 for (int i = 0; i < (a.Subtrees.Count()); i++) { 256 TreeIterator(a.Subtrees.ToList()[i], rand, cancellationToken, childScope, maxStepNumber); 257 } 258 } 259 return maxStepNumber; 260 } 261 void ModelChange(TreeModelTreeNode a, IRandom rand, CancellationToken cancellationToken, IScope childScope) { 262 int treeNumber = a.TreeNumber; 263 var oldSubTree = (ISymbolicExpressionTree)a.Tree.Clone(); 264 double oldQuality = ((DoubleValue)childScope.Variables["Quality"].Value).Value; 265 int cluster = Map.ClusterNumber[treeNumber]; 266 int newTreeNumber = rand.Next(Map.Map[cluster].Count); 267 a.Tree = (ISymbolicExpressionTree)Map.ModelSet[newTreeNumber].Clone(); 268 a.Tree.Root.ShakeLocalParameters(rand, 1); 269 var evaluator = Problem.Evaluator; 270 ExecuteOperation(executionContext, cancellationToken, executionContext.CreateChildOperation(evaluator, childScope)); 271 double currentQuality = ((DoubleValue)childScope.Variables["Quality"].Value).Value; 272 if (oldQuality > currentQuality) { 273 a.Tree = (ISymbolicExpressionTree)oldSubTree.Clone(); 274 ((DoubleValue)childScope.Variables["Quality"].Value).Value = oldQuality; 275 } 276 } 276 277 } 277 278 279 278 280 } 279 281
Note: See TracChangeset
for help on using the changeset viewer.