Tiện ích tính toán để tiết kiệm khi cắt tấm, cắt thanh.

Liên hệ QC
Tôi cũng biết điều này vì thế ngay bài #1 tôi cũng nói là chỉ là 1 cách cắt.
Tôi cũng nói là bài toán rất khó.
Mục đích tôi muốn nói chỉ là nếu không thể chứng minh được về mặt toán học là tối ưu thì mãi mãi cách cắt chỉ là "ứng cử viên" cách cách tối ưu thôi.
Code của tôi dùng chỉ để có cái mà so sánh, để thấy là có cách cắt kém hơn và có cách cắt tốt hơn code của bạn, với mục đích chỉ ra là code không tối ưu trong mọi trường hợp. Chỉ thế thôi chứ tôi không có ý định tranh đua về code. Chỉ có điều là nếu tôi ý thức được là không có code nào luôn tối ưu thì mỗi khi có trường hợp cụ thể thì tôi sẽ chạy tất cả - của bạn, của tôi, và của những người khác - rồi chọn kết quả tốt nhất trong chúng. Chuyện code nào được dùng "thường xuyên" hơn thì là chuyện không có ý nghĩa gì đối với người cắt thép. Anh ta chỉ cần cắt tốt nhất có thể mà thôi.

Thật thú vị khi em test cách của em tại bài #4 (một bạn nào đó đưa lên lại) cho kết quả giống của anh tại bài 11, cách của bạn huuthang_bd mình chưa test được vì không hiểu sao lại báo lỗi.
Trước đây mình chỉ cắt tuần tự nên hao hụt có thể xảy ra lớn.

Đúng là rất khó, em đã đầu tư thời gian để tạo ra cách sau đây, mà em nghĩ là đã tối ưu.
Chứng minh:
- Liệt kê tất cả các "tổ hợp" có thể xảy ra và kích thước của chúng căn cứ vào chiều dài thanh nguyên liệu và thanh nhỏ nhất cần cắt. Ví dụ từ thanh nguyên 3000, ta phải cắt hai loại a và b, kích thước loại nhỏ là 950, vậy một thanh nguyên có thể cắt tối đa 3 SP. Các trường hợp cắt có thể xảy ra trên một thanh nguyên là: a,b, a+b, a+a+b, a+b+b, a+a+a,b+b+b.
- Tính kích thước trong từng trường hợp và loại bỏ những trường hợp vượt quá chiều dài thanh nguyên.
- Sắp xếp tổ hợp theo kích thước của chúng.
- Xét lần lượt từ trường hợp dài nhất (tổn hao ít nhất) đến trường hợp ngắn nhất, nếu yêu cầu cắt còn thỏa mãn các loại thanh của trường hợp đó thì tiến hành cắt.

Muốn giảm hao hụt cần phải: Các thanh cần cắt và các thanh nguyên liệu phải phù hợp. Ví dụ thanh nguyên liệu là 6000 mà cắt toàn loại khỏng 3500 thì không có cách nào giảm tổn hao được.

--------------------------------------------------

Tuy nhiên cái gì cũng có giá của nó, để tính cắt tối ưu thì thời gian tính toán rất lâu, tùy thuộc vào: Cấu hình máy tính, số laoị cần cắt và tỉ lệ giữa thanh nguyên và thanh nhỏ nhất.
Với máy mình + cắt 10 loại thanh + tỉ lệ thanh nguyên/thanh cắt min = 6000/480 thì thời gian tình toán xấp xỉ 1 phút (phải xét gần 100.000 trường hợp).
Thới gian tính có lẽ tăng theo lũy thừa của 2, ví dụ: 10 loại 2 phút thì 11 loại là 4 phút, 12 loại 8 phút.

Mình gởi file để các bạn tham khảo, vì là bản "dùng thử" nên số loại cắt tối đa cho phép là 260 loại. Hi hi, như phân tích ở trên thì nếu cắt đủ 260 loại thì hãy bật náy lên, đi chơi một tuần về coi thử tính xong chưa, mà có lẽ cũng không được vì lỗi tràn bộ nhớ. Bản thân mình test có 10 loại mà test đi test lại quá mất thời gian. Code trong file chưa được khai báo đầy đủ kiểu biến và giải phóng biến.
 

File đính kèm

  • CatVL.xls
    74.5 KB · Đọc: 171
Thật thú vị khi em test cách của em tại bài #4 (một bạn nào đó đưa lên lại) cho kết quả giống của anh tại bài 11, cách của bạn huuthang_bd mình chưa test được vì không hiểu sao lại báo lỗi.
Trước đây mình chỉ cắt tuần tự nên hao hụt có thể xảy ra lớn.

