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
Private Sub FirstFit() '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, j, k 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) Dim bPlaced As Boolean = False 'Loops through each Bin to find the first available spot For j = 0 To BinNumber BinElement = Bins(j).GetUpperBound(0) 'Count the amount placed in this Bin BinCount = 0 For k = 0 To BinElement BinCount += Bins(j)(k) Next If BinCount + ElementsCopy(i) <= Me.BinHeight Then 'There's room for this Element ReDim Preserve Bins(j)(BinElement + 1) Bins(j)(BinElement) = ElementsCopy(i) bPlaced = True Exit For Else 'There's not room for this Element in this Bin End If Next 'There wasn't room for the Element in any existing Bin 'Create a new Bin If bPlaced = False Then 'Add another Bin ReDim Preserve Bins(BinNumber + 1) BinNumber += 1
'Initialize first element of new bin ReDim Bins(BinNumber)(1) BinElement = 0 Bins(BinNumber)(BinElement) = ElementsCopy(i) End If Next 'All Elements have been place, now we go back and remove unused Elements For i = 0 To BinNumber For j = 0 To Bins(i).GetUpperBound(0) If Bins(i)(j) = 0 Then ReDim Preserve Bins(i)(j - 1) End If Next Next GC.Collect() End Sub Private Sub WorstFit() '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 WorstBin, WorstBinAmount As Integer Dim i, j, k 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) WorstBin = -1 WorstBinAmount = Me.BinHeight + 1 For j = 0 To BinNumber BinElement = Bins(j).GetUpperBound(0) 'Count the amount placed in this Bin BinCount = 0
For k = 0 To BinElement BinCount += Bins(j)(k) Next 'Find the least full Bin that can hold this Element If WorstBinAmount > BinCount AndAlso BinCount + ElementsCopy(i) <= Me.BinHeight Then WorstBinAmount = BinCount WorstBin = j End If Next If WorstBin = -1 Then 'There wasn't room for the Element in any existing Bin 'Create a new Bin ReDim Preserve Bins(BinNumber + 1) BinNumber += 1 'Initialize first element of new bin ReDim Bins(BinNumber)(1) BinElement = 0 Bins(BinNumber)(BinElement) = ElementsCopy(i) Else 'There's room for this Element in an existing Bin 'Place Element in "Best Bin" BinElement = Bins(WorstBin).GetUpperBound(0) ReDim Preserve Bins(WorstBin)(BinElement + 1) Bins(WorstBin)(BinElement) = ElementsCopy(i) End If Next 'All Elements have been place, now we go back and remove unused Elements For i = 0 To BinNumber For j = 0 To Bins(i).GetUpperBound(0) If Bins(i)(j) = 0 Then ReDim Preserve Bins(i)(j - 1) End If Next Next GC.Collect() End Sub Private Sub BestFit() '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 BestBin, BestBinAmount As Integer
Dim i, j, k 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) BestBin = -1 BestBinAmount = -1 For j = 0 To BinNumber BinElement = Bins(j).GetUpperBound(0) 'Count the amount placed in this Bin BinCount = 0 For k = 0 To BinElement BinCount += Bins(j)(k) Next 'Find the most full Bin that can hold this Element If BestBinAmount < BinCount AndAlso BinCount + ElementsCopy(i) <= Me.BinHeight Then BestBinAmount = BinCount BestBin = j End If Next If BestBin = -1 Then 'There wasn't room for the Element in any existing Bin 'Create a new Bin ReDim Preserve Bins(BinNumber + 1) BinNumber += 1 'Initialize first element of new bin ReDim Bins(BinNumber)(1) BinElement = 0 Bins(BinNumber)(BinElement) = ElementsCopy(i) Else 'There's room for this Element in an existing Bin 'Place Element in "Best Bin" BinElement = Bins(BestBin).GetUpperBound(0) ReDim Preserve Bins(BestBin)(BinElement + 1) Bins(BestBin)(BinElement) = ElementsCopy(i) End If Next
'All Elements have been place, now we go back and remove unused Elements For i = 0 To BinNumber For j = 0 To Bins(i).GetUpperBound(0) If Bins(i)(j) = 0 Then ReDim Preserve Bins(i)(j - 1) End If Next Next GC.Collect() End Sub