2010-02-07 22 views
11

Với 2N-điểm trong một 2D mặt phẳng, bạn phải nhóm chúng thành N cặp sao cho tổng tổng thể của khoảng cách giữa các điểm của tất cả các cặp là có thể tối thiểu giá trị. Đầu ra mong muốn chỉ là tổng.tổng nhỏ nhất của các cặp

Nói cách khác, nếu a1, a2, .. một là khoảng cách giữa các điểm của cặp nhất, nhì ... và thứ n tương ứng, sau đó (a1 + a2 + ... an) tối thiểu phải đạt .

Chúng ta hãy xem xét thử trường hợp này, nếu 2 * 5 điểm là: {20,20}, { 40, 20}, { 10, 10}, { 2, 2 }, {240, 6}, {12, 12}, {100, 120}, {6, 48}, {12, 18}, {0, 0}

Các mong muốn đầu ra là .

Đây không phải là bài tập về nhà của tôi, tôi tò mò về các cách tiếp cận khác nhau hơn là sức mạnh vũ phu.

+0

Điều này được gọi là vấn đề người bán hàng du lịch. –

+0

Không, điều đó khác với TSP. Nhưng nhìn vào TSP có thể là một điểm tốt để bắt đầu. –

+0

@Doc Brown: Hãy khai sáng cho tôi :) –

Trả lời

7

Dường như bạn đang tìm kiếm Minimum weight perfect matching.

Có các thuật toán để khai thác thực tế rằng đây là những điểm trong mặt phẳng. Bài báo này: Mincost Perfect Matching in the Plane có một thuật toán và cũng đề cập đến một số công việc trước đó trên đó.


Khi được yêu cầu, đây là mô tả ngắn gọn về thuật toán "đơn giản" cho đối sánh tối thiểu có trọng số tối ưu trong biểu đồ. Đây là một bản tóm tắt ngắn về các phần của chương về kết hợp có trọng số trong sách Tối ưu hóa kết hợp, Thuật toán và Độ phức tạp bởi Papadimitriou & Steiglitz.

Giả sử bạn được cung cấp biểu đồ không có trọng số G (với số lượng nút bằng nhau). Biểu đồ có thể được coi là biểu đồ có trọng số hoàn chỉnh, bằng cách thêm các cạnh bị thiếu và gán cho chúng trọng số rất lớn.

Giả sử các đỉnh được dán nhãn 1 đến n và trọng số cạnh giữa các đỉnh i và j là c (i, j).

Chúng ta có n (n-1)/2 biến x (i, j) biểu thị sự khớp với G. x (i, j) = 1 nếu cạnh giữa i và j nằm trong khớp và x (i, j) = 0 nếu không.

Bây giờ vấn đề phù hợp có thể được viết như các vấn đề Lập trình tuyến tính:

giảm thiểu Sum c (i, j) * x (i, j)

tùy thuộc vào điều kiện là

Tổng x (1, j) = 1, trong đó j dao động từ 1 đến n.

Tổng x (2, j) = 1, trong đó j dao động từ 1 đến n. . . .

Tổng x (n, j) = 1, trong đó j dao động từ 1 đến n.

(Sum x (1, j) = 1 về cơ bản có nghĩa là chúng ta đang lựa chọn chính xác một sự cố mép đỉnh nhãn 1.)

Và điều kiện cuối cùng mà

x (i, j)> = 0

(chúng ta có thể nói x (i, j) = 0 hoặc 1, nhưng điều đó sẽ không làm cho này một Lập trình vấn đề tuyến tính như những hạn chế là một trong hai phương trình tuyến tính hoặc bất bình đẳng)

