Jak podzielić zestaw na określoną liczbę rozłącznych podzbiorów pod pewnymi warunkami?

11

Dostaję zestaw , liczbę całkowitą s \ leqslant k i nieujemne liczby całkowite a_ {ij} . Mój problem polega na znalezieniu s podzbiory rozłączne S_j z \ {1, \ ldots, k \} takie, że:A{1,,k}skaijsSj{1,,k}

  1. j=1sSj=A ; i
  2. |Sj|aij dla wszystkich iSj i j=1,,s .

Jak rozwiązać ten problem? Czy trudno jest znaleźć realne rozwiązanie?

Myślę, że nie jest łatwo rozwiązać problem, ponieważ próbowałem procedury, która zaczyna się od jakiegoś j{1,,n} i przypisuje i{1,,k} aż do liczby z i przypisanych do j są większe niż aij dla niektórych przypisanych i . Ale to nie jest poprawne, ponieważ mogłem zostawić część i , której nie można przypisać do żadnego j (z powodu ich aij które nie mogą być spełnione).

Metoda brutalnej siły, gdy muszę wygenerować wszystkie podzbiory A i przetestować każdy z nich, działa dla mnie ( k=8,n=3 ), ale jest bardzo nieefektywna.

drzbir
źródło
Sprawdź, czy edycja odpowiada pytaniu, które chcesz zadać. Ponadto, skąd pochodzi ? Czy jest to stała stała (nie jest częścią danych wejściowych, ale stała przez cały czas), czy jest to część danych wejściowych? Wreszcie szukasz praktycznego rozwiązania? czy szukasz teoretycznej złożoności tego problemu? Jeśli to pierwsze, czy próbowałeś używać programowania liniowego liczb całkowitych? amax
DW

Odpowiedzi:

10

Problem ten jest trudny do wyeliminowania przez NP w porównaniu z osłoną wierzchołków.

W zadaniu Pokrycia wierzchołków otrzymujemy wykres i liczbę , a naszym zadaniem jest ustalenie, czy istnieje jakiś podzbiór co najwyżej wierzchołków od tak że każda krawędź w jest padająca co najmniej jednego wierzchołka w . (Równoważnie: Czy można zabić każdą krawędź w poprzez usunięcie co najwyżej wierzchołków?)r U r V E U GG=(V,E)rUrVEUGr

Po pierwsze, podział do rozłącznych podzbiorów jest równoważna przypisując każdy element w dokładnie jeden z możliwych etykiet. Podstawową ideą redukcji jest utworzenie etykiety dla każdego wierzchołka w i „umożliwienie” przypisania każdej krawędzi tylko jednej z dwóch etykiet odpowiadających jej punktom końcowym, w następującym znaczeniu: przypisanie krawędzi odpowiadającej etykieta nie wprowadza (prawdziwego) ograniczenia co do innych krawędzi, którym można przypisać tę samą etykietę, a przypisanie krawędzi do nie odpowiadającej etykiecie zapobiega przypisaniu tej samej etykiecie innej krawędzi - co oczywiście powoduje zwiększenie liczby wymagane odrębne etykiety.s A s S j v j VAsAsSjvjV

Aby zbudować instancję problemu z instancji programu Vertex Cover:( G , r )(A,a,s)(G,r)

  1. Ustaw naI tworzyć element w do każdej krawędzi w . (Te pary można traktować jako liczby całkowite ; zrobi to każdy bijection między nimi).| E |k|E|A v i v j E 1 , , k(i,j)AvivjE1,,k
  2. Ustaw najeśli lub ; w przeciwnym razie ustaw na 1.a(b,c),dd = b d = c a ( b , c ) , d|E|d=bd=ca(b,c),d
  3. Ustaw .s=r

Jeśli jest instancją YES dla Cover Vertex, łatwo zauważyć, że właśnie skonstruowana instancja twojego problemu jest również instancją YES: wystarczy wybrać etykiety odpowiadające wierzchołkom w dowolnym rozwiązaniu , i dla każdej krawędzi przypisz odpowiedni element którakolwiek z etykiet lub została wybrana (wybierz dowolnie, jeśli obie etykiety zostały wybrane). To rozwiązanie wykorzystuje podzbiory i jest poprawne, ponieważ jedynymi obowiązującymi są odpowiednieS j v j U v b v cE ( b , c ) (G,r)SjvjUvbvcES b S c s a i j | E |(b,c)ASbScsaijetykiety, które mają (nie) efekt zapobiegania więcej niżkrawędzie mają przypisaną tę samą etykietę.|E|

Pozostaje pokazać, że wystąpienie YES twojego problemu oznacza, że ​​oryginał jest wystąpieniem YES okładki wierzchołka. Jest to nieco bardziej skomplikowana, ponieważ ważnego rozwiązania na mogą w przypisaniu krawędź dla etykiety -corresponding , czyli , co oznacza, że nie może niekoniecznie „odczytać” prawidłową pokrywy wierzchołków z ważnego rozwiązania .( G , r ) Y XX=(A,a,s)(G,r)YXS m m { i , j } U Y(i,j)Smm{i,j}UY

