Thuật toán bài toán tối ưu về xây dựng (4 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

SA_DQ đã viết:
Trong xây dựng thì thép thanh được nối theo 2 cách thông dụng sau:
* Hàn nối
* Chập lên nhau & nối;
Với hàn nối thì độ dôi không đáng kể;
Với chập nối thì khoảng độ chập (chồng) lên nhau này có ghi trong TCVN;
Thép ngắn được các nhà cung cấp bán theo cấp chiều dài, thường gặp các loại sau: loại 3m, 4,5m , 6m & 9m; Một loại ngắn khác nữa là do ta tạo ra ngắn trong quá trình sử dụng;
Mình đề xuất cách giải theo hướng thép được nối chập lên nhau;
Xin các bạn xem file đính kèm & cho biết ý kiến!
.........................................
Bài toán trên có vấn đề như sau:
1. Loại thép đặt tại nhà máy khác Ltc = 11.7m (với số lượng lớn thì họ mới sản xuất, và phải được tư vấn chấp thuận)
Để đặt loại hàng này ta phải Tính và thống kê các loại thép của công trình, và khi mua về ta chỉ việc sử dụng => Không cần bài toán nối thép.
2. Trong quá trình thi công phải kết hợp giữa thanh nguyên (cắt từ thép có Ltc = 11.7m) và các thanh thép (ngắn) còn dư trong quá trình làm. Không để cuối công trình mới thực hiện việc ghép nối. Hoặc giả sử thi công 1 cấu kiện bê tông cốt thép có 1 loại thép duy nhất thì ta phải thực hiện việc cắt nối sao cho tiết kiệm nhất: KL thi công <= KL thiết kế x hệ số hao hụt.
3. Việc tạo ra một loại thanh mới (để ghép nối với các loại thanh dư) phải căn cứ vào chiều dài thanh dư, thép tiêu chuẩn L=11.7m và các loại thanh Li cần làm chứ không thể tạo ra loại mới theo phương pháp ngẫu nhiên được.

Quay về bài toán này, Ví dụ chỉ xét đến chiều dài, chưa xét đến số lượng thanh
Giả sử có các loại thanh Li <11.7m cần làm
Lnoi - Chiều dài nối tối thiểu giữa 2 thanh
Bài toán đặt ra: Cắt từ các thanh 11.7m ra các loại thanh Li và đoạn dư Lj (nếu có)
- Tổ hợp các loại thanh để kiểm tra điều kiện: Sum Li (i = 1 - n) = 11.7 => Ta đã loại ra các thanh có thể cắt từ 11.7m mà không phải nối.
- Các thanh Li còn lại sẽ được cắt từ cây 11.7 và dư 1 đoạn Lj, trong quá trình thực hiện kiểm tra:
Hoặc Sum Lj (j =1-m) + (m -1) x Lnoi = Li (m càng nhỏ càng tối ưu; = 2: nối 2 thanh)
Hoặc Lj + L(j+1)/2 + Lnoi = Li (thanh Lj nối với 1/2 thanh Lj+1 được thanh Li nào đó)
Hoặc ……………………………….
(Các điều kiện cho vào kiểm tra sao cho tổ hợp các thanh dư tạo thành thanh cần cắt)
Bài toàn này thuật toán quá phức tạp nên chúng ta nên tiến hành từng bước 1 cho từng trường hợp. Ví dụ 1 loại thanh, 2 loại, … 10 loại (quá lý tưởng).

Mời các bạn thử sức!
 
Ban su dung phan mem WinQSB lam ngon lanh!

_________________________

Viết bài bằng tiếng Việt có dấu bạn nhé!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cắt Nối Thép Thi Công "Tối Ưu"

VADaNang đã viết:
+ Mình có 1 bài toán tối ưu chưa tìm ra thuật toán. Mong được giúp đỡ.

Bài toán cụ thể như sau:
Đầu vào:
Ta có N1 cấu kiện có chiều dài L1 (real)
N2 cấu kiện có chiều dài L2 (real)
.....................................................
Nn cấu kiện có chiều dài Ln (real)
Trong đó N1, N2 ... Nn là số cấu kiện của cấu kiện có chiều dài tương ứng L1, L2 ..., Ln.

Đầu ra:

Phân tích tìm ra tổng số tổ hợp của tất cả các cấu kiện trên sao cho thoả mãn điều kiện :
N1x . L1 + N2x.L2 + + Nnx.Ln gần bằng 11,7(m) với sai số cho trước
Trong đó N1x, N2x ... Nnx là số cấu kiện ứng với từng chiều dài L1,L2....
để sao cho số thanh còn lại (không nằm trong các tổ hợp) là ít nhất.

Cụ thể các tổ hợp cần tìm thoả mãn điều kiện:
N11 . L1 + N21x.L2 + + Nn1x.Ln gần bằng 11,7(m) với sai số cho trước
N12 . L1 + N22x.L2 + + Nn2x.Ln gần bằng 11,7(m) với sai số cho trước
..................
v.v.v...........
Trong đó :
N11+N12+......= gần tiến tới N1 (gần bằng N1)
N21+N22+......= gần tiến tới N2 (gần bằng N2)
........................
Nn1+Nn2+......= gần tiến tới Nn (gần bằng Nn)

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é!
 

File đính kèm

Bài toán tối ưu cắt thép

Gởi các Anh Em chương trình cắt thép tôi mới sửa lại khắc phục 1 số lỗi. Anh Em kiểm tra và cho ý kiến giúp.
 

File đính kèm

Cảm ơn các bác, tôi mới ra trường vừa đi thi công thì vướng ngay bài toán này. Mong các bác tiếp tục hoàn thiện các tiện ích này để cho anh em thi công đỡ vất vả hơn. Một lần nữa cảm ơn các bác!
 
Bác Mai Văn Trí có thể tích hợp cả nối thép vào phần mềm của bác được ko? Ở một số công trường ko có điện để hàn nên nối thép bằng cách buộc có chiều dài mối nối khoảng 30D khá lãng phí, bác có thể bổ xung vào cho tiện ích của bác một mội mối nối cho một thanh thép ko? Xin cảm ơn bác!
 
Lần chỉnh sửa cuối:
bác SQ_DA àh link của bác tui không download được bác vui lòng gửi cho tui 1 bản cắt thép vào địa chỉ npthao80@yahoo.com được kô tui; cảm ơn bác nhiều nhé tui đang cần gấp
 
Cám ơn bạn rất nhiều mình đang vướng mắc vấn đề cắt thép này.Mong mọi người cố gắng giúp đỡ!
 
Bài toán cắt nối thép tối ưu là một vấn đề hết sức quan trọng trong việc tiết kiệm được vật liệu, Nhất là đối với dân thi công trực tiếp như mình. Giá thép bây giờ cao cắt cổ mình lại không biết gì về lập trình tính toán. Mong các bạn cùng góp sức hoàn chỉnh phai cắt nối thép. Nếu được thì tôi xin mua bản quyền. Chào các bạn
 
cai cat thep cua Mai Văn Trí hay đấy nhưng không thật sự tối ưu
điển hình là tôi làm từ bài ví dụ của cậu thì chỉ sử dụng 14 cây thôi mà bạn phải dùng đến 15 cây
tôi mới gia nhập nên không biết cách gởi bài các bạn chỉ đi tôi sẽ gởi cách tính
 
Phai cắt thép của Mai Văn Trí không thể dùng được trong khi thi công. Thực tế mình thi công phải nối thép với chiều dài nối buộc là 30d (d là đường kính thanh thép). Chiều dài 1 cây thép nguyên là 11.7m, Nếu như có 1 chủng loại thép Của hạng mục tường cánh gồm có n1 cây A1(fi25) chiều dài mỗi cây là 40m và n2 cây A2 (fi16) chiều dài mỗi cây là 30m (Ví dụ như thế đi) thế thì phải cắt như thế nào và nối như thế nào?. Phai của bác Mai Văn Trí không thể thực hiện được. Vì vậy mà phai đó không có tính thực tế. Cái thể loại này từ trước đến nay mình toàn tính thủ công rất mệt. Mong các cao thủ ra tay xử lý vấn nạn trên. Nó rất có ích trong thi công. Rất tiếc mình không biết về lập trình nên không có ý kiến gì thêm. Chào tất cả các bạn.!
 
nguyen vuong ! khi thi công nối thép thì bạn phải chủ động nối thép ở đoạn nào chứ và định ra chiều dài thanh để đưa vô tính tối ưu khi phối hợp cắt thôi. chứ làm như bạn nói sao làm được trong 1 câu kiện theo từng người thì cách bố trí khác nhau
 
Hiện nay tôi đang hoàn thiện code Cắt nối thép tối ưu, với ví dụ cụ thể như sau:
Có 5 loại thanh ký hiệu 1, 2, 3, 4, 5
tương ứng chiều dài: L1, L2, L3, L4, L5 (chiều dài có thể là tùy ý: Li >= 1170cm hoặc Li < 1170cm)
tương ứng số lượng: N1, N2, N3, N4, N5
Cần sử dụng bao nhiêu cây thép tiêu chuẩn L=1170 (hoặc Lj nào đó do ta quy định) để cắt nối thành số lượng các thanh trên, phương án cắt nối như thế nào?
Tối ưu ở đây bao gồm:
1 . Phải đưa ra phương án cắt nối để số lượng thanh thép gia công = (N1+N2+N3+N4+N5) -> Min
2. Số cây thép L1170 sử dụng là ít nhất (< hơn định mức cho phép, hoặc nhỏ hơn cả thiết kế nữa là tốt nhất = cắt ngắn đi mỗi thanh 5-3cm).

Có thể sau 1 lần tính kết quả đạt mỹ mãn hoặc cũng phải tính đi tính lại vài ba lần mới đạt kết quả mong muốn.

Ngôn ngữ Visual Studio 2008, để sử dụng máy tính cần cài:
- Excel 2007
- .net Famework 3.5
- Visual studio Tools for Office V3.0

Dự kiến đầu tháng 11 tôi sẽ upload lên, bác nào quan tâm cho ý kiến nhé!
 
Gửi bạn mai van tri! đầu tiên mình cám ơn bạn đã hổ trợ A & E xây dựng
minh có các loại thép cần cắt là D10: 29c 1.82m, 46c 11.7, 20c 10.8, 18c 2.08, 17c 7.15, 21c 3.33, 181c 1.46m.
Mình cắt thủ công thì sử dụng 113cây D10 nhưng Chương trình của bạn tính 115cây D10.
Vậy bạn ráng hòan thiện chường trình nhé
 
cai ong mai van tri hay day nhung chua cat duoc
toi cat từ ví dụ thì ít hơn cái làm sẳn
dù sao phải nhận định rằng ông mai văn trí rất tích cực
cần phải nghiên cứu thêm!
 
Gửi bạn mai van tri! đầu tiên mình cám ơn bạn đã hổ trợ A & E xây dựng
minh có các loại thép cần cắt là D10: 29c 1.82m, 46c 11.7, 20c 10.8, 18c 2.08, 17c 7.15, 21c 3.33, 181c 1.46m.
Mình cắt thủ công thì sử dụng 113cây D10 nhưng Chương trình của bạn tính 115cây D10.
Vậy bạn ráng hòan thiện chường trình nhé


cây 11700 thì đem vào cắt làm gì
cho nó chạy chậm
 
Gửi bạn mai van tri! đầu tiên mình cám ơn bạn đã hổ trợ A & E xây dựng
minh có các loại thép cần cắt là D10: 29c 1.82m, 46c 11.7, 20c 10.8, 18c 2.08, 17c 7.15, 21c 3.33, 181c 1.46m.
Mình cắt thủ công thì sử dụng 113cây D10 nhưng Chương trình của bạn tính 115cây D10.
Vậy bạn ráng hòan thiện chường trình nhé
 
Web KT

Bài viết mới nhất

Back
Top Bottom