Algorytm Max-Cut, który nie powinien działać, nie wiadomo dlaczego

21

OK, może się to wydawać pytaniem o pracę domową iw pewnym sensie tak jest. Jako zadanie domowe w klasie algorytmów licencjackich podałem następujący klasyk:

Biorąc pod uwagę nieukierowany wykres , podaj algorytm, który znajdzie cięcie taki sposób, że , gdzie to liczba krawędzi przecinających cięcie. Złożoność czasowa musi wynosić .G=(V,E)(S,S¯)δ(S,S¯)|E|/2δ(S,S¯)O(V+E)

Z jakiegoś powodu mam wiele z następujących rozwiązań. Teraz zajmuje zbyt dużo czasu, więc nie jest to kwestia oceniania, ale zainteresowałem się. To „nie wydaje się” poprawne, ale wszystkie moje próby kontrprzykładów zakończyły się niepowodzeniem. Oto on:

  1. UstawS
  2. Niech będzie na wykresie wierzchołkiem o maksymalnym stopniuv
  3. Dodaj dovS
  4. Usuń wszystkie krawędzie sąsiadujące zv
  5. Jeśli wróć do 2δ(S,S¯)<|E|/2

Zauważ, że w kroku 5 odnosi się do oryginalnego wykresu. Zauważ też, że gdybyśmy pominęli krok 4, byłoby to oczywiście błędne (na przykład połączenie trójkąta z dwiema izolowanymi krawędziami).E

