Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2988_ModelsOfModels2/HeuristicLab.Algorithms.EMM/EMMOperators/EMMMultyPointsMutatorNodeTypeSaving.cs @ 17134

Last change on this file since 17134 was 17134, checked in by msemenki, 3 years ago

#2988:

  1. The file system was changed, folders was added and part of files was transferred in these folders.
  2. HelpFunctions class was divided on 2 parts: HelpFuctions for common purposes static functions and SelfConfiguration that include functions for self-configuration mechanism realization (is used in EMMSucsessMap).
  3. Parts of self-configuration mechanism was transferred from EMMSucsessMap.cs to SelfConfiguration.cs. Now EMMSucsessMap used SelfConfiguration like one of data member. Other parts of project was adopted for this changing.
  4. FileComunication class was added. It include the majority of functions for printing to files or reading from files. Here were realized possibility to write and read to hl files.
  5. ModelTreeNode.cs has additional possibility - to write sub-model in string (then it is possible to write it in file).
  6. InfixExpressionFormatter.cs can work with TreeModelNode.
  7. Possibility for different map types to be readable from files was extended and cheeked.
  8. Such parameters like - ClusterNumbers, ClusterNumbersShow, NegbourNumber, NegbourType (that is used only in several maps) was transferred from EMMAlgorithm to Map Parameters. Now EMMBaseMap class inherited from ParameterizedNamedItem (not from Item). And EMMIslandMap and EMMNetworkMap contains their parameters (constructors was modified). CreationMap calls functions were simplified.
  9. Functions for different distance metric calculation was added. Now, it is possible to calculate different types of distances between models (with different random values of constants).
  10. DistanceParametr was added. Now maps can be created according different types of distance calculations.
  11. The class EMMClustering has new name KMeansClusterizationAlgorithm. On KMeansClusterizationAlgorithm bug with bloating of centroids list was fixed. Algorithm was adopted for working with different type of distance metric and get maximum number of iterations.
  12. Possibilities for constants optimization in sub-models an whole tree was added. EMMAlgorithm get new function for evaluation of individuals (and some additional technical stuff for that). Function for trees with model in usual tree transformation and back was added.
  13. EMMAlgorithm was divided on 2 parts:
  • EMMAlgorithm, that contain evolutionary algorithm working with sub-models, and use ready to use maps;
  • ModelSetPreparation, that contain distance calculation, model set simplification and map creation.
