Changeset 9563 for branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/3D/EP/ISOContainerMultiComponentVectorDecoder3D.cs
- Timestamp:
- 06/02/13 04:26:26 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/3D/EP/ISOContainerMultiComponentVectorDecoder3D.cs
r9495 r9563 40 40 41 41 namespace HeuristicLab.Problems.BinPacking.Decoders { 42 [Item("I dentical bin, three dimensional, extreme points baseddecoder for the MultiComponentVector encoding.", "<Description missing...>")]42 [Item("ISO container decoder for the MultiComponentVector encoding.", "<Description missing...>")] 43 43 [StorableClass] 44 public class ISOContainerMultiComponentVectorDecoder3D : IdenticalBinPackingSolutionDecoder<44 public class ISOContainerMultiComponentVectorDecoder3D : PackingSolutionDecoder< 45 45 ThreeDimensionalPacking, 46 46 CuboidPackingBin, 47 CuboidPackingItem, 48 MultipleBinSizePackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem>> { 47 CuboidPackingItem>, I3DMCVDecoder { 49 48 50 49 public ISOContainerMultiComponentVectorDecoder3D () … … 60 59 } 61 60 62 public static MultipleBinSizePackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> Decode(MultiComponentVectorEncoding solution, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures) {61 public static PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> Decode(MultiComponentVectorEncoding solution, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures) { 63 62 64 MultipleBinSizePackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> result =65 new MultipleBinSizePackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem>(new ObservableDictionary<int, CuboidPackingBin>(), itemMeasures);63 PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> result = 64 new PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem>(new ObservableDictionary<int, CuboidPackingBin>(), itemMeasures); 66 65 67 66 #region Preperations 68 67 int nrOfBins = solution.NrOfBins; 69 70 //Get all indexes of items for every bin according to grouping-vector 68 71 69 Dictionary<int, List<PackingInformation>> unpackedItemIndexesPerBin = new Dictionary<int, List<PackingInformation>>(); 72 Dictionary<int, HashSet<ThreeDimensionalPacking>> extremePointsForBin = new Dictionary<int, HashSet<ThreeDimensionalPacking>>(); 70 Dictionary<int, HashSet<ThreeDimensionalPacking>> extremePointsForBin = new Dictionary<int, HashSet<ThreeDimensionalPacking>>(); 71 ObservableDictionary<int, CuboidPackingBin> resultingBinMeasures = new ObservableDictionary<int, CuboidPackingBin>(); 73 72 var occupiedPoints = new List<int[, ,]>(); 74 73 … … 79 78 extremePointsForBin[i].Add(new ThreeDimensionalPacking(i, 0, 0, 0, false)); 80 79 occupiedPoints = ExtremePointsFunctions3D.IncreaseBinCountForOccupiedPoints(occupiedPoints, binMeasures); 80 resultingBinMeasures[i] = new CuboidPackingBin(binMeasures.Width, binMeasures.Height, binMeasures.Depth); 81 81 } 82 82 … … 95 95 var item = itemMeasures[itemIndex]; 96 96 97 extremePointsForBin[binNr] = ExtremePointsFunctions3D.OrderExtremePoints(extremePointsForBin[binNr], occupiedPoints, binMeasures); 98 var positionFound = ExtremePointsFunctions3D.FindExtremePointForItem(itemIndex, itemMeasures, binMeasures, extremePointsForBin[binNr], occupiedPoints, itemPositions, unpackedItems[i].Rotated); 97 extremePointsForBin[binNr] = ExtremePointsFunctions3D.OrderExtremePoints(extremePointsForBin[binNr], occupiedPoints, resultingBinMeasures[binNr]); 98 var positionFound = ExtremePointsFunctions3D.FindExtremePointForItemUsingMaterialAndWeightConstraint(itemIndex, itemMeasures, resultingBinMeasures[binNr], extremePointsForBin[binNr], occupiedPoints, itemPositions, unpackedItems[i].Rotated); 99 100 if (positionFound == null && resultingBinMeasures[binNr].Depth.Equals(binMeasures.Depth)) { 101 occupiedPoints = DoubleDepthForBinNr(occupiedPoints, ref resultingBinMeasures, binNr); 102 positionFound = ExtremePointsFunctions3D.FindExtremePointForItemUsingMaterialAndWeightConstraint(itemIndex, itemMeasures, resultingBinMeasures[binNr], extremePointsForBin[binNr], occupiedPoints, itemPositions, unpackedItems[i].Rotated); 103 } 104 99 105 if (positionFound != null) { 100 106 extremePointsForBin[binNr].Remove(positionFound); 101 107 itemPositions[itemIndex] = positionFound; 102 108 occupiedPoints = ExtremePointsFunctions3D.OccupyPointsForNewItem(occupiedPoints, item, positionFound, itemIndex); 103 extremePointsForBin[binNr] = ExtremePointsFunctions3D.GenerateNewExtremePointsForNewItem(extremePointsForBin[binNr], occupiedPoints, item, positionFound, binMeasures);109 extremePointsForBin[binNr] = ExtremePointsFunctions3D.GenerateNewExtremePointsForNewItem(extremePointsForBin[binNr], occupiedPoints, item, positionFound, resultingBinMeasures[binNr]); 104 110 } else { 105 111 remainingItems.Add(unpackedItems[i]); 106 //solution.PackingInformations[binNr].Remove(unpackedItems[i]);112 solution.PackingInformations[binNr].Remove(unpackedItems[i]); 107 113 } 108 114 } … … 119 125 var item = itemMeasures[itemIndex]; 120 126 121 extremePointsForBin[binNr] = ExtremePointsFunctions3D.OrderExtremePoints(extremePointsForBin[binNr], occupiedPoints, binMeasures); 122 var positionFound = ExtremePointsFunctions3D.FindExtremePointForItem(itemIndex, itemMeasures, binMeasures, extremePointsForBin[binNr], occupiedPoints, itemPositions, unpackedItems[i].Rotated); 127 extremePointsForBin[binNr] = ExtremePointsFunctions3D.OrderExtremePoints(extremePointsForBin[binNr], occupiedPoints, resultingBinMeasures[binNr]); 128 var positionFound = ExtremePointsFunctions3D.FindExtremePointForItemUsingMaterialAndWeightConstraint(itemIndex, itemMeasures, resultingBinMeasures[binNr], extremePointsForBin[binNr], occupiedPoints, itemPositions, unpackedItems[i].Rotated); 129 130 131 if (positionFound == null && resultingBinMeasures[binNr].Depth.Equals(binMeasures.Depth)) { 132 occupiedPoints = DoubleDepthForBinNr(occupiedPoints, ref resultingBinMeasures, binNr); 133 positionFound = ExtremePointsFunctions3D.FindExtremePointForItemUsingMaterialAndWeightConstraint(itemIndex, itemMeasures, resultingBinMeasures[binNr], extremePointsForBin[binNr], occupiedPoints, itemPositions, unpackedItems[i].Rotated); 134 } 135 123 136 if (positionFound != null) { 124 137 extremePointsForBin[binNr].Remove(positionFound); 125 138 itemPositions[itemIndex] = positionFound; 126 139 occupiedPoints = ExtremePointsFunctions3D.OccupyPointsForNewItem(occupiedPoints, item, positionFound, itemIndex); 127 extremePointsForBin[binNr] = ExtremePointsFunctions3D.GenerateNewExtremePointsForNewItem(extremePointsForBin[binNr], occupiedPoints, item, positionFound, binMeasures);140 extremePointsForBin[binNr] = ExtremePointsFunctions3D.GenerateNewExtremePointsForNewItem(extremePointsForBin[binNr], occupiedPoints, item, positionFound, resultingBinMeasures[binNr]); 128 141 remainingItems.Remove(unpackedItems[i]); 129 //solution.PackingInformations[binNr].Add(unpackedItems[i]);142 solution.PackingInformations[binNr].Add(unpackedItems[i]); 130 143 } 131 144 } … … 134 147 extremePointsForBin[nrOfBins].Add(new ThreeDimensionalPacking(nrOfBins, 0, 0, 0, false)); 135 148 occupiedPoints = ExtremePointsFunctions3D.IncreaseBinCountForOccupiedPoints(occupiedPoints, binMeasures); 136 //solution.PackingInformations[nrOfBins] = new ItemList<PackingInformation>(); 149 resultingBinMeasures[nrOfBins] = new CuboidPackingBin(binMeasures.Width, binMeasures.Height, binMeasures.Depth); 150 solution.PackingInformations[nrOfBins] = new ItemList<PackingInformation>(); 137 151 nrOfBins++; 138 152 } 139 153 } 140 154 141 return itemPositions; 142 143 155 result.PackingItemPositions = itemPositions; 156 result.PackingBinMeasures = resultingBinMeasures; 144 157 return result; 145 158 } 146 159 147 protected override MultipleBinSizePackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> CreatePackingPlanFromEncoding(IPackingSolutionEncoding encodedSolution) { 160 private static List<int[, ,]> DoubleDepthForBinNr(List<int[, ,]> occupiedPoints, ref ObservableDictionary<int, CuboidPackingBin> binMeasures, int binNr) { 161 var oldDepth = binMeasures[binNr].Depth; 162 binMeasures[binNr].Depth = binMeasures[binNr].Depth * 2; 163 var newBinOccupation = new int[binMeasures[binNr].Width, binMeasures[binNr].Height, binMeasures[binNr].Depth]; 164 for (int w = 0; w < binMeasures[binNr].Width; w++) { 165 for (int h = 0; h < binMeasures[binNr].Height; h++) { 166 for (int d = 0; d < binMeasures[binNr].Depth; d++) { 167 if (d < oldDepth) 168 newBinOccupation[w, h, d] = occupiedPoints[binNr][w, h, d]; 169 else 170 newBinOccupation[w, h, d] = -1; 171 } 172 } 173 } 174 175 occupiedPoints[binNr] = newBinOccupation; 176 return occupiedPoints; 177 } 178 179 180 181 182 public override PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures) { 148 183 149 184 var solution = encodedSolution as MultiComponentVectorEncoding; 150 185 if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponentVector"); 151 186 152 return Decode(solution, PackingBinMeasuresParameter.ActualValue, PackingItemMeasuresParameter.ActualValue);187 return Decode(solution, binMeasures, itemMeasures); 153 188 } 154 189 }
Note: See TracChangeset
for help on using the changeset viewer.