Cân bằng trọng số của các cạnh trong đồ thị xương rồng


7

Cho một cây xương rồng , chúng tôi muốn cân các cạnh của nó theo cách mà

  1. Đối với mỗi đỉnh, tổng trọng số của các sự cố cạnh đối với đỉnh không quá 1.
  2. Tổng của tất cả các trọng số cạnh được tối đa hóa.

Rõ ràng câu trả lời không nhiều hơn cho n đỉnh ( \ sum d_i = 2D trong đó d_i là tổng của một đỉnh và D là tổng trên mỗi cạnh). Ràng buộc này có thể đạt được cho các đồ thị chu kỳ bằng cách cân mỗi cạnh 1/2.n2ndi=2DdiD

Tôi tìm thấy một thuật toán tham lam cho cây. Chỉ cần gán 1 cho các sự cố cạnh cho lá và loại bỏ chúng và hàng xóm của chúng khỏi biểu đồ trong các lần lặp lại. Điều này cắt tỉa cây xương rồng xuống một loạt các chu kỳ liên kết với nhau. Tại thời điểm này, tôi giả sử các chu kỳ còn lại không được liên kết với nhau và có trọng số mỗi cạnh 1/2. Điều này nhận được 9/10 trường hợp thử nghiệm, nhưng, tất nhiên, không đầy đủ.

Vì vậy, làm thế nào chúng ta có thể giải quyết vấn đề này cho xương rồng nói chung? Tôi muốn gợi ý cho các giải pháp đầy đủ, nhưng một trong hai là tốt.

Câu hỏi này liên quan đến một vấn đề từ InterviewStreet CompanySprint . Tôi đã thi đấu nhưng tôi muốn có một vài suy nghĩ về một vấn đề (các giải pháp không được đưa ra và tôi đã đập đầu vào tường về vấn đề này).


Có vẻ như điều này sẽ có thể được giải quyết với lưu lượng tối đa cho các ràng buộc dung lượng là 1 trên các đỉnh. Bạn (tôi) chỉ cần tìm cách thêm nguồn và chìm chính xác.
Nicholas Mancuso

Tôi nghĩ về điều đó nhưng không thể tìm thấy bất kỳ mạng nào hoạt động. Như sxu lưu ý, một giải pháp tốt gần như chắc chắn liên quan đến cấu trúc của đồ thị xương rồng. Tôi đang gặp khó khăn khi xem cách sử dụng nó để xây dựng mạng. Và việc tôi tìm ra giải pháp cho cây (ít nhất là tôi nghĩ là tôi đã làm; tôi chỉ phác thảo một bằng chứng cho sự tham lam mà tôi không bao gồm ở đây) đã đưa tôi ra khỏi tuyến đường LP.
loạn nhịp

Giáo sư. Rối não. Tôi hiểu ý của bạn bây giờ. Điều đó có vẻ hứa hẹn.
loạn nhịp

Linh cảm tiếp theo của tôi sẽ là gán trong đó là một đỉnh khớp nối (tham gia ít nhất 2 chu kỳ riêng biệt). Loại bỏ và các cạnh của nó, sau đó rửa sạch và lặp lại. Điều này cuối cùng sẽ để lại cho bạn với các thành phần hoàn toàn rời rạc. 1/divivi
Nicholas Mancuso

Vâng. Điều thú vị là với các chu kỳ có độ dài lẻ, bạn có thể thay thế các trọng số , , ..., và đi xung quanh cùng một . Điều đó cảm thấy tốt bằng trực giác, nhưng nó vẫn không phải là một giải pháp đầy đủ. 1/di11/din2
loạn nhịp

Câu trả lời:


5

Vì vậy, câu hỏi này đã làm phiền tôi: tại sao một cây xương rồng, nếu đã có một thuật toán thời gian tuyến tính cho một lớp tổng quát hơn?

Vấn đề nguyên thủy được gọi là vấn đề khớp phân số, và, không ngạc nhiên, nó cũng đã được nghiên cứu. Balinski (có kết quả được biết đến với tôi qua cuốn sách Tối ưu hóa kết hợp của Schrijver) đã mô tả các điểm cực trị của đa giác khớp phân đoạn là bao gồm một số nguyên cộng với một nửa tập hợp các chu kỳ lẻ. Với các giới hạn đầu vào tương đối thấp, tôi nghi ngờ rằng giải pháp dự định của người đặt vấn đề là sửa đổi thuật toán nở hoa của Edmonds theo cách mà bây giờ, tôi sẽ để bạn khám phá. Cấu trúc của các chu kỳ trong một cây xương rồng làm cho thuật toán này đủ đơn giản để phù hợp cho một cuộc thi.


Như sxu chỉ ra, vấn đề này phù hợp với lập trình tuyến tính. Nếu bạn chỉ cần giá trị mục tiêu, LP kép có cùng giá trị mục tiêu và là vấn đề bao trùm đỉnh phân đoạn. Điều hay ho của nắp đỉnh là nó có một nửa tối ưu tích phân; trong thời gian tuyến tính, bạn có thể sử dụng tìm kiếm theo chiều sâu để tính toán phân tách cây của cây xương rồng có chiều rộng O (1) và giải LP kép bằng một chương trình động thử các giá trị biến trong {0, 1/2, 1}.

Nếu bạn thực sự cần một giải pháp cho nguyên thủy, thì sự chậm chạp bổ sung có thể giúp ích, nhưng tôi không thể nghi ngờ rằng sự hạn chế đối với xương rồng được cho là cho phép một giải pháp cơ bản hơn.


1

Bạn luôn có thể sử dụng lập trình tuyến tính : chỉ cần tạo một biến cho mỗi cạnh và ràng buộc cho mỗi đỉnh. Tuy nhiên, phải có một giải pháp tốt hơn vì điều này không sử dụng thực tế là chúng ta có một biểu đồ xương rồng. Tôi cũng đề nghị chạy các thuật toán LP trên một vài ví dụ và thử xem có điều gì thú vị đang xảy ra trên biểu đồ xương rồng không nhưng trên biểu đồ chung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.