#region License Information
/* HeuristicLab
* Copyright (C) 2002-2015 Joseph Helm and Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using HeuristicLab.Core;
using HeuristicLab.Common;
using HeuristicLab.Encodings.PermutationEncoding;
using HeuristicLab.Encodings.PackingEncoding.PackingSequence;
using HeuristicLab.Problems.Instances;
using HeuristicLab.PluginInfrastructure;
using HeuristicLab.Data;
using HeuristicLab.Problems.BinPacking;
namespace HeuristicLab.Problems.BinPacking3D {
[Item("Bin Packing Problem (3D, identical cuboids) (BPP)", "Represents a three-dimensional bin-packing problem using only bins with identical measures and bins/items with cuboidic shapes.")]
[StorableClass]
[Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 310)]
public class Problem : Problem, IProblemInstanceConsumer, IProblemInstanceExporter {
#region Default Instance
private static readonly BPPData DefaultInstance = new BPPData() {
Name = "3D BPP Default Instance",
Description = "The default instance for 3D Bin Packing.",
BinShape = new PackingShape(25, 25, 35),
Items = new PackingItem[] {
new PackingItem(12,5,10, new PackingShape(25,25,35)),
new PackingItem(10,18,20, new PackingShape(25,25,35)),
new PackingItem(9,7,7, new PackingShape(25,25,35)),
new PackingItem(21,12,4, new PackingShape(25,25,35)),
new PackingItem(8,8,12, new PackingShape(25,25,35)),
new PackingItem(3,6,14, new PackingShape(25,25,35)),
new PackingItem(20,4,9, new PackingShape(25,25,35)),
new PackingItem(5,9,8, new PackingShape(25,25,35)),
new PackingItem(7,17,3, new PackingShape(25,25,35)),
new PackingItem(13,20,15, new PackingShape(25,25,35)),
new PackingItem(9,11,9, new PackingShape(25,25,35)),
new PackingItem(10,18,20, new PackingShape(25,25,35)),
new PackingItem(9,7,7, new PackingShape(25,25,35)),
new PackingItem(21,12,4, new PackingShape(25,25,35)),
new PackingItem(8,8,12, new PackingShape(25,25,35)),
new PackingItem(3,6,14, new PackingShape(25,25,35)),
new PackingItem(20,4,9, new PackingShape(25,25,35)),
new PackingItem(5,9,8, new PackingShape(25,25,35)),
new PackingItem(7,17,3, new PackingShape(25,25,35)),
new PackingItem(13,20,15, new PackingShape(25,25,35)),
new PackingItem(9,11,9, new PackingShape(25,25,35)),
new PackingItem(10,18,20, new PackingShape(25,25,35)),
new PackingItem(9,7,7, new PackingShape(25,25,35)),
new PackingItem(21,12,4, new PackingShape(25,25,35)),
new PackingItem(8,8,12, new PackingShape(25,25,35)),
new PackingItem(3,6,14, new PackingShape(25,25,35)),
new PackingItem(20,4,9, new PackingShape(25,25,35)),
new PackingItem(5,9,8, new PackingShape(25,25,35)),
new PackingItem(7,17,3, new PackingShape(25,25,35)),
new PackingItem(13,20,15, new PackingShape(25,25,35)),
new PackingItem(9,11, 9,new PackingShape(25,25,35)),
new PackingItem(10,18,20, new PackingShape(25,25,35)),
new PackingItem(9,7,7, new PackingShape(25,25,35)),
new PackingItem(21,12,4, new PackingShape(25,25,35)),
new PackingItem(8,8,12, new PackingShape(25,25,35)),
new PackingItem(3,6,14, new PackingShape(25,25,35)),
new PackingItem(20,4,9, new PackingShape(25,25,35)),
new PackingItem(5,9,8, new PackingShape(25,25,35)),
new PackingItem(7,17,3, new PackingShape(25,25,35)),
new PackingItem(13,20,15, new PackingShape(25,25,35)),
new PackingItem(9,11,9, new PackingShape(25,25,35))
},
};
#endregion
[StorableConstructor]
protected Problem(bool deserializing) : base(deserializing) { }
protected Problem(Problem original, Cloner cloner)
: base(original, cloner) {
}
public override IDeepCloneable Clone(Cloner cloner) {
return new Problem(this, cloner);
}
public Problem() : base(
new DecodingEvaluator()) {
}
public void Load(BPPData data) {
BestKnownQuality = data.BestKnownQuality.HasValue ? new DoubleValue(data.BestKnownQuality.Value) : null;
PackingBinMeasures = data.BinShape;
PackingItemMeasures = new ItemList(data.Items);
ApplyHorizontalOrientation();
SortItems();
PackingItemsParameter.Value.Value = PackingItemMeasures.Count;
LowerBoundParameter.Value.Value = CalculateLowerBound();
}
public BPPData Export() {
return new BPPData {
Name = Name,
Description = Description,
BinShape = PackingBinMeasures,
Items = PackingItemMeasures.ToArray()
};
}
#region Helpers
protected override void InitializeDecoder() {
// Operators.RemoveAll(op => op is I2DOperator); TODO
PackingSolutionDecoderParameter.ValidValues.Clear();
if (SolutionCreator is PackingSequenceRandomCreator) {
PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances());
} /* else if (SolutionCreator is GroupingVectorRandomCreator) {
PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances());
} else if (SolutionCreator is MultiComponentVectorRandomCreator) {
PackingSolutionDecoderParameter.ValidValues.UnionWith(ApplicationManager.Manager.GetInstances());
} */ else {
string error = "The given problem does not support the selected solution-creator.";
ErrorHandling.ShowErrorDialog(error, null);
}
}
protected override IEvaluator CreateDefaultEvaluator() {
return new PackingRatioEvaluator();
}
protected override void InitializeProblemData() {
Load(DefaultInstance);
}
protected override void RemoveTooBigItems() {
PackingItemMeasures.RemoveAll(pi =>
!PackingBinMeasures.Encloses(new PackingPosition(0, 0, 0, 0, false), pi) &&
!PackingBinMeasures.Encloses(new PackingPosition(0, 0, 0, 0, true), pi));
}
#endregion
}
}