Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/13/17 15:25:11 (7 years ago)
Author:
abeham
Message:

#2762: integrated bin packing extension into trunk

Location:
trunk/sources/HeuristicLab.Problems.BinPacking
Files:
6 edited
7 copied

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.BinPacking

  • trunk/sources/HeuristicLab.Problems.BinPacking/3.3/3D/BinPacking3D.cs

    r14916 r15230  
    2020#endregion
    2121
     22using System;
    2223using System.Collections.Generic;
    2324using System.Linq;
     
    3536      : base(binShape) {
    3637      ExtremePoints = new SortedSet<PackingPosition>();
    37       ExtremePoints.Add(binShape.Origin);
     38      ResidualSpace = new Dictionary<PackingPosition, Tuple<int,int,int>>();
     39      AddExtremePoint(binShape.Origin);
    3840      InitializeOccupationLayers();
    3941    }
     
    4345      : base(original, cloner) {
    4446      this.ExtremePoints = new SortedSet<PackingPosition>(original.ExtremePoints.Select(p => cloner.Clone(p)));
     47      this.ResidualSpace = new Dictionary<PackingPosition, Tuple<int, int, int>>();
     48      foreach (var o in original.ResidualSpace)
     49        this.ResidualSpace.Add(cloner.Clone(o.Key), Tuple.Create(o.Value.Item1, o.Value.Item2, o.Value.Item3));
    4550    }
    4651    public override IDeepCloneable Clone(Cloner cloner) {
     
    6065          current = PackingPosition.MoveDown(current);
    6166        }
    62         ExtremePoints.Add((PackingPosition)current.Clone());
     67        AddExtremePoint((PackingPosition)current.Clone());
    6368        while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current))) {
    6469          current = PackingPosition.MoveLeft(current);
    6570        }
    66         ExtremePoints.Add(current);
     71        AddExtremePoint(current);
    6772
    6873        //Traversing down the z-axis
     
    7176          current = PackingPosition.MoveBack(current);
    7277        }
    73         ExtremePoints.Add((PackingPosition)current.Clone());
    74         while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
    75           current = PackingPosition.MoveDown(current);
    76         }
    77         ExtremePoints.Add(current);
     78        AddExtremePoint((PackingPosition)current.Clone());
     79        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
     80          current = PackingPosition.MoveDown(current);
     81        }
     82        AddExtremePoint(current);
    7883      }
    7984
     
    8691          current = PackingPosition.MoveLeft(current);
    8792        }
    88         ExtremePoints.Add((PackingPosition)current.Clone());
    89         while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
    90           current = PackingPosition.MoveDown(current);
    91         }
    92         ExtremePoints.Add(current);
     93        AddExtremePoint((PackingPosition)current.Clone());
     94        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
     95          current = PackingPosition.MoveDown(current);
     96        }
     97        AddExtremePoint(current);
    9398
    9499        //Traversing down the z-axis
     
    97102          current = PackingPosition.MoveBack(current);
    98103        }
    99         ExtremePoints.Add((PackingPosition)current.Clone());
    100         while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
    101           current = PackingPosition.MoveDown(current);
    102         }
    103         ExtremePoints.Add(current);
     104        AddExtremePoint((PackingPosition)current.Clone());
     105        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
     106          current = PackingPosition.MoveDown(current);
     107        }
     108        AddExtremePoint(current);
    104109      }
    105110
     
    112117          current = PackingPosition.MoveLeft(current);
    113118        }
    114         ExtremePoints.Add((PackingPosition)current.Clone());
    115         while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
    116           current = PackingPosition.MoveDown(current);
    117         }
    118         ExtremePoints.Add(current);
     119        AddExtremePoint((PackingPosition)current.Clone());
     120        while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current))) {
     121          current = PackingPosition.MoveDown(current);
     122        }
     123        AddExtremePoint(current);
    119124
    120125        //Traversing down the y-axis
     
    123128          current = PackingPosition.MoveDown(current);
    124129        }
    125         ExtremePoints.Add((PackingPosition)current.Clone());
     130        AddExtremePoint((PackingPosition)current.Clone());
    126131        while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current))) {
    127132          current = PackingPosition.MoveLeft(current);
    128133        }
    129         ExtremePoints.Add(current);
     134        AddExtremePoint(current);
     135      }
     136    }
     137
     138    private void AddExtremePoint(PackingPosition current) {
     139      if (ExtremePoints.Add(current)) {
     140        var tuple = Tuple.Create(BinShape.Width - current.X, BinShape.Height - current.Y, BinShape.Depth - current.Z);
     141        ResidualSpace.Add(current, tuple);
    130142      }
    131143    }
    132144
    133145    public override PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints) {
    134 
    135146      PackingItem newItem = new PackingItem(
    136147        rotated ? item.Depth : item.Width,
     
    139150        item.TargetBin, item.Weight, item.Material);
    140151
    141       int epIndex = 0;
    142       while (epIndex < ExtremePoints.Count && (
    143         !IsPositionFeasible(newItem, ExtremePoints.ElementAt(epIndex))
    144         || !IsSupportedByAtLeastOnePoint(newItem, ExtremePoints.ElementAt(epIndex))
    145         || (stackingConstraints && !IsStaticStable(newItem, ExtremePoints.ElementAt(epIndex)))
    146         || (stackingConstraints && !IsWeightSupported(newItem, ExtremePoints.ElementAt(epIndex)))
    147       )) { epIndex++; }
    148 
    149       if (epIndex < ExtremePoints.Count) {
    150         var origPoint = ExtremePoints.ElementAt(epIndex);
    151         var result = new PackingPosition(origPoint.AssignedBin, origPoint.X, origPoint.Y, origPoint.Z, rotated);
     152      var ep = ExtremePoints.Where(x => IsPositionFeasible(newItem, x, stackingConstraints)).FirstOrDefault();
     153      if (ep != null) {
     154        var result = new PackingPosition(ep.AssignedBin, ep.X, ep.Y, ep.Z, rotated);
    152155        return result;
    153156      }
     
    155158    }
    156159
    157     public override PackingPosition FindPositionBySliding(PackingItem item, bool rotated) {
    158       //TODO: does not support stacking constraints yet
     160    public override bool IsPositionFeasible(PackingItem item, PackingPosition position, bool stackingConstraints) {
     161      var feasible = base.IsPositionFeasible(item, position, stackingConstraints);
     162      return feasible
     163        && IsSupportedByAtLeastOnePoint(item, position)
     164        && (!stackingConstraints || (IsStaticStable(item, position) && IsWeightSupported(item, position)));
     165    }
     166
     167    public override PackingPosition FindPositionBySliding(PackingItem item, bool rotated, bool stackingConstraints) {
    159168      //Starting-position at upper right corner (=left bottom point of item-rectangle is at position item.width,item.height)
    160169      PackingPosition currentPosition = new PackingPosition(0,
     
    163172        BinShape.Depth - (rotated ? item.Width : item.Depth), rotated);
    164173      //Slide the item as far as possible to the bottom
    165       while (IsPositionFeasible(item, PackingPosition.MoveDown(currentPosition))
    166         || IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition))
    167         || IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition))) {
     174      while (IsPositionFeasible(item, PackingPosition.MoveDown(currentPosition), stackingConstraints)
     175        || IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition), stackingConstraints)
     176        || IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition), stackingConstraints)) {
    168177        //Slide the item as far as possible to the left
    169         while (IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition))
    170       || IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition))) {
     178        while (IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition), stackingConstraints)
     179      || IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition), stackingConstraints)) {
    171180          //Slide the item as far as possible to the back
    172           while (IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition))) {
     181          while (IsPositionFeasible(item, PackingPosition.MoveBack(currentPosition), stackingConstraints)) {
    173182            currentPosition = PackingPosition.MoveBack(currentPosition);
    174183          }
    175           if (IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition)))
     184          if (IsPositionFeasible(item, PackingPosition.MoveLeft(currentPosition), stackingConstraints))
    176185            currentPosition = PackingPosition.MoveLeft(currentPosition);
    177186        }
    178         if (IsPositionFeasible(item, PackingPosition.MoveDown(currentPosition)))
     187        if (IsPositionFeasible(item, PackingPosition.MoveDown(currentPosition), stackingConstraints))
    179188          currentPosition = PackingPosition.MoveDown(currentPosition);
    180189      }
    181190
    182       return IsPositionFeasible(item, currentPosition) ? currentPosition : null;
    183     }
    184 
    185     public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items) {
     191      return IsPositionFeasible(item, currentPosition, stackingConstraints) ? currentPosition : null;
     192    }
     193
     194    public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, bool stackingConstraints) {
    186195      var temp = new List<int>(sequence);
    187196      for (int i = 0; i < temp.Count; i++) {
    188197        var item = items[temp[i]];
    189         var position = FindPositionBySliding(item, false);
     198        var position = FindPositionBySliding(item, false, stackingConstraints);
    190199        if (position != null) {
    191200          PackItem(temp[i], item, position);
     
    194203      }
    195204    }
    196     public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, Dictionary<int, bool> rotationArray) {
     205    public override void SlidingBasedPacking(ref IList<int> sequence, IList<PackingItem> items, Dictionary<int, bool> rotationArray, bool stackingConstraints) {
    197206      var temp = new List<int>(sequence);
    198207      for (int i = 0; i < temp.Count; i++) {
    199208        var item = items[temp[i]];
    200         var position = FindPositionBySliding(item, rotationArray[i]);
     209        var position = FindPositionBySliding(item, rotationArray[i], stackingConstraints);
    201210        if (position != null) {
    202211          PackItem(temp[i], item, position);
     
    212221        if (positionFound != null) {
    213222          PackItem(itemID, item, positionFound);
     223          if (!(positionFound.X == 0 && positionFound.Y == 0 && positionFound.Z == 0)) {
     224            UpdateResidualSpace(item, positionFound);
     225          }
    214226          sequence.Remove(itemID);
    215227        }
     
    227239      }
    228240    }
    229 
    230241    public override int ShortestPossibleSideFromPoint(PackingPosition position) {
    231242
     
    297308    }
    298309
    299 
    300310    protected override void InitializeOccupationLayers() {
    301311      for (int i = 0; i * 10 <= BinShape.Depth; i += 1) {
     
    320330      for (int i = z1; i <= z2; i++)
    321331        result.AddRange(OccupationLayers[i]);
    322 
    323332      return result;
    324333    }
     334   
     335    public void UpdateResidualSpace(PackingItem item, PackingPosition pos) {
     336      foreach (var ep in ExtremePoints) {
     337        if (ep.Z >= pos.Z && ep.Z <= pos.Z + item.Depth) {
     338          if (ep.X <= pos.X && ep.Y > pos.Y && ep.Y < pos.Y + item.Height) {
     339            var diff = pos.X - ep.X;
     340            var newRSX = ResidualSpace[ep].Item1 < diff ? ResidualSpace[ep].Item1 : diff;
     341            ResidualSpace[ep] = Tuple.Create(newRSX, ResidualSpace[ep].Item2, ResidualSpace[ep].Item3);
     342          }
     343          if (ep.Y <= pos.Y && ep.X > pos.X && ep.X < pos.X + item.Width) {
     344            var diff = pos.Y - ep.Y;
     345            var newRSY = ResidualSpace[ep].Item2 < diff ? ResidualSpace[ep].Item2 : diff;
     346            ResidualSpace[ep] = Tuple.Create(ResidualSpace[ep].Item1, newRSY, ResidualSpace[ep].Item3);
     347          }
     348        }
     349        if (ep.Z <= pos.Z &&
     350          ep.Y > pos.Y && ep.Y < pos.Y + item.Height &&
     351          ep.X > pos.X && ep.X < pos.X + item.Width) {
     352            var diff = pos.Z - ep.Z;
     353            var newRSZ = ResidualSpace[ep].Item3 < diff ? ResidualSpace[ep].Item3 : diff;
     354            ResidualSpace[ep] = Tuple.Create(ResidualSpace[ep].Item1, ResidualSpace[ep].Item2, newRSZ);
     355        }
     356      }
     357      return;
     358    }
    325359  }
    326 
    327360}
  • trunk/sources/HeuristicLab.Problems.BinPacking/3.3/3D/IntegerVectorEncoding/BottomLeftIntegerVectorDecoder.cs

    r14167 r15230  
    5454
    5555    protected override PackingPosition FindPositionForItem(BinPacking3D bp, PackingItem item, bool useStackingConstraints) {
    56       return bp.FindPositionBySliding(item, rotated: false);
     56      return bp.FindPositionBySliding(item, rotated: false, stackingConstraints: useStackingConstraints);
    5757    }
    5858
     
    6161      ref IList<int> remainingIDs, IList<PackingItem> items, bool useStackingConstraints) {
    6262      var bp = new BinPacking3D(partialSolution.BinShape);
    63       bp.SlidingBasedPacking(ref remainingIDs, items);
     63      bp.SlidingBasedPacking(ref remainingIDs, items, useStackingConstraints);
    6464      return bp;
    6565    }
  • trunk/sources/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/BottomLeftPermutationDecoder.cs

    r14167 r15230  
    4646      while (remainingIDs.Count > 0) {
    4747        var bp = new BinPacking3D(binShape);
    48         bp.SlidingBasedPacking(ref remainingIDs, items);
     48        bp.SlidingBasedPacking(ref remainingIDs, items, useStackingConstraints);
    4949        result.Bins.Add(bp);
    5050      }
  • trunk/sources/HeuristicLab.Problems.BinPacking/3.3/3D/PermutationEncoding/ExtremePointPermutationDecoder.cs

    r14167 r15230  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Core;
    2324using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    2526using System.Collections.Generic;
    2627using HeuristicLab.Encodings.PermutationEncoding;
     28using System.Linq;
     29
    2730
    2831namespace HeuristicLab.Problems.BinPacking3D {
    2932  [Item("Extreme-point Permutation Decoder (3d)", "Decodes the permutation and creates a packing solution candidate")]
    3033  [StorableClass]
    31   public class ExtremePointPermutationDecoder : Item, IDecoder<Permutation> {
     34  public class ExtremePointPermutationDecoder : ExtremePointPermutationDecoderBase {
    3235
    3336    [StorableConstructor]
     
    4144    }
    4245
    43     public Solution Decode(Permutation permutation, PackingShape binShape, IList<PackingItem> items, bool useStackingConstraints) {
     46    public override Solution Decode(Permutation permutation, PackingShape binShape, IList<PackingItem> items, bool useStackingConstraints) {
     47      return Apply(permutation, binShape, items, useStackingConstraints);
     48    }
     49
     50    public static Solution Apply(Permutation permutation, PackingShape binShape, IList<PackingItem> items, bool useStackingConstraints) {
    4451      Solution result = new Solution(binShape, useExtremePoints: true, stackingConstraints: useStackingConstraints);
    4552      IList<int> remainingIDs = new List<int>(permutation);
  • trunk/sources/HeuristicLab.Problems.BinPacking/3.3/3D/ProblemBase.cs

    r14162 r15230  
    175175    public override bool Maximization { get { return true; } }
    176176
    177 
    178177    public override double Evaluate(Individual individual, IRandom random) {
    179178      var encodedSolutionCand = (TSol)individual[EncodedSolutionName];
     
    237236      BinShape = data.BinShape;
    238237      var items = new ItemList<PackingItem>(data.Items);
    239       items.Sort((x, y) => y.CompareTo(x));
    240238      Items = items.AsReadOnly();
    241239
Note: See TracChangeset for help on using the changeset viewer.