Free cookie consent management tool by TermsFeed Policy Generator

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

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

#1966: Fixed some problems in MCV-move operators; Added parts of potvin-encoding implementation;

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