Đúng là rất khó, em đã đầu tư thời gian để tạo ra cách sau đây, mà em nghĩ là đã tối ưu.
Chứng minh:
- Liệt kê tất cả các "tổ hợp" có thể xảy ra và kích thước của chúng căn cứ vào chiều dài thanh nguyên liệu và thanh nhỏ nhất cần cắt. Ví dụ từ thanh nguyên 3000, ta phải cắt hai loại a và b, kích thước loại nhỏ là 950, vậy một thanh nguyên có thể cắt tối đa 3 SP. Các trường hợp cắt có thể xảy ra trên một thanh nguyên là: a,b, a+b, a+a+b, a+b+b, a+a+a,b+b+b.
- Tính kích thước trong từng trường hợp và loại bỏ những trường hợp vượt quá chiều dài thanh nguyên.
- Sắp xếp tổ hợp theo kích thước của chúng.
- Xét lần lượt từ trường hợp dài nhất (tổn hao ít nhất) đến trường hợp ngắn nhất, nếu yêu cầu cắt còn thỏa mãn các loại thanh của trường hợp đó thì tiến hành cắt.

Muốn giảm hao hụt cần phải: Các thanh cần cắt và các thanh nguyên liệu phải phù hợp. Ví dụ thanh nguyên liệu là 6000 mà cắt toàn loại khỏng 3500 thì không có cách nào giảm tổn hao được.

--------------------------------------------------

Tuy nhiên cái gì cũng có giá của nó, để tính cắt tối ưu thì thời gian tính toán rất lâu, tùy thuộc vào: Cấu hình máy tính, số laoị cần cắt và tỉ lệ giữa thanh nguyên và thanh nhỏ nhất.
Với máy mình + cắt 10 loại thanh + tỉ lệ thanh nguyên/thanh cắt min = 6000/480 thì thời gian tình toán xấp xỉ 1 phút (phải xét gần 100.000 trường hợp).
Thới gian tính có lẽ tăng theo lũy thừa của 2, ví dụ: 10 loại 2 phút thì 11 loại là 4 phút, 12 loại 8 phút.

Mình gởi file để các bạn tham khảo, vì là bản "dùng thử" nên số loại cắt tối đa cho phép là 260 loại. Hi hi, như phân tích ở trên thì nếu cắt đủ 260 loại thì hãy bật náy lên, đi chơi một tuần về coi thử tính xong chưa, mà có lẽ cũng không được vì lỗi tràn bộ nhớ. Bản thân mình test có 10 loại mà test đi test lại quá mất thời gian. Code trong file chưa được khai báo đầy đủ kiểu biến và giải phóng biến.

Bạn thử cắt 30 thanh kích thước 3999 (a) và 30 thanh kích thước 2000 (b) với kích thước nguyên liệu là 6000 xem.

Kết quả hợp lý nhất là kết hợp 1 thanh (a) với 1 thanh (b) tổng cộng sử dụng 30 thanh nguyên liệu.

Code của bạn cho kết quả là
- Kiểu 1: 1 thanh nguyên liệu cắt 3 thanh (b) => 10 thanh nguyên liệu cắt 30 thanh (b)
- Kiểu 2: 1 thanh nguyên liệu cắt 1 thanh (a) => 30 thanh nguyên liệu cắt 30 thanh (a)
Tổng cộng sử dụng 40 thanh nguyên liệu.
 
Bạn thử cắt 30 thanh kích thước 3999 (a) và 30 thanh kích thước 2000 (b) với kích thước nguyên liệu là 6000 xem.

Kết quả hợp lý nhất là kết hợp 1 thanh (a) với 1 thanh (b) tổng cộng sử dụng 30 thanh nguyên liệu.

Code của bạn cho kết quả là
- Kiểu 1: 1 thanh nguyên liệu cắt 3 thanh (b) => 10 thanh nguyên liệu cắt 30 thanh (b)
- Kiểu 2: 1 thanh nguyên liệu cắt 1 thanh (a) => 30 thanh nguyên liệu cắt 30 thanh (a)
Tổng cộng sử dụng 40 thanh nguyên liệu.
Ok, cảm ơn bạn, mình sẽ kiểm tra lại điều kiện chọn cây mới.
 
sao nó lại bị cái lỗi này vậy a Untitled.jpg
 
Lần trước tôi đã gửi một file dùng để tính toán các sắp xếp tối ưu những hình chữ nhật nhỏ có cùng kích thước trong một hình chữ nhật lớn để số lượng hình chữ nhật nhỏ được xếp là lớn nhất. Tiện ích này sẽ giúp các bạn tiết kiệm không gian khi sắp xếp hàng hóa, tiết kiệm nguyên liệu khi cắt một tấm lớn ra thành nhiều tấm nhỏ.

Lần này tôi gửi tặng các bạn thành viên GPE một tiệt ích dùng để tiết kiệm khi cắt các thanh nguyên liệu ra thành nhiều thanh ngắn hơn có độ dài khác nhau.

