Tôi đang làm việc trong một dự án thiết kế ngôi nhà nhỏ và một trong những phần quan trọng nhất của nó là phần mà người dùng có thể cung cấp một số thông tin về cách anh ấy muốn phòng của mình (ví dụ: một ngôi nhà với 10 x 10 mét, có một phòng khách 3x3, một nhà bếp 3x3, hai 4 x 5 phòng ngủ, và một phòng tắm 4x2), và sau đó chương trình tạo ra một bản đồ của ngôi nhà theo các requeriments thực hiện.Trợ giúp về thuật toán để đặt phòng trên một không gian giới hạn
Hiện tại, tôi không lo lắng về việc vẽ bản đồ, chỉ sắp xếp các phòng theo cách mà chúng không chồng lên nhau (có, đầu ra có thể khá xấu xí). Tôi đã thực hiện một số tìm kiếm và thấy rằng những gì tôi muốn rất giống với packing problem, có một số algorithms xử lý vấn đề này khá tốt (mặc dù đó là vấn đề NP-complete). Tuy nhiên, sau đó tôi có thêm một hạn chế: người dùng có thể chỉ định "liên kết" giữa các phòng, ví dụ, anh ta có thể muốn một căn phòng phải có "cánh cửa" vào phòng tắm, phòng khách để trực tiếp đến nhà bếp, vv (có nghĩa là, các phòng phải được đặt cạnh nhau), và đây là nơi mà mọi thứ trở nên phức tạp.
Tôi khá chắc chắn rằng những gì tôi muốn định cấu hình NP-problem, vì vậy tôi yêu cầu các mẹo để xây dựng một triển khai tốt, nhưng không nhất thiết phải tối ưu. Ý tưởng tôi có là sử dụng đồ thị để thể hiện mối quan hệ giữa các phòng, nhưng tôi không thể tìm ra cách tôi có thể điều chỉnh các thuật toán đóng gói hiện có để phù hợp với hạn chế mới này. Ai giúp tôi với?
Tôi tin rằng tên chung cho loại vấn đề này là * tối ưu hóa ràng buộc *, một tập con của * sự ràng buộc hạn chế *. Điều này có thể hỗ trợ tìm kiếm của bạn. Tôi cũng tự hỏi nếu bạn thực sự muốn giải quyết vấn đề này; có rất nhiều thứ khác đi vào vị trí phòng (ví dụ, mặt nào của mặt trời vào buổi sáng, nơi nào tất cả các ống dẫn AC, đường ống dẫn nước, vv ..?) – derobert
Thực ra, tốt hơn là chỉ cần tạo giao diện người dùng snazzy cho phép người dùng đặt phòng riêng của họ, trong khi nhắc nhở họ về những hạn chế của họ. – bdonlan
Nếu người dùng chỉ định quá nhiều ràng buộc và bạn không tìm kiếm giải pháp tối ưu, bạn nên sử dụng thuật toán 'xây dựng'. Xây dựng từng bước theo phòng theo các ràng buộc, và quay trở lại và thay đổi lựa chọn trước đó của bạn nếu nó không hoạt động –