Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/SequentialPackingFunctions.cs @ 9593

Last change on this file since 9593 was 9593, checked in by jhelm, 11 years ago

#1966: Applied some heavy refactoring on the decoder-classes and cleaned up the code a bit;

File size: 27.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using HeuristicLab.Collections;
6using HeuristicLab.Core;
7using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
8using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
9using HeuristicLab.Encodings.PackingEncoding.PackingPlan;
10using HeuristicLab.Encodings.PackingEncoding.PackingSequence;
11using HeuristicLab.Encodings.PermutationEncoding;
12using HeuristicLab.Problems.BinPacking.Dimensions;
13using HeuristicLab.Problems.BinPacking.Interfaces;
14using HeuristicLab.Problems.BinPacking.PackingBin;
15using HeuristicLab.Problems.BinPacking.PackingItem;
16using HeuristicLab.Problems.BinPacking.Shapes;
17
18namespace HeuristicLab.Problems.BinPacking.Decoders {
19  public static class SequentialPackingFunctions {     
20
21
22
23    public static List<List<int>> GenerateSequenceMatrix(GroupingVectorEncoding gv) {
24      List<List<int>> result = new List<List<int>> ();
25      int nrOfBins = gv.GroupingVector.Max() + 1;
26      for (int i = 0; i < nrOfBins; i++)
27        result.Add (new List<int>());
28      for (int i = 0; i < gv.GroupingVector.Length; i++ ) {
29        result[gv.GroupingVector[i]].Add(i);
30      }
31      return result;
32    }
33    public static List<List<int>> GenerateSequenceMatrix(MultiComponentVectorEncoding mcv) {
34      List<List<int>> result = new List<List<int>>();
35      foreach (var bi in mcv.PackingInformations){
36        var temp = new List<int>();
37        foreach (var piEntry in bi.Value) {
38          temp.Add(piEntry.ItemID);
39        }
40        result.Add(temp);
41      }
42      return result;
43    }
44    public static Dictionary<int, bool> GenerateRotationArray(MultiComponentVectorEncoding solution) {
45      Dictionary<int, bool> result = new Dictionary<int, bool>();
46      foreach (var bi in solution.PackingInformations)
47        foreach (var pi in bi.Value)
48          result[pi.ItemID] = pi.Rotated;
49      return result;
50    }
51
52
53
54
55
56    public static BinPacking<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> BottomLeftPacking(
57      ref List<int> sequence,  RectangularPackingBin binMeasures, ItemList<RectangularPackingItem> itemMeasures) {
58      BinPacking<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> result = new BinPacking2D(binMeasures);
59      var temp = new List<int>(sequence);
60      for (int i = 0; i < temp.Count; i++) {
61        var item = itemMeasures[temp[i]];
62        TwoDimensionalPacking position = result.FindPositionBySliding(item, false);
63        if (position != null) {
64          result.PackItem(temp[i], item, position);
65          sequence.Remove(temp[i]);
66        }
67      }
68      return result;
69    }
70    public static BinPacking<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> BottomLeftPacking(
71      ref List<int> sequence, RectangularPackingBin binMeasures, ItemList<RectangularPackingItem> itemMeasures, Dictionary<int,bool> rotationArray) {
72      BinPacking<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> result = new BinPacking2D(binMeasures);
73      var temp = new List<int>(sequence);
74      for (int i = 0; i < temp.Count; i++) {
75        var item = itemMeasures[temp[i]];
76        TwoDimensionalPacking position = result.FindPositionBySliding(item, rotationArray[temp[i]]);
77        if (position != null) {
78          result.PackItem(temp[i], item, position);
79          sequence.Remove(temp[i]);
80        }
81      }
82      return result;
83    }
84
85    public static BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> DeepestLeftBottomPacking(
86      ref List<int> sequence, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures) {
87      BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> result = new BinPacking3D(binMeasures);
88      var temp = new List<int>(sequence);
89      for (int i = 0; i < temp.Count; i++) {
90        var item = itemMeasures[temp[i]];
91        ThreeDimensionalPacking position = result.FindPositionBySliding(item, false);
92       
93        if (position != null) {
94          result.PackItem(temp[i], item, position);
95          sequence.Remove(temp[i]);
96        }
97      }
98      return result;
99    }
100    public static BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> DeepestLeftBottomPacking(
101      ref List<int> sequence, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures, Dictionary<int, bool> rotationArray) {
102      BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> result = new BinPacking3D(binMeasures);
103      var temp = new List<int>(sequence);
104      for (int i = 0; i < temp.Count; i++) {
105        var item = itemMeasures[temp[i]];
106        ThreeDimensionalPacking position = result.FindPositionBySliding(item, rotationArray[i]);
107
108        if (position != null) {
109          result.PackItem(temp[i], item, position);
110          sequence.Remove(temp[i]);
111        }
112      }
113      return result;
114    }
115       
116    public static BinPacking<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> ExtremePointBasedPacking(
117      ref List<int> sequence, RectangularPackingBin binMeasures, ItemList<RectangularPackingItem> itemMeasures) { 
118      BinPacking<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> result = new BinPacking2D(binMeasures);
119     
120      var temp = new List<int>(sequence);
121      foreach (int itemID in temp) {
122        var item = itemMeasures[itemID];
123        var positionFound = result.FindExtremePointForItem(item, false, false);
124        if (positionFound != null) {
125          result.PackItem(itemID, item, positionFound);
126          sequence.Remove(itemID);
127        }
128      }
129
130      return result;
131    }
132    public static BinPacking<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> ExtremePointBasedPacking(
133      ref List<int> sequence, RectangularPackingBin binMeasures, ItemList<RectangularPackingItem> itemMeasures, Dictionary<int, bool> rotationArray) {
134      BinPacking<TwoDimensionalPacking, RectangularPackingBin, RectangularPackingItem> result = new BinPacking2D(binMeasures);
135
136      var temp = new List<int>(sequence);
137      foreach (int itemID in temp) {
138        var item = itemMeasures[itemID];
139        var positionFound = result.FindExtremePointForItem(item, rotationArray[itemID], false);
140        if (positionFound != null) {
141          result.PackItem(itemID, item, positionFound);
142          sequence.Remove(itemID);
143        }
144      }
145
146      return result;
147    }
148
149    public static BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> ExtremePointBasedPacking(
150      ref List<int> sequence, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures, bool stackingConstraints) {
151      BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> result = new BinPacking3D(binMeasures);
152
153      var temp = new List<int>(sequence);
154      foreach (int itemID in temp) {
155        var item = itemMeasures[itemID];
156        var positionFound = result.FindExtremePointForItem(item, false, stackingConstraints);
157        if (positionFound != null) {
158          result.PackItem(itemID, item, positionFound);
159          sequence.Remove(itemID);
160        }
161      }
162
163      return result;
164    }
165    public static BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> ExtremePointBasedPacking(
166      ref List<int> sequence, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures, bool stackingConstraints, Dictionary<int, bool> rotationArray) {
167      BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> result = new BinPacking3D(binMeasures);
168
169      var temp = new List<int>(sequence);
170      foreach (int itemID in temp) {
171        var item = itemMeasures[itemID];
172        var positionFound = result.FindExtremePointForItem(item, rotationArray[itemID], stackingConstraints);
173        if (positionFound != null) {
174          result.PackItem(itemID, item, positionFound);
175          sequence.Remove(itemID);
176        }
177      }
178
179      return result;
180    }
181
182
183
184
185
186
187         
188             /*
189
190    public static TwoDimensionalPacking BottomLeftPosition(RectangularPackingBin binMeasures, RectangularPackingItem currentItem, ObservableDictionary<int, TwoDimensionalPacking> itemPositions, ItemList<RectangularPackingItem> itemMeasures, bool rotated) {
191      TwoDimensionalPacking currentPosition = new TwoDimensionalPacking(0,
192        binMeasures.Width - (rotated ? currentItem.Height : currentItem.Width),
193        binMeasures.Height - (rotated ? currentItem.Width : currentItem.Height), rotated);
194      //Slide the item as far as possible to the left
195      while (IsPositionFeasible(binMeasures, currentItem, MoveLeft(currentPosition), itemPositions, itemMeasures)
196        || IsPositionFeasible(binMeasures, currentItem, MoveDown(currentPosition), itemPositions, itemMeasures)) {
197        //Slide the item as far as possible to the bottom
198        while (IsPositionFeasible(binMeasures, currentItem, MoveDown(currentPosition), itemPositions, itemMeasures)) {
199          currentPosition = MoveDown(currentPosition);
200        }
201        if (IsPositionFeasible(binMeasures, currentItem, MoveLeft(currentPosition), itemPositions, itemMeasures))
202          currentPosition = MoveLeft(currentPosition);
203      }
204
205      return IsPositionFeasible(binMeasures, currentItem, currentPosition, itemPositions, itemMeasures) ? currentPosition : null;
206    }
207    private static TwoDimensionalPacking MoveLeft(TwoDimensionalPacking original) {
208      return new TwoDimensionalPacking(original.AssignedBin, original.X - 1, original.Y, original.Rotated);
209    }
210    private static TwoDimensionalPacking MoveDown(TwoDimensionalPacking original) {
211      return new TwoDimensionalPacking(original.AssignedBin, original.X, original.Y - 1, original.Rotated);
212    }
213   
214
215    private static TwoDimensionalPacking FindExtremePointForItem(int itemIndex, ItemList<RectangularPackingItem> itemMeasures, RectangularPackingBin binMeasures,
216        HashSet<TwoDimensionalPacking> extremePoints, int[,] occupiedPoints, ObservableDictionary<int, TwoDimensionalPacking> itemPositions, bool rotated) {
217
218      var itemFromList = itemMeasures[itemIndex];
219      RectangularPackingItem item = new RectangularPackingItem(
220        rotated ? itemFromList.Height : itemFromList.Width,
221        rotated ? itemFromList.Width : itemFromList.Height,
222        itemFromList.TargetBin);
223
224      int epIndex = 0;
225      while (epIndex < extremePoints.Count &&
226        (!IsPositionFeasible(binMeasures, item, extremePoints.ElementAt(epIndex), occupiedPoints)))
227        //(!BottomLeftFunctions.IsPositionFeasible(binMeasures, extremePoints.ElementAt(epIndex).AssignedBin, item, extremePoints.ElementAt(epIndex), itemPositions, itemMeasures)))
228        { epIndex++; }
229
230      if (epIndex < extremePoints.Count) {
231        var result = extremePoints.ElementAt(epIndex);
232        result.Rotated = rotated;
233        return result;
234      }
235      return null;
236    }
237    private static HashSet<TwoDimensionalPacking> GenerateNewExtremePointsForNewItem(HashSet<TwoDimensionalPacking> extremePoints, int[,] occupiedPoints,
238        RectangularPackingItem newItem, TwoDimensionalPacking position, RectangularPackingBin binMeasures) {
239
240      int newWidth = position.Rotated ? newItem.Height : newItem.Width;
241      int newHeight = position.Rotated ? newItem.Width : newItem.Height;
242
243      //Find ExtremePoints beginning from sourcepointX
244      var sourcePointX = new TwoDimensionalPacking(0, position.X + newWidth, position.Y);
245      if (sourcePointX.X < binMeasures.Width && sourcePointX.Y < binMeasures.Height) {
246        //Traversing down the y-axis                                                                           
247        int currentYValue = sourcePointX.Y;
248        while (currentYValue > 0 && occupiedPoints[sourcePointX.X, currentYValue] == -1) {
249          currentYValue--;
250        }
251        extremePoints.Add(new TwoDimensionalPacking(0, sourcePointX.X, currentYValue));
252      }
253
254
255
256
257      //Find ExtremePoints beginning from sourcepointY
258      var sourcePointY = new TwoDimensionalPacking(0, position.X, position.Y + newItem.Height);
259      if (sourcePointY.X < binMeasures.Width && sourcePointY.Y < binMeasures.Height) {
260        //Traversing down the x-axis 
261        int currentXValue = sourcePointY.X;
262        while (currentXValue > 0 && occupiedPoints[currentXValue - 1, sourcePointY.Y] == -1) {
263          currentXValue--;
264        }
265        extremePoints.Add(new TwoDimensionalPacking(0, currentXValue, sourcePointY.Y));
266      }
267
268
269      return extremePoints;
270    }
271    private static HashSet<TwoDimensionalPacking> OrderExtremePoints(HashSet<TwoDimensionalPacking> hashSet, int[,] occupiedPoints, RectangularPackingBin binMeasures) {
272      return new HashSet<TwoDimensionalPacking>(hashSet.OrderBy(ep => ep.AssignedBin).ThenBy(ep => ep.X).ThenBy(ep => ep.Y).ThenBy(ep => ShortestPossibleSideFromEP(ep, occupiedPoints, binMeasures)));
273    }
274    private static int ShortestPossibleSideFromEP(TwoDimensionalPacking ep, int[,] occupiedPoints, RectangularPackingBin binMeasures) {
275      int shortestSide = int.MaxValue;
276
277      if (ep.X >= binMeasures.Width || ep.Y >= binMeasures.Height)
278        return shortestSide;
279
280      int currentX = ep.X;
281      while (currentX < binMeasures.Width && occupiedPoints[currentX, ep.Y] == -1) { currentX++; }
282      if (currentX - ep.X < shortestSide)
283        shortestSide = currentX - ep.X;
284
285      int currentY = ep.Y;
286      while (currentY < binMeasures.Height && occupiedPoints[ep.X, currentY] == -1) { currentY++; }
287      if (currentY - ep.Y < shortestSide)
288        shortestSide = currentY - ep.Y;
289
290      return shortestSide;
291    }
292    private static int[,] OccupyPointsForNewItem(int[,] occupiedPoints, RectangularPackingItem newItem, TwoDimensionalPacking position, int itemIndex) {
293      int width = position.Rotated ? newItem.Height : newItem.Width;
294      int height = position.Rotated ? newItem.Width : newItem.Height;
295      for (int w = position.X; w < position.X + width; w++) {
296        for (int h = position.Y; h < position.Y + height; h++) {
297          occupiedPoints[w, h] = itemIndex;
298        }
299      }
300      return occupiedPoints;
301    }
302    private static int[,] GetOccupiedPoints(RectangularPackingBin binMeasures) {
303      var result = new int[binMeasures.Width, binMeasures.Height];
304      for (int w = 0; w < binMeasures.Width; w++) {
305        for (int h = 0; h < binMeasures.Height; h++) {
306            result[w, h] = -1;
307        }
308      }
309      return result;
310    }
311    private static bool IsPositionFeasible(RectangularPackingBin binMeasures, RectangularPackingItem currentItem,
312     TwoDimensionalPacking position, int[,] occupiedPoints) {
313      //In this case feasability is defined as following: 1. the item fits into the bin-borders; 2. the item does not collide with another already packed item
314      if (!binMeasures.Encloses(position, currentItem))
315        return false;
316
317      for (int w = position.X; w < position.X + currentItem.Width; w++) {
318        for (int h = position.Y; h < position.Y + currentItem.Height; h++) {
319          if (occupiedPoints[w, h] != -1)
320            return false;
321        }
322      }
323
324      return true;
325    }
326    private static bool IsPositionFeasible(RectangularPackingBin binMeasures, RectangularPackingItem currentItem,
327      TwoDimensionalPacking currentPosition, ObservableDictionary<int, TwoDimensionalPacking> itemPositions, ItemList<RectangularPackingItem> itemMeasures) {
328      //In this case feasability is defined as following: 1. the item fits into the bin-borders; 2. the item does not collide with another already packed item
329      if (!binMeasures.Encloses(currentPosition, currentItem))
330        return false;
331
332      foreach (var ipEntry in itemPositions) {
333        if (itemMeasures[ipEntry.Key].Overlaps(ipEntry.Value, currentPosition, currentItem))
334          return false;
335      }
336
337      return true;
338    }
339
340                          */
341
342
343
344
345
346
347
348
349     
350
351               /*
352    public static ThreeDimensionalPacking DeepestLeftBottomPosition(CuboidPackingBin binMeasures, CuboidPackingItem currentItem, ObservableDictionary<int, ThreeDimensionalPacking> itemPositions, ItemList<CuboidPackingItem> itemMeasures, bool rotated) {
353      //Starting-position at upper right corner (=left bottom point of item-rectangle is at position item.width,item.height)
354      ThreeDimensionalPacking currentPosition = new ThreeDimensionalPacking(0,
355        binMeasures.Width - (rotated ? currentItem.Depth : currentItem.Width),
356        binMeasures.Height - currentItem.Height,
357        binMeasures.Depth - (rotated ? currentItem.Width : currentItem.Depth), rotated);
358      //Slide the item as far as possible to the bottom
359      while (IsPositionFeasible(binMeasures, currentItem, MoveDown(currentPosition), itemPositions, itemMeasures)
360        || IsPositionFeasible(binMeasures, currentItem, MoveLeft(currentPosition), itemPositions, itemMeasures)
361        || IsPositionFeasible(binMeasures, currentItem, MoveBack(currentPosition), itemPositions, itemMeasures)) {
362        //Slide the item as far as possible to the left
363        while (IsPositionFeasible(binMeasures, currentItem, MoveLeft(currentPosition), itemPositions, itemMeasures)
364        || IsPositionFeasible(binMeasures, currentItem, MoveBack(currentPosition), itemPositions, itemMeasures)) {
365          //Slide the item as far as possible to the back
366          while (IsPositionFeasible(binMeasures, currentItem, MoveBack(currentPosition), itemPositions, itemMeasures)) {
367            currentPosition = MoveBack(currentPosition);
368          }
369          if (IsPositionFeasible(binMeasures, currentItem, MoveLeft(currentPosition), itemPositions, itemMeasures))
370            currentPosition = MoveLeft(currentPosition);
371        }
372        if (IsPositionFeasible(binMeasures, currentItem, MoveDown(currentPosition), itemPositions, itemMeasures))
373          currentPosition = MoveDown(currentPosition);
374      }
375
376      return IsPositionFeasible(binMeasures, currentItem, currentPosition, itemPositions, itemMeasures) ? currentPosition : null;
377    }
378    private static ThreeDimensionalPacking MoveLeft(ThreeDimensionalPacking original) {
379      return new ThreeDimensionalPacking(original.AssignedBin, original.X - 1, original.Y, original.Z, original.Rotated);
380    }
381    private static ThreeDimensionalPacking MoveDown(ThreeDimensionalPacking original) {
382      return new ThreeDimensionalPacking(original.AssignedBin, original.X, original.Y - 1, original.Z, original.Rotated);
383    }
384    private static ThreeDimensionalPacking MoveBack(ThreeDimensionalPacking original) {
385      return new ThreeDimensionalPacking(original.AssignedBin, original.X, original.Y, original.Z - 1, original.Rotated);
386    }
387 
388    private static ThreeDimensionalPacking FindExtremePointForItem(int itemIndex, ItemList<CuboidPackingItem> itemMeasures, CuboidPackingBin binMeasures,
389        HashSet<ThreeDimensionalPacking> extremePoints, int[, ,] occupiedPoints, ObservableDictionary<int, ThreeDimensionalPacking> itemPositions, bool stackingConstraints, bool rotated) {
390
391      var itemFromList = itemMeasures[itemIndex];
392      CuboidPackingItem item = new CuboidPackingItem(
393        rotated ? itemFromList.Depth : itemFromList.Width,
394        itemFromList.Height,
395        rotated ? itemFromList.Width : itemFromList.Depth,
396        itemFromList.TargetBin);
397
398      int epIndex = 0;
399      while (epIndex < extremePoints.Count &&
400        (!IsPositionFeasible(binMeasures, item, extremePoints.ElementAt(epIndex), occupiedPoints)
401        //(!DeepestBottomLeftFunctions.IsPositionFeasible(binMeasures, extremePoints.ElementAt(epIndex).AssignedBin, item, extremePoints.ElementAt(epIndex), itemPositions, itemMeasures) ||
402        //||(stackingConstraints && !ExtremePointsFunctions3D.IsStaticStable(occupiedPoints, item, extremePoints.ElementAt(epIndex)))
403        )){ epIndex++; }
404
405      if (epIndex < extremePoints.Count) {
406        var result = extremePoints.ElementAt(epIndex);
407        result.Rotated = rotated;
408        return result;
409      }
410      return null;
411    }
412    private static HashSet<ThreeDimensionalPacking> GenerateNewExtremePointsForNewItem(HashSet<ThreeDimensionalPacking> extremePoints, int[, ,] occupiedPoints,
413        CuboidPackingItem newItem, ThreeDimensionalPacking position, CuboidPackingBin binMeasures) {
414
415      int newWidth = position.Rotated ? newItem.Depth : newItem.Width;
416      int newDepth = position.Rotated ? newItem.Width : newItem.Depth;
417
418      //Find ExtremePoints beginning from sourcepointX
419      var sourcePointX = new ThreeDimensionalPacking(0, position.X + newWidth, position.Y, position.Z);
420      if (sourcePointX.X < binMeasures.Width && sourcePointX.Y < binMeasures.Height && sourcePointX.Z < binMeasures.Depth) {
421        //Traversing down the y-axis                                                                           
422        int currentYValue = sourcePointX.Y;
423        while (currentYValue > 0 && occupiedPoints[sourcePointX.X, currentYValue, sourcePointX.Z] == -1) {
424          currentYValue--;
425        }
426        extremePoints.Add(new ThreeDimensionalPacking(0, sourcePointX.X, currentYValue, sourcePointX.Z));
427
428        //Traversing down the z-axis
429        int currentZValue = sourcePointX.Z;
430        while (currentZValue > 0 && occupiedPoints[sourcePointX.X, sourcePointX.Y, currentZValue - 1] == -1) {
431          currentZValue--;
432        }
433        extremePoints.Add(new ThreeDimensionalPacking(0, sourcePointX.X, sourcePointX.Y, currentZValue));
434      }
435
436
437
438
439      //Find ExtremePoints beginning from sourcepointY
440      var sourcePointY = new ThreeDimensionalPacking(0, position.X, position.Y + newItem.Height, position.Z);
441      if (sourcePointY.X < binMeasures.Width && sourcePointY.Y < binMeasures.Height && sourcePointY.Z < binMeasures.Depth) {
442        //Traversing down the x-axis 
443        int currentXValue = sourcePointY.X;
444        while (currentXValue > 0 && occupiedPoints[currentXValue - 1, sourcePointY.Y, sourcePointY.Z] == -1) {
445          currentXValue--;
446        }
447        extremePoints.Add(new ThreeDimensionalPacking(0, currentXValue, sourcePointY.Y, sourcePointY.Z));
448
449        //Traversing down the z-axis
450        int currentZValue = sourcePointY.Z;
451        while (currentZValue > 0 && occupiedPoints[sourcePointY.X, sourcePointY.Y, currentZValue - 1] == -1) {
452          currentZValue--;
453        }
454        extremePoints.Add(new ThreeDimensionalPacking(0, sourcePointY.X, sourcePointY.Y, currentZValue));
455      }
456
457
458
459
460
461      //Find ExtremePoints beginning from sourcepointZ
462      var sourcePointZ = new ThreeDimensionalPacking(0, position.X, position.Y, position.Z + newDepth);
463      if (sourcePointZ.X < binMeasures.Width && sourcePointZ.Y < binMeasures.Height && sourcePointZ.Z < binMeasures.Depth) {
464        //Traversing down the x-axis 
465        int currentXValue = sourcePointZ.X;
466        while (currentXValue > 0 && occupiedPoints[currentXValue - 1, sourcePointZ.Y, sourcePointZ.Z] == -1) {
467          currentXValue--;
468        }
469        extremePoints.Add(new ThreeDimensionalPacking(0, currentXValue, sourcePointZ.Y, sourcePointZ.Z));
470
471        //Traversing down the y-axis                                                                           
472        int currentYValue = sourcePointZ.Y;
473        while (currentYValue > 0 && occupiedPoints[sourcePointZ.X, currentYValue, sourcePointZ.Z] == -1) {
474          currentYValue--;
475        }
476        extremePoints.Add(new ThreeDimensionalPacking(0, sourcePointZ.X, currentYValue, sourcePointZ.Z));
477      }
478
479
480      return extremePoints;
481    }
482    private static HashSet<ThreeDimensionalPacking> OrderExtremePoints(HashSet<ThreeDimensionalPacking> hashSet, int[, ,] occupiedPoints, CuboidPackingBin binMeasures) {
483      return new HashSet<ThreeDimensionalPacking>(hashSet.OrderBy(ep => ep.AssignedBin).ThenBy(ep => ep.Z).ThenBy(ep => ep.X).ThenBy(ep => ep.Y).ThenBy(ep => ShortestPossibleSideFromEP(ep, occupiedPoints, binMeasures)));
484    }
485    private static int ShortestPossibleSideFromEP(ThreeDimensionalPacking ep, int[, ,] occupiedPoints, CuboidPackingBin binMeasures) {
486      int shortestSide = int.MaxValue;
487
488      if (ep.X >= binMeasures.Width || ep.Y >= binMeasures.Height || ep.Z >= binMeasures.Depth)
489        return shortestSide;
490
491      int currentX = ep.X;
492      while (currentX < binMeasures.Width && occupiedPoints[currentX, ep.Y, ep.Z] == -1) { currentX++; }
493      if (currentX - ep.X < shortestSide)
494        shortestSide = currentX - ep.X;
495
496      int currentY = ep.Y;
497      while (currentY < binMeasures.Height && occupiedPoints[ep.X, currentY, ep.Z] == -1) { currentY++; }
498      if (currentY - ep.Y < shortestSide)
499        shortestSide = currentY - ep.Y;
500
501      int currentZ = ep.Z;
502      while (currentZ < binMeasures.Depth && occupiedPoints[ep.X, ep.Y, currentZ] == -1) { currentZ++; }
503      if (currentZ - ep.Z < shortestSide)
504        shortestSide = currentZ - ep.Z;
505
506      return shortestSide;
507    }
508    private static int[, ,] OccupyPointsForNewItem(int[, ,] occupiedPoints, CuboidPackingItem newItem, ThreeDimensionalPacking position, int itemIndex) {
509      int width = position.Rotated ? newItem.Depth : newItem.Width;
510      int depth = position.Rotated ? newItem.Width : newItem.Depth;
511      for (int w = position.X; w < position.X + width; w++) {
512        for (int h = position.Y; h < position.Y + newItem.Height; h++) {
513          for (int d = position.Z; d < position.Z + depth; d++) {
514            occupiedPoints[w, h, d] = itemIndex;
515          }
516        }
517      }
518      return occupiedPoints;
519    }
520    private static int[,,] GetOccupiedPoints(CuboidPackingBin binMeasures) {
521      var result = new int[binMeasures.Width, binMeasures.Height, binMeasures.Depth];
522      for (int w = 0; w < binMeasures.Width; w++) {
523        for (int h = 0; h < binMeasures.Height; h++) {
524          for (int d = 0; d < binMeasures.Depth; d++) {
525            result[w, h, d] = -1;
526          }
527        }
528      }
529      return result;
530    }
531    private static bool IsPositionFeasible(CuboidPackingBin binMeasures, CuboidPackingItem currentItem,
532      ThreeDimensionalPacking position, int[, ,] occupiedPoints) {
533      //In this case feasability is defined as following: 1. the item fits into the bin-borders; 2. the item does not collide with another already packed item
534      if (!binMeasures.Encloses(position, currentItem))
535        return false;
536
537      for (int w = position.X; w < position.X + currentItem.Width; w++) {
538        for (int h = position.Y; h < position.Y + currentItem.Height; h++) {
539          for (int d = position.Z; d < position.Z + currentItem.Depth; d++) {
540            if (occupiedPoints[w, h, d] != -1)
541              return false;
542          }
543        }
544      }
545
546      return true;
547    }
548    private static bool IsPositionFeasible(CuboidPackingBin binMeasures, CuboidPackingItem currentItem,
549      ThreeDimensionalPacking currentPosition, ObservableDictionary<int, ThreeDimensionalPacking> itemPositions, ItemList<CuboidPackingItem> itemMeasures) {
550      //In this case feasability is defined as following: 1. the item fits into the bin-borders; 2. the item does not collide with another already packed item
551      if (!binMeasures.Encloses(currentPosition, currentItem))
552        return false;
553
554      foreach (var ipEntry in itemPositions) {
555        if (itemMeasures[ipEntry.Key].Overlaps(ipEntry.Value, currentPosition, currentItem))
556          return false;
557      }
558
559      return true;
560    }
561                */
562   
563  }
564}
Note: See TracBrowser for help on using the repository browser.