2016-08-15 42 views
7

Więc natknąłem się na problem w świecie rzeczywistym, który wygląda tak: mamy listę par, które musimy podzielić na grupy. Chcemy zminimalizować liczbę grup, które mamy w sumie, z ograniczeniem, że dowolny członek grupy nie może współużytkować elementu z żadnym innym członkiem grupy.Grupa krotek tak, że każdy element w grupie nie ma wspólnych elementów z innymi członkami.

Oto przykład. Nasza lista krotek to (A, B), (B, C), (C, A), (D, E), (F, G). Możemy utworzyć trzy grupy wykonując [(A, B), (D, E), (F, G)], [(B, C)], [(C, A)].

Czy możliwe jest optymalne rozwiązanie tego problemu w czasie wielomianowym? Jak złe jest to chciwe rozwiązanie? Możliwe, że został przedstawiony jako inny problem, ale nie jestem w stanie wymyślić, jak zredukować go do czegoś innego (przypuszcza się kolorowanie graficzne).

+1

Czy możesz opublikować dłuższy przykład lub podać rozmiar rzeczywistego wejścia? Czy mogą istnieć zduplikowane krotki? Czy oczekujesz, że każdy element pojawi się mniej więcej tyle samo razy? – m69

+0

Rozmiar wejścia mieści się w przedziale 20-60 (pary).Nie ma powtarzających się krotek, tj. Jeśli (A, B) jest w zbiorze, nie ma innych (A, B) lub (B, A). Nie posiadam żadnej wiedzy dystrybucyjnej na temat poszczególnych elementów (choć w praktyce podejrzewam, że niektóre elementy pojawiają się częściej niż inne, nie wiem, że tak jest w przypadku problemu - jeśli jest jakaś probabilistyczna wiedza na temat problemu daje lepsze średnie rozwiązanie problemu, daj mi znać, a ja mogę spróbować go dostarczyć). –

+0

Z grubsza, ile różnych liter (lub cokolwiek one reprezentują) ma dane wejściowe? Czy próbowałeś [przybliżenie minimalnego rozmiaru wierzchołka] (https://pl.wikipedia.org/wiki/Vertex_cover#Approximate_evaluation) swoich wykresów i ich [grafów dopełniających] (https: //en.wikipedia. org/wiki/Complement_graph)? Czy próbowałeś [przybliżając szerokość drzewa] (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.29.7198&rep=rep1&type=pdf) swoich wykresów? –

Odpowiedz

6

Problem opisany jako edge-coloring problem: masz wykres, w którym każda pozycja krotki jest węzłem, a krawędzie są podawane przez krotki. Grupowanie krotek w grupy odpowiada zatem znajdowaniu grup krawędzi, które nie współdzielą punktów końcowych (dopasowań), którym można przypisać ten sam kolor przy kolorowaniu krawędzi. Innymi słowy, każde zabarwienie krawędzi daje skupienie, a każde grupowanie daje kolorystykę krawędzi. Niestety, jest to NP - trudno znaleźć najlepszą kolorystykę krawędzi, więc Twoim problemem jest ogólnie NP -hard. Istnieją algorytmy aproksymacyjne dla tego problemu, które dają przybliżenia w postaci stałego współczynnika, ale chyba że nie ma dokładnego algorytmu.

Jeśli uogólnisz ten problem, aby pozwolić na dowolną liczbę elementów na krotkę, wtedy problem ten staje się o wiele trudniejszy. Ogólną wersją tego problemu jest rzeczywiście NP - trudne i bardzo trudne do przybliżenia, poprzez zmniejszenie kolorystyki wykresu. Pokażę przykład redukcji w konkretnej sprawie, ale generalizuje ona całkiem ładnie.

Biorąc pod uwagę wykres podobny do tego:

A -- B -- C 
| | | 
D -- E -- F 

Będziemy tworzyć zbiór krotek, po jednej dla każdego węzła, gdzie każdy wpis w krotka jest zbiorem krawędzi przyległych do tego węzła. Na przykład, w powyższym wykresie, chcemy tworzyć te krotki:

(AB, AD) 
(AB, BC, BE) 
(CB, CF) 
(AD, DE) 
(BE, DE, EF) 
(CF, EF) 

Teraz wyobraź sobie, że dwa z tych krotek nie pokrywają się. Oznacza to, że dwa węzły odpowiadające tym krotkom nie mogą przylegać, ponieważ gdyby były, krawędź między nimi byłaby wspólnym elementem w krotkach, a zatem nie mogłyby być skupione. Z drugiej strony, jeśli dwa węzły nie sąsiadują ze sobą, wówczas ich krotki mogą być zgrupowane w tym samym skupisku, ponieważ w drugiej nie będzie widoczna krawędź w jednej krotce.

Biorąc pod uwagę tę konfigurację, dowolna kolorystyka oryginalnego wykresu daje sposób grupowania krotek (wszystkie krotki dla węzłów o tym samym kolorze w tym samym zestawie, żadne z nich nie sąsiadują ze sobą, więc nie powodują konfliktu), i dowolny sposób grupowania krotek daje kolorowanie (kolor wszystkie węzły odpowiadające każdej krotce w klastrze tego samego koloru). Dlatego znalezienie minimalnej liczby klastrów odpowiada znalezieniu liczby chromatycznej oryginalnego wykresu, która jest NP - trudna i nieznana, aby przyjąć jakiekolwiek algorytmy aproksymacyjne, które uzyskałyby wartość zbliżoną do rzeczywistej.

+0

Widzę tutaj potencjalny problem. Krotki wydają się być rzeczywiście ograniczone do par (OP używa słowa "para" przed "krotką" - co prawda niejednoznaczne), więc nie sądzę, że można zakodować * zbiór * krawędzi incydentów węzła w * single * tuple w taki sposób, że 2 krotki nakładają się na siebie, a ich odpowiednie węzły mają wspólną krawędź. Myślę, że możesz zakodować ten zestaw za pomocą * wielu * krotek, ale wtedy nie jest oczywiste (przynajmniej dla mnie), jak przejść od skupiska krotek do kolorowania, ponieważ krotki odpowiadające wierzchołkowi mogą być rozmieszczone w kilku klastrach. –

+0

@j_random_hacker Zauważyłem to również ... po tym, jak to napisałem. :-) Edycja, aby wspomnieć kolorowanie krawędzi u góry, powinna dokładniej uwzględniać ten fakt i nadal określa twardość NP. – templatetypedef

+0

Przepraszam za to. Powinienem to sobie uświadomić i ograniczyć do jednego lub drugiego. W praktyce problemem jest po prostu patrzenie na pary elementów. –