2011-01-24 39 views
17

Giả sử rằng tôi có biểu đồ G hoàn chỉnh, không bị chiếu xạ với khoảng cách được liên kết với mỗi cạnh. Ý nghĩa của cạnh (u, v) có độ dài l là "điểm u và v không thể gần nhau hơn l." Mục tiêu của tôi là đặt các nút của đồ thị này ra trong mặt phẳng sao cho không có ràng buộc khoảng cách nào bị vi phạm và sao cho phần lồi của các điểm có tổng diện tích nhỏ nhất. Ví dụ, giả sử rằng tôi có một loạt các thành phần điện tôi muốn đưa vào một con chip, mỗi bộ tạo ra một số nhiễu điện. Nếu tôi đặt các thành phần quá gần nhau, chúng sẽ bắt đầu can thiệp vào nhau, làm cho toàn bộ hệ thống vô dụng. Với khoảng cách tối thiểu mà mỗi điểm phải là từ mỗi điểm khác, cách hiệu quả nhất về mặt không gian của việc đưa các thành phần vào một con chip là gì?Đóng các điểm đóng trên mặt phẳng?

Tôi không biết làm cách nào để bắt đầu nghĩ về điều này. Tôi cũng không biết làm thế nào vấn đề có thể khái quát hóa với trường hợp chiều cao hơn (đóng gói điểm vào một hyperplane). Có ai biết một cách tốt để giải quyết vấn đề này?

+0

Bạn muốn tra cứu Vẽ đồ thị. Các kỹ thuật hướng đến lực lượng có thể cho bạn kết quả tốt cho trường hợp này. – novalis

+0

@ novalis- Tôi biết về những kỹ thuật này, nhưng theo hiểu biết tốt nhất của tôi thì không có bằng chứng nào cho thấy các giải pháp tối ưu (hoặc thậm chí là bất kỳ thứ gì gần với giải pháp tối ưu). Tôi đang tìm một thuật toán có thể nằm trong một số yếu tố dự đoán được tối ưu. – templatetypedef

+0

Thay vì diện tích của lồi lồi (theo câu trả lời của Chris Hopman), bạn có thể muốn giảm thiểu một cái gì đó giống như sản phẩm của tỷ lệ khung hình và bán kính từ trọng tâm đến điểm xa nhất. Tôi giả định cho điều này có ý nghĩa rằng đồ thị của bạn là hoàn toàn dày đặc - bạn không có các thành phần có thể 'ngăn xếp' ở cùng một vị trí? – Novelocrat

Trả lời

6

Tôi có giải pháp tối ưu nhưng bạn sẽ không thích nó :).

Hãy nhãn nút của chúng tôi x , x , ..., x n . Hãy B = max i, j < n (dist (x i, x j)), nơi dist (x i, x j) là khoảng cách tối thiểu giữa x i và x j.Đối với mỗi i, nút đặt x i tại vị trí (0, i * B). Bây giờ mỗi nút có ít nhất B cách xa tất cả các nút khác và thân lồi có diện tích 0.

Điểm thực ở đây là giảm thiểu diện tích thân lồi một mình sẽ cung cấp cho bạn một giải pháp vô nghĩa. Một biện pháp tốt hơn có thể là đường kính của vỏ lồi.

+1

Đó là một điểm cực kỳ tốt. Nếu bạn thiết lập các vấn đề để làm việc với đường kính, bạn có bất kỳ suy nghĩ? Bạn có vẻ là một thuật sĩ thuật toán chính, và tôi rất muốn nghe suy nghĩ của bạn về vấn đề này. – templatetypedef

+0

Heh. Tuyệt vời! – RBarryYoung

3

Tôi đoán sẽ rất khó để tìm ra thuật toán tối ưu. Tôi sẽ không ngạc nhiên nếu nó hóa ra lại là một vấn đề NP-hard. Tuy nhiên, nếu bạn quan tâm đến một thuật toán thực tế mang lại các giải pháp tốt, tôi khuyên bạn nên xem force-based graph drawing algorithms.

