Next Fit Algorithm
The basic algorithm is termed the
Next Fit Algorithm.
This algorithm starts at the beginning of the Elements array and steps
through each one. Once Bin 1 is full, it moves on and starts
placing elements into Bin 2, never looking back to see if an Element in
the future may fit inside Bin 1. This process continues until
there are no more Elements. This is least efficient of the
algorithms but it does have a practical benefit. Think of a
conveyor belt placing items in boxes to be shipped to a single customer. You wouldn't
want to have to reverse the conveyor belt to go back to a partially
empty box to fit in an item that the customer ordered.
Private Sub NextFit()
If Elements Is Nothing Then Exit Sub
Dim ElementsCopy(Elements.GetUpperBound(0)) As Integer
ReDim Bins(0)
Dim BinNumber, BinElement, BinCount As Integer
Dim i As Integer
DeepCopyArray(Elements, ElementsCopy)
If Me.Decreasing = True Then
Array.Sort(ElementsCopy)
Array.Reverse(ElementsCopy)
End If
ReDim Bins(0)(0)
For i = 0 To ElementsCopy.GetUpperBound(0)
If BinCount + ElementsCopy(i) > Me.BinHeight Then
ReDim Preserve Bins(BinNumber)(BinElement - 1)
ReDim Preserve Bins(BinNumber + 1)
BinNumber += 1
ReDim Bins(BinNumber)(0)
BinElement = 0
BinCount = 0
End If
Bins(BinNumber)(BinElement) = ElementsCopy(i)
BinCount += ElementsCopy(i)
If i < ElementsCopy.GetUpperBound(0) Then
ReDim Preserve Bins(BinNumber)(BinElement + 1)
BinElement += 1
End If
Next
GC.Collect()
End Sub
After looking at the code you may be worried about the amount of ReDim
Preserve statements. A better solution would be to make each Bin
Array (the array that holds the Elements) as big as the Bin Height right at the declaration and
then just chop of the unused (0) elements after the algorithm is
done. An ArrayList could also be used as an alternative.
When the code above executes you will have in your array
this structure (using BinHeight = 80, Elements = {26 57 18 8 45 16 22 29 5 11 8
27 54 13 17 21 63 14 16 45 6 32 57 24 18 27 54 35 12 43 36 72 14 28 3
11 46 27 42 59 26 41 15 41 68}):
How
to read this graph: Bin Numbers along the bottom, Bin
Height/Amount along the left side, Actual Fill Amount along the top,
Individual Element Amount inside of bars.