Jednakże, przypisywanie innego niż odpowiednie etykiety ma wysoki koszt, który znacznie ogranicza struktury rozwiązania: gdy krawędź jest przypisana taka etykieta z , fakt że zapewnia, że ​​musi to być jedyna krawędź, której przypisano tę etykietę. Tak więc w każdym rozwiązaniu zawierającym taką nieoznaczoną krawędź , moglibyśmy skonstruować alternatywne rozwiązanie w następujący sposób:S m m { i , j } a ( i ,(i,j)Smm{i,j}Y(i,j) S m Y a(i,j),m=1Y(i,j)SmY

  1. Dowolnie wybierz nową etykietę dla jako lub . ( i , j ) S i S jSz(i,j)SiSj
  2. Przypisz tę nową etykietę. Jeśli skutkuje to nieprawidłowym rozwiązaniem, musi to być spowodowane tym, że dokładnie jedna inna krawędź , została już przypisana do etykiety . W takim przypadku ustaw i przejdź do kroku 1.( i , j ) z { i , j } S z ( i , j ) = ( i , j )(i,j)(i,j)z{i,j}Sz(i,j)=(i,j)

Powyższy algorytm musi zakończyć się na jeden z dwóch sposobów: albo zostanie znaleziona nowa etykieta która nie wprowadza sprzeczności, albo zostanie znaleziony pełny cykl wierzchołków. W pierwszym przypadku znaleziono prawidłowe nowe rozwiązanie z zestawami , podczas gdy w drugim przypadku znaleziono prawidłowe nowe rozwiązanie z zestawami ; w obu przypadkach stworzyliśmy nowe, poprawne rozwiązanie z co najmniej jedną dodatkową krawędzią przypisaną do odpowiedniej etykiety. Po powtórzeniu całego tego procesu najwyżejrazy, stworzymy prawidłowe rozwiązanie z którego można odczytać rozwiązanie pierwotnego problemu z pokrywą wierzchołków . s - 1 s | E | Y Szs1s|E|Y

Ta konstrukcja jest wyraźnie czasem wielomianowym, więc wynika z tego, że twój problem jest trudny do NP.

j_random_hacker
źródło
Dziękuję za pomoc Czy masz pojęcie, jak można (w przybliżeniu) rozwiązać ten problem? (Na przykład, czy mogę zastosować techniki rozwiązania problemu z pokrywą wierzchołków, aby go rozwiązać?) Próbowałem jakiegoś chciwego podejścia, ale czasami nie daje to możliwego rozwiązania. (Sposób, w jaki wybrałem sprawia, że ​​zachłanne podejście kończy się niepowodzeniem tam, gdzie mogłoby istnieć rozwiązanie.)Sj
drzbir
Oczekuje się, że zachłanne podejście czasami nie da możliwego rozwiązania, ponieważ gdyby zawsze tak było, rozwiązywałbyś trudny NP problem w czasie wielodniowym ;-) Pamiętaj, że niekoniecznie jest źle, jeśli nie może znaleźć rozwiązanie: być może nie istnieje żadne realne rozwiązanie.
j_random_hacker
Jeśli chodzi o techniki rozwiązania, to, co lubię, nazywa się wyszukiwaniem wiązki. Jest to w zasadzie rodzaj odgałęzienia, który „zapomina” wystarczająco złe częściowe rozwiązania, aby ograniczyć wykorzystanie pamięci. (B & B jest bardzo dobrym podejściem i czasami rozwiązuje problemy szybko, i jest nieco prostsze niż wyszukiwanie wiązką, więc warto
spróbować
(Wszystkie poniższe informacje dotyczą również wyszukiwania wiązki oraz B & B.) B & B to bardzo ogólna technika. Kluczową kwestią jest wykorzystanie specyfiki problemu w celu uporządkowania podejmowanych decyzji, tak aby w miarę możliwości podejmować złe decyzje (tj. Decyzje, które nie prowadzą do wykonalnych rozwiązań) na wczesnym etapie drzewa wyszukiwania. (Te decyzje będą gdzieś podejmowane , a każdy poziom, w którym zostaną wykonane, podwoi liczbę razy , kiedy zostaną podjęte). Dla twojego problemu sugerowałbym najpierw uszeregować elementy w w malejącej kolejności „zła”, gdzie. ..A
j_random_hacker
... The zło elementu może być, na przykład, minimum nad wszystkimi , łamiąc więzi według drugiego minimum, a następnie trzeciego minimum, itd. Z grubsza rzecz biorąc, „najgorszy” elementem będzie elementem co najsilniej ogranicza zestaw, do którego jest dodawany. W każdym węźle na głębokości w drzewie wyszukiwania będziesz mieć częściowe rozwiązanie, w którym pierwsze (a zatem „najgorsze”) elementy zostały już przypisane do zbiorów; musisz wybrać, który z zestawów przypisać th elementowi, to znaczy, że będziesz potrzebował do połączeń rekurencyjnych. („Do”, bo mam nadzieję, że mamy…a i j j d d n ( d + 1 ) niaijjddn(d+1)n
j_random_hacker