Private Sub NextFit()
'Checks to make sure everything is initialized
If Elements Is Nothing Then Exit Sub
Dim ElementsCopy(Elements.GetUpperBound(0)) As Integer
ReDim Bins(0)
'Bin Number we are on, Bin Element we are on, Amount placed in the current Bin
Dim BinNumber, BinElement, BinCount As Integer
Dim i As Integer
'Make a copy of the array incase we need to sort it
DeepCopyArray(Elements, ElementsCopy)
'Sort in descending order if needed
If Me.Decreasing = True Then
Array.Sort(ElementsCopy)
Array.Reverse(ElementsCopy)
End If
'Declare the first element in the first Bin
ReDim Bins(0)(0)
'Loop through each Element and place in a Bin
For i = 0 To ElementsCopy.GetUpperBound(0)
'If True, move on to next Bin
If BinCount + ElementsCopy(i) > Me.BinHeight Then
'Remove extra, unused Element of this Bin
ReDim Preserve Bins(BinNumber)(BinElement - 1)
'Add another Bin
ReDim Preserve Bins(BinNumber + 1)
BinNumber += 1
'Initialize first element of new bin
ReDim Bins(BinNumber)(0)
BinElement = 0
BinCount = 0
End If
'Place task
Bins(BinNumber)(BinElement) = ElementsCopy(i)
'Keep track of how much is stored in this bin
BinCount += ElementsCopy(i)
'Add Element unless we are done
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.
Comments