Pokrycie zbioru

by Jerry Sky



Zobrazowanie

Problem pokrycia zbioru (set cover) można zobrazować na przykładzie planowania budowy szkół. Powiedzmy, że mamy zbiór wiosek BB, w których chcemy zbudować szkoły dla okolicznej młodzieży. Musimy przestrzegać następujących założeń:

  1. każda szkoła musi być w wiosce
  2. odległość, którą muszą przebyć uczniowie do szkoły nie może być większa niż np. 10km.

Celem jest rozmieszczenie szkół w wioskach, aby wszystkie osoby chodzące do szkoły miały ją w odległości nie większej niż ustalona oraz aby wybudować minimalną liczbę szkół. Jeśli dla każdej wioski xBx \in B zdefiniujemy podzbiór wiosek SxBS_x \subset B będących w odległości mniejszej niż ustalona od xx to możemy powiedzieć, że wybudowanie szkoły w wiosce xx pokrywa osoby z wiosek należących do zbioru SxS_x.

Formalna definicja

Input: Zbiór BB oraz jego podzbiory S1,,SmBS_1,\dots,S_m \subset B

Output: Wybór podzbiorów pokrywających zbiór BB, czyli iISi=B\bigcup_{i\in I}S_i = B, gdzie II jest zbiorem indeksów

Koszt: I|I| – liczba wybranych podzbiorów

Zależy nam na tym, aby koszt wyborów podzbiorów był jak najmniejszy.

Algorytm

Zauważmy, że zachłanne rozwiązanie samo się tutaj nasuwa:

GreedySetCover(B,S1,,Sm)(B, S_1,\dots,S_m):

  1. repeat until BB nie jest całe pokryte:
    1. wybierz zbiór SiS_i, który zawiera najwięcej niepokrytych elementów

Przykład do algorytmu

Zobaczmy, jak to naturalne rozwiązanie sprawdza się w praktyce. Wróćmy do naszego przykładu budowy szkół w wioskach. Powiedzmy, że mamy dwunastoelementowy zbiór wiosek: A,B,C,D,E,F,G,H,I,J,K,LA,B,C,D,E,F,G,H,I,J,K,L. Łączymy ze sobą te wioski, które są oddalone od siebie o mniej niż ustalona wartość:

example

Zatem: SA={A,B,C,D}SB={A,B,C,D,E}SC={A,B,C,D,E}SD={A,B,C,D,E}SE={B,C,D,E,F,I}SF={E,F,G,H}SG={F,G,H}SH={F,G,H}SI={E,I,J,K}SJ={I,J,K,L}SK={I,J,K,L}SL={J,K,L} S_A = \{A, B, C, D\}\\ S_B = \{A, B, C, D, E\}\\ S_C = \{A, B, C, D, E\}\\ S_D = \{A, B, C, D, E\}\\ S_E = \{B, C, D, E, F, I\}\\ S_F = \{E, F, G, H\}\\ S_G = \{F, G, H\}\\ S_H = \{F, G, H\}\\ S_I = \{E, I, J, K\}\\ S_J = \{I, J, K, L\}\\ S_K = \{I, J, K, L\}\\ S_L = \{J, K, L\}

górne rozwiązanie (uzyskane w sposób zachłanny) o koszcie 44 to SA,SE,SG,SLS_A,S_E,S_G,S_L, a dolne rozwiązanie o koszcie 33 (rozwiązanie optymalne) to SC,SH,SKS_C,S_H,S_K.

Widzimy zatem, że rozwiązanie zachłanne nie musi dawać nam optymalnego rozwiązania. Na szczęście okazuje się, że jesteśmy w stanie ograniczyć odległość rozwiązania zachłannego od optymalnego w zadowalający sposób.

Twierdzenie #1

Załóżmy, że B=n|B| = n, a optymalne rozwiązanie pokrycia zbioru ma koszt kk. Wówczas zachłanny algorytm zwróci rozwiązanie o koszcie co najwyżej klnnk\ln n.

D-d Twierdzenia #1

Niech ntn_t będzie liczbą niepokrytych elementów zbioru BB po tt iteracjach pętli algorytmu zachłannego (n0=n)(n_0 = n). Skoro niepokryte elementy da się pokryć optymalnymi kk zbiorami to musi istnieć zbiór mający co najmniej ntk\frac{n_t}{k} niepokrytych elementów. Zatem możemy ograniczyć wielkość nt+1n_{t+1} przez nt+1ntntk=nt(11k). n_{t+1} \le n_t - \frac{n_t}{k} = n_t \left( 1 - \frac{1}{k} \right).

Powtarzając ten argument uzyskujemy ograniczenie: ntn0(11k)t. n_t \le n_0 \left( 1 - \frac{1}{k} \right)^t.

Użyjmy znanego ograniczenia xR{0}:1x<ex\forall x \in \mathbb{R} \setminus \{0\}: 1 - x < e^{-x}, które daje nam: nt<netk. n_t < ne^{-\frac{t}{k}}.

Zauważmy, że dla T=klnnT = k\ln n dostajemy nT<nelnn=1n_T < ne^{-\ln n} = 1, co oznacza, że po klnnk\ln n krokach algorytm zachłanny pokryje wszystkie elementy zbioru wejściowego.

Final remarks

Algorytm zachłanny rozwiązujący problem pokrycia zbioru należy do klasy algorytmów aproksymujących (czyli niekoniecznie zwracających optymalne rozwiązanie), a stosunek rozwiązania otrzymanego przy pomocy algorytmu aproksymacyjnego przez rozwiązanie algorytmu optymalnego nazywamy approximation factor. Powyższy algorytm zachłanny dla problemu pokrycia zbioru ma approximation factor równy lnnln n. Innymi metodami można pokazać również, że nie istnieje algorytm wielomianowy mający mniejszy approximation factor.

More