Đây là ý tưởng chung (một số phép tính cao hơn sẽ xuất hiện). Nó tổng quát đến bất kỳ số thứ nguyên nào.

Xây dựng hàm f chỉ định giá trị cho mỗi bố cục nút - giá trị bạn muốn thu nhỏ. Trong trường hợp của bạn, hàm có thể tính toán diện tích của lồi lồi cho một bố trí đã cho + một hình phạt lớn cho mỗi ràng buộc mà không được đáp ứng. Hoặc nó có thể là một hàm đơn giản hơn g hợp lý gần đúng với cái cũ: trong ngắn hạn, chúng tôi muốn g để thu nhỏ hơn bất cứ khi nào f trở nên nhỏ hơn và ngược lại. Tốt nhất là chọn một hàm tương đối đơn giản, bởi vì bạn sẽ cần tính các dẫn xuất một phần của nó (đối với các tọa độ của các nút).

Bây giờ giả sử bạn có 100 nút và bạn muốn đặt chúng ra ở chế độ 3D. Điều đó có nghĩa là bạn có 300 số không xác định (100 nút lần 3 tọa độ cho mỗi nút). Chức năng f là một chức năng từ R đến R và lý tưởng nhất là chúng tôi muốn tìm mức tối thiểu toàn cầu. Thực tế hơn, mức tối thiểu địa phương đủ sâu sẽ đủ.

Có các thuật toán số nổi tiếng để tìm mức tối thiểu như vậy, ví dụ: Conjugate gradient, BFGS. Điều tốt là, bạn không thực sự phải hiểu chúng chi tiết, các thuật toán này được thực hiện bằng nhiều ngôn ngữ. Tất cả những gì bạn phải làm là cung cấp một phương pháp tính f(x)f'(x) cho bất kỳ x theo yêu cầu của thuật toán và bố cục ban đầu x₀.

+0

Tôi thực sự nghĩ về việc này trong một thời gian, nhưng thực tế là tôi không có đảm bảo rằng các đồ thị kết quả là bất cứ nơi nào gần tối ưu luôn luôn biến tôi thành nó. – templatetypedef

+0

Đối với mục đích thực tế, bạn có thể chạy thuật toán nhiều lần như bạn có thể đủ khả năng với các bố cục ban đầu khác nhau (ngẫu nhiên), và kết quả tốt nhất nên thỏa mãn. Tất nhiên, vẫn không có bảo đảm rằng bạn đến bất cứ nơi nào gần tối ưu. Đó là một vấn đề rất thú vị từ một quan điểm lý thuyết! – Bolo

2

Đó là 2D bin packing problem (là NP cứng) với các ràng buộc bổ sung. Tôi đã nghe mô phỏng ủ thực hiện khá tốt cho thiết kế mạch/chip.

Tôi thực sự là looking for real-world test-data of a big bin packing problem cho Drools Planner.

+0

ủ mô phỏng thực sự là tuyệt vời cho các vấn đề như vậy. Tìm nơi để đặt điểm cho chia lưới một miền (với ràng buộc: hình tam giác phải là "chất béo" và đường kính của chúng phải được phân phối dưới dạng mật độ trên miền) trông khá giống nhau và có thể được giải quyết bằng SA. –

+2

Tôi không chắc chắn tôi theo dõi ... Bạn đang nói rằng đây là NP-hard thông qua giảm từ bao bì bin 2D? Nếu vậy, làm thế nào để bạn chứng minh điều này? Nếu không, sau đó chỉ nói rằng bạn có thể giải quyết điều này bằng cách sử dụng bin đóng gói không nói gì về sự phức tạp. – templatetypedef

+0

@templatetypedef Điểm tốt. Vì tôi không có tất cả các ràng buộc, tôi không thể tuyên bố rằng nó "chắc chắn là NP cứng". Và ngay cả khi tôi đã có tất cả các khó khăn, thật khó để chứng minh rằng một cái gì đó là NP cứng :) Tôi vẫn nghĩ rằng nó có nhiều khả năng NP khó mặc dù. –

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