2016-01-22 21 views
6

Tôi có kích thước khác nhau của hình chữ nhật nhỏ (1cm x 2xm, 2cmx3cm, 4cm * 6cm, v.v ...). Số lượng hình chữ nhật loại khác nhau có thể thay đổi tùy theo từng trường hợp. Mỗi loại hình chữ nhật khác nhau có thể có số lượng đếm khác nhau.Thuật toán tính toán diện tích tối thiểu (Chỉ đặt các ô trên cạnh)

Tôi cần tạo hình chữ nhật lớn với tất cả các hình chữ nhật nhỏ này, những hình chữ nhật nhỏ này chỉ có thể được đặt trên các cạnh . không có phép quay. Hình chữ nhật bên ngoài cuối cùng lý tưởng nên được làm quen với một hình vuông. X ~ Y. Không phải tất cả các cạnh cần phải được lấp đầy. Có thể có những khoảng trống giữa các hình chữ nhật nhỏ hơn. Ví dụ:
http://i.stack.imgur.com/GqI5z.png

Tôi đang cố gắng viết mã tìm ra khu vực tối thiểu có thể được tạo thành.

Tôi có một thuật toán lặp qua tất cả các vị trí có thể để tìm ra khu vực tối thiểu có thể. Nhưng phải mất một thời gian dài vì số lượng hình chữ nhật loại khác nhau và số lượng hình chữ nhật tăng lên. tức là 2 loại hình chữ nhật, mỗi hình chữ nhật có 100 hình chữ nhật. 8 cho vòng lặp. Đó sẽ là ~ 100^8 lần lặp

Bất kỳ ý tưởng nào về thuật toán tốt hơn và nhanh hơn để tính toán khu vực tối thiểu có thể? mã là python, nhưng mọi khái niệm thuật toán đều ổn.

for rectange_1_top_count in (range(0,all_rectangles[1]["count"]+1)): 
     for rectange_1_bottom_count in range(0,all_rectangles[1]["count"]-rectange_1_top_count+1): 
     for rectange_1_left_count in (range(0,all_rectangles[1]["count"]-rectange_1_top_count-rectange_1_bottom_count+1)): 
      for rectange_1_right_count in ([all_rectangles[1]["count"]-rectange_1_top_count-rectange_1_bottom_count-rectange_1_left_count]): 
      for rectange_2_top_count in (range(0,all_rectangles[2]["count"]+1)): 
       for rectange_2_bottom_count in (range(0,all_rectangles[2]["count"]-rectange_2_top_count+1)): 
       for rectange_2_left_count in (range(0,all_rectangles[2]["count"]-rectange_2_bottom_count-rectange_2_top_count+1)): 
        for rectange_2_right_count in [(all_rectangles[2]["count"]-rectange_2_bottom_count-rectange_2_left_count-rectange_2_top_count)]: 
         area=calculate_minimum_area() 
         if area< minimum_area: 
         minimum_area=area 
+0

Vì vậy, kích thước của hình chữ nhật bên ngoài được đưa ra và bạn muốn giảm thiểu vùng màu trắng ở giữa? –

+0

Điều kiện làm cho nó khó khăn là hình chữ nhật chỉ có thể được đặt trên các cạnh/cạnh. Chúng không thể được xếp chồng lên nhau –

+0

Kích thước của hình chữ nhật ngoài không được đưa ra. Chỉ có hình chữ nhật nhỏ diemsions được đưa ra. Kích thước của hình chữ nhật bên ngoài sẽ thay đổi dưới dạng thay đổi vị trí. Nhưng tôi muốn vị trí hình chữ nhật nhỏ tối ưu trên cạnh sẽ cung cấp cho khu vực hình chữ nhật nhỏ nhất bên ngoài. –

Trả lời

0

Điều này trông giống như vấn đề NP-hard, vì vậy không tồn tại thuật toán đơn giản và hiệu quả. Nó không có nghĩa là không có heuristic tốt mà bạn có thể sử dụng, nhưng nếu bạn có nhiều hình chữ nhật nhỏ, bạn sẽ không tìm thấy giải pháp tối ưu nhanh chóng.

Tại sao NP-cứng? Giả sử tất cả các hình chữ nhật của bạn có chiều cao 1 và bạn có hình chữ nhật có chiều cao 2, thì sẽ có ý nghĩa để tìm giải pháp với tổng chiều cao 2 (về cơ bản, bạn cố gắng tạo thành hai đường ngang của hình chữ nhật có độ dài tương tự). Để tìm ra nếu một giải pháp như vậy tồn tại, bạn sẽ phải tạo thành hai tập hợp con của các hình chữ nhật nhỏ của bạn, cả hai cộng với tổng chiều rộng tương tự. Điều này được gọi là partition problem và nó là NP-hoàn thành. Ngay cả khi có thể có khoảng trống và tổng chiều rộng không bắt buộc phải giống nhau, đây vẫn là một vấn đề NP-hard. Bạn có thể giảm vấn đề phân vùng cho vấn đề hình chữ nhật của bạn bằng cách chuyển đổi các phần tử thành phân vùng thành hình chữ nhật có chiều cao 1 như được nêu ở trên.

Tôi sẽ đợi câu trả lời cho các câu hỏi tôi đã đăng trong nhận xét cho câu hỏi của bạn và sau đó suy nghĩ lại về câu hỏi đó.

+0

Tôi nghĩ rằng bản phác thảo bằng chứng của bạn quá chính thức. Đối số của bạn về cơ bản nói rằng bạn có thể giảm một trường hợp cụ thể của vấn đề cho vấn đề phân vùng, điều đó không chứng minh NP-đầy đủ. Bạn nên chứng minh nghịch đảo: rằng bất kỳ trường hợp nào của một vấn đề NP-complete có thể được giảm (trong thời gian đa thức) cho vấn đề này, sau đó nó sẽ được coi là NP-hard. Nó không thể được chứng minh NP-hoàn thành, bởi vì đây không phải là một vấn đề quyết định, tức là nó không phải là NP. –

+0

@ juan-lopes, cảm ơn vì đã chỉ ra điều này. Tôi trộn NP-hard và NP-complete. Tôi đã cố gắng để cải thiện câu trả lời. – lex82

Các vấn đề liên quan