Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 17002 was 17002, checked in by msemenki, 5 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.3 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.Encodings.SymbolicExpressionTreeEncoding;
26using HeuristicLab.Parameters;
27using HeuristicLab.Problems.DataAnalysis.Symbolic;
28using System.Collections.Generic;
29using System.Linq;
30
31namespace HeuristicLab.Algorithms.EvolvmentModelsOfModels {
32  [Item("EMMChangeNodeTypeManipulation", "Selects a random tree node and changes the symbol.")]
33  [StorableType("990D3946-7F06-48B4-B8DB-F8E308D6304D")]
34  public sealed class EMMMutators : SymbolicExpressionTreeManipulator {
35    private const int MAX_TRIES = 100;
36    private const string MapParameterName = "Map";
37
38    public ILookupParameter<EMMMapBase<ISymbolicExpressionTree>> MapParameter {
39      get { return (ILookupParameter<EMMMapBase<ISymbolicExpressionTree>>)Parameters[MapParameterName]; }
40    }
41
42    public List<ISymbolicExpressionTree> ModelSet => MapParameter.ActualValue.ModelSet;
43    public List<List<int>> Map => MapParameter.ActualValue.Map;
44
45    [StorableConstructor]
46    private EMMMutators(StorableConstructorFlag _) : base(_) { }
47    private EMMMutators(EMMMutators original, Cloner cloner) : base(original, cloner) { }
48    public EMMMutators() : base() {
49      Parameters.Add(new LookupParameter<EMMMapBase<ISymbolicExpressionTree>>(MapParameterName));
50    }
51
52    public override IDeepCloneable Clone(Cloner cloner) {
53      return new EMMMutators(this, cloner);
54    }
55
56    protected override void Manipulate(IRandom random, ISymbolicExpressionTree symbolicExpressionTree) {
57      EMMMutatorsPart(random, symbolicExpressionTree, ModelSet, Map);
58    }
59    public void EMMMutatorsPart(IRandom random, ISymbolicExpressionTree symbolicExpressionTree, List<ISymbolicExpressionTree> modelSet, List<List<int>> map) {
60      List<ISymbol> allowedSymbols = new List<ISymbol>();
61      ISymbolicExpressionTreeNode parent;
62      int childIndex;
63      ISymbolicExpressionTreeNode child;
64      // repeat until a fitting parent and child are found (MAX_TRIES times)
65      int tries = 0;
66      do {
67
68#pragma warning disable 612, 618
69        parent = symbolicExpressionTree.Root.IterateNodesPrefix().Skip(1).Where(n => n.SubtreeCount > 0).SelectRandom(random);
70#pragma warning restore 612, 618
71
72        childIndex = random.Next(parent.SubtreeCount);
73
74        child = parent.GetSubtree(childIndex);
75        int existingSubtreeCount = child.SubtreeCount;
76        allowedSymbols.Clear();
77        foreach (var symbol in parent.Grammar.GetAllowedChildSymbols(parent.Symbol, childIndex)) {
78          // check basic properties that the new symbol must have
79          if (symbol.Name != child.Symbol.Name &&
80            symbol.InitialFrequency > 0 &&
81            existingSubtreeCount <= parent.Grammar.GetMinimumSubtreeCount(symbol) &&
82            existingSubtreeCount >= parent.Grammar.GetMaximumSubtreeCount(symbol)) {
83            // check that all existing subtrees are also allowed for the new symbol
84            bool allExistingSubtreesAllowed = true;
85            for (int existingSubtreeIndex = 0; existingSubtreeIndex < existingSubtreeCount && allExistingSubtreesAllowed; existingSubtreeIndex++) {
86              var existingSubtree = child.GetSubtree(existingSubtreeIndex);
87              allExistingSubtreesAllowed &= parent.Grammar.IsAllowedChildSymbol(symbol, existingSubtree.Symbol, existingSubtreeIndex);
88            }
89            if (allExistingSubtreesAllowed) {
90              allowedSymbols.Add(symbol);
91            }
92          }
93        }
94        tries++;
95      } while (tries < MAX_TRIES && allowedSymbols.Count == 0);
96
97      if (tries < MAX_TRIES) {
98        var weights = allowedSymbols.Select(s => s.InitialFrequency).ToList();
99#pragma warning disable 612, 618
100        var newSymbol = allowedSymbols.SelectRandom(weights, random);
101#pragma warning restore 612, 618
102
103        // replace the old node with the new node
104
105        var newNode = newSymbol.CreateTreeNode();
106
107        if (newNode is TreeModelTreeNode treeNode) {
108          int p = random.Next(modelSet.Count);
109          if (child is TreeModelTreeNode chNode) { p = chNode.TreeNumber; }
110          treeNode.TreeNumber = p;
111          MapParameter.ActualValue.NodeForMutationChange(random, treeNode);
112        } else if (newNode.HasLocalParameters)
113          newNode.ResetLocalParameters(random);
114        foreach (var subtree in child.Subtrees)
115          newNode.AddSubtree(subtree);
116        parent.RemoveSubtree(childIndex);
117        parent.InsertSubtree(childIndex, newNode);
118      }
119    }
120  }
121}
Note: See TracBrowser for help on using the repository browser.