Free cookie consent management tool by TermsFeed Policy Generator

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

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

#1966: Implemented new encoding (MultiComponentVector/MCV); Implemented move-operators for MCV and GV encodings; Implemented new decoding-methods for PS, GV and MCV encodings (ExtremePoint-based packing);

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