#region License Information /* HeuristicLab * Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Linq; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using HeuristicLab.Core; using HeuristicLab.Problems.BinPacking.Dimensions; using HeuristicLab.Problems.BinPacking.PackingBin; using HeuristicLab.Problems.BinPacking.PackingItem; using HeuristicLab.Encodings.PackingEncoding.PackingPlan; using HeuristicLab.Common; using HeuristicLab.Collections; using HeuristicLab.Problems.BinPacking.Interfaces; using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector; namespace HeuristicLab.Problems.BinPacking.Decoders { [Item("ISO container decoder for the MultiComponentVector encoding.", "")] [StorableClass] public class ISOContainerMultiComponentVectorDecoder3D : PackingSolutionDecoder< ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem>, I3DMCVDecoder { public ISOContainerMultiComponentVectorDecoder3D () : base() { } [StorableConstructor] protected ISOContainerMultiComponentVectorDecoder3D (bool deserializing) : base(deserializing) { } protected ISOContainerMultiComponentVectorDecoder3D(ISOContainerMultiComponentVectorDecoder3D original, Cloner cloner) : base(original, cloner) { } public override IDeepCloneable Clone(Cloner cloner) { return new ISOContainerMultiComponentVectorDecoder3D(this, cloner); } public static PackingPlan Decode(MultiComponentVectorEncoding solution, CuboidPackingBin binMeasures, ItemList itemMeasures) { PackingPlan resultPlan = new PackingPlan3D(binMeasures); ObservableList result = new ObservableList(); var sequenceMatrix = solution.GenerateSequenceMatrix(); Dictionary rotated = solution.GenerateRotationArray(); //Fill bins according to grouping vector List remainingIDs = new List(); foreach (var sequence in sequenceMatrix) { remainingIDs = remainingIDs.Concat(sequence).ToList(); var bp = new BinPacking3D(binMeasures); bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated); if (remainingIDs.Count > 0) { bp.DoubleDepth(); bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated); } result.Add(bp); } result.RemoveAll(x => x.ItemPositions.Count == 0); result = new ObservableList(result.OrderByDescending(bp => bp.PackingDensity)); //Try to put remaining items in existing bins var temp = new List(remainingIDs); foreach (int id in temp) { foreach (var bp in result) { var position = bp.FindExtremePointForItem(itemMeasures[id], rotated[id], true); if (remainingIDs.Count > 0) { bp.DoubleDepth(); position = bp.FindExtremePointForItem(itemMeasures[id], rotated[id], true); } if (position != null) { bp.PackItem(id, itemMeasures[id], position); remainingIDs.Remove(id); } } } //Put still remaining items in new bins while (remainingIDs.Count > 0) { var bp = new BinPacking3D(binMeasures); bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated); if (remainingIDs.Count > 0) { bp.DoubleDepth(); bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated); } result.Add(bp); } result.RemoveAll(x => x.ItemPositions.Count == 0); resultPlan.BinPackings = new ObservableList>(result.OrderByDescending(bp => bp.PackingDensity)); return resultPlan; } public override PackingPlan CreatePackingPlanFromEncoding(IItem encodedSolution, CuboidPackingBin binMeasures, ItemList itemMeasures) { var solution = encodedSolution as MultiComponentVectorEncoding; if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponentVector"); return Decode(solution, binMeasures, itemMeasures); } } }