1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022018 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 HeuristicLab.Common;


23  using HeuristicLab.Core;


24  using HeuristicLab.Encodings.PermutationEncoding;


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


26  using HeuristicLab.Problems.BinPacking3D;


27  using HeuristicLab.Problems.BinPacking3D.ExtremePointCreation;


28  using System;


29  using System.Collections.Generic;


30  using System.Linq;


31  using System.Text;


32  using System.Threading.Tasks;


33 


34  namespace HeuristicLab.Problems.BinPacking3D.Packer {


35  internal abstract class BinPacker : Item, IBinPacker {


36 


37  #region Constructors for HEAL


38 


39 


40  [StorableConstructor]


41  protected BinPacker(bool deserializing) : base(deserializing) { }


42 


43  protected BinPacker(BinPacker original, Cloner cloner)


44  : base(original, cloner) {


45  }


46 


47  #endregion


48 


49  public BinPacker() { }


50 


51 


52  /// <summary>


53  /// Packs all items of the bin packer and returns a collection of BinPacking3D objects


54  /// </summary>


55  /// <param name="sortedItems">Permutation of items sorted by a sorting method. The value of each permutation index references to the index of the items list</param>


56  /// <param name="binShape">Bin for storing the items</param>


57  /// <param name="items">A list of packing items which should be assigned to a bin</param>


58  /// <param name="useStackingConstraints">Flag for using stacking constraints</param>


59  /// <returns>Returns a collection of bin packing 3d objects. Each object represents a bin and the packed items</returns>


60  public abstract IList<BinPacking3D> PackItems(Permutation sortedItems, PackingShape binShape, IList<PackingItem> items, ExtremePointCreationMethod epCreationMethod, ExtremePointPruningMethod epPruningMethod, bool useStackingConstraints);


61 


62  /// <summary>


63  /// Pack a given item into a given bin and updates the residual space and the extreme points


64  /// </summary>


65  /// <param name="packingBin"></param>


66  /// <param name="itemId"></param>


67  /// <param name="packingItem"></param>


68  /// <param name="position"></param>


69  protected virtual void PackItem(BinPacking3D packingBin, int itemId, PackingItem packingItem, PackingPosition position, IExtremePointCreator extremePointCreator, bool useStackingConstraints) {


70  packingBin.PackItem(itemId, packingItem, position);


71  extremePointCreator.UpdateBinPacking(packingBin, packingItem, position);


72  }


73 


74  /// <summary>


75  /// This method tries to find a valid packing position for an given item in a given packing bin


76  /// </summary>


77  /// <param name="packingBin"></param>


78  /// <param name="packingItem"></param>


79  /// <param name="useStackingConstraints"></param>


80  /// <returns>Returns the packing position for an given item. If there could not be found a valid position it returns null</returns>


81  protected virtual PackingPosition FindPackingPositionForItem(BinPacking3D packingBin, PackingItem packingItem, bool useStackingConstraints) {


82  if (!CheckItemDimensions(packingBin, packingItem)) {


83  throw new BinPacking3DException($"The dimensions of the given item exceeds the bin dimensions. " +


84  $"Bin: ({packingBin.BinShape.Width} {packingBin.BinShape.Depth} {packingBin.BinShape.Height})" +


85  $"Item: ({packingItem.Width} {packingItem.Depth} {packingItem.Height})");


86  }


87 


88  PackingItem newItem = new PackingItem(


89  packingItem.Width,


90  packingItem.Height,


91  packingItem.Depth,


92  packingItem.TargetBin, packingItem.Weight, packingItem.Material);


93 


94  // The extremepoints are sortet by Y / Z / X


95  var newPosition = packingBin.ExtremePoints.Where(x => packingBin.IsPositionFeasible(newItem, x.Key, useStackingConstraints)).FirstOrDefault();


96 


97  return newPosition.Key;


98  }


99 


100  /// <summary>


101  /// Compares the dimensions of a given item and the current bin.


102  /// </summary>


103  /// <param name="item"></param>


104  /// <returns>Returns true if the dimensions of an given item are less or equal to the bin.</returns>


105  protected virtual bool CheckItemDimensions(BinPacking3D packingBin, PackingItem item) {


106  var width = item.Width;


107  var depth = item.Depth;


108  return packingBin.BinShape.Width >= width && packingBin.BinShape.Height >= item.Height && packingBin.BinShape.Depth >= depth;


109  }


110 


111  /// <summary>


112  /// Clones a given list of packing items.


113  /// </summary>


114  /// <param name="items"></param>


115  /// <returns></returns>


116  protected static IList<PackingItem> CloneItems(IList<PackingItem> items) {


117  var clonedItems = new List<PackingItem>();


118  foreach (var item in items) {


119  clonedItems.Add(item.Clone() as PackingItem);


120  }


121  return clonedItems;


122  }


123 


124  }


125  }

