1  #region License Information


2 


3  /* HeuristicLab


4  * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)


5  *


6  * This file is part of HeuristicLab.


7  *


8  * HeuristicLab is free software: you can redistribute it and/or modify


9  * it under the terms of the GNU General Public License as published by


10  * the Free Software Foundation, either version 3 of the License, or


11  * (at your option) any later version.


12  *


13  * HeuristicLab is distributed in the hope that it will be useful,


14  * but WITHOUT ANY WARRANTY; without even the implied warranty of


15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


16  * GNU General Public License for more details.


17  *


18  * You should have received a copy of the GNU General Public License


19  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.


20  */


21 


22  #endregion


23 


24  using System;


25  using System.Threading;


26  using HEAL.Attic;


27  using HeuristicLab.Common;


28  using HeuristicLab.Core;


29  using HeuristicLab.Encodings.BinaryVectorEncoding;


30  using HeuristicLab.Optimization;


31 


32  namespace HeuristicLab.Problems.Binary {


33  [Item("Hierararchical If and only If problem (HIFF)", "Genome evaluated in nested subsets to see if each subset contains either all 0s or all 1s.")]


34  [StorableType("8AC6D94EE7B44216B2CA8E142E7A1391")]


35  [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 220)]


36  public class HIFFProblem : BinaryVectorProblem {


37 


38  public HIFFProblem() : base() {


39  Maximization = true;


40  Dimension = 64;


41  }


42 


43  // In the GECCO paper, Section 4.1


44  public override ISingleObjectiveEvaluationResult Evaluate(BinaryVector individual, IRandom random, CancellationToken cancellationToken) {


45  int[] level = new int[individual.Length];


46  int levelLength = individual.Length;


47 


48  // Initialize the level to the current solution


49  for (int i = 0; i < levelLength; i++) {


50  level[i] = Convert.ToInt32(individual[i]);


51  }


52  int power = 1;


53  int nextLength = levelLength / 2;


54  int total = 0;


55  int maximum = 0;


56 


57  // Keep going while the next level actual has bits in it


58  while (nextLength > 0) {


59  int[] nextLevel = new int[nextLength];


60  // Construct the next level using the current level


61  for (int i = 0; i + 1 < levelLength; i += 2) {


62  if (level[i] == level[i + 1] && level[i] != 1) {


63  // Score points for a correct setting at this level


64  total += power;


65  nextLevel[i / 2] = level[i];


66  } else {


67  nextLevel[i / 2] = 1;


68  }


69  // Keep track of the maximum possible score


70  maximum += power;


71  }


72  level = nextLevel;


73  levelLength = nextLength;


74  nextLength = levelLength / 2;


75  power *= 2;


76  }


77 


78  // Convert to percentage of total


79  var quality = (double)total / maximum;


80  return new SingleObjectiveEvaluationResult(quality);


81  }


82 


83  [StorableConstructor]


84  protected HIFFProblem(StorableConstructorFlag _) : base(_) { }


85  protected HIFFProblem(HIFFProblem original, Cloner cloner)


86  : base(original, cloner) {


87  }


88  public override IDeepCloneable Clone(Cloner cloner) {


89  return new HIFFProblem(this, cloner);


90  }


91  }


92  }

