[14162]  1  #region License Information


 2  /* HeuristicLab


[15617]  3  * Copyright (C) 20022018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)


[14162]  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 System;


 23  using System.Linq;


 24  using HeuristicLab.Core;


 25  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;


 26  using HeuristicLab.Common;


 27 


[15473]  28  namespace HeuristicLab.Problems.BinPacking3D.Evaluators {


[14162]  29  // NOTE: same implementation as for 2d problem


 30  [Item("BinUtilization Evaluator (3d)", "Calculates the overall utilization of bin space.")]


 31  [StorableClass]


 32  public class BinUtilizationEvaluator : Item, IEvaluator {


 33 


 34  [StorableConstructor]


 35  protected BinUtilizationEvaluator(bool deserializing) : base(deserializing) { }


 36  protected BinUtilizationEvaluator(BinUtilizationEvaluator original, Cloner cloner)


 37  : base(original, cloner) {


 38  }


 39  public BinUtilizationEvaluator() : base() { }


 40  public override IDeepCloneable Clone(Cloner cloner) {


 41  return new BinUtilizationEvaluator(this, cloner);


 42  }


 43 


 44  #region IEvaluator Members


[15473]  45 


 46  /// <summary>


 47  /// Calculates the bin utilization in percent.


 48  /// </summary>


 49  /// <param name="solution"></param>


 50  /// <returns>Returns the calculated bin utilization of all bins in percent.</returns>


[14162]  51  public double Evaluate(Solution solution) {


 52  return CalculateBinUtilization(solution);


 53  }


 54 


 55 


 56  public static double CalculateBinUtilization(Solution solution) {


 57  int nrOfBins = solution.NrOfBins;


 58  double totalUsedSpace = 0;


 59  double totalUsableSpace = 0;


 60 


 61  for (int i = 0; i < nrOfBins; i++) {


[14167]  62  totalUsableSpace += solution.Bins[i].BinShape.Volume;


 63  totalUsedSpace += solution.Bins[i].Items.Sum(kvp => kvp.Value.Volume);


[14162]  64  }


 65 


 66  return totalUsedSpace / totalUsableSpace;


 67  }


 68 


[15646]  69  private static int GetBinCount(Solution solution) {


 70  return solution.NrOfBins;


 71  }


 72 


 73  private static int GetNumberOfResidualSpaces(Solution solution) {


 74  var cnt = 0;


 75  foreach (var binPacking in solution.Bins) {


 76  foreach (var item in ((BinPacking3D)binPacking).ExtremePoints) {


 77  cnt += item.Value.Count();


 78  }


 79  }


 80  return cnt;


 81  }


 82 


 83  public Tuple<int, double, int> Evaluate1(Solution solution) {


 84 


 85 


 86  var res = Tuple.Create<int, double, int>(


 87  GetBinCount(solution),


 88  CalculateBinUtilizationFirstBin(solution),


 89  GetNumberOfResidualSpaces(solution)


 90  );


 91 


 92  return res;


 93  }


 94 


 95  private static double CalculateBinUtilizationFirstBin(Solution solution) {


 96  if (solution.NrOfBins <= 0) {


 97  return 0.0;


 98  }


 99 


 100  double totalUsedSpace = 0;


 101  double totalUsableSpace = 0;


 102 


 103  totalUsableSpace += solution.Bins[0].BinShape.Volume;


 104  totalUsedSpace += solution.Bins[0].Items.Sum(kvp => kvp.Value.Volume);


 105 


 106  return totalUsedSpace / totalUsableSpace;


 107  }


 108 


 109 


[14162]  110  #endregion


 111  }


 112  }