Có một phương pháp được gọi là phương pháp Simplex có thể giải quyết vấn đề Lập trình tuyến tính này để đưa ra một giải pháp tối ưu trong thời gian đa thức về số lượng các biến. Bây giờ, nếu G là bipartite, nó có thể được hiển thị rằng chúng ta có thể có được một giải pháp tối ưu sao cho x (i, j) = 0 hoặc 1. Do đó bằng cách giải quyết vấn đề lập trình tuyến tính này cho một đồ thị hai bên, chúng ta có được một thiết lập các nhiệm vụ cho mỗi x (i, j), mỗi là 0 hoặc 1. Bây giờ chúng ta có thể có được một kết hợp bằng cách chọn các cạnh (i, j) mà x (i, j) = 1. Các ràng buộc đảm bảo rằng nó sẽ phù hợp với trọng lượng nhỏ nhất.

Thật không may, điều này không đúng đối với đồ thị chung (tức là x (i, j) là 0 hoặc 1). Edmonds đã tìm ra rằng điều này là do sự hiện diện của các chu kỳ kỳ lạ trong biểu đồ.

Vì vậy, ngoài các contraints trên, Edmonds thêm các hạn chế bổ sung mà trong bất kỳ tập hợp con của các đỉnh của kích thước 2k + 1 (tức là kích thước lẻ), số cạnh phù hợp là không quá k

liệt kê mỗi tập con lẻ của các đỉnh để lấy danh sách các bộ S (1), S (2), ..., S (2^n - n). Hãy kích thước của S (r) là 2 * s (r) + 1.

Sau đó, những hạn chế trên là, đối với mỗi tập S (r)

Sum x (i, j) + y (r) = s (r), đối với i, j trong S (r).

Edmonds sau đó chứng minh rằng điều này là đủ để đảm bảo rằng mỗi x (i, j) là 0 hoặc 1, do đó cho chúng ta một trọng lượng tối thiểu phù hợp hoàn hảo.

Thật không may, bây giờ số lượng biến đã trở thành theo cấp số nhân. Vì vậy, các thuật toán simplex, nếu chỉ chạy trên này như nó được, sẽ dẫn đến một thuật toán thời gian mũ.

Để vượt qua điều này, Edmonds xem xét vấn đề lập trình tuyến tính kép (tôi sẽ không đi sâu vào chi tiết ở đây), và cho thấy thuật toán nhị phân kép khi chạy trên hệ thống chỉ mất các bước O (n^4) để đạt được một giải pháp, do đó cho chúng ta một thuật toán thời gian đa thức! Ông cho thấy điều này bằng cách chỉ ra rằng tại hầu hết O (n) của y (r) là khác không ở bất kỳ bước nào của thuật toán (mà ông gọi là hoa).

Đây là liên kết nên giải thích chi tiết hơn một chút: http://www.cs.ucl.ac.uk/staff/V.Kolmogorov/papers/blossom5.pdf, Phần 2.

Cuốn sách tôi đã đề cập trước đây đáng đọc (mặc dù nó có thể hơi khô) để hiểu sâu hơn.

Phew. Hy vọng rằng sẽ giúp!


+0

Có lẽ không hoàn toàn ... nhiệm vụ ở đây là hình học, không dựa trên đồ thị. Bạn có nhiều tự do hơn mà không có sự hạn chế đó mà tất cả mọi thứ phải được đóng gói thành một đồ thị. –

+0

Bạn có thể giải thích với một số trường hợp thử nghiệm không? –

+0

Tôi? Vâng, 2N điểm trong máy bay 2d là giống như có một đồ thị 2N hoàn chỉnh, và đó là sẽ ăn lên rất nhiều bộ nhớ! –

1

Khoản tiền cuối cùng của bạn chủ yếu sẽ bị chi phối bởi khoản phụ lục lớn nhất. Thuật toán đơn giản nhất để khai thác này có thể đi như thế này (tôi không thể chứng minh điều này):

  1. điểm sắp xếp giảm dần theo khoảng cách gần nhất, người hàng xóm của họ
  2. hình thức cặp nhập đầu tiên và hàng xóm gần nhất
  3. remove cặp từ danh sách
  4. nếu danh sách không trống goto 1.