Tôi đã gộp cả hai tiện ích trên vào trong một file đính kèm bên dưới. Để sử dụng, bạn chỉ cần nhập số liệu phù hợp vào các ô màu xanh và bấm nút.

Hi vọng sẽ có ích cho nhiều người.
Gửi bạn huuthang_bd,

Bài này thiếu mất code CTam (Cắt tấm), tui tải mấy file đính kèm mà không thấy, bạn cập nhật dùm nhé.

Cảm ơn.
 
Đọc sách đừng đọc mỗi trang cuối.
 
Đọc sách đừng đọc mỗi trang cuối.
Gửi huuthang_bd,
Thành thật xin lỗi vì file đầu tiên tải xuống, tui sử dụng chưa đúng nên bị lỗi (Khuôn 1220x2440, Mẫu 250x350) mà không kiểm tra code CTam. Các file từ bài 13, 16, 17 không có code này. Vì bài 17 cập nhật ngày 22/07, muộn hơn bài 1 cập nhật 17/07 nên tui không kiểm tra lại code trong bài 1. Tui đọc và tải ít nhất 6 file các bài trong topic này trước khi gửi bài 27.
Cảm ơn huuthang_bd đã nhắc nhở và cảm ơn vì bài viết hữu ích này.
 
Chào bạn , tôi có 1 bài toán cắt thép tối ưu, muốn nhờ bạn giải giúp như sau
Hiện trong kho có các loại thép thanh 6000,6500,7000,7500,8000,8500,9000,9500,10000,10500,11000,11500,12000
với số lượng và các kích thước cần cắt có sẵn (file đính kèm). tìm số lượng thanh thép cần dùng (có thể phối hợp 3-4 loại thép ở trên). THANKS
 

File đính kèm

  • Book1.xls
    27 KB · Đọc: 10
Chào các bạn , tôi có 1 bài toán cắt thép tối ưu, muốn nhờ bạn giải giúp như sau
Hiện trong kho có các loại thép thanh 6000,6500,7000,7500,8000,8500,9000,9500,10000,1050 0,11000,11500,12000
với số lượng và các kích thước cần cắt có sẵn (file đính kèm). tìm số lượng thanh thép cần dùng (có thể phối hợp 3-4 loại thép ở trên). THANKS
 

File đính kèm

  • Book1.xls
    27 KB · Đọc: 26
cho mình hỏi vì sao khi bấm "run" thì nó bị lỗi này@#!^%
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    29 KB · Đọc: 83
upload_2017-7-11_17-33-4.pngupload_2017-7-11_17-33-4.pngupload_2017-7-11_17-33-4.png upload_2017-7-11_17-33-4.png sao em làm lại ra lỗi thế này thầy?
 
Với SHEET tấm mình nhập thông số đầu vào là: Tấm có kuch thước (tính theo mm) 6.000, 12.000 và tấm muốn chia có kích thước là 200, 350 thì bị lỗi. Bạn check lại xem
 
Sao lại chia cho 50 làm gì mà mình chưa hiểu con số nàt lắm?
 
Sao lại chia cho 50 làm gì mà mình chưa hiểu con số nàt lắm?
Code vẽ kết quả trên sheet với mỗi đơn vị là 1 ô nên nếu chiều rộng lớn hơn số cột của Excel sẽ không đủ chỗ vẽ và bị lỗi. 50 là ước số chung lớn nhất của các số, chia ra để giảm kích thước, lúc này 1 ô tương đương với 50 đơn vị.
 
huuthang_bd đã viết:
Sao tôi thử một vài trường hợp mà không nhận được trường hợp theo CÁCH XẾP UT DÀI?
Liệu cách xếp UT Rong và UT Dai có bản chất thuật toán giống nhau?
 
Lần trước tôi đã gửi một file dùng để tính toán các sắp xếp tối ưu những hình chữ nhật nhỏ có cùng kích thước trong một hình chữ nhật lớn để số lượng hình chữ nhật nhỏ được xếp là lớn nhất. Tiện ích này sẽ giúp các bạn tiết kiệm không gian khi sắp xếp hàng hóa, tiết kiệm nguyên liệu khi cắt một tấm lớn ra thành nhiều tấm nhỏ.

Lần này tôi gửi tặng các bạn thành viên GPE một tiệt ích dùng để tiết kiệm khi cắt các thanh nguyên liệu ra thành nhiều thanh ngắn hơn có độ dài khác nhau.

Tôi đã gộp cả hai tiện ích trên vào trong một file đính kèm bên dưới. Để sử dụng, bạn chỉ cần nhập số liệu phù hợp vào các ô màu xanh và bấm nút.

Hi vọng sẽ có ích cho nhiều người.
cái này muốn thêm phần nhôm bị cắt đi do lưỡi cắt từ 10-20mm thì thêm vào chỗ nào trong đoạn mã vậy b
 
Web KT
Back
Top Bottom