Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/06/19 14:20:06 (5 years ago)
Author:
msemenki
Message:

#2988: New version of class structure.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2988_ModelsOfModels2/HeuristicLab.Algorithms.EMM/EMMAlgorithm.cs

    r16760 r16899  
    2828using HeuristicLab.Random;
    2929using HeuristicLab.Selection;
    30 using System;
    3130using System.Collections.Generic;
    3231using System.IO;
     
    4039  [StorableType("AD23B21F-089A-4C6C-AD2E-1B01E7939CF5")]
    4140  public class EMMAlgorithm : EvolvmentModelsOfModelsAlgorithmBase {
    42     public EMMMapTreeModel Map { get; private set; }
    43 
    4441    public EMMAlgorithm() : base() { }
    4542    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      //}
    4946    }
    5047    public override IDeepCloneable Clone(Cloner cloner) {
     
    5855      InfixExpressionParser parser = new InfixExpressionParser();
    5956      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"))
    9275          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      }
    12078    }
    12179    private void EMMAlgorithmRun(CancellationToken cancellationToken) {
     
    227185
    228186      // 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));
    238196
    239197      EvaluatedSolutions = populationSize;
     
    274232      }
    275233    }
     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    }
    276277  }
    277278
     279
    278280}
    279281
Note: See TracChangeset for help on using the changeset viewer.