AI的答案,仅供参考
Function MaxBoxCountWithSize(containerLength As Integer, containerWidth As Integer, _
itemLength, itemWidth, _
ByRef maxLength As Long, ByRef maxWidth As Long) As Long
' 初始化最大数量和占用尺寸
Dim maxCount As Integer
maxCount = 0
maxLength = 0
maxWidth = 0
' 方案1:货物不旋转
Dim count1 As Integer
Dim layout1Length As Integer, layout1Width As Integer
count1 = (containerLength \ itemLength) * (containerWidth \ itemWidth)
layout1Length = (containerLength \ itemLength) * itemLength
layout1Width = (containerWidth \ itemWidth) * itemWidth
' 方案2:货物旋转
Dim count2 As Integer
Dim layout2Length As Integer, layout2Width As Integer
count2 = (containerLength \ itemWidth) * (containerWidth \ itemLength)
layout2Length = (containerLength \ itemWidth) * itemWidth
layout2Width = (containerWidth \ itemLength) * itemLength
' 比较两种基本方案
If count1 > maxCount Then
maxCount = count1
maxLength = layout1Length
maxWidth = layout1Width
End If
If count2 > maxCount Then
maxCount = count2
maxLength = layout2Length
maxWidth = layout2Width
End If
' 方案3:水平分割混合摆放
Dim h As Integer
Dim stepSize As Integer
stepSize = Application.WorksheetFunction.Gcd(itemWidth, itemLength)
If stepSize = 0 Then stepSize = 1 ' 避免除零错误
For h = 0 To containerWidth Step stepSize
' 顶部区域(不旋转)
Dim topCount As Integer
Dim topLength As Integer, topWidth As Integer
topCount = (containerLength \ itemLength) * (h \ itemWidth)
topLength = (containerLength \ itemLength) * itemLength
topWidth = (h \ itemWidth) * itemWidth
' 底部区域(旋转)
Dim bottomCount As Integer
Dim bottomLength As Integer, bottomWidth As Integer
bottomCount = (containerLength \ itemWidth) * ((containerWidth - h) \ itemLength)
bottomLength = (containerLength \ itemWidth) * itemWidth
bottomWidth = ((containerWidth - h) \ itemLength) * itemLength
' 计算整体占用尺寸
Dim totalCount As Integer
Dim totalLength As Long, totalWidth As Long
totalCount = topCount + bottomCount
totalLength = containerLength ' 水平方向满宽
totalWidth = topWidth + bottomWidth
' 更新最优方案
If totalCount > maxCount Or (totalCount = maxCount And totalLength * totalWidth > maxLength * maxWidth) Then
maxCount = totalCount
maxLength = totalLength
maxWidth = totalWidth
End If
Next h
' 方案4:垂直分割混合摆放
Dim v As Integer
For v = 0 To containerLength Step stepSize
' 左侧区域(不旋转)
Dim leftCount As Integer
Dim leftLength As Integer, leftWidth As Integer
leftCount = (v \ itemLength) * (containerWidth \ itemWidth)
leftLength = (v \ itemLength) * itemLength
leftWidth = (containerWidth \ itemWidth) * itemWidth
' 右侧区域(旋转)
Dim rightCount As Integer
Dim rightLength As Integer, rightWidth As Integer
rightCount = ((containerLength - v) \ itemWidth) * (containerWidth \ itemLength)
rightLength = ((containerLength - v) \ itemWidth) * itemWidth
rightWidth = (containerWidth \ itemLength) * itemLength
' 更新最优方案
If totalCount > maxCount Or (totalCount = maxCount And totalLength * totalWidth > maxLength * maxWidth) Then
maxCount = totalCount
maxLength = totalLength
maxWidth = totalWidth
End If
Next v
' 返回最大数量
MaxBoxCountWithSize = maxCount
End Function
Sub CalculateMaxBoxesWithSize()
Dim containerL As Integer, containerW As Integer
Dim itemL As Integer, itemW As Integer
' 计算最大装箱数量及占用尺寸
Dim maxCount As Integer
Dim usedLength As Long, usedWidth As Long
For i = 2 To UBound(ar)
If ar(i, 2) > 0 And ar(i, 3) > 0 Then
maxCount = MaxBoxCountWithSize(containerL, containerW, ar(i, 2), ar(i, 3), usedLength, usedWidth)
ar(i, 4) = maxCount
ar(i, 5) = usedLength
ar(i, 6) = usedWidth
End If
Next
Range("a4").CurrentRegion = ar
End Sub