thanhlanh
Thành viên tích cực


- Tham gia
- 21/2/08
- Bài viết
- 858
- Được thích
- 1,211
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.