1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022019 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 


22  using HEAL.Attic;


23  using HeuristicLab.Common;


24  using HeuristicLab.Core;


25  using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;


26  using System;


27  using System.Collections.Generic;


28 


29  namespace HeuristicLab.Algorithms.EvolvmentModelsOfModels {


30  [Item("DistanceMap", "A map of models of models of models")]


31  [StorableType("456692FB21494359810645D59D2D7FA0")]


32  public class EMMDisatanceMap : EMMMapBase<ISymbolicExpressionTree> {


33  [Storable]


34  public List<List<double>> Probabilities { get; set; }


35  #region conctructors


36  [StorableConstructor]


37  protected EMMDisatanceMap(StorableConstructorFlag _) : base(_) { }


38  public override IDeepCloneable Clone(Cloner cloner) {


39  return new EMMDisatanceMap(this, cloner);


40  }


41  public EMMDisatanceMap() : base() { ModelSet = new List<ISymbolicExpressionTree>(); }


42  public EMMDisatanceMap(EMMDisatanceMap original, Cloner cloner) : base(original, cloner) { }


43  #endregion


44  #region MapCreation


45  override public void CreateMap(IRandom random, int k) {


46 


47  Probabilities = new List<List<double>>();


48  MapSizeCheck(ModelSet.Count);


49  ApplyDistanceMapCreationAlgorithm(random, CalculateDistances(), Map, Probabilities);


50  }


51  public static void ApplyDistanceMapCreationAlgorithm(IRandom random, double[,] distances, List<List<int>> map, List<List<double>> probabilities) {


52  int mapSize = distances.GetLength(0);


53  for (int t = 0; t < mapSize; t++) {


54  probabilities.Add(new List<double>());


55  double tempSum = 0;


56  for (int i = 0; i < mapSize; i++) {


57  tempSum += Math.Log(distances[i, t]);


58  }


59  for (int i = 0; i < mapSize; i++) {


60  if (distances[i, t].IsAlmost(0))


61  continue;


62  map[t].Add(i);


63  probabilities[t].Add(Math.Log(distances[i, t]) / tempSum);


64  }


65  }


66  }


67  #endregion


68  #region MapApplayFunctions


69  public override ISymbolicExpressionTree NewModelForMutation(IRandom random, out int treeNumber, int parentTreeNumber) {


70  treeNumber = HelpFunctions.OneElementFromListProportionalSelection(random, Probabilities[parentTreeNumber]);


71  return (ISymbolicExpressionTree)ModelSet[treeNumber].Clone();


72  }


73  override public ISymbolicExpressionTree NewModelForInizializtionNotTree(IRandom random, out int treeNumber) {


74  return NewModelForInizializtion(random, out treeNumber);


75  }


76  #endregion


77  }


78  }

