Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Decoders/3D/EP/ISOContainerMultiComponentVectorDecoder3D.cs @ 9596

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

#1966: More refactoring; Added more sophisticated structures for packing-plan and bin-packing representation; Transferred parts of the decoding-algorithms to these structures; Did some more refactoring and cleanup;

File size: 5.4 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.Text;
26using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
27using HeuristicLab.Core;
28using HeuristicLab.Problems.BinPacking.Dimensions;
29using HeuristicLab.Problems.BinPacking.PackingBin;
30using HeuristicLab.Problems.BinPacking.PackingItem;
31using HeuristicLab.Encodings.PackingEncoding.PackingPlan;
32using HeuristicLab.Encodings.PermutationEncoding;
33using HeuristicLab.Common;
34using HeuristicLab.Data;
35using HeuristicLab.Collections;
36using HeuristicLab.Encodings.PackingEncoding.PackingSequence;
37using HeuristicLab.Problems.BinPacking.Interfaces;
38using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
39using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
40
41namespace HeuristicLab.Problems.BinPacking.Decoders {
42  [Item("ISO container decoder for the MultiComponentVector encoding.", "<Description missing...>")]
43  [StorableClass]
44  public class ISOContainerMultiComponentVectorDecoder3D : PackingSolutionDecoder<
45      ThreeDimensionalPacking,
46      CuboidPackingBin,
47      CuboidPackingItem>, I3DMCVDecoder {
48
49    public ISOContainerMultiComponentVectorDecoder3D ()
50      : base() {
51    }
52    [StorableConstructor]
53    protected ISOContainerMultiComponentVectorDecoder3D (bool deserializing) : base(deserializing) { }
54    protected ISOContainerMultiComponentVectorDecoder3D(ISOContainerMultiComponentVectorDecoder3D original, Cloner cloner)
55      : base(original, cloner) {
56    }
57    public override IDeepCloneable Clone(Cloner cloner) {
58      return new ISOContainerMultiComponentVectorDecoder3D(this, cloner);
59    }
60
61    public static PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> Decode(MultiComponentVectorEncoding solution, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures) {
62      PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> resultPlan = new PackingPlan3D(binMeasures);
63      ObservableList<BinPacking3D> result = new ObservableList<BinPacking3D>();
64
65      var sequenceMatrix = solution.GenerateSequenceMatrix();
66      Dictionary<int, bool> rotated = solution.GenerateRotationArray();
67
68      //Fill bins according to grouping vector
69      List<int> remainingIDs = new List<int>();
70      foreach (var sequence in sequenceMatrix) {
71        remainingIDs = remainingIDs.Concat(sequence).ToList();
72        var bp = new BinPacking3D(binMeasures);
73        bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated);
74        if (remainingIDs.Count > 0) {
75          bp.DoubleDepth();
76          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated);
77        }
78        result.Add(bp);
79      }
80      result.RemoveAll(x => x.ItemPositions.Count == 0);
81      result = new ObservableList<BinPacking3D>(result.OrderByDescending(bp => bp.PackingDensity));
82
83      //Try to put remaining items in existing bins
84      var temp = new List<int>(remainingIDs);
85      foreach (int id in temp) {
86        foreach (var bp in result) {
87          var position = bp.FindExtremePointForItem(itemMeasures[id], rotated[id], true);
88          if (remainingIDs.Count > 0) {
89            bp.DoubleDepth();
90            position = bp.FindExtremePointForItem(itemMeasures[id], rotated[id], true);
91          }
92          if (position != null) {
93            bp.PackItem(id, itemMeasures[id], position);
94            remainingIDs.Remove(id);
95          }
96        }
97      }
98
99      //Put still remaining items in new bins
100      while (remainingIDs.Count > 0) {
101        var bp = new BinPacking3D(binMeasures);
102        bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated);
103        if (remainingIDs.Count > 0) {
104          bp.DoubleDepth();
105          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, true, rotated);
106        }
107        result.Add(bp);
108      }
109      result.RemoveAll(x => x.ItemPositions.Count == 0);
110      resultPlan.BinPackings = new ObservableList<BinPacking<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem>>(result.OrderByDescending(bp => bp.PackingDensity));
111      return resultPlan;
112    }
113
114
115    public override PackingPlan<ThreeDimensionalPacking, CuboidPackingBin, CuboidPackingItem> CreatePackingPlanFromEncoding(IItem encodedSolution, CuboidPackingBin binMeasures, ItemList<CuboidPackingItem> itemMeasures) {
116      var solution = encodedSolution as MultiComponentVectorEncoding;
117      if (solution == null) throw new InvalidOperationException("Encoding is not of type MultiComponentVector");
118      return Decode(solution, binMeasures, itemMeasures);
119    }
120  }
121}
Note: See TracBrowser for help on using the repository browser.