Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/13/17 09:47:49 (6 years ago)
Author:
rhanghof
Message:

#2817:

  • Changed the calculation algorithm for creating extreme points by using line based projection
  • Changed the calculation of the residual spaces for line based projection
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2817-BinPackingSpeedup/HeuristicLab.Problems.BinPacking/3.3/3D/ExtremePointCreation/ExtremePointCreator.cs

    r15488 r15520  
    11using HeuristicLab.Common;
    22using HeuristicLab.Problems.BinPacking3D.Geometry;
     3using HeuristicLab.Problems.BinPacking3D.ResidualSpaceCalculation;
    34using System;
    45using System.Collections.Generic;
     
    1112
    1213
    13     public abstract void UpdateExtremePoints(BinPacking3D binPacking, PackingItem item, PackingPosition position);
    14 
    15     public abstract void UpdateResidualSpace(BinPacking3D binPacking, PackingItem item, PackingPosition position);
     14    public void UpdateBinPacking(BinPacking3D binPacking, PackingItem item, PackingPosition position) {
     15      UpdateExtremePoints(binPacking, item, position);
     16      UpdateResidualSpace(binPacking, item, position);
     17    }
     18
     19    protected abstract void UpdateExtremePoints(BinPacking3D binPacking, PackingItem item, PackingPosition position);
     20
     21    /// <summary>
     22    /// Updates the residual space for a given bin packing
     23    /// </summary>
     24    /// <param name="binPacking"></param>
     25    /// <param name="item"></param>
     26    /// <param name="position"></param>
     27    protected abstract void UpdateResidualSpace(BinPacking3D binPacking, PackingItem item, PackingPosition position);
    1628    protected abstract bool AddExtremePoint(BinPacking3D binPacking, PackingPosition position);
    1729
     
    2335    /// <param name="newItem"></param>
    2436    /// <param name="position"></param>
    25     protected virtual void GenerateNewExtremePointsForNewItem(BinPacking3D binPacking, PackingItem newItem, PackingPosition position) {
     37    protected virtual void GenerateNewExtremePointsForItem(BinPacking3D binPacking, PackingItem newItem, PackingPosition position) {
    2638      int newWidth = position.Rotated ? newItem.Depth : newItem.Width;
    2739      int newDepth = position.Rotated ? newItem.Width : newItem.Depth;
     
    3547        var below = ProjectDown(binPacking, sourcePoint);
    3648        var residualSpace = CalculateResidualSpace(binPacking, below);
    37         if (IsNonZero(residualSpace)
     49        if (!residualSpace.IsZero()
    3850          && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, below, residualSpace)) {
    3951          // add only if the projected point's residual space is not a sub-space
     
    4557        var back = ProjectBackward(binPacking, sourcePoint);
    4658        residualSpace = CalculateResidualSpace(binPacking, back);
    47         if (IsNonZero(residualSpace)
     59        if (!residualSpace.IsZero()
    4860          && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, back, residualSpace)) {
    4961          // add only if the projected point's residual space is not a sub-space
     
    6072        var left = ProjectLeft(binPacking, sourcePoint);
    6173        var residualSpace = CalculateResidualSpace(binPacking, left);
    62         if (IsNonZero(residualSpace)
     74        if (!residualSpace.IsZero()
    6375          && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, left, residualSpace)) {
    6476          // add only if the projected point's residual space is not a sub-space
     
    7082        var back = ProjectBackward(binPacking, sourcePoint);
    7183        residualSpace = CalculateResidualSpace(binPacking, back);
    72         if (IsNonZero(residualSpace)
     84        if (!residualSpace.IsZero()
    7385          && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, back, residualSpace)) {
    7486          // add only if the projected point's residual space is not a sub-space
     
    8597        var below = ProjectDown(binPacking, sourcePoint);
    8698        var residualSpace = CalculateResidualSpace(binPacking, below);
    87         if (IsNonZero(residualSpace)
     99        if (!residualSpace.IsZero()
    88100          && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, below, residualSpace)) {
    89101          // add only if the projected point's residual space is not a sub-space
     
    95107        var left = ProjectLeft(binPacking, sourcePoint);
    96108        residualSpace = CalculateResidualSpace(binPacking, left);
    97         if (IsNonZero(residualSpace)
     109        if (!residualSpace.IsZero()
    98110          && !IsWithinResidualSpaceOfAnotherExtremePoint(binPacking, left, residualSpace)) {
    99111          // add only if the projected point's residual space is not a sub-space
     
    171183    #region Residual space
    172184
    173 
    174 
    175     protected virtual bool IsNonZero(Tuple<int, int, int> space) {
    176       return space.Item1 > 0 && space.Item2 > 0 && space.Item3 > 0;
    177     }
    178185
    179186    /// <summary>
     
    184191    /// <param name="residualSpace"></param>
    185192    /// <returns></returns>
    186     protected virtual bool IsWithinResidualSpaceOfAnotherExtremePoint(BinPacking3D binPacking, Vector3D pos, Tuple<int, int, int> residualSpace) {
    187       var eps = binPacking.ExtremePoints.Where(x => !pos.Equals(x) && pos.IsInside(x, binPacking.ResidualSpace[x]));
    188       return eps.Any(x => IsWithinResidualSpaceOfAnotherExtremePoint(pos, residualSpace, x, binPacking.ResidualSpace[x]));
    189     }
    190 
    191     /// <summary>
    192     ///
     193    protected virtual bool IsWithinResidualSpaceOfAnotherExtremePoint(BinPacking3D binPacking, Vector3D pos, ResidualSpace residualSpace) {
     194      var eps = binPacking.ExtremePoints.Where(x => !pos.Equals(x) && pos.IsInside(x, binPacking.ResidualSpaces[x]));
     195      return eps.Any(x => IsWithinResidualSpaceOfAnotherExtremePoint(pos, residualSpace, x, binPacking.ResidualSpaces[x]));
     196    }
     197
     198    /// <summary>
     199    /// Returns true, if the given poisition and the related residual space is within the residual space of the given extreme point
    193200    /// </summary>
    194201    /// <param name="pos"></param>
     
    197204    /// <param name="rsEp"></param>
    198205    /// <returns></returns>
    199     protected virtual bool IsWithinResidualSpaceOfAnotherExtremePoint(Vector3D pos, Tuple<int, int, int> rsPos, PackingPosition ep, Tuple<int, int, int> rsEp) {
    200       return rsEp.Item1 >= pos.X - ep.X + rsPos.Item1
    201           && rsEp.Item2 >= pos.Y - ep.Y + rsPos.Item2
    202           && rsEp.Item3 >= pos.Z - ep.Z + rsPos.Item3;
     206    protected virtual bool IsWithinResidualSpaceOfAnotherExtremePoint(Vector3D pos, ResidualSpace rsPos, PackingPosition ep, ResidualSpace rsEp) {
     207      return rsEp.Width >= pos.X - ep.X + rsPos.Width
     208          && rsEp.Height >= pos.Y - ep.Y + rsPos.Height
     209          && rsEp.Depth >= pos.Z - ep.Z + rsPos.Depth;
    203210    }
    204211
     
    210217    /// <param name="pos"></param>
    211218    /// <returns>A Tuple(width, Height, Depth)</width></returns>
    212     protected Tuple<int, int, int> CalculateResidualSpace(BinPacking3D binPacking, Vector3D pos) {
     219    protected virtual ResidualSpace CalculateResidualSpace(BinPacking3D binPacking, Vector3D pos) {
     220      //return ResidualSpaceCalculator.Create().CalculateResidualSpace(binPacking, pos).First();
     221      return new ResidualSpace(CalculateResidualSpaceOld(binPacking, pos));
     222    }
     223
     224    protected virtual Tuple<int, int, int> CalculateResidualSpaceOld(BinPacking3D binPacking, Vector3D pos) {
     225
    213226      if (pos == null) {
    214227        return Tuple.Create(0, 0, 0);
Note: See TracChangeset for help on using the changeset viewer.