Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/PackingPlans/PackingPlan.cs @ 13611

Last change on this file since 13611 was 13611, checked in by gkronber, 8 years ago

#1966: continue splitting into 2d and 3d implementations

File size: 9.3 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2015 Joseph Helm and 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 HeuristicLab.Problems.BinPacking.Interfaces;
26using HeuristicLab.Problems.BinPacking.Shapes;
27using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
28using HeuristicLab.Core;
29using HeuristicLab.Common;
30using HeuristicLab.Data;
31using HeuristicLab.Collections;
32using HeuristicLab.Encodings.PackingEncoding.MultiComponentVector;
33using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
34using HeuristicLab.Encodings.PackingEncoding.PackingSequence;
35using HeuristicLab.Encodings.IntegerVectorEncoding;
36
37namespace HeuristicLab.Encodings.PackingEncoding.PackingPlan {
38  [Item("PackingPlan", "Represents a concrete solution for a bin-packing problem.")]
39  [StorableClass]
40  public abstract class PackingPlan<D, B, I> :Item, IPackingPlan
41    where D : class, IPackingDimensions
42    where B : PackingShape<D>, IPackingBin
43    where I : PackingShape<D>, IPackingItem {
44
45    #region Properties
46    public int NrOfBins {
47      get {
48        if (BinPackings != null)
49          return BinPackings.Count;
50        else return 0;
51      }
52    }
53    [Storable]
54    protected bool StackingConstraints { get; set; }
55    [Storable]
56    protected bool UseExtremePoints { get; set; }
57
58    [Storable]
59    public B BinMeasures { get; private set; }
60
61    [Storable]
62    public ObservableList<BinPacking<D, B, I>> BinPackings { get; set; }
63
64    [Storable]
65    private DoubleValue quality;
66    public DoubleValue Quality {
67      get { return quality; }
68      set {
69        if (quality != value) {
70          if (quality != null) DeregisterQualityEvents();
71          quality = value;
72          if (quality != null) RegisterQualityEvents();
73          OnQualityChanged();
74        }
75      }
76    }
77    #endregion
78
79    protected PackingPlan(B binMeasures, bool useExtremePoints, bool stackingConstraints)
80      : base(){
81        BinMeasures = (B)binMeasures.Clone();
82        StackingConstraints = stackingConstraints;
83        UseExtremePoints = useExtremePoints;
84        BinPackings = new ObservableList<BinPacking<D, B, I>>();
85    }
86
87    [StorableConstructor]
88    protected PackingPlan(bool deserializing) : base(deserializing) { }
89    protected PackingPlan(PackingPlan<D,B,I> original, Cloner cloner)
90      : base(original, cloner) {
91        this.BinPackings = new ObservableList<BinPacking<D, B, I>>(original.BinPackings);
92    }
93   
94
95    public abstract BinPacking<D, B, I> NewBinPacking();
96    public void UpdateBinPackings() {
97      BinPackings.RemoveAll(x => x.ItemPositions.Count == 0);
98      BinPackings = new ObservableList<BinPacking<D, B, I>>(BinPackings.OrderByDescending (bp => bp.PackingDensity));
99    }
100
101    public void Pack(MultiComponentVectorEncoding solution, ItemList<I> itemMeasures) {
102      var sequenceMatrix = solution.GenerateSequenceMatrix();
103      Dictionary<int, bool> rotated = solution.GenerateRotationArray();
104
105      //Fill bins according to grouping vector
106      List<int> remainingIDs = new List<int>();
107      foreach (var sequence in sequenceMatrix) {
108        remainingIDs = remainingIDs.Concat(sequence).ToList();
109        var bp = NewBinPacking();
110        if (!UseExtremePoints)
111          bp.SlidingBasedPacking(ref remainingIDs, itemMeasures, rotated);
112        else
113          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, StackingConstraints, rotated);
114        BinPackings.Add(bp);
115      }
116      UpdateBinPackings();
117
118      //Try to put remaining items in existing bins
119      var temp = new List<int>(remainingIDs);
120      foreach (int id in temp) {
121        foreach (var bp in BinPackings) {
122          var position = UseExtremePoints ? bp.FindExtremePointForItem(itemMeasures[id], rotated[id], StackingConstraints) : bp.FindPositionBySliding(itemMeasures[id], rotated[id]);
123          if (position != null) {
124            bp.PackItem(id, itemMeasures[id], position);
125            remainingIDs.Remove(id);
126            break;
127          }
128        }
129      }
130
131      //Put still remaining items in new bins
132      while (remainingIDs.Count > 0) {
133        var bp = NewBinPacking();
134        if (!UseExtremePoints)
135          bp.SlidingBasedPacking(ref remainingIDs, itemMeasures, rotated);
136        else
137          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, StackingConstraints, rotated);
138        BinPackings.Add(bp);
139      }
140      UpdateBinPackings();
141
142      var newSolution = new ObservableDictionary<int,ItemList<PackingInformation>> ();
143      foreach (var bp in BinPackings) {
144        int binIndex = newSolution.Count;
145        newSolution[binIndex] = new ItemList<PackingInformation>();
146        foreach (var entry in bp.ItemPositions)
147          newSolution[binIndex].Add(new PackingInformation (entry.Key, entry.Value.Rotated));
148      }
149      solution.PackingInformations = newSolution;
150    }
151    public void Pack(GroupingVectorEncoding solution, ItemList<I> itemMeasures) {
152      var sequenceMatrix = solution.GenerateSequenceMatrix();
153
154      //Fill bins according to grouping vector
155      List<int> remainingIDs = new List<int>();
156      foreach (var sequence in sequenceMatrix) {
157        remainingIDs = remainingIDs.Concat(sequence).ToList();
158        var bp = NewBinPacking();
159        if (!UseExtremePoints)
160          bp.SlidingBasedPacking(ref remainingIDs, itemMeasures);
161        else
162          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, StackingConstraints);
163        BinPackings.Add(bp);
164      }
165      UpdateBinPackings();
166
167      //Try to put remaining items in existing bins
168      var temp = new List<int>(remainingIDs);
169      foreach (int id in temp) {
170        foreach (var bp in BinPackings) { 
171          var position = UseExtremePoints ? bp.FindExtremePointForItem (itemMeasures[id], false, StackingConstraints) : bp.FindPositionBySliding(itemMeasures[id], false);
172          if (position != null) {
173            bp.PackItem(id, itemMeasures[id], position);
174            remainingIDs.Remove(id);
175            break;
176          }
177        }
178      }
179
180      //Put still remaining items in new bins
181      while (remainingIDs.Count > 0) {
182        var bp = NewBinPacking();
183        if (!UseExtremePoints)
184          bp.SlidingBasedPacking(ref remainingIDs, itemMeasures);
185        else
186          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, StackingConstraints);
187        BinPackings.Add(bp);
188      }
189      UpdateBinPackings();
190
191      var newSolution = new int[solution.GroupingVector.Length];
192      int binIndex = 0;
193      foreach (var bp in BinPackings) {
194        foreach (var entry in bp.ItemPositions)
195          newSolution[entry.Key] = binIndex;
196        binIndex++;
197      }
198      solution.GroupingVector = new IntegerVector (newSolution);
199    }
200    public void Pack(PackingSequenceEncoding solution, ItemList<I> itemMeasures) {
201      List<int> remainingIDs = new List<int>(solution.PackingSequence);
202      while (remainingIDs.Count > 0) {
203        var bp = NewBinPacking();
204        if (!UseExtremePoints)
205          bp.SlidingBasedPacking(ref remainingIDs, itemMeasures);
206        else
207          bp.ExtremePointBasedPacking(ref remainingIDs, itemMeasures, StackingConstraints);
208        BinPackings.Add(bp);
209      }
210      UpdateBinPackings();
211    }
212
213
214    #region Events
215    public event EventHandler QualityChanged;
216    private void OnQualityChanged() {
217      var changed = QualityChanged;
218      if (changed != null)
219        changed(this, EventArgs.Empty);
220    }
221    private void RegisterQualityEvents() {
222      Quality.ValueChanged += new EventHandler(Quality_ValueChanged);
223    }
224    private void DeregisterQualityEvents() {
225      Quality.ValueChanged -= new EventHandler(Quality_ValueChanged);
226    }
227    private void Quality_ValueChanged(object sender, EventArgs e) {
228      OnQualityChanged();
229    }
230
231    public event EventHandler BinPackingsChanged;
232    private void OnBinPackingsChanged() {
233      var changed = BinPackingsChanged;
234      if (changed != null)
235        changed(this, EventArgs.Empty);
236    }
237    private void RegisterBinPackingsEvents() {
238      BinPackings.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(BinPackings_PropertyChanged);
239    }
240    private void DeregisterBinPackingsEvents() {
241      BinPackings.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(BinPackings_PropertyChanged);
242    }
243    private void BinPackings_PropertyChanged(object sender, EventArgs e) {
244      OnBinPackingsChanged();
245    }
246    #endregion
247  }
248}
Note: See TracBrowser for help on using the repository browser.