Changeset 15473 for branches/2817-BinPackingSpeedup/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs
- Timestamp:
- 11/15/17 12:30:13 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2817-BinPackingSpeedup/HeuristicLab.Problems.BinPacking/3.3/2D/BinPacking2D.cs
r15241 r15473 34 34 public BinPacking2D(PackingShape binShape) 35 35 : base(binShape) { 36 OccupationLayers = new Dictionary<int, List<int>>(); 36 37 ExtremePoints.Add(binShape.Origin); 37 38 InitializeOccupationLayers(); … … 40 41 [StorableConstructor] 41 42 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 } 43 49 public override IDeepCloneable Clone(Cloner cloner) { 44 50 return new BinPacking2D(this, cloner); 45 51 } 52 53 [Storable] 54 protected Dictionary<int, List<int>> OccupationLayers { get; set; } 46 55 47 56 protected override void GenerateNewExtremePointsForNewItem(PackingItem newItem, PackingPosition position) { … … 75 84 } 76 85 77 public overridePackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints) {86 public PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints) { 78 87 PackingItem rotatedItem = new PackingItem( 79 88 rotated ? item.Height : item.Width, … … 91 100 return null; 92 101 } 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) { 94 145 PackingPosition currentPosition = new PackingPosition(0, 95 146 BinShape.Width - (rotated ? item.Height : item.Width), … … 109 160 } 110 161 111 public overridevoid SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {162 public void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) { 112 163 var temp = new List<int>(sequence); 113 164 for (int i = 0; i < temp.Count; i++) { … … 120 171 } 121 172 } 122 public overridevoid 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) { 123 174 var temp = new List<int>(sequence); 124 175 for (int i = 0; i < temp.Count; i++) { … … 131 182 } 132 183 } 133 public overridevoid ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {184 public void ExtremePointBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) { 134 185 var temp = new List<int>(sequence); 135 186 foreach (int itemID in temp) { … … 143 194 } 144 195 145 public overridevoid 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) { 146 197 var temp = new List<int>(sequence); 147 198 foreach (int itemID in temp) { … … 155 206 } 156 207 157 public overrideint ShortestPossibleSideFromPoint(PackingPosition position) {208 public int ShortestPossibleSideFromPoint(PackingPosition position) { 158 209 int shortestSide = int.MaxValue; 159 210 int width = BinShape.Width; … … 179 230 throw new NotSupportedException(); 180 231 } 181 protected overridevoid InitializeOccupationLayers() {232 protected void InitializeOccupationLayers() { 182 233 for (int i = 0; i * 10 <= BinShape.Width; i += 1) { 183 234 OccupationLayers[i] = new List<int>(); … … 185 236 } 186 237 187 protected overridevoid AddNewItemToOccupationLayers(int itemID, PackingItem item, PackingPosition position) {238 protected void AddNewItemToOccupationLayers(int itemID, PackingItem item, PackingPosition position) { 188 239 int x1 = position.X / 10; 189 240 int x2 = (position.X + (position.Rotated ? item.Height : item.Width)) / 10; … … 192 243 OccupationLayers[i].Add(itemID); 193 244 } 194 protected overrideList<int> GetLayerItemIDs(PackingPosition position) {245 protected List<int> GetLayerItemIDs(PackingPosition position) { 195 246 return OccupationLayers[position.X / 10]; 196 247 } 197 protected overrideList<int> GetLayerItemIDs(PackingItem item, PackingPosition position) {248 protected List<int> GetLayerItemIDs(PackingItem item, PackingPosition position) { 198 249 List<int> result = new List<int>(); 199 250 int x1 = position.X / 10; … … 205 256 return result; 206 257 } 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 } 207 275 } 208 276 }
Note: See TracChangeset
for help on using the changeset viewer.