Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2988_ModelsOfModels2/HeuristicLab.Algorithms.EMM/EMMMultyPointsMutator.cs @ 17002

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

#2988:
Class HelpFuction get new static functions that are used in different Map’s classes and possible in other classes.
Branch was adapted to Hive.
New version of class structure for Maps:

  1. 3 new variants of maps (RankMap, SuccessMap and ZeroMap) are added.
  2. BaseMap class was simplified, some class members were deleted and other were transported to child class, because some of them are not used in all kinds of maps.
  3. Functions between base class and child class were divided in other way.
  4. Mutation operators were adapted to work with new class structure. Now mutation make less work for ModelNodes than previously.
  5. ModelNode and Model symbols were simplified. They should not take into account a map type.
  6. Models frequency analyzers were adapted for new variants of maps.
  7. EMMAlgorithm class was adapted to new maps
File size: 5.6 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("EMMMultyPointMutator", "Selects a random tree node and changes the symbol.")]
34  [StorableType("918B5F77-3B9E-4620-94A3-236913C4A3F2")]
35  public sealed class EMMMultyPointsMutator : SymbolicExpressionTreeManipulator {
36    private const string MapParameterName = "Map";
37    private const string MutationProbabilityParameterName = "MutationProbability";
38    public ILookupParameter<EMMMapBase<ISymbolicExpressionTree>> MapParameter {
39      get { return (ILookupParameter<EMMMapBase<ISymbolicExpressionTree>>)Parameters[MapParameterName]; }
40    }
41    public ILookupParameter<PercentValue> MutationProbabilityParameter {
42      get { return (ILookupParameter<PercentValue>)Parameters[MutationProbabilityParameterName]; }
43    }
44    public List<ISymbolicExpressionTree> ModelSet => MapParameter.ActualValue.ModelSet;
45    public List<List<int>> Map => MapParameter.ActualValue.Map;
46    public PercentValue MutationProbability => MutationProbabilityParameter.ActualValue;
47
48    [StorableConstructor]
49    private EMMMultyPointsMutator(StorableConstructorFlag _) : base(_) { }
50    private EMMMultyPointsMutator(EMMMultyPointsMutator original, Cloner cloner) : base(original, cloner) { }
51    public EMMMultyPointsMutator() : base() {
52      Parameters.Add(new LookupParameter<EMMMapBase<ISymbolicExpressionTree>>(MapParameterName));
53      Parameters.Add(new LookupParameter<PercentValue>(MutationProbabilityParameterName));
54    }
55
56    public override IDeepCloneable Clone(Cloner cloner) {
57      return new EMMMultyPointsMutator(this, cloner);
58    }
59
60    protected override void Manipulate(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) {
61      EMMOnePointMutatorPart(random, symbolicExpressionTree, ModelSet, Map, MutationProbability);
62    }
63    private static bool SymbolTypeCheck(ISymbol nSymbol, IEnumerable<ISymbol> allSymbols) {
64      foreach (var pSymbol in allSymbols) {
65        if (nSymbol == pSymbol)
66          return true;
67      }
68      return false;
69    }
70    public void EMMOnePointMutatorPart(IRandom random, ISymbolicExpressionTree symbolicExpressionTree, List<ISymbolicExpressionTree> modelSet, List<List<int>> map, PercentValue mutationProbability) {
71
72      List<ISymbol> allowedSymbols = new List<ISymbol>();
73      var probability = (1 / mutationProbability.Value) / (symbolicExpressionTree.Length); // probability for edch node to mutate
74      var allAllowedSymbols = symbolicExpressionTree.Root.Grammar.AllowedSymbols.Where(s =>
75        !(s is Defun) &&
76        !(s is GroupSymbol) &&
77        !(s is ProgramRootSymbol) &&
78        !(s is StartSymbol)
79      );
80
81      symbolicExpressionTree.Root.ForEachNodePostfix(node => {//for each node in tree - try to mutate
82
83        if (SymbolTypeCheck(node.Symbol, allAllowedSymbols)) { // we do not want to toch StartSymbol
84          if (random.NextDouble() < probability) { // ok. this node decide to mutate
85
86            foreach (var symbol in allAllowedSymbols) {// add in list all nodes with the same arity
87              if ((symbol.MaximumArity == node.Symbol.MaximumArity) && (symbol.MinimumArity == node.Symbol.MinimumArity)) { allowedSymbols.Add(symbol); }
88            }
89            if (node.Symbol.MaximumArity == 0) { // for terminal nodes add aditional the same type of nodes
90              allowedSymbols.Add(node.Symbol);
91            }
92            int pTemp = random.Next(map.Count);
93            if (node is TreeModelTreeNode treeNode) { pTemp = treeNode.TreeNumber; } //remeber the cluster number
94            var weights = allowedSymbols.Select(s => s.InitialFrequency).ToList(); // set up probabilities
95
96#pragma warning disable CS0618 // Type or member is obsolete
97            var newSymbol = allowedSymbols.SelectRandom(weights, random); // create new node from the choosen symbol type. Ror terminal nodes it means that we have only one possible varint.
98#pragma warning restore CS0618 // Type or member is obsolete
99            node = newSymbol.CreateTreeNode();
100
101            if (node is TreeModelTreeNode treeNode2) { // make rigth mutation for tree model
102              treeNode2.TreeNumber = pTemp;
103              MapParameter.ActualValue.NodeForMutationChange(random, treeNode2);
104            } else if (node.HasLocalParameters) { // make local parametrs set up for other node types
105              node.ResetLocalParameters(random);
106            }
107            allowedSymbols.Clear(); // clean before the next node
108          }
109
110        }
111      });
112    }
113  }
114}
Note: See TracBrowser for help on using the repository browser.