2012-03-25 21 views
52

Tôi muốn tìm một thuật toán tốt hơn để giải quyết các vấn đề sau đây:không giao nhau đoạn thẳng trong khi giảm thiểu độ dài tích lũy

N điểm bắt đầu (màu tím) và N điểm mục tiêu (màu xanh) trong 2D. Tôi muốn một thuật toán kết nối các điểm bắt đầu với các điểm mục tiêu bằng một đoạn thẳng (màu nâu) mà không có bất kỳ phân đoạn nào giao nhau (màu đỏ) và trong khi giảm thiểu độ dài tích lũy của tất cả các đoạn.

Nỗ lực đầu tiên của tôi trong C++ đã làm mất đi tất cả các trạng thái có thể, tìm trạng thái không có giao lộ, và trong số các trạng thái có tổng chiều dài phân đoạn tối thiểu O (n!). Nhưng tôi nghĩ rằng phải có một cách tốt hơn.

enter image description here

Bất kỳ ý tưởng nào? Hoặc từ khóa tốt cho tìm kiếm?

+0

Có thể một số loại kiểu tôpô? –

+0

Tôi không biết câu trả lời, nhưng tôi sẽ tạo ra bất kỳ giải pháp nào (bỏ qua xung đột) và sau đó giải quyết xung đột riêng lẻ: khi hai đường xung đột, có vẻ như việc chuyển đổi một cặp điểm cuối sẽ giải quyết xung đột. Tôi không chắc chắn làm thế nào để đảm bảo tiến bộ, mặc dù. –

+1

@ DietmarKühl: Việc chuyển đổi điểm cuối có thể gây ra xung đột khác để xuất hiện. –

Trả lời

38

Đây là Minimum Euclidean Matching in 2D. Liên kết chứa một thư mục về những gì được biết về vấn đề này. Cho rằng bạn muốn giảm thiểu tổng chiều dài, ràng buộc không giao nhau là dư thừa, vì chiều dài của bất kỳ cặp phân đoạn nào có thể được giảm xuống bằng cách bỏ qua chúng.

+0

@Walkerneo, nó không đi qua chân của bạn, bởi vì khoảng cách giữa bàn chân của bạn, và khoảng cách giữa hông của bạn là ngắn hơn chiều dài của chân của bạn. – zzzzBov

+1

@ qq3: Nói đúng ra, tôi nghĩ rằng đây là * Bipartite * Matching Euclidian tối thiểu, một tập con được đề cập trong liên kết của bạn. – RBarryYoung

+0

@dmckee: qq3 cho biết rằng quy tắc không giao nhau là * dư thừa * theo giới hạn tổng chiều dài tối thiểu, không "xung đột" với nó (về mặt toán học, đây là * rất * những thứ khác nhau). Và đối với các vấn đề * Bipartite * (cái này là) các cải tiến có thể phân tách cục bộ cũng luôn là những cải tiến hợp lệ trên toàn cầu, do đó quy tắc chuyển đổi độ dài cục bộ cũng được áp dụng trên toàn cầu. (Tôi không chắc chắn nếu điều này áp dụng cho các trường hợp không Bipartite mặc dù, Bipartite là đơn giản hơn nhiều). – RBarryYoung

2

Bạn có thể chọn kết nối ngẫu nhiên, sau đó mỗi lần xóa một dấu chéo (trên thực tế thay đổi kết nối của thiết bị đầu cuối), Thuật toán này hoạt động và hoàn thành các bước hữu hạn. có thể bạn nói chuyển đổi chéo gây ra cross mới, không có vấn đề, mỗi lần bằng cách chuyển đổi một chéo, bạn sẽ giảm thiểu tổng chiều dài của câu trả lời của bạn và cách này không thể là vô hạn (vì tổng chiều dài của dòng là hữu hạn). Trên thực tế hoạt động trong O (F * n^2) trong đó F= sum of all line segments * power of 10 (để làm cho nó số nguyên). O này là rất lạc quan, tôi nghĩ rằng nếu bạn thử thuật toán đơn giản này nó sẽ hoạt động tốt. Chắc chắn nó là tốt hơn so với lực lượng vũ phu nói chung.

+0

@MasoudM. Tôi chắc chắn 100% rằng chuyển đổi chéo cuối cùng sẽ dừng lại (tổng chiều dài giảm). Nếu bạn quan tâm đến thời gian (bao nhiêu lần bạn nên làm điều này), vì chương trình của bạn chạy trên các máy hữu hạn (PC), chúng không có thứ gì đó giống như epsilon (có thể rất nhỏ), độ chính xác của chúng được xác định trước (ví dụ 30 bit), vì vậy nó có thể được hoàn thành sớm, Ngoài ra bạn có thể thêm một số chẩn đoán trong mỗi bước, để có lựa chọn tốt hơn trong những thay đổi. Tôi đề nghị bạn thực hiện điều này (bạn cần một số cơ sở trong tất cả các thuật toán khác như tìm giao lộ và thay đổi một số trong số đó là cần thiết trong tất cả các thuật toán). –

+0

Tổng chiều dài giảm nhưng hữu hạn bởi vì nó ít nhất sẽ bằng không. –

+0

@MasoudM. Một heuristic hữu ích là tìm tất cả các xung đột trong mỗi bước và giải quyết chúng, sau đó lại tìm kiếm xung đột, Ngoài ra nếu bạn đọc các bài báo gợi ý của qq3, tất nhiên bạn sẽ nhận được câu trả lời tốt hơn. –

1

Sử dụng thuật toán này với thứ tự O (n):

Hungarian algorithm là một tối ưu hóa thuật toán tổ hợp rằng giải quyết vấn đề phân công trong thời gian đa thức.

Làm cách nào để trợ giúp? Vâng, nó sẽ tìm thấy chiều dài tích lũy tối thiểu. Nhưng ...

KHI LỚN TỔNG LÀ TỐI THIỂU, KHÔNG CÓ PHIẾU GIỮ.

Vì vậy, như @ QQ3 cho biết hạn chế ngã là không cần thiết và sau khi gỡ bỏ hạn chế này, nó có thể làm giảm đơn đặt hàng từ O (n!)-O (n).

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