Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/09/13 12:58:39 (11 years ago)
Author:
jhelm
Message:

#1966: Bugfixing; Refactoring; Performancetuning;

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/BinPacking3D.cs

    r9598 r9599  
    4141  public class BinPacking3D : BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> {
    4242
    43     public BinPacking3D(CuboidPackingBin binMeasures) : base(binMeasures) {
    44       //OccupiedPoints = new OccupiedPoints3D(binMeasures);
     43    public BinPacking3D(CuboidPackingBin binMeasures)
     44      : base(binMeasures) {
     45      //ExtremePoints = new HashSet<ThreeDimensionalPacking>();
     46      ExtremePoints = new SortedSet<ThreeDimensionalPacking>(new EPComparer3D());
     47      ExtremePoints.Add(binMeasures.Origin);
    4548    }
    4649    [StorableConstructor]
     
    4851    protected BinPacking3D(BinPacking3D original, Cloner cloner)
    4952      : base(original, cloner) {
    50         this.depthWasDoubled = original.depthWasDoubled;
     53      this.depthWasDoubled = original.depthWasDoubled;
     54      this.ExtremePoints = new SortedSet<ThreeDimensionalPacking>(original.ExtremePoints, new EPComparer3D());
    5155    }
    5256    public override IDeepCloneable Clone(Cloner cloner) {
     
    6367        //Traversing down the y-axis           
    6468        ThreeDimensionalPacking current = new ThreeDimensionalPacking(0, sourcePointX.X, sourcePointX.Y, sourcePointX.Z);
    65         while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown (current))) {
    66           current = ThreeDimensionalPacking.MoveDown(current);
    67         }
    68         ExtremePoints.Add((ThreeDimensionalPacking)current.Clone());
    69         while (current.X > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveLeft(current))) {
     69        while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown (current))) {
     70          current = ThreeDimensionalPacking.MoveDown(current);
     71        }
     72        ExtremePoints.Add((ThreeDimensionalPacking)current.Clone());
     73        while (current.X > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveLeft(current))) {
    7074          current = ThreeDimensionalPacking.MoveLeft(current);
    7175        }
     
    7478        //Traversing down the z-axis                 
    7579        current = new ThreeDimensionalPacking(0, sourcePointX.X, sourcePointX.Y, sourcePointX.Z);
    76         while (current.Z > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveBack (current))) {
     80        while (current.Z > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveBack (current))) {
    7781          current = ThreeDimensionalPacking.MoveBack(current);
    7882        }
    7983        ExtremePoints.Add((ThreeDimensionalPacking)current.Clone());
    80         while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
     84        while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
    8185          current = ThreeDimensionalPacking.MoveDown(current);
    8286        }
     
    9296        //Traversing down the x-axis         
    9397        ThreeDimensionalPacking current = new ThreeDimensionalPacking(0, sourcePointY.X, sourcePointY.Y, sourcePointY.Z);
    94         while (current.X > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveLeft(current))) {
     98        while (current.X > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveLeft(current))) {
    9599          current = ThreeDimensionalPacking.MoveLeft(current);
    96100        }
    97101        ExtremePoints.Add((ThreeDimensionalPacking)current.Clone());
    98         while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
     102        while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
    99103          current = ThreeDimensionalPacking.MoveDown(current);
    100104        }
     
    103107        //Traversing down the z-axis                                                                   
    104108        current = new ThreeDimensionalPacking(0, sourcePointY.X, sourcePointY.Y, sourcePointY.Z);
    105         while (current.Z > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveBack(current))) {
     109        while (current.Z > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveBack(current))) {
    106110          current = ThreeDimensionalPacking.MoveBack(current);
    107111        }
    108112        ExtremePoints.Add((ThreeDimensionalPacking)current.Clone());
    109         while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
     113        while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
    110114          current = ThreeDimensionalPacking.MoveDown(current);
    111115        }
     
    122126        //Traversing down the x-axis                                                                             
    123127        ThreeDimensionalPacking current = new ThreeDimensionalPacking(0, sourcePointZ.X, sourcePointZ.Y, sourcePointZ.Z);
    124         while (current.X > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveLeft(current))) {
     128        while (current.X > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveLeft(current))) {
    125129          current = ThreeDimensionalPacking.MoveLeft(current);
    126130        }
    127131        ExtremePoints.Add((ThreeDimensionalPacking)current.Clone());
    128         while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
     132        while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
    129133          current = ThreeDimensionalPacking.MoveDown(current);
    130134        }
     
    133137        //Traversing down the y-axis                                                                     
    134138        current = new ThreeDimensionalPacking(0, sourcePointZ.X, sourcePointZ.Y, sourcePointZ.Z);
    135         while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
    136           current = ThreeDimensionalPacking.MoveDown(current);
    137         }
    138         ExtremePoints.Add((ThreeDimensionalPacking)current.Clone());
    139         while (current.X > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveLeft(current))) {
     139        while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {
     140          current = ThreeDimensionalPacking.MoveDown(current);
     141        }
     142        ExtremePoints.Add((ThreeDimensionalPacking)current.Clone());
     143        while (current.X > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveLeft(current))) {
    140144          current = ThreeDimensionalPacking.MoveLeft(current);
    141145        }
     
    143147      }
    144148
    145       ExtremePoints = new HashSet<ThreeDimensionalPacking>(ExtremePoints.
    146         OrderBy(ep => ep.Z).
    147         ThenBy(ep => ep.X).
    148         ThenBy(ep => ep.Y)//.ThenBy(ep => ShortestPossibleSideFromPoint(ep))
    149         );
     149      //ExtremePoints.RemoveWhere(ep => IsPointOccupied (ep));
     150
     151      //ExtremePoints = new HashSet<ThreeDimensionalPacking>(ExtremePoints.
     152      //  OrderBy(ep => ep.Z).
     153      //  ThenBy(ep => ep.X).
     154      //  ThenBy(ep => ep.Y)//.ThenBy(ep => ShortestPossibleSideFromPoint(ep))
     155      //  );
    150156    }
    151157
     
    281287
    282288      if (IsPointOccupied (new ThreeDimensionalPacking (0, position.X, position.Y - 1, position.Z))
    283         && IsPointOccupied (new ThreeDimensionalPacking (0, position.X + item.Width, position.Y - 1, position.Z))
    284         && IsPointOccupied (new ThreeDimensionalPacking (0, position.X, position.Y - 1, position.Z + item.Depth))
    285         && IsPointOccupied (new ThreeDimensionalPacking (0, position.X + item.Width, position.Y - 1, position.Z + item.Depth)))
     289        && IsPointOccupied (new ThreeDimensionalPacking (0, position.X + item.Width-1, position.Y - 1, position.Z))
     290        && IsPointOccupied (new ThreeDimensionalPacking (0, position.X, position.Y - 1, position.Z + item.Depth-1))
     291        && IsPointOccupied (new ThreeDimensionalPacking (0, position.X + item.Width-1, position.Y - 1, position.Z + item.Depth-1)))
    286292        return true;
    287293
     
    307313    }
    308314
    309 
    310315    [Storable]
    311316    private bool depthWasDoubled = false;
     
    336341
    337342      if (ItemMeasures[PointOccupation(new ThreeDimensionalPacking(0, ep.X, ep.Y - 1, ep.Z))].SupportsStacking(item)
    338         && ItemMeasures[PointOccupation(new ThreeDimensionalPacking(0, ep.X + item.Width, ep.Y - 1, ep.Z))].SupportsStacking(item)
    339         && ItemMeasures[PointOccupation(new ThreeDimensionalPacking(0, ep.X, ep.Y - 1, ep.Z + item.Depth))].SupportsStacking(item)
    340         && ItemMeasures[PointOccupation(new ThreeDimensionalPacking(0, ep.X + item.Width, ep.Y - 1, ep.Z + item.Depth))].SupportsStacking(item))
     343        && ItemMeasures[PointOccupation(new ThreeDimensionalPacking(0, ep.X + item.Width-1, ep.Y - 1, ep.Z))].SupportsStacking(item)
     344        && ItemMeasures[PointOccupation(new ThreeDimensionalPacking(0, ep.X, ep.Y - 1, ep.Z + item.Depth-1))].SupportsStacking(item)
     345        && ItemMeasures[PointOccupation(new ThreeDimensionalPacking(0, ep.X + item.Width-1, ep.Y - 1, ep.Z + item.Depth-1))].SupportsStacking(item))
    341346        return true;
    342347
    343348      return false;
     349    }   
     350   
     351
     352    protected override void InitializeOccupationLayers() {
     353      for (int i = 0; i*10 <= BinMeasures.Depth; i += 1) {
     354        OccupationLayers[i] = new List<int>();
     355      }
     356    }
     357    protected override void AddNewItemToOccupationLayers(int itemID, CuboidPackingItem measures, ThreeDimensionalPacking position) {
     358      int z1 = position.Z / 10;
     359      int z2 = (position.Z + (position.Rotated ? measures.Width : measures.Depth)) / 10;
     360
     361      for (int i = z1; i <= z2; i++)
     362        OccupationLayers[i].Add(itemID);
     363    }
     364    protected override List<int> GetLayerItemIDs(ThreeDimensionalPacking position) {
     365      return OccupationLayers[position.Z / 10];
     366    }
     367    protected override List<int> GetLayerItemIDs(CuboidPackingItem measures, ThreeDimensionalPacking position) {
     368      List<int> result = new List<int>();
     369      int z1 = position.Z / 10;
     370      int z2 = (position.Z + (position.Rotated ? measures.Width : measures.Depth)) / 10;
     371
     372      for (int i = z1; i <= z2; i++)
     373        result.AddRange(OccupationLayers[i]);
     374
     375      return result;
     376    }
     377  }
     378  public class EPComparer3D : IComparer<ThreeDimensionalPacking> {
     379    public int Compare(ThreeDimensionalPacking a, ThreeDimensionalPacking b) {
     380        int result = a.Z.CompareTo (b.Z);
     381      if (result == 0)
     382        result = a.X.CompareTo (b.X);
     383      if (result == 0)
     384        result = a.Y.CompareTo(b.Y);
     385
     386      return result;
    344387    }
    345388  }
Note: See TracChangeset for help on using the changeset viewer.