Điều này sẽ hoạt động rất thường xuyên.

Vì bạn về cơ bản đang tìm kiếm thuật toán phân cụm cho các cụm 2 this link hoặc tìm kiếm clustering algorithms for jet reconstruction có thể thú vị. Những người trong cộng đồng vật lý hạt thử nghiệm đang nghiên cứu các thuật toán heuristic cho những vấn đề như thế này.

+0

-1.Như tôi đã viết cho Hamish, một bản ngã tham lam như bạn đánh giá thấp sự khó khăn của vấn đề. Và có một cái nhìn ngắn để liên kết của bạn, họ dường như chỉ theo một hướng hoàn toàn sai. –

+0

@Doc Tôi không nói điều này sẽ luôn hoạt động, và btw thuật toán của Harmish bắt đầu với cặp gần nhất. Có lẽ bạn có một cái gì đó trong tâm trí mà luôn luôn hoạt động (tôi sẽ được quan tâm) –

+0

@ honk: Tôi nghĩ rằng (bên cạnh các giải pháp rõ ràng 'brute force') các liên kết được đưa ra bởi Moron chứa các thuật toán hợp lệ. Họ chỉ là khó đọc cho các nhà toán học phi và có lẽ không dễ dàng để thực hiện. –

0

Sau khi googling một lúc, tôi tìm thấy một số tham chiếu khác để tối thiểu trọng lượng phù hợp hoàn hảo thuật toán có thể dễ hiểu hơn (ít nhất, dễ dàng hơn ở một mức độ nhất định).

EDIT

Here I found a python implementation của một trong các thuật toán đó. Nó có 837 dòng mã (+ một số bài kiểm tra đơn vị bổ sung), và tôi đã không tự mình thử. Nhưng có lẽ bạn có thể sử dụng nó cho trường hợp của bạn.

Here is a link tới thuật toán xấp xỉ cho sự cố. Tất nhiên, phong cách của bài báo cũng là toán học, nhưng IMHO dễ hiểu hơn nhiều so với bài báo của Cook và Rohe. Và nó nói trong lời nói đầu của nó rằng nó nhằm mục đích chính xác cho mục đích để dễ thực hiện hơn thuật toán gốc của Edmond, vì bạn không cần một bộ giải mã lập trình tuyến tính.

EDIT2:

Sau khi suy nghĩ một thời gian về vấn đề này, IMHO nó phải có khả năng thiết lập một tìm kiếm A* để giải quyết vấn đề này. Không gian tìm kiếm ở đây là tập hợp các 'kết hợp một phần' (hoặc bộ điểm được ghép nối một phần). Như Moron đã viết trong các bình luận của mình, người ta có thể hạn chế việc tìm kiếm tình huống mà không có cặp nào với việc kết nối các đường dây tồn tại. Hàm chi phí đường dẫn (để sử dụng các thuật ngữ từ Wikipedia) là tổng của khoảng cách của các điểm đã ghép nối. Chức năng heuristic h(x) có thể là bất kỳ ước lượng thấp cho khoảng cách còn lại, ví dụ, khi bạn có 2M điểm không được ghép nối cho đến nay, lấy tổng của khoảng cách tối thiểu M giữa tất cả các điểm còn lại.

Điều đó có thể sẽ không hiệu quả như thuật toán mà Moron chỉ ra, nhưng tôi nghi ngờ nó sẽ tốt hơn nhiều so với 'lực lượng vũ phu' và dễ thực hiện hơn nhiều.

+0

Liên kết đầu tiên bạn đưa ra có thuật toán xấp xỉ. –

+0

Ups, bạn nói đúng, tôi bỏ qua điều đó ngay từ cái nhìn đầu tiên. Tôi sẽ chỉnh sửa câu trả lời của tôi một cách thích hợp. –

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