現(xiàn)有7.4米鋼材一批纹冤,現(xiàn)需焊接鋼架,需要2.9米100根购公,2.1米100根赵哲,1.5米100根,問怎樣切割用7.4米鋼材最少君丁?
1.先考慮1根的情況:
7.4米分別切割2.9,2.1将宪,1.5最多能有幾根绘闷?
總長 | 2.9 | 2.1 | 1.5 |
---|---|---|---|
7.4 | 2 | 3 | 4 |
但是當我們用7.4-2*2.9=1.6米 還可以切割1根1.5米余0.1米橡庞。
那么隱含條件就出現(xiàn)一個 余量必然小于1.5米。
那么在這個 余量>=0,同時余量<1.5的條件下有多少種組合方式印蔗?
用VBA進行窮舉
Sub ListCuttingMethods()
Dim lengths() As Variant
lengths = Array(2.9, 2.1, 1.5) ' 定義可以切割的長度
Dim maxCount() As Integer
Dim totalLength As Double
totalLength = 7.4 ' 鋼材總長度
ReDim Preserve maxCount(LBound(lengths) To UBound(lengths)) As Integer
Dim i As Integer, j As Integer, k As Integer
Dim remainingLength As Double
Dim method As String
' 計算每種長度的最大可切割數(shù)量
For i = LBound(lengths) To UBound(lengths)
maxCount(i) = Int(totalLength / lengths(i))
Next i
' 遍歷所有可能的切割數(shù)量組合
For i = 0 To maxCount(0)
For j = 0 To maxCount(1)
For k = 0 To maxCount(2)
' 計算剩余長度
remainingLength = totalLength - (i * lengths(0) + j * lengths(1) + k * lengths(2))
' 檢查剩余長度
If remainingLength < 1.5 And remainingLength >= 0 Then
m = m + 1
Cells(m + 1, 1) = i
Cells(m + 1, 2) = j
Cells(m + 1, 3) = k
method = "2.9米 x " & i & ", 2.1米 x " & j & ", 1.5米 x " & k
Debug.Print method ' 在Immediate窗口打印切割方法
End If
Next k
Next j
Next i
End Sub
得出8種方法扒最,同時問題可以轉(zhuǎn)化為用規(guī)劃求解來處理最小值問題:怎樣下料讓余料最少?
=SUMPRODUCT($B$2:$B$9,C2:C9)
需要2.9华嘹,2.1吧趣,1.5各100根
求解目標值為:切割方式用量-切割后總量 的最小值
結(jié)果
就是說采用3種組合切割方式下料余量最少即:
X3:切2.1米2根,1.5米2根 共30根
X7:切2.9米1根耙厚,2.1米2根 共20根
X8:切2.9米2根强挫,1.5米1根 共40根
為最優(yōu)切割方案,用量為90根薛躬。
當然實際下料沒有這么理想的狀態(tài)俯渤,會多于90根的情況,但不應(yīng)該多太多型宝。