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("RankMap", "A map of models of models of models")]


31  [StorableType("1D4DD90E553A46DBB0CD6A899AA0B6D0")]


32  public class EMMRankMap : EMMMapBase<ISymbolicExpressionTree> {


33  [Storable]


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


35  #region conctructors


36  [StorableConstructor]


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


38  public override IDeepCloneable Clone(Cloner cloner) {


39  return new EMMRankMap(this, cloner);


40  }


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


42  public EMMRankMap(EMMRankMap 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  ApplyRankMapCreationAlgorithm(random, CalculateDistances(), Map, Probabilities);


50  }


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


52  int mapSize = distances.GetLength(0);


53  double tempSum = 0;


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


55  tempSum += i;


56  }


57  List<List<double>> currentList = new List<List<double>>();


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


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


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


61  continue;


62  currentList.Add(new List<double>());


63  currentList[i].Add(i);


64  currentList[i].Add(distances[i, t]);


65  }


66  currentList.Sort((a, b) => a[1].CompareTo(b[1])); ///загадкой является то нафига оно мне вообще понадобилось in DistanceMap.. но это работающая сортировка.


67  for (int i = 0; i < currentList.Count; i++) {


68  currentList[i].Add(currentList.Count  i);


69  }


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


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


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


73  continue;


74  map[t].Add(Convert.ToInt32(currentList[i][0]));


75  probabilities[t].Add(currentList[i][2] / tempSum);


76  }


77  currentList.Clear();


78  }


79  }


80  #endregion


81  #region MapApplayFunctions


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


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


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


85  }


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


87  return NewModelForInizializtion(random, out treeNumber);


88  }


89  #endregion


90  }


91  }

