Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/15/17 12:30:13 (6 years ago)
Author:
rhanghof
Message:

#2817:
-Added unit tests
-Refactoring of bp 3D

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2817-BinPackingSpeedup/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs

    r15241 r15473  
    3434    public BinPacking2D(PackingShape binShape)
    3535      : base(binShape) {
     36      OccupationLayers = new Dictionary<int, List<int>>();
    3637      ExtremePoints.Add(binShape.Origin);
    3738      InitializeOccupationLayers();
     
    4041    [StorableConstructor]
    4142    protected BinPacking2D(bool deserializing) : base(deserializing) { }
    42     protected BinPacking2D(BinPacking2D original, Cloner cloner) : base(original, cloner) { }
     43    protected BinPacking2D(BinPacking2D original, Cloner cloner) : base(original, cloner) {
     44      this.OccupationLayers = new Dictionary<int, List<int>>();
     45      foreach (var kvp in original.OccupationLayers) {
     46        OccupationLayers.Add(kvp.Key, new List<int>(kvp.Value));
     47      }
     48    }
    4349    public override IDeepCloneable Clone(Cloner cloner) {
    4450      return new BinPacking2D(this, cloner);
    4551    }
     52
     53    [Storable]
     54    protected Dictionary<int, List<int>> OccupationLayers { get; set; }
    4655
    4756    protected override void GenerateNewExtremePointsForNewItem(PackingItem newItem, PackingPosition position) {
     
    7584    }
    7685
    77     public override PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints) {
     86    public PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints) {
    7887      PackingItem rotatedItem = new PackingItem(
    7988        rotated ? item.Height : item.Width,
     
    91100      return null;
    92101    }
    93     public override PackingPosition FindPositionBySliding(PackingItem item, bool rotated, bool stackingConstraints) {
     102
     103    public override void PackItem(int itemID, PackingItem item, PackingPosition position) {
     104      Items[itemID] = item;
     105      Positions[itemID] = position;
     106      ExtremePoints.Remove(position);
     107      GenerateNewExtremePointsForNewItem(item, position);
     108
     109      AddNewItemToOccupationLayers(itemID, item, position);
     110    }
     111
     112    public bool PackItemIfFeasible(int itemID, PackingItem item, PackingPosition position, bool stackingConstraints) {
     113      if (IsPositionFeasible(item, position, stackingConstraints)) {
     114        PackItem(itemID, item, position);
     115        return true;
     116      }
     117      return false;
     118    }
     119
     120    /// <summary>
     121    ///
     122    /// </summary>
     123    /// <param name="item"></param>
     124    /// <param name="position"></param>
     125    /// <param name="stackingConstraints"></param>
     126    /// <returns></returns>
     127    public override bool IsPositionFeasible(PackingItem item, PackingPosition position, bool stackingConstraints) {
     128      //In this case feasability is defined as following:
     129      //1. the item fits into the bin-borders;
     130      //2. the point is supported by something;
     131      //3. the item does not collide with another already packed item
     132      if (!BinShape.Encloses(position, item))
     133        return false;
     134
     135      foreach (var id in GetLayerItemIDs(item, position)) {
     136        if (Items[id].Overlaps(Positions[id], position, item))
     137          return false;
     138      }
     139
     140      return true;
     141    }
     142
     143
     144    public PackingPosition FindPositionBySliding(PackingItem item, bool rotated, bool stackingConstraints) {
    94145      PackingPosition currentPosition = new PackingPosition(0,
    95146        BinShape.Width - (rotated ? item.Height : item.Width),
     
    109160    }
    110161
    111     public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {
     162    public void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {
    112163      var temp = new List<int>(sequence);
    113164      for (int i = 0; i < temp.Count; i++) {
     
    120171      }
    121172    }
    122     public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, Dictionary<int, bool> rotationArray, bool stackingConstraints) {
     173    public void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, Dictionary<int, bool> rotationArray, bool stackingConstraints) {
    123174      var temp = new List<int>(sequence);
    124175      for (int i = 0; i < temp.Count; i++) {
     
    131182      }
    132183    }
    133     public override void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {
     184    public void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {
    134185      var temp = new List<int>(sequence);
    135186      foreach (int itemID in temp) {
     
    143194    }
    144195   
    145     public override void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints, Dictionary<int, bool> rotationArray) {
     196    public void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints, Dictionary<int, bool> rotationArray) {
    146197      var temp = new List<int>(sequence);
    147198      foreach (int itemID in temp) {
     
    155206    }
    156207
    157     public override int ShortestPossibleSideFromPoint(PackingPosition position) {
     208    public int ShortestPossibleSideFromPoint(PackingPosition position) {
    158209      int shortestSide = int.MaxValue;
    159210      int width = BinShape.Width;
     
    179230      throw new NotSupportedException();
    180231    }
    181     protected override void InitializeOccupationLayers() {
     232    protected void InitializeOccupationLayers() {
    182233      for (int i = 0; i * 10 <= BinShape.Width; i += 1) {
    183234        OccupationLayers[i] = new List<int>();
     
    185236    }
    186237
    187     protected override void AddNewItemToOccupationLayers(int itemID, PackingItem item, PackingPosition position) {
     238    protected void AddNewItemToOccupationLayers(int itemID, PackingItem item, PackingPosition position) {
    188239      int x1 = position.X / 10;
    189240      int x2 = (position.X + (position.Rotated ? item.Height : item.Width)) / 10;
     
    192243        OccupationLayers[i].Add(itemID);
    193244    }
    194     protected override List<int> GetLayerItemIDs(PackingPosition position) {
     245    protected List<int> GetLayerItemIDs(PackingPosition position) {
    195246      return OccupationLayers[position.X / 10];
    196247    }
    197     protected override List<int> GetLayerItemIDs(PackingItem item, PackingPosition position) {
     248    protected List<int> GetLayerItemIDs(PackingItem item, PackingPosition position) {
    198249      List<int> result = new List<int>();
    199250      int x1 = position.X / 10;
     
    205256      return result;
    206257    }
     258   
     259
     260    public int PointOccupation(PackingPosition position) {
     261      foreach (var id in GetLayerItemIDs(position)) {
     262        if (Items[id].EnclosesPoint(Positions[id], position))
     263          return id;
     264      }
     265      return -1;
     266    }
     267
     268    public bool IsPointOccupied(PackingPosition position) {
     269      foreach (var id in GetLayerItemIDs(position)) {
     270        if (Items[id].EnclosesPoint(Positions[id], position))
     271          return true;
     272      }
     273      return false;
     274    }
    207275  }
    208276}
Note: See TracChangeset for help on using the changeset viewer.