Changeset 14048 for branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/BinPacking2D.cs
- Timestamp:
- 07/12/16 19:54:35 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking.2D/3.3/BinPacking2D.cs
r14046 r14048 31 31 [Item("BinPacking2D", "Represents a single-bin packing for a 2D bin-packing problem.")] 32 32 [StorableClass] 33 public class BinPacking2D : BinPacking< TwoDimensionalPacking, RectangularPackingShape, RectangularPackingItem> {33 public class BinPacking2D : BinPacking<PackingPosition, RectangularPackingShape, RectangularPackingItem> { 34 34 35 35 public BinPacking2D(RectangularPackingShape binMeasures) 36 36 : base(binMeasures) { 37 ExtremePoints = new SortedSet< TwoDimensionalPacking>(new EPComparer2D());37 ExtremePoints = new SortedSet<PackingPosition>(new EPComparer2D()); 38 38 ExtremePoints.Add(binMeasures.Origin); 39 39 } … … 42 42 protected BinPacking2D(BinPacking2D original, Cloner cloner) 43 43 : base(original, cloner) { 44 this.ExtremePoints = new SortedSet< TwoDimensionalPacking>(original.ExtremePoints, new EPComparer2D());44 this.ExtremePoints = new SortedSet<PackingPosition>(original.ExtremePoints, new EPComparer2D()); 45 45 } 46 46 public override IDeepCloneable Clone(Cloner cloner) { … … 48 48 } 49 49 50 protected override void GenerateNewExtremePointsForNewItem(RectangularPackingItem newItem, TwoDimensionalPackingposition) {50 protected override void GenerateNewExtremePointsForNewItem(RectangularPackingItem newItem, PackingPosition position) { 51 51 52 52 int newWidth = position.Rotated ? newItem.Height : newItem.Width; … … 54 54 55 55 //Find ExtremePoints beginning from sourcepointX 56 var sourcePointX = new TwoDimensionalPacking(0, position.X + newWidth, position.Y);56 var sourcePointX = new PackingPosition(0, position.X + newWidth, position.Y); 57 57 if (sourcePointX.X < BinMeasures.Width && sourcePointX.Y < BinMeasures.Height) { 58 58 //Traversing down the y-axis 59 var newPoint = new TwoDimensionalPacking(0, sourcePointX.X, sourcePointX.Y - 1);59 var newPoint = new PackingPosition(0, sourcePointX.X, sourcePointX.Y - 1); 60 60 while (sourcePointX.Y > 0 && !IsPointOccupied(newPoint)) { 61 61 sourcePointX = newPoint; 62 newPoint = new TwoDimensionalPacking(0, sourcePointX.X, sourcePointX.Y - 1);63 } 64 ExtremePoints.Add(new TwoDimensionalPacking(0, sourcePointX.X, sourcePointX.Y));62 newPoint = new PackingPosition(0, sourcePointX.X, sourcePointX.Y - 1); 63 } 64 ExtremePoints.Add(new PackingPosition(0, sourcePointX.X, sourcePointX.Y)); 65 65 } 66 66 67 67 //Find ExtremePoints beginning from sourcepointY 68 var sourcePointY = new TwoDimensionalPacking(0, position.X, position.Y + newItem.Height);68 var sourcePointY = new PackingPosition(0, position.X, position.Y + newItem.Height); 69 69 if (sourcePointY.X < BinMeasures.Width && sourcePointY.Y < BinMeasures.Height) { 70 70 //Traversing down the x-axis 71 var newPoint = new TwoDimensionalPacking(0, sourcePointY.X - 1, sourcePointY.Y);71 var newPoint = new PackingPosition(0, sourcePointY.X - 1, sourcePointY.Y); 72 72 while (sourcePointY.X > 0 && !IsPointOccupied(newPoint)) { 73 73 sourcePointY = newPoint; 74 newPoint = new TwoDimensionalPacking(0, sourcePointY.X - 1, sourcePointY.Y);75 } 76 ExtremePoints.Add(new TwoDimensionalPacking(0, sourcePointY.X, sourcePointY.Y));74 newPoint = new PackingPosition(0, sourcePointY.X - 1, sourcePointY.Y); 75 } 76 ExtremePoints.Add(new PackingPosition(0, sourcePointY.X, sourcePointY.Y)); 77 77 } 78 78 … … 85 85 } 86 86 87 public override TwoDimensionalPackingFindExtremePointForItem(RectangularPackingItem measures, bool rotated, bool stackingConstraints) {87 public override PackingPosition FindExtremePointForItem(RectangularPackingItem measures, bool rotated, bool stackingConstraints) { 88 88 RectangularPackingItem item = new RectangularPackingItem( 89 89 rotated ? measures.Height : measures.Width, … … 97 97 var currentPoint = ExtremePoints.ElementAt(epIndex); 98 98 99 var result = new TwoDimensionalPacking(currentPoint.AssignedBin, currentPoint.X, currentPoint.Y, rotated);99 var result = new PackingPosition(currentPoint.AssignedBin, currentPoint.X, currentPoint.Y, rotated); 100 100 return result; 101 101 } 102 102 return null; 103 103 } 104 public override TwoDimensionalPackingFindPositionBySliding(RectangularPackingItem measures, bool rotated) {105 TwoDimensionalPacking currentPosition = new TwoDimensionalPacking(0,104 public override PackingPosition FindPositionBySliding(RectangularPackingItem measures, bool rotated) { 105 PackingPosition currentPosition = new PackingPosition(0, 106 106 BinMeasures.Width - (rotated ? measures.Height : measures.Width), 107 107 BinMeasures.Height - (rotated ? measures.Width : measures.Height), rotated); 108 108 //Slide the item as far as possible to the left 109 while (IsPositionFeasible(measures, TwoDimensionalPacking.MoveLeft(currentPosition))110 || IsPositionFeasible(measures, TwoDimensionalPacking.MoveDown(currentPosition))) {109 while (IsPositionFeasible(measures, PackingPosition.MoveLeft(currentPosition)) 110 || IsPositionFeasible(measures, PackingPosition.MoveDown(currentPosition))) { 111 111 //Slide the item as far as possible to the bottom 112 while (IsPositionFeasible(measures, TwoDimensionalPacking.MoveDown(currentPosition))) {113 currentPosition = TwoDimensionalPacking.MoveDown(currentPosition);114 } 115 if (IsPositionFeasible(measures, TwoDimensionalPacking.MoveLeft(currentPosition)))116 currentPosition = TwoDimensionalPacking.MoveLeft(currentPosition);112 while (IsPositionFeasible(measures, PackingPosition.MoveDown(currentPosition))) { 113 currentPosition = PackingPosition.MoveDown(currentPosition); 114 } 115 if (IsPositionFeasible(measures, PackingPosition.MoveLeft(currentPosition))) 116 currentPosition = PackingPosition.MoveLeft(currentPosition); 117 117 } 118 118 … … 165 165 } 166 166 167 public override int ShortestPossibleSideFromPoint( TwoDimensionalPackingposition) {167 public override int ShortestPossibleSideFromPoint(PackingPosition position) { 168 168 int shortestSide = int.MaxValue; 169 169 int width = BinMeasures.Width; … … 173 173 return shortestSide; 174 174 175 TwoDimensionalPacking current = new TwoDimensionalPacking(0, position.X, position.Y);176 while (current.X < width && IsPointOccupied(current)) { current = TwoDimensionalPacking.MoveRight(current); }175 PackingPosition current = new PackingPosition(0, position.X, position.Y); 176 while (current.X < width && IsPointOccupied(current)) { current = PackingPosition.MoveRight(current); } 177 177 if (current.X - position.X < shortestSide) 178 178 shortestSide = current.X - position.X; 179 179 180 180 181 current = new TwoDimensionalPacking(0, position.X, position.Y);182 while (current.Y < height && IsPointOccupied(current)) { current = TwoDimensionalPacking.MoveUp(current); }181 current = new PackingPosition(0, position.X, position.Y); 182 while (current.Y < height && IsPointOccupied(current)) { current = PackingPosition.MoveUp(current); } 183 183 if (current.Y - position.Y < shortestSide) 184 184 shortestSide = current.Y - position.Y; … … 186 186 return shortestSide; 187 187 } 188 public override bool IsStaticStable(RectangularPackingItem item, TwoDimensionalPackingposition) {188 public override bool IsStaticStable(RectangularPackingItem item, PackingPosition position) { 189 189 throw new NotImplementedException(); 190 190 } … … 196 196 } 197 197 } 198 protected override void AddNewItemToOccupationLayers(int itemID, RectangularPackingItem measures, TwoDimensionalPackingposition) {198 protected override void AddNewItemToOccupationLayers(int itemID, RectangularPackingItem measures, PackingPosition position) { 199 199 int x1 = position.X / 10; 200 200 int x2 = (position.X + (position.Rotated ? measures.Height : measures.Width)) / 10; … … 203 203 OccupationLayers[i].Add(itemID); 204 204 } 205 protected override List<int> GetLayerItemIDs( TwoDimensionalPackingposition) {205 protected override List<int> GetLayerItemIDs(PackingPosition position) { 206 206 return OccupationLayers[position.X / 10]; 207 207 } 208 protected override List<int> GetLayerItemIDs(RectangularPackingItem measures, TwoDimensionalPackingposition) {208 protected override List<int> GetLayerItemIDs(RectangularPackingItem measures, PackingPosition position) { 209 209 List<int> result = new List<int>(); 210 210 int x1 = position.X / 10; … … 217 217 } 218 218 } 219 public class EPComparer2D : IComparer< TwoDimensionalPacking> {220 public int Compare( TwoDimensionalPacking a, TwoDimensionalPackingb) {219 public class EPComparer2D : IComparer<PackingPosition> { 220 public int Compare(PackingPosition a, PackingPosition b) { 221 221 int result = a.X.CompareTo(b.X); 222 222 if (result == 0)
Note: See TracChangeset
for help on using the changeset viewer.