File size: 5.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using HEAL.Attic;
23using HeuristicLab.Common;
24using HeuristicLab.Core;
25using HeuristicLab.Data;
26using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
27using HeuristicLab.Parameters;
28using HeuristicLab.Problems.DataAnalysis.Symbolic;
29using System.Collections.Generic;
30using System.Linq;
31
32namespace HeuristicLab.Algorithms.EvolvmentModelsOfModels {
33  [Item("EMMMultyPointMutatorNodeTypeSaving", "Selects a random tree node and changes the symbol.")]
34  [StorableType("8A24C715-BEFD-4396-9264-31F949330B1A")]
35  public sealed class EMMMultyPointsMutatorNodeTypeSaving : SymbolicExpressionTreeManipulator {
36
37    private const string MapParameterName = "Map";
38    private const string MutationProbabilityParameterName = "MutationProbability";
39    public ILookupParameter<EMMMapBase<ISymbolicExpressionTree>> MapParameter {
40      get { return (ILookupParameter<EMMMapBase<ISymbolicExpressionTree>>)Parameters[MapParameterName]; }
41    }
42    public List<ISymbolicExpressionTree> ModelSet => MapParameter.ActualValue.ModelSet;
43    public List<List<int>> Map => MapParameter.ActualValue.Map;
44
45    public ILookupParameter<PercentValue> MutationProbabilityParameter {
46      get { return (ILookupParameter<PercentValue>)Parameters[MutationProbabilityParameterName]; }
47    }
48
49    public PercentValue MutationProbability => MutationProbabilityParameter.ActualValue;
50
51    [StorableConstructor]
52    private EMMMultyPointsMutatorNodeTypeSaving(StorableConstructorFlag _) : base(_) { }
53    private EMMMultyPointsMutatorNodeTypeSaving(EMMMultyPointsMutatorNodeTypeSaving original, Cloner cloner) : base(original, cloner) { }
54    public EMMMultyPointsMutatorNodeTypeSaving() : base() {
55      Parameters.Add(new LookupParameter<EMMMapBase<ISymbolicExpressionTree>>(MapParameterName));
56      Parameters.Add(new LookupParameter<PercentValue>(MutationProbabilityParameterName));
57    }
58
59    public override IDeepCloneable Clone(Cloner cloner) {
60      return new EMMMultyPointsMutatorNodeTypeSaving(this, cloner);
61    }
62
63    protected override void Manipulate(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) {
64      EMMOnePointMutatorPart(random, symbolicExpressionTree, ModelSet, Map, MutationProbability);
65    }
66    private static bool SymbolTypeCheck(ISymbol nSymbol, IEnumerable<ISymbol> allSymbols) {
67      foreach (var pSymbol in allSymbols) {
68        if (nSymbol == pSymbol)
69          return true;
70      }
71      return false;
72    }
73    public void EMMOnePointMutatorPart(IRandom random, ISymbolicExpressionTree symbolicExpressionTree, List<ISymbolicExpressionTree> modelSet, List<List<int>> map, PercentValue mutationProbability) {
74
75      List<ISymbol> allowedSymbols = new List<ISymbol>();
76      var probability = (1 / mutationProbability.Value) / (symbolicExpressionTree.Length); // probability for each node to mutate
77      var allAllowedSymbols = symbolicExpressionTree.Root.Grammar.AllowedSymbols.Where(s =>
78        !(s is Defun) &&
79        !(s is GroupSymbol) &&
80        !(s is ProgramRootSymbol) &&
81        !(s is StartSymbol)
82      );
83
84      symbolicExpressionTree.Root.ForEachNodePostfix(node => {//for each node in tree - try to mutate
85
86        if (SymbolTypeCheck(node.Symbol, allAllowedSymbols)) { // we do not want to touch StartSymbol
87          if (random.NextDouble() < probability) { // ok. this node decide to mutate
88            if (node.Symbol.MaximumArity > 0) {
89              foreach (var symbol in allAllowedSymbols) {// add in list all nodes with the same arity
90                if ((symbol.MaximumArity == node.Symbol.MaximumArity) && (symbol.MinimumArity == node.Symbol.MinimumArity)) { allowedSymbols.Add(symbol); }
91              }
92            } else { // for terminal nodes add  the same type of nodes
93              allowedSymbols.Add(node.Symbol);
94            }
95            int pTemp = random.Next(modelSet.Count);
96            if (node is TreeModelTreeNode treeNode) { pTemp = treeNode.TreeNumber; } //remember the cluster number
97            var weights = allowedSymbols.Select(s => s.InitialFrequency).ToList(); // set up probabilities
98
99#pragma warning disable CS0618 // Type or member is obsolete
100            var newSymbol = allowedSymbols.SelectRandom(weights, random); // create new node from the chosen symbol type. For terminal nodes it means that we have only one possible variant.
101#pragma warning restore CS0618 // Type or member is obsolete
102            node = newSymbol.CreateTreeNode();
103
104            if (node is TreeModelTreeNode treeNode2) { // make right mutation for tree model
105              treeNode2.TreeNumber = pTemp;
106              MapParameter.ActualValue.NodeForMutationChange(random, treeNode2);
107            } else if (node.HasLocalParameters) { // make local parameters set up for other node types
108              node.ResetLocalParameters(random);
109            }
110            allowedSymbols.Clear(); // clean before the next node
111          }
112
113        }
114      });
115    }
116  }
117}
Note: See TracBrowser for help on using the repository browser.