Changeset 9599 for branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/BinPacking3D.cs
- Timestamp:
- 06/09/13 12:58:39 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/BinPacking3D.cs
r9598 r9599 41 41 public class BinPacking3D : BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> { 42 42 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); 45 48 } 46 49 [StorableConstructor] … … 48 51 protected BinPacking3D(BinPacking3D original, Cloner cloner) 49 52 : base(original, cloner) { 50 this.depthWasDoubled = original.depthWasDoubled; 53 this.depthWasDoubled = original.depthWasDoubled; 54 this.ExtremePoints = new SortedSet<ThreeDimensionalPacking>(original.ExtremePoints, new EPComparer3D()); 51 55 } 52 56 public override IDeepCloneable Clone(Cloner cloner) { … … 63 67 //Traversing down the y-axis 64 68 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))) { 70 74 current = ThreeDimensionalPacking.MoveLeft(current); 71 75 } … … 74 78 //Traversing down the z-axis 75 79 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))) { 77 81 current = ThreeDimensionalPacking.MoveBack(current); 78 82 } 79 83 ExtremePoints.Add((ThreeDimensionalPacking)current.Clone()); 80 while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {84 while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) { 81 85 current = ThreeDimensionalPacking.MoveDown(current); 82 86 } … … 92 96 //Traversing down the x-axis 93 97 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))) { 95 99 current = ThreeDimensionalPacking.MoveLeft(current); 96 100 } 97 101 ExtremePoints.Add((ThreeDimensionalPacking)current.Clone()); 98 while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {102 while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) { 99 103 current = ThreeDimensionalPacking.MoveDown(current); 100 104 } … … 103 107 //Traversing down the z-axis 104 108 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))) { 106 110 current = ThreeDimensionalPacking.MoveBack(current); 107 111 } 108 112 ExtremePoints.Add((ThreeDimensionalPacking)current.Clone()); 109 while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {113 while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) { 110 114 current = ThreeDimensionalPacking.MoveDown(current); 111 115 } … … 122 126 //Traversing down the x-axis 123 127 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))) { 125 129 current = ThreeDimensionalPacking.MoveLeft(current); 126 130 } 127 131 ExtremePoints.Add((ThreeDimensionalPacking)current.Clone()); 128 while (current.Y > 0 && IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) {132 while (current.Y > 0 && !IsPointOccupied(ThreeDimensionalPacking.MoveDown(current))) { 129 133 current = ThreeDimensionalPacking.MoveDown(current); 130 134 } … … 133 137 //Traversing down the y-axis 134 138 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))) { 140 144 current = ThreeDimensionalPacking.MoveLeft(current); 141 145 } … … 143 147 } 144 148 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 // ); 150 156 } 151 157 … … 281 287 282 288 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))) 286 292 return true; 287 293 … … 307 313 } 308 314 309 310 315 [Storable] 311 316 private bool depthWasDoubled = false; … … 336 341 337 342 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)) 341 346 return true; 342 347 343 348 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; 344 387 } 345 388 }
Note: See TracChangeset
for help on using the changeset viewer.