Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Problem/RegularIdenticalBinPackingProblem.cs @ 9348

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

#1966: First working version of bin-packing problems.

File size: 12.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.Problems.BinPacking.Interfaces;
27using HeuristicLab.Problems.BinPacking.Shapes;
28using HeuristicLab.Optimization;
29using HeuristicLab.Core;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
31using HeuristicLab.Common;
32using HeuristicLab.Parameters;
33using HeuristicLab.Encodings.PermutationEncoding;
34using HeuristicLab.Problems.BinPacking.Evaluators;
35using HeuristicLab.Problems.BinPacking.Decoders;
36using HeuristicLab.PluginInfrastructure;
37using HeuristicLab.Data;
38using HeuristicLab.Problems.BinPacking.PackingPlans;
39using HeuristicLab.Problems.BinPacking.Analyzers;
40using HeuristicLab.Encodings.PackingEncoding.PackingSequence;
41using HeuristicLab.Encodings.PackingEncoding.Interfaces;
42using HeuristicLab.Encodings.PackingEncoding.GroupingVector;
43using HeuristicLab.Problems.Instances;
44
45namespace HeuristicLab.Problems.BinPacking.Problem {
46  [Item("RegularIdenticalBinPackingProblem", "Represents a bin-packing problem-instance using only bins with identical measures and bins/items with regular shapes (e.g. rectangle, cuboid).")]
47  [StorableClass]
48  public abstract class RegularIdenticalBinPackingProblem<D, B, I> : BinPackingProblem<D, B, I>, IProblemInstanceConsumer<BPPData>,  IProblemInstanceExporter<BPPData>
49    where D : class, IPackingDimensions
50    where B : PackingShape<D>, IPackingBin, IRegularPackingShape, new()
51    where I : PackingShape<D>, IPackingItem, IRegularPackingShape, new() {       
52
53    #region Parameter Properties
54    public ValueParameter<B> PackingBinMeasuresParameter {
55      get { return (ValueParameter<B>)Parameters["PackingBinMeasures"]; }
56    }
57    public OptionalValueParameter<IPackingSolutionDecoder> PackingSolutionDecoderParameter {
58      get { return (OptionalValueParameter<IPackingSolutionDecoder>)Parameters["PackingSolutionDecoder"]; }
59    }
60    #endregion
61
62    #region Properties
63    public B PackingBinMeasures {
64      get { return PackingBinMeasuresParameter.Value; }
65      set { PackingBinMeasuresParameter.Value = value; }
66    }
67    public IdenticalBinPackingSolutionDecoder<D,B,I, PackingPlan<D,B,I>> PackingSolutionDecoder {
68      get { return PackingSolutionDecoderParameter.Value as IdenticalBinPackingSolutionDecoder<D, B, I, PackingPlan<D, B, I>>; }
69      set { PackingSolutionDecoderParameter.Value = value; }
70    }
71    #endregion
72
73
74    [StorableConstructor]
75    protected RegularIdenticalBinPackingProblem(bool deserializing) : base(deserializing) { }
76    protected RegularIdenticalBinPackingProblem(RegularIdenticalBinPackingProblem<D,B,I> original, Cloner cloner)
77      : base(original, cloner) {
78      InitializeEventHandlers();
79    }
80
81    protected RegularIdenticalBinPackingProblem(IPackingPlanEvaluationAlgorithm e) : this(e, new GroupingVectorRandomCreator()) { }
82    protected RegularIdenticalBinPackingProblem(IPackingPlanEvaluationAlgorithm e, IPackingSolutionCreator c)
83      : base(e, c) {
84      Parameters.Add(new ValueParameter<B>("PackingBinMeasures", "Packing-bin data defining the measures of the used bins.", new B()));
85      Parameters.Add(new ValueParameter<IPackingPlanEvaluator>("PackingPlanEvaluator", "The evaluator is used to determine the quality of a solution.", CreateDefaultEvaluator()));
86      Parameters.Add(new OptionalValueParameter<IPackingSolutionDecoder>("PackingSolutionDecoder", "The operator that decodes the representation and creates a packing plan."));
87      this.Maximization.Value = true;
88      InitializeProblemInstance();
89      InitializeOperators();
90      InitializeEventHandlers();
91    }
92
93   
94
95
96    #region Helpers
97    protected override void InitializeProblemInstance() {
98      InitializeProblemData();
99      ApplyHorizontalOrientation();
100      SortItems();
101      PackingItemsParameter.Value.Value = PackingItemMeasures.Count;
102      LowerBoundParameter.Value.Value = CalculateLowerBound();
103    }
104    protected abstract void InitializeProblemData();
105    protected abstract IPackingPlanEvaluator CreateDefaultEvaluator();
106    private void ApplyHorizontalOrientation() {
107      PackingBinMeasures.ApplyHorizontalOrientation();
108      foreach (IRegularPackingShape shape in PackingItemMeasures) {
109        shape.ApplyHorizontalOrientation();
110      }
111    }
112    private void SortItems() {
113      PackingItemMeasures.Sort((x, y) => y.CompareTo(x));
114    }
115    private int CalculateLowerBound() {
116      //This is the obvious continuous lower bound calculation; Martello and Vigo proposed a better way but it has not been implemented yet;
117      int items = PackingItemMeasures.Select(x => x.MultipliedMeasures).Sum();
118      int bin = PackingBinMeasures.MultipliedMeasures;
119      return (items + bin - 1)/(bin);
120    }
121
122    protected override void InitializeOperators() {
123      Operators.Clear(); 
124      Operators.Add(new BestBinPackingSolutionAnalyzer<D, B, I>());
125
126      ApplyEncoding();
127      ParameterizeOperators();
128    }
129    private void ApplyEncoding() {
130      if (SolutionCreator.GetType() == typeof(PackingSequenceRandomCreator)) {
131        Operators.AddRange(ApplicationManager.Manager.GetInstances<IPackingSequenceOperator>());
132        InitializeDecoder();
133      } else if (SolutionCreator.GetType() == typeof(GroupingVectorRandomCreator)) {
134        Operators.AddRange(ApplicationManager.Manager.GetInstances<IGroupingVectorOperator>());
135        InitializeDecoder();
136      }
137    }
138    private void ParameterizeOperators() {   
139      foreach (var op in Operators.OfType<BestBinPackingSolutionAnalyzer<D, B, I>>()) {
140        op.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
141      }
142
143      Evaluator.PackingSolutionDecoderParameter.ActualName = PackingSolutionDecoderParameter.Name;
144      Evaluator.PackingSolutionDecoderParameter.Hidden = true;
145      Evaluator.PackingPlanEvaluatorParameter.ActualName = PackingPlanEvaluatorParameter.Name;
146      Evaluator.PackingPlanEvaluatorParameter.Hidden = true;
147      Evaluator.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
148      Evaluator.QualityParameter.Hidden = true;
149
150      if (PackingSolutionDecoder != null)
151        PackingSolutionDecoder.EncodedSolutionParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
152
153      if (PackingSolutionDecoder != null) {
154        PackingPlanEvaluator.PackingPlanParameter.ActualName = PackingSolutionDecoder.PackingPlanParameter.ActualName;
155        PackingPlanEvaluator.PackingPlanParameter.Hidden = true;
156      } else {
157        PackingPlanEvaluator.PackingPlanParameter.ActualName = PackingPlanEvaluator.PackingPlanParameter.Name;
158        PackingPlanEvaluator.PackingPlanParameter.Hidden = false;
159      }
160
161      foreach (var op in Operators.OfType<IPackingSolutionManipulator>()) {
162        op.EncodedSolutionParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
163        op.EncodedSolutionParameter.Hidden = true;
164      }
165
166      foreach (var op in Operators.OfType<IPackingSolutionCrossover>()) {
167        op.ChildParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
168        op.ChildParameter.Hidden = true;
169        op.ParentsParameter.ActualName = SolutionCreator.EncodedSolutionParameter.ActualName;
170        op.ParentsParameter.Hidden = true;
171      }
172
173      foreach (var op in Operators.OfType<BestBinPackingSolutionAnalyzer<D, B, I>>()) {
174        op.QualityParameter.ActualName = PackingPlanEvaluator.QualityParameter.ActualName;
175        if (PackingSolutionDecoder != null) {
176          op.PackingPlanParameter.ActualName = PackingSolutionDecoder.PackingPlanParameter.ActualName;
177          op.PackingPlanParameter.Hidden = true;
178        } else {
179          op.PackingPlanParameter.ActualName = op.PackingPlanParameter.Name;
180          op.PackingPlanParameter.Hidden = false;
181        }
182      }
183
184    }
185
186    protected override void InitializeEventHandlers() {
187      PackingPlanEvaluatorParameter.ValueChanged += PackingPlanEvaluatorParameter_ValueChanged;
188      PackingPlanEvaluator.QualityParameter.ActualNameChanged += PackingPlanEvaluator_QualityParameter_ActualNameChanged;
189      SolutionCreatorParameter.ValueChanged += SolutionCreatorParameter_ValueChanged;
190      SolutionCreator.EncodedSolutionParameter.ActualNameChanged += SolutionCreator_EncodedSolutionParameter_ActualNameChanged;
191      PackingSolutionDecoderParameter.ValueChanged += PackingSolutionDecoderParameter_ValueChanged;
192      if (PackingSolutionDecoder != null) PackingSolutionDecoder.PackingPlanParameter.ActualNameChanged += PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged;
193    }
194    #endregion
195
196    #region Events
197    protected override void OnSolutionCreatorChanged() {
198      InitializeOperators();
199    }
200    protected override void OnEvaluatorChanged() {
201      base.OnEvaluatorChanged();
202      ParameterizeOperators();
203    }
204    private void PackingPlanEvaluatorParameter_ValueChanged(object sender, EventArgs eventArgs) {
205      PackingPlanEvaluator.QualityParameter.ActualNameChanged += PackingPlanEvaluator_QualityParameter_ActualNameChanged;
206      ParameterizeOperators();
207    }
208    private void PackingPlanEvaluator_QualityParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
209      ParameterizeOperators();
210    }
211    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs eventArgs) {
212      SolutionCreator.EncodedSolutionParameter.ActualNameChanged += SolutionCreator_EncodedSolutionParameter_ActualNameChanged;
213      ParameterizeOperators();
214    }
215    private void SolutionCreator_EncodedSolutionParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
216      ParameterizeOperators();
217    }
218    private void PackingSolutionDecoderParameter_ValueChanged(object sender, EventArgs eventArgs) {
219      if (PackingSolutionDecoder != null) PackingSolutionDecoder.PackingPlanParameter.ActualNameChanged += PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged;
220      ParameterizeOperators();
221    }
222    private void PackingSolutionDecoder_PackingPlanParameter_ActualNameChanged(object sender, EventArgs eventArgs) {
223      ParameterizeOperators();
224    }
225    #endregion
226
227
228    #region Problem instance handling
229    public void Load(BPPData data) {
230      var binData = new B();
231      binData.InitializeFromMeasures (data.BinMeasures);
232
233      var itemData = new ItemList<I>(data.Items);
234      for (int j = 0; j < data.Items; j++) {
235        var item = new I();
236        item.InitializeFromMeasures(data.ItemMeasures[j]);
237        item.AddTargetBinMeasures(data.BinMeasures);
238        itemData.Add(item);
239      }
240
241      BestKnownQuality = data.BestKnownQuality.HasValue ? new DoubleValue(data.BestKnownQuality.Value) : null;
242                                                                   
243      PackingBinMeasures = binData;   
244      //PackingItemsParameter.Value.Value = data.Items;
245      PackingItemMeasures = itemData;
246
247      ApplyHorizontalOrientation();
248      SortItems();
249      PackingItemsParameter.Value.Value = PackingItemMeasures.Count;
250      LowerBoundParameter.Value.Value = CalculateLowerBound();
251    }           
252
253    public BPPData Export() {
254      var result = new BPPData{
255        Name = Name,
256        Description = Description,
257        Items = PackingItemsParameter.Value.Value,
258        BinMeasures = PackingBinMeasures.ToArray()
259      };
260
261      var itemMeasures = new int[result.Items][];
262      int i = 0;
263      foreach (var item in PackingItemMeasures) {
264        itemMeasures[i] = item.ToArray();
265        i++;
266      }
267      result.ItemMeasures = itemMeasures;
268      return result;
269    }
270    #endregion
271  }
272}
Note: See TracBrowser for help on using the repository browser.