Teraz każdy prosty dowód ma następujący problem - być może podczas dodawania nowego wierzchołka faktycznie usuwamykrawędzie wycięcia podczas dodawania nowych ( nowych krawędzi (gdzie odnosi się do wykresu z usuniętymi krawędziami). Chodzi o to, że jeśli jest to szkodliwe dla naszej sprawy, oznacza to, że ten wierzchołek „kiedyś” miał coraz wyższy stopień, więc „powinien był zostać” wybrany wcześniej.| S | d ( v ) d ( v ) vv|S|d(v)d(v)v

Czy to dobrze znane algorytmy? Czy jest na to jakiś prosty kontrprzykład?

Yonatan
źródło
2
Wygląda podobnie do przybliżenia 2 dla osłony wierzchołków. Prawidłowy chciwy algorytm, jak sądzę, wybrałby wierzchołek z większą liczbą sąsiadów w tej części, to jest w drugiej części i przesuwał go, aż nie będzie takiego wierzchołka i nietrudno jest pokazać, że w tym momencie odpowiedź jest przynajmniej . Ale poprawność tego algorytmu zależy od tego, że: patrzymy na różnicę między liczbą sąsiadów dla wierzchołka po obu stronach cięcia, a nie tylko maksymalnym stopniem. Również właściwy algorytm przechodzi wierzchołków w obu kierunkach, a nie tylko z °° S do . |E|/2S¯S
Kaveh
3
@Kaveh Myślę, że OP zna algorytm, który opisujesz (przypisał go jako zadanie domowe). Jego pytanie brzmi, czy opisany algorytm osiąga jakieś przybliżenie.
Sasho Nikolov,
2
@ MohammadAl-Turkistany patrz komentarz Nikołowa.
Vb le
1
Zauważ też, że przybliżenie 16/17 jest trudne dla NP, a nie 1/2. GW podają przybliżenie ~ 0,878 przy użyciu SDP w swoim przełomowym artykule.
Yonatan,
1
@Yonatan Zobacz to pytanie cstheory.stackexchange.com/questions/3846/…
Mohammad Al-Turkistany,

Odpowiedzi:

13

Moje wcześniejsze roszczenie z nie uwzględnia cięcia wielkościn2/4już w wykresie. Wydaje się, że następująca konstrukcja (imperialnie - stworzyłem pytanie na stronie math.stackexchange.com w celu uzyskania dokładnego dowodu) wO(12c+6n2/4ułamek.O(1logc)

Algorytm źle działa na połączeniach kilku odłączonych, różnej wielkości kompletnych wykresów. Cały wykres na wierzchołkach oznaczamy jako K n . Rozważ zachowanie algorytmu na K n : wielokrotnie dodaje dowolny wierzchołek jeszcze w S do S - wszystkie takie wierzchołki są identyczne, więc kolejność nie ma znaczenia. Ustawienie liczby wierzchołków jeszcze nie dodanych do S przez algorytm | ˉ S | = k , wielkość nacięcia w tym momencie wynosi k ( n - k ) .nKnKnSSS|S¯|=kk(nk)

Zastanów się, co się stanie, jeśli uruchomimy algorytm na kilku odłączonych grafach ze stałymi x i między 0 a 1. Jeśli k i jest liczbą elementów, które nie są jeszcze w S na i- tym kompletnym grafie, algorytm będzie wielokrotnie dodawał wierzchołkiem do S z pełnego wykresu z najwyżej k I , łamiąc związki dowolnie. Będzie to wywoływać `okrągłe” uzupełnień opartych wierzchołków do S : algorytm dodaje wierzchołek ze wszystkich graf pełny o najwyższym k = k I , a następnie ze wszystkich graf pełny z kKxinxikiSiSkiSk=ki (zaktualizacją k i po poprzedniej rundzie) i tak dalej. Gdy pełny wykres ma dodany wierzchołek do S w rundzie, będzie to robił dla każdej rundy od tego momentu.ki=k1kiS

Niech będzie liczbą kompletnych wykresów. Niech 0 < x i1 z 0 i c - 1 będzie modyfikatorem wielkości dla i-tego pełnego wykresu. Zamawiamy te modyfikatory wielkości od dużych do małych i ustawiamy x 0 = 1 . Mamy teraz, że jeśli istnieją wykresy c z dokładnie k elementami, które nie zostały jeszcze dodane do S , wówczas wielkość nacięcia w tym czasie wynosi c - 1 i = 0 k (c0<xi10ic1ix0=1ckS . Całkowita liczba krawędzi wynosi | E | = c - 1 i = 0 x i n ( x i n - 1 )i=0c1k(xink)=kni=0c1(xi)ck2 .|E|=i=0c1xin(xin1)2n22i=0c1xi2

Zauważ, że jest funkcją kwadratową w k, a zatem ma maksimum. Dlatego będziemy mieli kilka lokalnych maksymalnych cięć. Na przykład, jeśli c = 1, nasze maksymalne cięcie wynosi k = nkni=0c1xick2kc=1 wielkościn2k=n2 . Mamy zamiar odebraćx1tak, żex1=1/2-ε, co oznacza drugi graf pełny nie będzie zmieniać rozmiar tego lokalnie maksymalnego cięcia przyk=nn24x1x1=1/2ε . Następnie dostać nowy lokalnie maksymalne cięcie przyk=3/8nk=n2 i tak możemy odebrać x 2 = 3 / 8 n - ε " (z ε , ε ' , ε " małych stałych). Będziemy ignorować ε s na chwilę i po prostu założyć możemy odebrać x 1 = 1 / 2 - powinniśmy zapewnić x 1 n = nk=3/8nεx2=3/8nεε,ε,εεx1=1/2, ale nie wpłynie to na końcowe wyniki, jeślinjest wystarczająco duże.x1n=n21n

Chcemy znaleźć lokalne maksima naszych cięć. Rozróżniamy do k , uzyskując n c - 1 i = 0 ( x i ) - 2 c k . Równanie 0 daje k = nkni=0c1(xi)ck2kni=0c1(xi)2ck0, co daje cięcie o rozmiarzen2k=n2ci=0c1xi.n24c(i=0c1xi)2

Pozwolić być k określona w poprzednim ustępie, jeżeli c ' = I . Zapewniamy, że formuła posiada żądając, że X i n < k I - wszystkie graf pełny i ' z I ' > i są wtedy mniejsze niż k í tego lokalnie maksymalnego cięcia, a tym samym nie zwiększają rozmiar cięcia. Oznacza to, że mamy c cięcia w tych k i, które są większe niż wszystkie inne cięcia znalezione przez algorytm.kikc=ixin<kiii>ikicki

Wypełniając , otrzymujemy rekurencję x i = 1xin<ki (plus niektóre małe ε ) przy x 0 = 1 . Rozwiązanie tego daje x i = ( 2 ixi=12ci=0c1xiεx0=1 :patrz moje pytanie na stronie math.stackexchange.comdotyczące pochodnej autorstwa @Daniela Fishera. Podłączając to don2xi=(2ii)4ii wykorzystanie naszego wglądu w nawrót daje nam cięcia o rozmiarzen2n24c(i=0c1xi)2. Korzystając zwłaściwości tego centralnego współczynnika dwumianowego, mamylimcc( ( 2 c n24c(2c(2cc)4c)2=n2c((2cc)4c)2 (zobacz takżemoje pytanie na stronie math.stackexchange.com).limcc((2cc)4c)2=1π

Liczba krawędzi wynosi około . Według znanych właściwościmamy1n22i=0c1xi2=n22i=0c1((2ii)4i)2 . Wpisanie daje co najmniejn214i(2ii)4i który jest asymptotycznien2n22i=0c1(14i)2=n28i=0c11ijakocidzie do nieskończoności.n28logcc

Mamy zatem jest asymptotycznie równy8δ(S,S¯)|E| jakocprzechodzi w nieskończoność, pokazując, że algorytm może zwracać cięcia, które są dowolnie małymi ułamkami| E| .8πlogcc|E|

Alex ten Brink
źródło
3
Z niewielkimi zmianami, twoja budowa daje . Ustalić ε i wybrać odpowiednio dużą N . Niech V = { 1 , , N } . Połącz co dwa wierzchołki w { 1 , , ε N } krawędzią; Następnie dodatkowo połączyć co dwa wierzchołki V wp ε ( n 2 / 2 ) = ε 2 n 2 . Algorytm znajduje cięcie, które tnie około ε1/4εNV={1,,N}{1,,εN}V . Całkowita liczba krawędzi wynosi w przybliżeniu ( ε n ) 2 / 2 + ε 2ε2(εn)2/2+ε2(n2/2)=ε2n2 krawędzie (do obniżenia warunki w kolejnościε2n2/4 ). ε
Yury,
Myślę, że przepiszę swoją odpowiedź, aby po prostu dołączyć końcowe wyniki (bardziej szczegółowo) wkrótce, ponieważ jest to teraz trochę bałagan.
Alex ten Brink
1
Odnośnie sumy , ponieważ każdyskładniktoΘ(1/(i+1)), suma jest szeregiem harmonicznym, który sumuje się doΘ(logc), i w sumie otrzymujemyΘ(n2logcn22i=0c1((2ii)4i)2Θ(1/(i+1))Θ(logc) . Θ(n2logc)
Yuval Filmus,
12

Po chwili namysłu i zadawania pytań, oto przykład, dzięki uprzejmości Ami Paz :

Niech będzie parzyste, a G będzie wykresem będącym sumą K n z dopasowaniem n +nGKn wierzchołków (to znaczy dopasowaniem z n / 2 + 1 krawędziami).n+2n/2+1

Jak działa algorytm na tym wykresie? Po prostu pobiera wierzchołki z części kliki w dowolnej kolejności. Po pobraniu wierzchołków z kliki nacięcie ma rozmiar k ( n - k ) . Jest to maksymalne dla k = n / 2 , co daje cięcie o rozmiarze n 2kk(nk)k=n/2 , podczas gdy liczba krawędzi na wykresie wynosin2n24.n22+1

Algorytm zgodnie z zaleceniami będzie kontynuował dodawanie wierzchołków z kliki, zmniejszając liczbę krawędzi przecinających nacięcie, aż pozostała z kliki będzie tylko pojedynczą krawędzią. W tym momencie nie może uzyskać niczego lepszego niż .n2+2

Yonatan
źródło
1
Niezły kontrprzykład.
Kaveh
wciąż jest bardzo blisko chociaż. dobrze byłoby zobaczyć przykład, w którym algorytm gorzej|E|/2
Sasho Nikolov