CẮT NỐI THÉP TỐI ƯU:
Việc tổ hợp các thanh = 1170cm để cắt đã có nhiều người thực hiện, nhưng chưa tính đến việc nối chúng trong quá trình cắt. Điều này hiển nhiên hao hụt rất lớn vượt quá định mức cho phép, không có hiệu quả và hiển nhiên là Không tối ưu.
Thực tế, việc nối thép là hiển nhiên, có khi cho phép bố trí lên tới 50% số lượng thanh trong một mặt cắt của cấu kiện.
1. Khi ta nhìn thấy Số lượng thanh cần cắt nối quá lớn ta thấy quá phức tạp, nhưng nếu ta biết, ví dụ: 2 cây L =1170cm cắt nối thành 3 loại thanh: 2 x L1, 1 x L2, 3 x L3 thì ta thấy quá đơn giản và dễ dàng thực hiện được - có 1 mối nối.
2. Việc tổ hợp và cắt theo kiểu thống kê từng thanh 1 như file gửi của bạn VA Đà Nẵng, bạn Trí sẽ khó khăn cho việc thi công, giả sử số lượng các thanh lớn: Chúng ta phải tổng hợp lại các trường hợp chương trình đã thực hiện. Phải nhặt ra từng loại để tổ hợp lại những loại cắt giống nhau để gia công đồng loạt.
3. Việc tối ưu: phải được thực hiện từ nhiều trường hợp sau đó tổng kết, so sánh, chọn lựa mới có được nên dữ liệu và cách tính phải mở cho người dùng lựa chọn.
Từ ý tưởng trên tôi đã thực hiện bài toán theo cách sau:
(Tổ hợp 4 loại thanh - Trường hợp tổng quát sau đó giảm dần xuống 1 thanh)
n lần: N x 1170 - SSD < = i.L1 + j.L2 + k.L3 + l.L4 < = N x 1170 + SSA
SSD - sai số dương cho phép cắt dài hơn: để người dùng tự chọn
SSA - sai số âm cho phép cắt ngắn hơn: để người dùng tự chọn
Và thỏa mãn các điều kiện:
n.i <= N1 n.j <= N2
n.k <= N3 n.l <= N4
N1, N2, N3, N4, .. Nn số thanh tương ứng với L1, L2, L3, L4, ….. Ln cần thực hiện và tôi thấy hợp lý, tiết kiệm.
' 1 đoạn code:
Select Case nBar
Case Is >= 4
PP = 2: Bars = 4
Case Is = 3
PP = 4: Bars = 6
Case Is = 2
PP = 6: Bars = 8
Case Is = 1
PP = 8: Bars = 10
End Select
iOf = 1
For p = 1 To PP
For iJ = 1 To nBar: If nBar = 1 Then GoTo Line
For iZ = iJ + 1 To nBar: If nBar = 2 Then GoTo Line
For iG = iZ + 1 To nBar: If nBar = 3 Then GoTo Line
For iH = iG + 1 To nBar
Line:
For i = 0 To Bars: If nBar = 1 Then GoTo Lines
For j = 0 To Bars: If nBar = 2 Then GoTo Lines
For k = 0 To Bars: If nBar = 3 Then GoTo Lines
For l = 0 To Bars
Lines:
TempL = LenCheck(nBar, iRow, iCol, iJ, iZ, iG, iH, i, j, k, l, p, SSD, SSA) = True
If TempL Then
If nBar = 1 Then GoTo Line1: If nBar = 2 Then GoTo Line2
If nBar = 3 Then GoTo Line3
Cells(iRow + iOf, iCol + iH) = l
Line3:
Cells(iRow + iOf, iCol + iG) = k
Line2:
Cells(iRow + iOf, iCol + iZ) = j
Line1:
Cells(iRow + iOf, iCol + iJ) = i
cBar = 1
Cells(iRow + iOf, iCol) = "=1170*" & p & ""
Do
Cells(iRow + iOf, iCol - 1) = cBar
KiemTra = Check(nBar, iRow, iCol, iOf, iJ, iZ, iG, iH) = True
If KiemTra Then ' Do nothing
Else
Cells(iRow + iOf, iCol - 1) = cBar - 1: Exit Do
End If
cBar = cBar + 1
Loop
iOf = iOf + 1
End If
If nBar = 3 Then GoTo line33: If nBar = 2 Then GoTo line22
If nBar = 1 Then GoTo line11
Next l
line33:
Next k
line22:
Next j
line11:
Next i
If nBar = 3 Then GoTo line333: If nBar = 2 Then GoTo line222
If nBar = 1 Then GoTo line111
Next iH
line333:
Next iG
line222:
Next iZ
line111:
Next iJ, p
…………………………
Vòng lặp nhiêu hơi phức tạp, bạn có thể thay = các trường hợp (hơi dài nhưng dễ hiểu)
Select Case nBar
Case Is >= 4
PP = 4: i1 = 4: i2 = 4: i3 = 4: i4 = 4
For p = 1 To PP
For iJ = 1 To nBar: For iZ = iJ + 1 To nBar: For iG = iZ + 1 To nBar: For iH = iG + 1 To nBar
For i = 0 To i1: For j = 0 To i2: For k = 0 To i3: For l = 0 To i4
TempL = LenCheck(nBar, iRow, iCol, iJ, iZ, iG, iH, i, j, k, l, p, SSD, SSA) = True
If TempL Then
Cells(iRow + iOf, iCol + iJ) = i: Cells(iRow + iOf, iCol + iZ) = j
Cells(iRow + iOf, iCol + iG) = k: Cells(iRow + iOf, iCol + iH) = l
cBar = 1
Cells(iRow + iOf, iCol) = "=1170*" & p & ""
Do
Cells(iRow + iOf, iCol - 1) = cBar
KiemTra = Check(nBar, iRow, iCol, iOf, iJ, iZ, iG, iH) = True
If KiemTra Then ' Do nothing
Else
Cells(iRow + iOf, iCol - 1) = cBar - 1: Exit Do
End If
cBar = cBar + 1
Loop
iOf = iOf + 1
End If
Next l: Next k: Next j: Next i
Next iH: Next iG: Next iZ: Next iJ
Next p
Case Is = 3
PP = 8: i1 = 8: i2 = 8: i3 = 8: i4 = 0
For p = 1 To PP
For iJ = 1 To nBar: For iZ = iJ + 1 To nBar: For iG = iZ + 1 To nBar
For i = 0 To i1: For j = 0 To i2: For k = 0 To i3
TempL = LenCheck(nBar, iRow, iCol, iJ, iZ, iG, iH, i, j, k, l, p, SSD, SSA) = True
If TempL Then
Cells(iRow + iOf, iCol + iJ) = i: Cells(iRow + iOf, iCol + iZ) = j
Cells(iRow + iOf, iCol + iG) = k:
cBar = 1
Cells(iRow + iOf, iCol) = "=1170*" & p & ""
Do
Cells(iRow + iOf, iCol - 1) = cBar
KiemTra = Check(nBar, iRow, iCol, iOf, iJ, iZ, iG, iH) = True
If KiemTra Then ' Do nothing
Else
Cells(iRow + iOf, iCol - 1) = cBar - 1: Exit Do
End If
cBar = cBar + 1
Loop
iOf = iOf + 1
End If
Next k: Next j: Next i
Next iG: Next iZ: Next iJ
Next p
.........
(File đính kèm)
Hy vọng sẽ giúp được một phần nào công việc của các bạn.
Nhập liệu: Sheet Data, sang Sheet Cacular để thực hiện
Tự mò mẫm học nên còn nhiều sai sót, mong mọi người đóng góp ý kiến nhé!