2012-04-17 11 views
16

Tôi gặp sự cố này. Tôi có một đồ thị của n nút mà tôi muốn chia thành hai subgraphs của các nút x và n-x tùy thuộc vào ràng buộc rằng số cạnh còn lại được tối đa hóa (hoặc giảm thiểu số cạnh được cắt).Lý thuyết đồ thị: Tách đồ thị

Không chắc liệu điều đó có hợp lý hay không. Không phải là một người lý thuyết đồ thị nhưng đây là phiên bản trừu tượng của vấn đề của tôi. Tôi nên xem xét thuật toán nào có thể giúp tôi?

Đây KHÔNG phải là vấn đề về bài tập về nhà. Vấn đề thú vị mặc dù tôi nghĩ!

tôi có kế hoạch thực hiện trong C.

+0

Là x tham số hay bạn chỉ đang tìm 2 biểu đồ phụ? Nếu x không phải là tham số, bạn sẽ không chỉ tìm nút có số cạnh tối thiểu và cắt nó ra khỏi biểu đồ? – brianestey

+0

vâng .. xin lỗi tôi nên làm điều đó rõ ràng hơn. Nói x là 10 và tổng số nút là 25. Tôi muốn hai đồ thị, một với 10 nút và một với 15 .. bằng cách "cắt" số cạnh ít nhất. – JoshDG

+0

Chắc chắn là một vấn đề thú vị. Trên thực tế giả định đầu tiên của tôi về việc tìm kiếm một nút duy nhất là sai - tôi đã đưa ra một biểu đồ không đúng. Chúc may mắn tìm một giải pháp! – brianestey

Trả lời

11

Trường hợp đặc biệt trong đó x = n - x được gọi là vấn đề chia nhỏ nhất và là NP-hard. Điều này làm cho vấn đề của bạn NP-cứng là tốt. Có một số chẩn đoán được mô tả trong bài viết trên graph partitioning trên Wikipedia, bao gồm tìm kiếm cục bộ (ví dụ, bắt đầu với một phép cắt ngẫu nhiên và lặp lại các cặp đỉnh làm giảm kích thước cắt) và phương pháp phổ (ví dụ: tính toán và ngưỡng đối tượng thứ hai) . Nếu n là nhỏ, lập trình số nguyên cũng là một khả năng.

+1

Đây là câu trả lời. –

+0

Yikes. Có lẽ quá tiên tiến cho một nhà khoa học không phải máy tính. Có thể tốt hơn là chỉ sử dụng thuật toán di truyền nếu x nhỏ? Chỉ cần lấy một nhóm các bộ ngẫu nhiên x = 10 và, trong trường hợp đồ thị được chia thành hai phần chính xác, hãy lấy 10% hàng đầu về cắt giảm tối thiểu và sau đó biến đổi chúng thành một loạt các thế hệ? Bạn có nghĩ rằng điều đó có hiệu quả không? Hoặc, nó phụ thuộc hoàn toàn vào tập dữ liệu. Tôi đoán tôi cũng có thể thử nó. – JoshDG

+0

Tìm kiếm địa phương khá dễ thực hiện: chỉ cần bắt đầu bằng cách cắt và cố gắng cải thiện nó bằng cách thực hiện các thay đổi nhỏ. Tính riêng của eigenvectors không quá tệ nhưng đòi hỏi một số kiến ​​thức toán học. Lập trình số nguyên là khó, nhưng có các thư viện miễn phí. Tôi không thích các thuật toán di truyền cho các vấn đề tổ hợp, nhưng chúng có thể tốt hơn tìm kiếm địa phương nếu bạn sẵn sàng ném đủ chu kỳ vào chúng. – uty

2

Có lẽ một tìm kiếm đầu tiên chiều sâu trên các nút. Chúng tôi chỉ định từng nút một và đếm số lần cắt cho đến giờ. Nếu con số đó vượt quá số của giải pháp tốt nhất, thì chúng tôi sẽ hủy bỏ số này và quay lại.

  1. Với tập hợp đầy đủ các nút S, chúng ta hãy P và P' được setsuts các nút, ban đầu trống rỗng, và K bằng số cạnh cắt, ban đầu 0.
  2. Hãy S *, K * là giải pháp nổi tiếng nhất và số lượng cạnh cắt của nó, với K * ban đầu vô cùng.
  3. Chọn một nút N để bắt đầu với và gán nó vào S.
  4. Đối với mỗi nút M unassigned:
    1. Gán M để S', và thêm số cạnh từ M đến các hạch trong S để K.
    2. Nếu K> K *, thì không có giải pháp nào dựa trên điều này sẽ đánh bại tốt nhất, vì vậy hãy chỉ định M cho S.
    3. Nếu | S | > X, thì tập hợp đã phát triển quá lớn; quay lại.
    4. Nếu không, recurse từ 4.
  5. Nếu tất cả các nút được giao và K < K *, sau đó cho phép S * = S và K * = K.

Tôi đã tưởng tượng này như một thuật toán kiểu Prolog, nhưng làm nó trong C không quá khó. Backtracking chỉ có nghĩa là bỏ gán nút được gán cuối cùng.

0

về cơ bản bạn đang xem xét phiên bản sửa đổi của sự cố cắt nhỏ.

Một cách để sửa đổi karger's algorythm Trong bản đồ của Karger, bạn hợp đồng các đỉnh dọc theo các cạnh ngẫu nhiên cho đến khi bạn kết thúc với chỉ hai đỉnh, các cạnh còn lại thể hiện vết cắt. Vì nó là ngẫu nhiên bạn chỉ cần làm điều này nhiều lần và giữ cho các giải pháp với các cạnh ít nhất trong cắt.

Trong phiên bản sửa đổi khi một đỉnh đã được thu gọn x lần bạn có thể ngừng thu gọn và đếm các cạnh đi (đây sẽ là vết cắt trong trường hợp của bạn), hãy thực hiện một lượng thời gian phù hợp và bạn có giải pháp. Phần khó khăn là tìm ra số lần lặp lại các phép tính để tăng độ tin cậy lên một giới hạn thỏa đáng

+0

Các sự cố cắt nhỏ không được cố định 'x' [số đỉnh ở một bên của đường cắt] và có' nguồn' và 'sink' cụ thể. Nếu bạn có suy nghĩ về vấn đề cắt nhỏ - hãy thêm nó vào câu trả lời của bạn. – amit

+0

Tôi nghĩ rằng một số loại sửa đổi để Karger có thể giải quyết vấn đề này. Không có bồn rửa và nguồn trong các vấn đề cắt giảm tối thiểu cho mỗi lần, nó chỉ là một số algorythms làm giảm vấn đề với một dòng chảy tối đa. Tôi sẽ chỉnh sửa câu trả lời nếu tôi có thể đưa ra một sửa đổi tốt cho karger xử lý trường hợp x cố định (có một cách rõ ràng, nhưng không chắc chắn nó cho kết quả chính xác) – AntonioD