Maksymalne grafy planarne
This commit is contained in:
parent
329d1e57de
commit
8b47f59936
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@
|
||||
*.pdf
|
||||
*.log
|
||||
*.fdb_latexmk
|
||||
*.dvi
|
||||
|
150
2011.01.18.tex
Normal file
150
2011.01.18.tex
Normal file
@ -0,0 +1,150 @@
|
||||
%! TEX root = main.tex
|
||||
|
||||
\section{18.01.2011 kolokwium \#2}
|
||||
|
||||
\task{
|
||||
\textit{Problem Optymalnego Rozkroju} (\problem{POR}) zdefiniowany jest następująco ,,Dany jest arkusz blachy o wymiarach
|
||||
$d \times sz$ oraz różne wielokąty wypukłe, które należy wykroić z tego arkusza. Czy można wybrać podzbiór
|
||||
tych wielokątów i tak zaplanowac to wykrajanie aby odpady blachy były zerowe?'' W oparciu o problem \textit{Sumy Podzbioru} (\problem{SP})
|
||||
udowodnij, że $\problem{POR} \in \NPC$
|
||||
}
|
||||
|
||||
\solution
|
||||
Tak jak w poprzednio, aby udowodnić, że problem należy do klasy \NP, powinniśmy sprawdzić czy jesteśmy w stanie sprawdzić poprawność rozwiązania
|
||||
w czasie wielomianowym. Jeżeli za certyfikat przyjmiemy wielokąty w postaciu listy punktów i krawędzi to sprawdzenia można dokonać
|
||||
w czasie wielomianowym - wystarczy sprawdzić, że żaden wierzchołek nie znajduje się w żadnym innym wielokącie a suma pól wielokątów
|
||||
jest równa $sz \times d$. Obie te operacje są wykonywalne w czasie wielomianowym.
|
||||
|
||||
W zadaniu excplicite zostało podane, że musimy zredukować problem \textit{Sumy Podzbioru} do naszego problemu \problem{POR}, i faktycznie wybór ten jest nieprzypadkowy.
|
||||
Na wstępie przypomnijmy: problem \textit{Sumy Podzbioru} to pytanie ,,Czy w danym (multi)zbiorze $A$ istnieje podzbiór $B$ ($B \subseteq A$) taki, że suma elementów $B$ jest równa $n$?''.
|
||||
Naszkicujmy schemat $\alpha$-redukcji dla tego problemu.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/sp-por.tex}
|
||||
\caption{Schemat $\alpha$-redukcji z \problem{SP} do \problem{POR}, gdzie $W$ to zbiór wielokątów.}
|
||||
\end{figure}
|
||||
|
||||
Wyobraźmy sobie problem \problem{SP} jako problem \problem{POR} tylko w jednym wymiarze - mamy odcinki różnej długości,
|
||||
pytanie brzmi czy jesteśmy z nich w stanie skonstruować odcinek o długości dokładnie $l$?
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/por-1.tex}
|
||||
\caption{W tym wypadku multizbiór $A = \{ 1, 3, 2, 5, 4, 2, 1 \}$, a poszukiwana długość $n = 6$}
|
||||
\end{figure}
|
||||
|
||||
Podejście takie powinno być dość intuicyjne i proste do wyprowadzenia. Aby przelożyć problem na 2 wymiary wystarczy, że
|
||||
rozpatrzymy prostokąty o stałej szerokości równej szerokości blachy, i zmiennej długości.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/por-2.tex}
|
||||
\caption{Ten sam multizbiór przedstawiony w formie problemu w 2 wymiarach.}
|
||||
\end{figure}
|
||||
|
||||
Dla uproszeczenia, załóżmy że nasza długość $d = 1$, w takim wypadadku aby przekstałcić zbiór $A$ musimy utworzyć prostokąty o wymiarach $a_1 \times 1$, $a_2 \times 1$, itd.
|
||||
Czyli z $\alpha$-redukcji utrzymalibyśmy następujące parametry: $W = \text{wygenerowane prostokąty}$, $sz = n$, $d = 1$. Jak dowiedliśmy powyżej, takie przekształcenie zachowuje problem.
|
||||
\taskend
|
||||
|
||||
\task{
|
||||
Problem \textit{Ważonego Pokrycia Wierzchołkowego} (\problem{WPW}) zdefiniowany jest następująco: ,,Dany jest graf $G_w$ z obciążonymi
|
||||
wierzchołkami (tj. wierzchołki mają wagi) oraz próg $p$; czy w $G_w$ istnieje pokrycie wierzchołkowe o łącznej wadze $\leq p$.
|
||||
Udowodnij, że $\problem{WPW} \in \NPC$
|
||||
}
|
||||
|
||||
\solution
|
||||
Tak jak zwykle, zacznijmy od udowodnienia, że problem w istocie należy do klasy $\NP$. Potrzebujemy więc jakiegoś certyfikatu, który
|
||||
mógłby potwierdzić, że odpowiedź na to pytanie jest poprawna - w tym wypadku oczywistym zdaje się być lista wierzchołków $V$ stanowiących to pokrycie.
|
||||
Sprawdzenia czy ich suma ich wag faktycznie jest mniejsza niż $p$ jest do wykonania w czasie liniowym. Aby sprawdzić pokrycie faktycznie
|
||||
pokrywa wszystkie krawędzie wystarczy przeiterować po wszystkich wierzchołkach usuwając z grafu krawędzie zawierające ten wierzchołek, co jest wykonywalne
|
||||
w czasie $O(m \cdot n)$. Jeżeli po tych operacjach uzyskamy graf pusty - to odpowiedź była poprawna.
|
||||
|
||||
Nie będzie zaskoczeniem, że najbliższym problemem który możemy zredukowac do \problem{WPW} będzie problem \textit{Pokrycia Wierzchołkowego} (\problem{PW}).
|
||||
Problem \problem{WPW} jest w zasadzie uogólnionym problemem \problem{PW}. Na ogół redukcja problemów szczegółowych do uogólnionych jest dużo
|
||||
łatwiejsza niż problemów ze sobą niepowiąznych bądź przypadku ogólnego do szczególnego.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/pw-wpw.tex}
|
||||
\caption{Schemat $\alpha$-redukcji z problemu \problem{PW} do \problem{WPW}}
|
||||
\end{figure}
|
||||
|
||||
\begin{minipage}{.5\linewidth}%
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/wpw-1.tex}
|
||||
\caption{Przykładowy graf nieważony $G$}
|
||||
\end{figure}
|
||||
\end{minipage}%
|
||||
\begin{minipage}{.5\linewidth}%
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/wpw-2.tex}
|
||||
\caption{Przykładowy graf ważony $G_W$}
|
||||
\end{figure}
|
||||
\end{minipage}
|
||||
\\\\
|
||||
|
||||
Można powiedzieć, że - w pewnym sensie - w grafie nieważonym wszystkie wierzchołki są równie ważne, a w grafie ważonym niektóre są ważniejsze.
|
||||
Biorąc pod uwagę to podejście aby uzyskać graf ważony z grafu nieważonego o podobnych właściwościach należy wszystkim wierzchołkom nadać te samą
|
||||
wagę $w$. Przy takim podejsciu, jeżeli w grafie $G$ pokrycie stanowiło $n$ wierzchołków, to w grafie $G_W$ takie samo pokrycie będzie miało
|
||||
łączną wagę $p = n \cdot w$ a $n = \frac{p}{w}$. Dla uproszczenia możemy przyjąć, że $w = 1$ i wtedy uzyskamy $p = n$.
|
||||
|
||||
Przypisania wagi do wierzchołków możemy dokonać w czasie liniowym, wyliczenie $p$ jest w zasadzie darmowe. Ponieważ uzyskaliśmy, że dla tak skonstruowanego
|
||||
grafu $p = n$ mamy pewność, że taka $\alpha$-redukcja zachowuje problem.
|
||||
\taskend
|
||||
|
||||
\task{Graf planarny jest maksymalny, gdy dodanie jakiejkolwiek krawędzi łączącej niesąsiednie wierzchołki psuje jego
|
||||
planarność. \textit{Maksymalny Graf Planarny} (\textbf{MGP}) jest 3-barwny wtedy, gdy jest eulerowski.}
|
||||
\subtask{Narysuj \textbf{MGP} o 5 wierzchołkach i pokoloruj go optymalnie.}
|
||||
\subtask{Narysuj \textbf{MGP} o 6 wierzchołkach i pokoloruj go optymalnie.}
|
||||
\subtask{Przyjmując, że \textbf{MGP} dany jest w postaci macierzy sąsiedztwa wierzchołków, naszkicuj algorytm dla
|
||||
wyznaczania jego liczby chromatycznej i oszacuj jego złożonosć przy użyciu symbolu $\Theta$}
|
||||
|
||||
\solution
|
||||
Przypomnijmy - graf planarny to graf, w którym nie istnieją przecinające się krawędzie. Naszym zadaniem jest narysować
|
||||
taki graf planarny że ma 5 lub 6 wierzchołków oraz dodanie krawędzi niszczyłoby planarność. Najprostrzym podejściem jest
|
||||
narysowanie graf pustego (tj. wierzchołków tak jakbyśmy chcieli rysować wielokąt foremny) i dorysowywać kolejno:
|
||||
|
||||
\begin{enumerate}[a)]
|
||||
\item Cykl łączący wszystkie wierzchołki
|
||||
\item W środku powstałego wielokąta łączymy niepołączone wierzchołki "zygzakiem"
|
||||
\item Pozostałe wierzchołki łączymy na zewnątrz.
|
||||
\end{enumerate}
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/mgp-5.tex}
|
||||
\caption{Kolejne etapy rosyowania grafu planarengo o 5 wierzchołkach}
|
||||
\end{figure}
|
||||
|
||||
Analogicznie możemy postąpić dla grafu o 6 wierzchołkach, uzyskując:
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/mgp-6.tex}
|
||||
\caption{Kolejne etapy rosyowania grafu planarengo o 6 wierzchołkach}
|
||||
\end{figure}
|
||||
|
||||
\begin{shortcut}
|
||||
Twierdzenie Kuratowskiego mówi nam, że graf jest planarny wtedy i tylko wtedy kiedy nie zawiera podgrafu $K_5$
|
||||
i $K_{3,3}$ (dwudzielnego 3 na 3).
|
||||
|
||||
\begin{column}{.5}%
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/k3-3.tex}
|
||||
\caption{Przykładowy graf nieważony $G$}
|
||||
\end{figure}
|
||||
\end{column}%
|
||||
\begin{column}{.5}%
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/k5.tex}
|
||||
\caption{Przykładowy graf ważony $G_W$}
|
||||
\end{figure}
|
||||
\end{column}
|
||||
|
||||
Pasuje nam to idealnie do zadania, ponieważ $K_5$ ma 5 wierzchołków a $K_{3,3}$ 6.
|
||||
Wystarczy zatem z $K_5$ usunąć krawędź, a z $K_{3,3}$ usunąć jedną krawędź i dodawac nowe póki jest planarny.
|
||||
\end{shortcut}
|
186
2013.01.26.tex
186
2013.01.26.tex
@ -1,18 +1,17 @@
|
||||
\section{26.01.2013 kolokwium \#2}
|
||||
|
||||
\task{Alicja i Bogdan wybrali się na zakupy. Przy kasie okazało się, że muszą zapłacić równo 100 zł, a kasa nie zwraca reszty. W portfelu mają: $a_1$ monet 1-złotowych, $a_2$ monet 2-złotowych i analogicznie dla nominałów 5, 10, 20, 50, gdzie $a_i \geq 0$. Zastanawiają sie, czy z posiadanych monet mogą uzbierać dokładnie 100 zł.}
|
||||
\task{Alicja i Bogdan wybrali się na zakupy. Przy kasie okazało się, że muszą zapłacić równo 100 zł, a kasa nie zwraca reszty. W portfelu mają: $a_1$ monet 1-złotowych, $a_2$ monet 2-złotowych i analogicznie dla nominałów 5, 10, 20, 50, gdzie $a_i \geq 0$. Zastanawiają się, czy z posiadanych monet mogą uzbierać dokładnie 100 zł.}
|
||||
|
||||
\subtask{Spróbuj zaprojektować algorytm wielomianowy dla tego problemu decyzyjnego}
|
||||
\subtask{Jeśli nie potrafisz, to spróbuj udowodnić jego NP-zupełność}
|
||||
|
||||
\solution
|
||||
Przy rozwiązywaniu tego zadania, jedną z pierwszych myśli może byc, że jest to problem zbliżony
|
||||
Przy rozwiązywaniu tego zadania, jedną z pierwszych myśli może być, że jest to problem zbliżony
|
||||
do problemu sumy podzbioru - i jest to prawdą, jest to specyficzny wypadek problemu sumy podzbioru.
|
||||
|
||||
Zauważmy jednak, że do dyspozycji mamy tylko i wyłącznie 6 wartości: 1, 2, 5, 10, 20, 50 oraz,
|
||||
że pojemność naszego "plecaka" jest zawsze stała i wynosi 100. Łatwo zauważyc, że istnieją bardzo
|
||||
proste przypadki, które rozwiązują nasz problem. Przykładowo, jeżeli mamy 2 bankonoty 50zł to
|
||||
jesteśmy w stanie zapłacić 100zł bez problemu, tak samo mają 5 banknotów 20zł czy nawet 100 złotówek.
|
||||
Zauważmy jednak, że do dyspozycji mamy tylko i wyłącznie 6 wartości: 1, 2, 5, 10, 20, 50 oraz, że $n$ jest stałe i wynosi $100$.
|
||||
Łatwo zauważyć, że istnieją bardzo proste przypadki, które rozwiązują nasz problem. Przykładowo, jeżeli mamy 2 bankonoty 50zł to
|
||||
jesteśmy w stanie zapłacić 100zł bez problemu, tak samo mając 5 banknotów 20zł czy nawet 100 złotówek.
|
||||
|
||||
\begin{table}[H]
|
||||
\begin{tabular}{rrrrrr}
|
||||
@ -27,19 +26,31 @@ jesteśmy w stanie zapłacić 100zł bez problemu, tak samo mają 5 banknotów 2
|
||||
\caption{Możliwe kombinacje tworzące 100zł}
|
||||
\end{table}
|
||||
|
||||
Stąd wynika, że istnieje jedynie skończona ilość kombinacji którymi możemy utworzyć 100zł - wystarczy zatem sprawdzić je wszystkie, a to można wykonac zawsze w tym samym czasie - uzyskany algorytm jest $O(1)$.
|
||||
Stąd wynika, że istnieje jedynie skończona ilość kombinacji, którymi możemy utworzyć 100zł. Wystarczy zatem sprawdzić
|
||||
je wszystkie, a to można wykonac zawsze w tym samym czasie - uzyskany algorytm jest $O(1)$.
|
||||
\taskend
|
||||
|
||||
\task{Ty masz graf 100-wierzchołkowy $G$ zapisany w postaci macierzy sąsiedztwa $A(G)$ i bardzo Ci zależy na tym aby stwierdzić, czy $G$ zawiera klikę $K_{10}$ lub większą. Ja mam program, który rozwiązuje Twój problem, ale tylko wtedy kiedy na wejście poda się mu macierz sąsiedztwa grafu niehamiltonowskiego. Jak przerobisz macierz $A(G)$ byś mógł skorzystać z mojego programu? Zaprojektuj taki program i oszacuj jego złożoność.}
|
||||
\task{
|
||||
Ty masz graf 100-wierzchołkowy $G$ zapisany w postaci macierzy sąsiedztwa $A(G)$ i bardzo Ci zależy na tym,
|
||||
aby stwierdzić, czy $G$ zawiera klikę $K_{10}$ lub większą. Ja mam program, który rozwiązuje Twój problem, ale tylko
|
||||
wtedy kiedy na wejście poda się mu macierz sąsiedztwa grafu niehamiltonowskiego. Jak przerobisz macierz $A(G)$
|
||||
byś mógł skorzystać z mojego programu? Zaprojektuj taki program i oszacuj jego złożoność.
|
||||
}
|
||||
|
||||
\solution
|
||||
Nasz graf $G$ może być w zasadzie dowolnym grafem 100-wierzchołkowym, nie wiemy nic o tym czy jest hamiltonowski czy nie.
|
||||
Do dyspozycji mamy program, który jest w stanie odpowiedzieć na nasze pytanie, ale tylko jeżeli graf \textbf{nie} jest hamiltonowski. Potrzebujemy zatem sposobu na przetworzenie naszego grafu $G$ tak, aby nie miał szans byc hamiltonowski - jednak to przekształcenie nie może wpływać na odpowiedź na nasze pytanie.
|
||||
Nasz graf $G$ może być w zasadzie dowolnym grafem 100-wierzchołkowym, w szczególności nie wiemy nic o tym czy jest
|
||||
hamiltonowski czy nie. Do dyspozycji mamy program, który jest w stanie odpowiedzieć na nasze pytanie,
|
||||
ale tylko jeżeli graf \textbf{nie} jest hamiltonowski. Potrzebujemy zatem sposobu na przetworzenie naszego grafu $G$ tak,
|
||||
aby nie miał szans być hamiltonowski - jednak to przekształcenie nie może wpływać na odpowiedź na nasze pytanie.
|
||||
|
||||
Na wstępie przypomnijmy, że graf hamiltonowski to taki, w którym istnieje cykl pozwalający przejść po
|
||||
wszystkich wierzchołkach dokładnie raz. Co znaczy, że każdy graf hamiltonowski musi być przedewszystkim grafem spójnym.
|
||||
Co za tym idzie, jeżeli przekształcimy nasz graf G w taki sposób, że nie będzie spójny to będziemy mieli pewność że nie będzie hamiltonowski.
|
||||
wszystkich wierzchołkach dokładnie raz. Co znaczy, że każdy graf hamiltonowski musi być przede wszystkim grafem spójnym.
|
||||
Co za tym idzie, jeżeli przekształcimy nasz graf G w taki sposób, że nie będzie spójny to będziemy mieli pewność,
|
||||
że nie będzie hamiltonowski.
|
||||
|
||||
Nie możemy usuwać ani dodawać krawędzi między wierzchołkami naszego grafu $G$ ponieważ mogłoby to wpłynąć na istnienie w nim kliki - najprostszym rozwiązaniem będzie więc dodanie zupełnie nowego wierzchołka, nazwijmy go $v_{101}$, który nie jest połączony z żadnym innym.
|
||||
Nie możemy usuwać ani dodawać krawędzi między wierzchołkami naszego grafu $G$, ponieważ mogłoby to wpłynąć na istnienie
|
||||
w nim kliki - najprostszym rozwiązaniem będzie więc dodanie zupełnie nowego wierzchołka, nazwijmy go $v_{101}$,
|
||||
który nie jest połączony z żadnym innym.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
@ -47,43 +58,82 @@ Nie możemy usuwać ani dodawać krawędzi między wierzchołkami naszego grafu
|
||||
\caption{Transformacja w graf niehamiltonowski}
|
||||
\end{figure}
|
||||
|
||||
Dodanie jednego swobodnego wierzchołka nie wpłynie na istnienie kliki $K_{10}$ bądź większej ponieważ jeden wierzchołek nie wystarczy na utworzenie kliki a nie dodajemy żadnych krawedzi, które mogłyby doprowadzic do tego, że klika nagle powstała.
|
||||
Dodanie jednego swobodnego wierzchołka nie wpłynie na istnienie kliki $K_{10}$ bądź większej ponieważ jeden wierzchołek
|
||||
nie wystarczy na utworzenie kliki, a nie dodajemy żadnych krawedzi, które mogłyby doprowadzić do tego, że klika nagle powstała.
|
||||
|
||||
Innym możliwym rozwiązaniem jest dodanie wierzchołka połączonego z tylko jednym wierzchołkiem - jedyny sposób aby się do niego dostać będzie przez 1 wierzchołek, a żeby przejść dalej będziemy musieli się cofnąć do wierzchołka, w którym już byliśmy.
|
||||
Innym możliwym rozwiązaniem jest dodanie wierzchołka połączonego z tylko jednym wierzchołkiem - jedyny sposób aby się
|
||||
do niego dostać będzie przez 1 wierzchołek, a żeby przejść dalej będziemy musieli się cofnąć do wierzchołka, w którym już byliśmy.
|
||||
|
||||
Jeżeli zaś chodzi o złożoność, to ważnym jest, że graf jest podany w formie macierzy sąsiedstwa, czyli aby dodać wierzchołek musimy do macierzy dodać 1 wiersz i 1 kolumnę - czyli w zasadzie utworzyć nową macierz. Operacja ta wymaga utworzenia $(n+1) \times (n+1)$ komórek, czyli teoretycznie jej złożoność to $O(n^2)$ jednak biorąc pod uwagę, że dla grafu $G$ z definicji $n = 100$ możemy powiedzieć, że operacja ta dla każdego takiego grafu G jest do wykonania w czasie stałym, czyli $O(1)$ - obie odpowiedzi będą poprawne.
|
||||
Jeżeli zaś chodzi o złożoność, to ważnym jest, że graf jest podany w formie macierzy sąsiedztwa, czyli aby dodać
|
||||
wierzchołek musimy do macierzy dodać 1 wiersz i 1 kolumnę - czyli w zasadzie utworzyć nową macierz. Operacja ta wymaga
|
||||
utworzenia $(n+1) \times (n+1)$ komórek, czyli teoretycznie jej złożoność to $O(n^2)$ jednak biorąc pod uwagę, że dla
|
||||
grafu $G$ z definicji $n = 100$ możemy powiedzieć, że operacja ta dla każdego takiego grafu G jest do wykonania w czasie
|
||||
stałym, czyli $O(1)$ - obie odpowiedzi będą poprawne.
|
||||
\taskend
|
||||
|
||||
\task{\textit{OGRANICZONY PROBLEM KLIKI} - \texttt{OPK} - zdefiniowany jest następująco: ``Dany jest graf $G$ i liczby naturalne $a$, $b$ takie, że $a \leq b$, czy w $G$ istnieje klika o rozmiarze $r$ taka, że $a \leq r \leq b$?,,. Pokaż, że:}
|
||||
\task{\textit{OGRANICZONY PROBLEM KLIKI} - \texttt{OPK} - zdefiniowany jest następująco: ``Dany jest graf $G$ i liczby
|
||||
naturalne $a$, $b$ takie, że $a \leq b$, czy w $G$ istnieje klika o rozmiarze $r$ taka, że $a \leq r \leq b$?,,. Pokaż, że:}
|
||||
\subtask{$\mathtt{OPK} \in \mathtt{NP}$}
|
||||
\subtask{$\mathtt{OPK} \in \mathtt{NPC}$}
|
||||
|
||||
\solution
|
||||
Aby udowodnić, że dany problem należy do klasy \NP należy zrobić jedną z dwóch rzeczy - przedstawić niedeterministyczny algorytm rozwiązujący ten problem w czasie wielomianowym, bądź zaprezentować wielomianowy algorytm sprawdzający rozwiązanie tego problemu. Moim zdaniem, podejście drugie jest o wiele łatwiejsze i przyjemniejsze - zatem to właśnie je zaprezentuję.
|
||||
Aby udowodnić, że dany problem należy do klasy \NP należy zrobić jedną z dwóch rzeczy - przedstawić niedeterministyczny
|
||||
algorytm rozwiązujący ten problem w czasie wielomianowym, bądź zaprezentować wielomianowy algorytm sprawdzający
|
||||
rozwiązanie tego problemu. Moim zdaniem, podejście drugie jest o wiele łatwiejsze i przyjemniejsze - zatem to właśnie
|
||||
je zaprezentuję i będę wykorzystywał.
|
||||
|
||||
Aby sprawdzić rozwiązanie, potrzebujemy więcej informacji niż proste \textbf{tak} lub \textbf{nie} - taką dodatkową informację nazywamy \textit{certyfikatem}, przykładowo w wypadku pytania, czy liczba $n$ jest złożona, certyfikatem mogą byc dwie liczby $p$ i $q$ takie, że $n = p \cdot q$ - mając taki certyfikat łatwo jest potwierdzić, że faktycznie liczba jest złożona.
|
||||
Aby sprawdzić rozwiązanie, potrzebujemy więcej informacji niż proste \textbf{tak} lub \textbf{nie} - taką dodatkową
|
||||
informację nazywamy \textit{certyfikatem}, przykładowo w wypadku pytania, czy liczba $n$ jest złożona, certyfikatem mogą
|
||||
być dwie liczby $p$ i $q$ takie, że $n = p \cdot q$ - mając taki certyfikat łatwo jest potwierdzić, że faktycznie
|
||||
liczba jest złożona.
|
||||
|
||||
W naszym wypadku certyfikatem może być lista wierzchołków tworząca klikę $K_n$. Określenie $r$ będzie wymagało sprawdzenia długosci listy, co z pewnością można wykonać w czasie wielomianowym, a sprawdzenie czy wierzchołki tworzą klikę będzie wymagało sprawdzenia czy faktycznie każdy wierzchołek sąsiaduje z każdym innym wierzchołkiem z listy - co tez można wykonać w czasie wielomianowym. Stąd wynika, że problem należy do klasy \NP
|
||||
W naszym wypadku certyfikatem może być lista wierzchołków tworząca klikę $K_n$. Określenie $r$ będzie wymagało
|
||||
sprawdzenia długości listy, co z pewnością można wykonać w czasie wielomianowym, a sprawdzenie czy wierzchołki tworzą
|
||||
klikę będzie wymagało sprawdzenia czy faktycznie każdy wierzchołek sąsiaduje z każdym innym wierzchołkiem z listy - co
|
||||
też można wykonać w czasie wielomianowym. Stąd wynika, że problem należy do klasy \NP.
|
||||
|
||||
Dowód, że problem należy do \NPC jest trochę trudniejszy do przeprowadzenia - należy mianowicie wykonać $\alpha$-redukcję jakiegoś problemu, który wiemy że jest \NPC do problemu, który badamy. Naturalnym kandydatem tutaj wydaje się być problem kliki:
|
||||
Dowód, że problem należy do \NPC jest trochę trudniejszy do przeprowadzenia - należy mianowicie wykonać
|
||||
$\alpha$-redukcję jakiegoś problemu, który wiemy że jest \NPC do problemu, który badamy. Naturalnym kandydatem tutaj
|
||||
wydaje się być problem kliki:
|
||||
``Czy w grafie $G$ istnieje klika wielkości $n$?,,
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{./gfx/klika-opk.tex}
|
||||
\caption{schemat $\alpha$-redukcji kliki do OPK}
|
||||
\caption{schemat $\alpha$-redukcji \problem{kliki} do \problem{OPK}}
|
||||
\end{figure}
|
||||
|
||||
Aby dokonac $\alpha$-redukcji musimy w wielomianowym czasie na podstawie danych $G, n$ znaleźć takie $G_1, a, b$ aby rozwiązując problem \texttt{OPK} uzyskac odpowiedź na problem kliki. Wiemy, że \texttt{OPK} zwróci nam prawdę jeżeli w grafie $G_1$ będzie klika o rozmiarze $r$ takim, że $a \leq r \leq b$. Jeżeli chcemy znaleźć klikę konkretnego rozmiaru, wystarczy zauważyć, że jeżeli $a = b \land A \leq r \leq b$ to $a = b = r$. Nasza $\alpha$-redukcja mogłaby zatem wyglądać następująco: $G_1 = G, a = n, b = n$. Co z pewnością możemy dokonać w czasie wielomianowym. Fakt, że takie podstawienie zachowuje problem udowodniliśmy już powyżej.
|
||||
Aby dokonać $\alpha$-redukcji musimy w wielomianowym czasie na podstawie danych $G, n$ znaleźć takie $G_1, a, b$ aby
|
||||
rozwiązując problem \problem{OPK} uzyskać odpowiedź na problem kliki. Wiemy, że \problem{OPK} zwróci nam prawdę jeżeli
|
||||
w grafie $G_1$ będzie klika o rozmiarze $r$ takim, że $a \leq r \leq b$. Jeżeli chcemy znaleźć klikę konkretnego
|
||||
rozmiaru, wystarczy zauważyć, że jeżeli $a = b \land A \leq r \leq b$ to $a = b = r$. Nasza $\alpha$-redukcja mogłaby
|
||||
zatem wyglądać następująco: $G_1 = G, a = n, b = n$. Co z pewnością możemy dokonać w czasie wielomianowym. Fakt, że
|
||||
takie podstawienie zachowuje problem udowodniliśmy już powyżej.
|
||||
\taskend
|
||||
|
||||
\task{\textit{Problem zanurzenia} (\problem{PZ}) grafu w innym grafie zdefiniowany jest następująco. Dane są dwa grafy: $(G, H)$, gdzie $G$ jest \textit{gościem} a $H$ - \textit{gospodarzem}. Czy istnieje takie odwzorowanie wierzchołków $f: V(G) \to V(H)$, że każdej krawędzi $\{u, v\} \in G$ odpowiada krawędź $\{f(u), f(v)\} \in H$? Pokaż, że PZ jest problemem NP-zupełnym.}
|
||||
\task{\textit{Problem zanurzenia} (\problem{PZ}) grafu w innym grafie zdefiniowany jest następująco. Dane są dwa grafy:
|
||||
$(G, H)$, gdzie $G$ jest \textit{gościem} a $H$ - \textit{gospodarzem}. Czy istnieje takie odwzorowanie wierzchołków
|
||||
$f: V(G) \to V(H)$, że każdej krawędzi $\{u, v\} \in G$ odpowiada krawędź $\{f(u), f(v)\} \in H$? Pokaż, że PZ jest
|
||||
problemem NP-zupełnym.}
|
||||
|
||||
\solution
|
||||
Przed dowiedzeniem, że problem jest \NPC najpierw musimy udowodnić, że w ogóle znajduje się w klasie \NP. Po raz kolejny wykorzystamy tutaj podejscie z certyfikatem, w tym wypadku będzie nim funkcja $f$. Nie rozważamy tutaj tego jak trudno jest wyliczyć na komputerze wynik działania funkcji $f$, zatem zakłdamy, że $f = O(1)$. Przetworzenie wszystkich krawędzi mozna zatem wykonać w czasie $O(m(G))$, aby sprawdzić czy krawędź istnieje w grafie $H$ w najgorszym wypadku musimy przejrzeć wszystkie krawędzie - co daje nam czas $O(m(H))$, ponieważ dla każdej przetworzonej krawędzi w $G$ musimy sprawdzić jej istnienie w $H$ to w najgorszym wypadku uzyskamy czas $O(m(H) \cdot m(G))$ - czyli wielomianowy.
|
||||
Przed dowiedzeniem, że problem jest \NPC najpierw musimy udowodnić, że w ogóle znajduje się w klasie \NP. Po raz
|
||||
kolejny wykorzystamy tutaj podejście z certyfikatem, w tym wypadku będzie nim funkcja $f$. Nie rozważamy tutaj tego
|
||||
jak trudno jest wyliczyć na komputerze wynik działania funkcji $f$, zatem zakładamy, że $f = O(1)$. Przetworzenie
|
||||
wszystkich krawędzi można zatem wykonać w czasie $O(m(G))$. Aby sprawdzić czy krawędź istnieje w grafie $H$ w
|
||||
najgorszym wypadku musimy przejrzeć wszystkie krawędzie - co daje nam czas $O(m(H))$, ponieważ dla każdej przetworzonej
|
||||
krawędzi w $G$ musimy sprawdzić jej istnienie w $H$ to w najgorszym wypadku uzyskamy czas
|
||||
$O(m(H) \cdot m(G))$ - czyli wielomianowy.
|
||||
|
||||
Aby udowodnić, że \problem{PZ} jest \NPC musimy znaleźć $\alpha$-redukcje jakiegoś innego, najlepiej zbliżonego problemu do \problem{PZ}. Na początek zauważmy, że $f$ musi być funkcją różnowartościową, ponieważ gdyby nie była, to istniałyby takie $u_1 \neq u_2$, że $f(u_1) = f(u_2) = v$, co dawałoby nieistniejącą krawędź $\{ v, v \}$ (tj. wierzchołek byłby połączony z samym sobą).
|
||||
Gdybyśmy natomiast rozpatrywali grafy, mogące zawierać takie pętle własne, to problem dla takich grafów oraz funkcji nieróżnowartościowej stawałby się trywialny wystarczyłoby zmapować wszystkie wierzchołki na ten jeden z pętlą własną i taka funkcja istniałaby zawsze.
|
||||
Aby udowodnić, że \problem{PZ} jest \NPC musimy znaleźć $\alpha$-redukcje jakiegoś innego, najlepiej zbliżonego
|
||||
problemu do \problem{PZ}. Na początek zauważmy, że $f$ musi być funkcją różnowartościową, ponieważ gdyby nie była, to
|
||||
istniałyby takie $u_1 \neq u_2$, że $f(u_1) = f(u_2) = v$, co dawałoby nieistniejącą krawędź $\{ v, v \}$
|
||||
(tj. wierzchołek byłby połączony z samym sobą). Gdybyśmy natomiast rozpatrywali grafy mogące zawierać takie pętle
|
||||
własne, to problem dla takich grafów oraz funkcji nieróżnowartościowej stawałby się trywialny - wystarczyłoby zmapować
|
||||
wszystkie wierzchołki na ten jeden z pętlą własną i taka funkcja istniałaby zawsze.
|
||||
|
||||
Z tego, że $f$ jest różnowartościowa wynika, że jeżeli wierzchołek w grafie G $\deg u = \delta$ to w grafie H $\deg f(u) \geq \delta$. Można to zaobserwować na rysunku poniżej.
|
||||
Z tego, że $f$ jest różnowartościowa wynika, że jeżeli wierzchołek w grafie G $\deg u = \delta$ to w grafie H
|
||||
$\deg f(u) \geq \delta$. Można to zaobserwować na rysunku poniżej.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
@ -91,7 +141,9 @@ Z tego, że $f$ jest różnowartościowa wynika, że jeżeli wierzchołek w graf
|
||||
\caption{Powiązane wierzchołki mają ten sam kolor w obu grafach.}
|
||||
\end{figure}
|
||||
|
||||
Biorąc pod uwagę ten tok rozumowania, możemy zauważyć że problem ten jest nam w stanie łatwo odpowiedzieć czy w danym grafie $H$ występuje podgraf $G$. Znanym problemem \NPC, który wymaga sprawdzenia obecności danego podgrafu w innym grafie jest oczywiście problem kliki.
|
||||
Biorąc pod uwagę ten tok rozumowania, możemy zauważyć że problem ten jest nam w stanie łatwo odpowiedzieć czy w danym
|
||||
grafie $H$ występuje podgraf $G$. Znanym problemem \NPC, który wymaga sprawdzenia obecności danego podgrafu w innym
|
||||
grafie jest oczywiście problem kliki.
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
@ -99,12 +151,18 @@ Biorąc pod uwagę ten tok rozumowania, możemy zauważyć że problem ten jest
|
||||
\caption{schemat $\alpha$-redukcji kliki do PZ}
|
||||
\end{figure}
|
||||
|
||||
$\alpha$-redukcja polega na sprawdzeniu czy graf pełny $K_n$ jest podgrafem grafu $G_0$, czyli dla problemu \problem{PZ} otrzymalibyśmy tak skontruowane dane wejściowe:
|
||||
$\alpha$-redukcja polega na sprawdzeniu czy graf pełny $K_n$ jest podgrafem grafu $G_0$, czyli dla problemu \problem{PZ}
|
||||
otrzymalibyśmy tak skonstruowane dane wejściowe:
|
||||
$G = K_n, H = G_0$.
|
||||
|
||||
Problem jest zachowany ponieważ jeżeli w grafie $G_0$ występuje klika o rozmiarze $n$ to możemy każdemu wierzchołkowi kliki znalezionej w $G_0$ przypisać unikalny wierzchołek w $K_n$. W drugą stronę analogicznie, Jeżeli istnieje takie przypisanie to w grafie $G_0$ musi znajdować się klika $K_n$.
|
||||
Problem jest zachowany ponieważ jeżeli w grafie $G_0$ występuje klika o rozmiarze $n$ to możemy każdemu wierzchołkowi
|
||||
kliki znalezionej w $G_0$ przypisać unikalny wierzchołek w $K_n$. W drugą stronę analogicznie, jeżeli istnieje takie
|
||||
przypisanie to w grafie $G_0$ musi znajdować się klika $K_n$.
|
||||
\taskend
|
||||
|
||||
\task{Przedyskutuj złożoność obliczeniową następujących problemów decyzyjnych, zakładając, że $G$ jest kubiczny (tj. 3-regularny) i zapamiętany jest w postaci list sąsiedztwa. Ponadto, jeżeli odpowiedź jest oczywista napisz czy brzmi ona \textbf{tak} lub \textbf{nie}.}
|
||||
\task{Przedyskutuj złożoność obliczeniową następujących problemów decyzyjnych, zakładając, że $G$ jest kubiczny
|
||||
(tj. 3-regularny) i zapamiętany jest w postaci list sąsiedztwa. Ponadto, jeżeli odpowiedź jest oczywista napisz czy
|
||||
brzmi ona \textbf{tak} lub \textbf{nie}.}
|
||||
|
||||
\begin{minipage}{.5\linewidth}
|
||||
\subtask{$\chi(X) \leq 1$}
|
||||
@ -119,29 +177,38 @@ Problem jest zachowany ponieważ jeżeli w grafie $G_0$ występuje klika o rozmi
|
||||
\subtask{$\chi(X) \geq 4$}
|
||||
\end{minipage}%
|
||||
\\
|
||||
\tip{Skorzystaj z twierdzenia Brooksa, które mówi, że $\chi(G) \leq \Delta$ za wyjątkiem $G = C_{2k-1}$ (czyli będącego cyklem nieparzystym i $G = K_n$)}
|
||||
\tip{Skorzystaj z twierdzenia Brooksa, które mówi, że $\chi(G) \leq \Delta$ za wyjątkiem
|
||||
$G = C_{2k-1}$ (czyli będącego cyklem nieparzystym i $G = K_n$)}
|
||||
|
||||
\solution
|
||||
Problem dotyczy liczby chromatycznej grafu - $\chi(G)$ - czyli minimalnej liczby kolorów potrzebnej do poprawnego pokolorowania grafu. Graf można pokolorować 1 kolorem $\chi(G) = 1$, tylko wtedy kiedy nie ma on krawędzi, a tym wypadku wiemy, że graf jest 3-regularny czyli dla każdego wierczhołka $v \in G$ wiemy, że jest połączony z 3 innymi wierzchołkami - stąd możemy wywnioskować, że dla tego typu grafów $\chi(G) \geq 2$.
|
||||
Problem dotyczy liczby chromatycznej grafu - $\chi(G)$ - czyli minimalnej liczby kolorów potrzebnej do poprawnego
|
||||
pokolorowania grafu. Graf można pokolorować 1 kolorem $\chi(G) = 1$, tylko wtedy kiedy nie ma on krawędzi, a tym wypadku
|
||||
wiemy, że graf jest 3-regularny czyli dla każdego wierzhołka $v \in G$ wiemy, że jest połączony z 3 innymi
|
||||
wierzchołkami - stąd możemy wywnioskować, że dla tego typu grafów $\chi(G) \geq 2$.
|
||||
|
||||
Dodatkowo wiemy, że każdy graf dwudzielny można pokolorować za pomocą dokładnie 2 kolorów ponieważ zawiera 2 grupy niepołączonych ze sobą wierzchołków - a sprawdzenie dwudzielnosci grafu można osiągnąć za pomocą BFS-a lub DFS-a, czyli w złożoności $O(m+ n)$.
|
||||
Dodatkowo wiemy, że każdy graf dwudzielny można pokolorować za pomocą dokładnie 2 kolorów ponieważ zawiera 2 grupy n
|
||||
iepołączonych ze sobą wierzchołków - a sprawdzenie dwudzielnosci grafu można osiągnąć za pomocą BFS-a lub DFS-a, czyli w złożoności $O(m+ n)$.
|
||||
|
||||
Z wskazówki znamy twierdzenie Brooksa - $\chi(G) \leq \Delta$, w naszym wypadku z 3-regularnosci oczywistym jest, że $\Delta = 3$, czyli $\chi(G) \leq 3$, \textbf{CHYBA, że} graf jest nieparzystym cyklem - co możemy wyeliminować ponieważ cykl nie jest 3-regularny, lub $G = K_4$, gdzyż klika rozmiaru 4 jest 3-regularna (Ogólnie kliki rozmiaru $n$ są $(n - 1)$-regularne) i tylko w tym jednym wypadku będziemy potrzebować 4 kolorów, ale nigdy więcej.
|
||||
Z wskazówki znamy twierdzenie Brooksa - $\chi(G) \leq \Delta$, w naszym wypadku z 3-regularności oczywistym jest, że
|
||||
$\Delta = 3$, czyli $\chi(G) \leq 3$, \textbf{CHYBA, że} graf jest nieparzystym cyklem - co możemy wyeliminować ponieważ
|
||||
cykl nie jest 3-regularny, lub $G = K_4$, gdzyż klika rozmiaru 4 jest 3-regularna (Ogólnie kliki rozmiaru $n$
|
||||
są $(n - 1)$-regularne) i tylko w tym jednym wypadku będziemy potrzebować 4 kolorów, ale nigdy więcej.
|
||||
|
||||
Zatem podsumowując odpowiedzi:
|
||||
|
||||
\begin{enumerate}[a)]
|
||||
\item $\chi(X) \leq 1$ - \textbf{NIE}
|
||||
\item $\chi(X) \leq 2$ - sprawdzenie dwudzielnosci - $O(n + m)$
|
||||
\item $\chi(X) \leq 2$ - sprawdzenie dwudzielności - $O(n + m)$
|
||||
\item $\chi(X) \leq 3$ - sprawdzenie czy $G \neq K_4$ - $O(1)$
|
||||
\item $\chi(X) \leq 4$ - \textbf{TAK}
|
||||
\item $\chi(X) \geq 1$ - \textbf{TAK} - zawsze potrzebny jest minimum 1 kolor
|
||||
\item $\chi(X) \geq 2$ - \textbf{TAK} - minimalna liczba potrzebnych kolorów dla takiego grafu to 2
|
||||
\item $\chi(X) \geq 3$ - jeżeli graf nie jest dwudzieolny - to na pewno potrzebuje minimum 3 kolorów - $O(n+m)$
|
||||
\item $\chi(X) \geq 3$ - jeżeli graf nie jest dwudzielny - to na pewno potrzebuje minimum 3 kolorów - $O(n+m)$
|
||||
\item $\chi(X) \geq 4$ - graf potrzebuje 4 kolorów tylko, gdy jest kliką $K_4$ - $O(1)$.
|
||||
\end{enumerate}
|
||||
|
||||
\task{\NP-trudny problem \textit{Maximum Acyclic Subgraph} (\problem{MAS}) pyta o maksymalny zbiór łuków digrafu $D$, który generuje digraf acykliczny. Porblem ten ma prosty algorym 2-aproksymacyjny, który polega na podzieleniu $D$ na dwa podgrafy.}
|
||||
\task{\NP-trudny problem \textit{Maximum Acyclic Subgraph} (\problem{MAS}) pyta o maksymalny zbiór łuków digrafu $D$,
|
||||
który generuje digraf acykliczny. Problem ten ma prosty algorym 2-aproksymacyjny, który polega na podzieleniu $D$ na dwa podgrafy.}
|
||||
|
||||
\subtask{udowodnij 2-aproksymowalność tego algorytmu}
|
||||
\subtask{udowodnij nie wprost, że jeżeli $\mathtt{P} \neq \mathtt{NP}$ to dla \problem{MAS} nie ma schamatu FPTAS}
|
||||
@ -150,7 +217,8 @@ Zatem podsumowując odpowiedzi:
|
||||
\ctip{Jaki digraf definiuje górna/dolna macierz trójkątna macierzy $A$?}
|
||||
|
||||
\solution
|
||||
Na wstępie - zadanie słabo opisuje problem i więcej informacji można wyciągnąć z nazwy problemu po angielsku niż jego opisu. W problemie chodzi o znalezienie najwiekszego podgrafu acyklicznego w digrafie $D$.
|
||||
Na wstępie - zadanie słabo opisuje problem i więcej informacji można wyciągnąć z nazwy problemu po angielsku niż jego opisu.
|
||||
W problemie chodzi o znalezienie największego podgrafu acyklicznego w digrafie $D$.
|
||||
\begin{figure}[H]
|
||||
\begin{minipage}{.5\linewidth}%
|
||||
\centering
|
||||
@ -167,10 +235,11 @@ Na wstępie - zadanie słabo opisuje problem i więcej informacji można wyciąg
|
||||
\end{bmatrix}
|
||||
\end{equation*}
|
||||
\end{minipage}%
|
||||
\caption{Przykładowy digraf $D$ wraz z maksymalnym podgrafem acyklicznym oraz macierzą sąsiedstwa.}
|
||||
\caption{Przykładowy digraf $D$ wraz z maksymalnym podgrafem acyklicznym oraz macierzą sąsiedztwa.}
|
||||
\end{figure}
|
||||
|
||||
Z zadania wiemy, że algorytm dzieli digraf $D$ na dwie części, na postawie wskazówki \#1 możemy się domyślac, że ma to coś wspólnego z macierzami trójkątnymi macierzy $A_D$. Zobaczmy, co te macierze reprezentują:
|
||||
Z zadania wiemy, że algorytm dzieli digraf $D$ na dwie części, na podstawie wskazówki \#1 możemy się domyślać, że ma to
|
||||
coś wspólnego z macierzami trójkątnymi macierzy $A_D$. Zobaczmy, co te macierze reprezentują:
|
||||
\begin{figure}[H]
|
||||
\begin{minipage}{.5\linewidth}%
|
||||
\centering
|
||||
@ -209,12 +278,23 @@ Z zadania wiemy, że algorytm dzieli digraf $D$ na dwie części, na postawie ws
|
||||
\caption{Graf opisany przez macierz trójkątną dolną macierzy $A_D$}
|
||||
\end{figure}
|
||||
|
||||
Jak widać górna macierz trójkątna opisuje tylko takie krawędzie (łuki) $(u_1, u_2)$ że $u_1 < u_2$, czyli nie może wystąpić cykl ponieważ to wymagałoby powrotu do wierzchołka, który już rozpatrywaliśmy - a to jest niemożliwe w takiej macierzy. W macierzy dolnej sytuacja jest analogiczna, z tym że zachodzi warunek $u_1 > u_2$.
|
||||
Jak widać górna macierz trójkątna opisuje tylko takie krawędzie (łuki) $(u_1, u_2)$ że $u_1 < u_2$, czyli nie może
|
||||
wystąpić cykl ponieważ to wymagałoby powrotu do wierzchołka, który już rozpatrywaliśmy - a to jest niemożliwe w takiej
|
||||
macierzy. W macierzy dolnej sytuacja jest analogiczna, z tym że zachodzi warunek $u_1 > u_2$.
|
||||
|
||||
Rozwiązanie takie gwarantuje brak cyklu, jednak nie jest dokładne, zastanówmy się więc jaki może być najgorszy przypadek.
|
||||
Biorąc pod uwagę, że bierzemy połowę grafu możemy być pewni, że algorytm nie pomyli się bardziej niź 2 krotnie, ponieważ w najgorszym wypadku cały graf jest już acykliczny, a my bierzemy jego połowę. Nie mamy jednak pewnosci co do tego, czy faktycznie może istnieć acykliczny graf dokładnie 2 krotnie większy od swojej połówki i prawdopodobnie na tym można skończyć dowód, jednak udowodnijmy że faktycznie istnieje taki przypadek w którym algorytm zwróci dokładnie 2-przybliżony.
|
||||
Biorąc pod uwagę, że bierzemy połowę grafu możemy być pewni, że algorytm nie pomyli się bardziej niż 2-krotnie, ponieważ
|
||||
w najgorszym wypadku cały graf jest już acykliczny, a my bierzemy jego połowę. Nie mamy jednak pewności co do tego,
|
||||
czy faktycznie może istnieć acykliczny graf dokładnie 2 krotnie większy od swojej połówki i prawdopodobnie na tym można
|
||||
skończyć dowód, jednak udowodnijmy że faktycznie istnieje taki przypadek w którym algorytm zwróci dokładnie
|
||||
2-przybliżony.
|
||||
|
||||
Aby uzyskać taki graf w dolnej i górnej macierzy trójkątnej musimy mieć dokłądnie taką samą ilosć krawędzi, a ponad to graf musi pozostać acykliczny. Nie jesteśmy w stanie stworzyć grafu o 2 wierzchołkach, który spełniałby ten warunek, ponieważ albo algorytm zwróci odpowiedź dokładną, albo graf będzie cykliczny tj. wierzchołek 1 będzie połączony z 2 oraz 2 z 1.Jesteśmy w stanie skonstruować jednak taki graw 3 wierzchołkowy, poniewaz wystarczy że będziemy mieli dokładnie połączenie wierzchołka "mniejszego" z "większym" oraz dokładnie jedno "większego" z "mniejszym" przy czym jedynym ograniczeniem jest to, że nie mogą to być te same wierzchołki.
|
||||
Aby uzyskać taki graf w dolnej i górnej macierzy trójkątnej musimy mieć dokładnie taką samą ilość krawędzi, a ponadto
|
||||
graf musi pozostać acykliczny. Nie jesteśmy w stanie stworzyć grafu o 2 wierzchołkach, który spełniałby ten warunek,
|
||||
ponieważ albo algorytm zwróci odpowiedź dokładną, albo graf będzie cykliczny tj. wierzchołek 1 będzie połączony z 2 oraz
|
||||
2 z 1. Jesteśmy w stanie skonstruować jednak taki graf 3 wierzchołkowy, ponieważ wystarczy że będziemy mieli dokładnie
|
||||
jedno połączenie wierzchołka "mniejszego" z "większym" oraz dokładnie jedno "większego" z "mniejszym" przy czym jedynym
|
||||
ograniczeniem jest to, że nie mogą to być te same wierzchołki.
|
||||
|
||||
\begin{figure}[H]
|
||||
\begin{minipage}{.5\linewidth}%
|
||||
@ -233,11 +313,18 @@ Aby uzyskać taki graf w dolnej i górnej macierzy trójkątnej musimy mieć dok
|
||||
\caption{Graf opisany przez macierz trójkątną dolną macierzy $A_D$}
|
||||
\end{figure}
|
||||
|
||||
W tym wypadku digraf $D$ jest acykliczny, jednak algorytm będzie w stanie znaleźć tylko pograf $\{ (1, 2) \}$ lub $\{ (1, 3) \}$, czyli zwróci 2-krotnie za mały wynik.
|
||||
W tym wypadku digraf $D$ jest acykliczny, jednak algorytm będzie w stanie znaleźć tylko podgraf $\{ (1, 2) \}$
|
||||
lub $\{ (1, 3) \}$, czyli zwróci 2-krotnie za mały wynik.
|
||||
|
||||
Istnienie schematu (F)PTAS mówi nam, że jesteśmy w stanie znaleźć wielomianowy algorytm o dowolnie dobrym przybliżeniu, tj. algorytm $(1 + \varepsilon)$-aproksymacyjny, gdzie $\varepsilon > 0$. Znalezienie takiego schematu jest trudne i jak mniemam wykraczające poza obszar przedmiotu a na pewno kolokwium, jednak stosunkowo prosto udowodnić, że taki schemat nie może istnieć. Wystarczy udowodnić, że dla każdych możliwych danych wejściowych istnieje taki epsilon, że z odpowiedzi przybliżonej jesteśmy w stanie ze 100\% pewnością wywnioskowac odpowiedź dokładną - a to znaczyłoby, że posiadamy wielomianowy algorytm rozwiązujący dany problem \NP-trudny dokładnie, co znaczyłoby, że $\P = \NP$
|
||||
Istnienie schematu (F)PTAS mówi nam, że jesteśmy w stanie znaleźć wielomianowy algorytm o dowolnie dobrym przybliżeniu,
|
||||
tj. algorytm $(1 + \varepsilon)$-aproksymacyjny, gdzie $\varepsilon > 0$. Znalezienie takiego schematu jest trudne i jak
|
||||
mniemam wykraczające poza obszar przedmiotu a na pewno kolokwium, jednak stosunkowo prosto udowodnić, że taki schemat
|
||||
nie może istnieć. Wystarczy udowodnić, że dla każdych możliwych danych wejściowych istnieje taki epsilon, że z
|
||||
odpowiedzi przybliżonej jesteśmy w stanie ze 100\% pewnością wywnioskować odpowiedź dokładną - a to znaczyłoby, że
|
||||
posiadamy wielomianowy algorytm rozwiązujący dany problem \NP-trudny dokładnie, co znaczyłoby, że $\P = \NP$
|
||||
|
||||
W tym wypadku rozważamy problem maksymalizacyjny, czyli wiemy że odpowiedź dokładna $N_\text{opt}$ jest większa bądź równa od odpowiedzi naszego algorytmu $N$:
|
||||
W tym wypadku rozważamy problem maksymalizacyjny, czyli wiemy że odpowiedź dokładna $N_\text{opt}$ jest większa bądź
|
||||
równa od odpowiedzi naszego algorytmu $N$:
|
||||
\begin{equation}
|
||||
N_{\text{opt}} \geq N
|
||||
\end{equation}
|
||||
@ -254,7 +341,7 @@ Co za tym idzie, z definicji przybliżalności wynika, że:
|
||||
\end{equation}
|
||||
|
||||
ponieważ wiemy, że liczba krawędzi w grafie jest zawsze liczbą naturalną ($N_\text{opt} \in \mathbb{N}$ oraz $N \in \mathbb{N}$),
|
||||
wystarczy że w nierównośco \ref{eqn:2013:fptas} będzie spełniony warunek
|
||||
wystarczy że w nierówności \ref{eqn:2013:fptas} będzie spełniony warunek
|
||||
|
||||
\begin{equation}
|
||||
\label{eqn:2013:fptas-condition}
|
||||
@ -283,3 +370,4 @@ Jeżeli teraz przedzielimy obie strony nierówności przez $m + 1$ uzyskamy po p
|
||||
\end{equation*}
|
||||
|
||||
a co za tym idzie wystarczy, że $\varepsilon < \frac{1}{m+1}$ a będziemy w stanie wywnioskować dokładny wynik w czasie wielomianowym, co jest możliwe tylko gdy $\P = \NP$.
|
||||
\taskend
|
||||
|
15
gfx/k3-3.tex
Normal file
15
gfx/k3-3.tex
Normal file
@ -0,0 +1,15 @@
|
||||
\def\a{3}
|
||||
\def\b{3}
|
||||
\def\r{2cm}
|
||||
|
||||
\begin{tikzpicture}
|
||||
\foreach \i in {1,...,\a}
|
||||
\node[draw, small vertex] (a-\i) at (\i*\r, \r) {};
|
||||
|
||||
\foreach \i in {1,...,\b}
|
||||
\node[draw, small vertex] (b-\i) at (\i*\r, 0) {};
|
||||
|
||||
\foreach \u in {1,...,\a}
|
||||
\foreach \v in {1,...,\b}
|
||||
\draw (a-\u) -- (b-\v);
|
||||
\end{tikzpicture}
|
11
gfx/k5.tex
Normal file
11
gfx/k5.tex
Normal file
@ -0,0 +1,11 @@
|
||||
\def\n{5}
|
||||
\def\radius{2cm}
|
||||
|
||||
\begin{tikzpicture}
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
|
||||
\foreach \u in {1,...,\n}
|
||||
\foreach \v in {\u,...,\n}
|
||||
\draw (v\u) -- (v\v);
|
||||
\end{tikzpicture}
|
@ -1,10 +1,10 @@
|
||||
% The block diagram code is probably more verbose than necessary
|
||||
\begin{tikzpicture}[auto, node distance=2cm]
|
||||
\node[problem] (klika) {KLIKA};
|
||||
\node[problem] (klika) {\problem{KLIKA}};
|
||||
\node[solution, right of=klika] (r-klika) {T/N};
|
||||
\node[left of=klika] (i-klika) {$G, n$};
|
||||
|
||||
\node[problem, below of=klika] (opk) {OPK};
|
||||
\node[problem, below of=klika] (opk) {\problem{OPK}};
|
||||
\node[solution, right of=opk] (r-opk) {T/N};
|
||||
\node[left of=opk] (i-opk) {$G_1, a, b$};
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
% The block diagram code is probably more verbose than necessary
|
||||
\begin{tikzpicture}[auto, node distance=2cm]
|
||||
\node[problem] (klika) {KLIKA};
|
||||
\node[problem] (klika) {\problem{KLIKA}};
|
||||
\node[solution, right of=klika] (r-klika) {T/N};
|
||||
\node[left of=klika] (i-klika) {$G_0, n$};
|
||||
|
||||
\node[problem, below of=klika] (pz) {PZ};
|
||||
\node[problem, below of=klika] (pz) {\problem{PZ}};
|
||||
\node[solution, right of=pz] (r-pz) {T/N};
|
||||
\node[left of=pz] (i-pz) {$G, H$};
|
||||
|
||||
|
26
gfx/mgp-5.tex
Normal file
26
gfx/mgp-5.tex
Normal file
@ -0,0 +1,26 @@
|
||||
\def\n{5}
|
||||
\def\radius{2cm}
|
||||
|
||||
\begin{tikzpicture}[scale=.8]
|
||||
\begin{scope}
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
\foreach \u/\v in {1/2,2/3,3/4,4/5,5/1} \draw[-, thick] (v-\u) edge (v-\v);
|
||||
\end{scope}
|
||||
\begin{scope}[xshift=3*\radius]
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
|
||||
\foreach \u/\v in {1/2,2/3,3/4,4/5,5/1} \draw[-] (v-\u) edge (v-\v);
|
||||
\foreach \u/\v in {1/4,4/2} \draw[-, thick] (v-\u) edge (v-\v);
|
||||
\end{scope}
|
||||
\begin{scope}[xshift=6*\radius]
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
|
||||
\foreach \u/\v in {1/2,2/3,3/4,4/5,5/1} \draw[-] (v-\u) edge (v-\v);
|
||||
\foreach \u/\v in {1/4,4/2} \draw[-] (v-\u) edge (v-\v);
|
||||
\foreach \u/\v in {3/5,5/2} \draw[-, thick] (v-\u) edge[bend left=60, out looseness=2.3] (v-\v);
|
||||
\end{scope}
|
||||
\end{tikzpicture}
|
||||
|
30
gfx/mgp-6.tex
Normal file
30
gfx/mgp-6.tex
Normal file
@ -0,0 +1,30 @@
|
||||
\def\n{6}
|
||||
\def\radius{2cm}
|
||||
|
||||
\begin{tikzpicture}[scale=.8]
|
||||
\begin{scope}
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
|
||||
\foreach \u/\v in {1/2,2/3,3/4,4/5,5/6,6/1} \draw[-, thick] (v-\u) edge (v-\v);
|
||||
\end{scope}
|
||||
\begin{scope}[xshift=3*\radius]
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
|
||||
\foreach \u/\v in {1/2,2/3,3/4,4/5,5/6,6/1} \draw[-] (v-\u) edge (v-\v);
|
||||
\foreach \u/\v in {2/6,6/3,3/5} \draw[-, thick] (v-\u) edge (v-\v);
|
||||
\end{scope}
|
||||
\begin{scope}[xshift=6*\radius]
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
|
||||
\foreach \u/\v in {1/2,2/3,3/4,4/5,5/6,6/1} \draw[-] (v-\u) edge (v-\v);
|
||||
\foreach \u/\v in {2/6,6/3,3/5} \draw[-] (v-\u) edge (v-\v);
|
||||
|
||||
\draw[-, thick] (v-1) edge[bend left=60, out looseness=2.3] (v-3);
|
||||
\draw[-, thick] (v-1) edge[bend right=100, out looseness=4] (v-4);
|
||||
\draw[-, thick] (v-1) edge[bend right=60, out looseness=2.3] (v-5);
|
||||
\end{scope}
|
||||
\end{tikzpicture}
|
||||
|
14
gfx/por-1.tex
Normal file
14
gfx/por-1.tex
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
\begin{tikzpicture}
|
||||
|
||||
\foreach[count=\xi] \len in {1,3,2,5,4,2,1} {
|
||||
\draw[|-|] (0, -\xi/2) node [left] {\alphalph{\xi}} -- node [above] {$\len$} (\len, -\xi/2);
|
||||
}
|
||||
|
||||
\begin{scope}[yshift=-2cm, xshift=7cm]
|
||||
\draw[|-] (0, 0) -- node [below] {a} (1, 0);
|
||||
\draw[|-] (1, 0) -- node [below] {f} (3, 0);
|
||||
\draw[|-|] (3, 0) -- node [below] {b} (6, 0);
|
||||
\end{scope}
|
||||
|
||||
\end{tikzpicture}
|
34
gfx/por-2.tex
Normal file
34
gfx/por-2.tex
Normal file
@ -0,0 +1,34 @@
|
||||
\def\d{1.5}
|
||||
|
||||
\usetikzlibrary{patterns}
|
||||
\begin{tikzpicture}
|
||||
|
||||
\foreach[count=\xi] \len in {1,3,2,5} {
|
||||
\draw[|-|] (0, -\xi*\d) rectangle (\len, -\xi*\d - .5*\d);
|
||||
\draw[|-|] (-.5, -\xi*\d) -- node [left] {$d$} (-.5, -\xi*\d - .5*\d);
|
||||
\draw[|-|, yshift=.2cm] (0, -\xi*\d) -- (\len, -\xi*\d) node [right] {$\len$};
|
||||
}
|
||||
|
||||
\begin{scope}[xshift=7cm]
|
||||
\foreach[count=\xi] \len in {4,2,1} {
|
||||
\draw[|-|] (0, -\xi*\d) rectangle (\len, -\xi*\d - .5*\d);
|
||||
\draw[|-|] (-.5, -\xi*\d) -- node [left] {$d$} (-.5, -\xi*\d - .5*\d);
|
||||
\draw[|-|, yshift=.2cm] (0, -\xi*\d) -- (\len, -\xi*\d) node [right] {$\len$};
|
||||
}
|
||||
\end{scope}
|
||||
|
||||
\begin{scope}[yshift=-6cm, xshift=7cm]
|
||||
\draw[|-|] (-.5, 0) -- node [left] {$d$} (-.5, -.5*\d);
|
||||
|
||||
\draw[pattern=crosshatch,pattern color=black!30] (0, 0) rectangle (1, -.5*\d);
|
||||
\draw[pattern=crosshatch,pattern color=black!30] (1, 0) rectangle (3, -.5*\d);
|
||||
\draw[pattern=crosshatch,pattern color=black!30] (3, 0) rectangle (6, -.5*\d);
|
||||
|
||||
\draw[|-, yshift=.2cm] (0, 0) -- node [above] {$1$} (1, 0) ;
|
||||
\draw[|-|, yshift=.2cm] (1, 0) -- node [above] {$2$} (3, 0) ;
|
||||
\draw[-|, yshift=.2cm] (3, 0) -- node [above] {$3$} (6, 0) ;
|
||||
|
||||
\draw[|-|, yshift=-.2cm] (0, -.5*\d) -- node [below] {$sz = 6$} (6, -.5*\d) ;
|
||||
\end{scope}
|
||||
|
||||
\end{tikzpicture}
|
20
gfx/pw-wpw.tex
Normal file
20
gfx/pw-wpw.tex
Normal file
@ -0,0 +1,20 @@
|
||||
% The block diagram code is probably more verbose than necessary
|
||||
\begin{tikzpicture}[auto, node distance=2cm]
|
||||
\node[problem] (pw) {\problem{PW}};
|
||||
\node[solution, right of=pw] (r-pw) {T/N};
|
||||
\node[left of=pw] (i-pw) {$G, n$};
|
||||
|
||||
\node[problem, below of=pw] (wpw) {\problem{WPW}};
|
||||
\node[solution, right of=wpw] (r-wpw) {T/N};
|
||||
\node[left of=wpw] (i-wpw) {$G_w, p$};
|
||||
|
||||
\draw[->, alpha, left] (i-pw) -- node[right] {$f$} (i-wpw);
|
||||
|
||||
\draw[->] (pw) -- (r-pw);
|
||||
\draw[->] (wpw) -- (r-wpw);
|
||||
|
||||
\draw[->] (i-pw) -- (pw);
|
||||
\draw[->] (i-wpw) -- (wpw);
|
||||
|
||||
\draw[Implies-Implies, double distance=2pt] (r-pw) -- (r-wpw);
|
||||
\end{tikzpicture}
|
20
gfx/sp-por.tex
Normal file
20
gfx/sp-por.tex
Normal file
@ -0,0 +1,20 @@
|
||||
% The block diagram code is probably more verbose than necessary
|
||||
\begin{tikzpicture}[auto, node distance=2cm]
|
||||
\node[problem] (sp) {\problem{SP}};
|
||||
\node[solution, right of=sp] (r-sp) {T/N};
|
||||
\node[left of=sp] (i-sp) {$A, n$};
|
||||
|
||||
\node[problem, below of=sp] (por) {\problem{POR}};
|
||||
\node[solution, right of=por] (r-por) {T/N};
|
||||
\node[left of=por] (i-por) {$W, sz, d$};
|
||||
|
||||
\draw[->, alpha, left] (i-sp) -- node[right] {$f$} (i-por);
|
||||
|
||||
\draw[->] (sp) -- (r-sp);
|
||||
\draw[->] (por) -- (r-por);
|
||||
|
||||
\draw[->] (i-sp) -- (sp);
|
||||
\draw[->] (i-por) -- (por);
|
||||
|
||||
\draw[Implies-Implies, double distance=2pt] (r-sp) -- (r-por);
|
||||
\end{tikzpicture}
|
7
gfx/wpw-1.tex
Normal file
7
gfx/wpw-1.tex
Normal file
@ -0,0 +1,7 @@
|
||||
\begin{tikzpicture}
|
||||
\foreach \pos [count=\xi] in { (1, 3), (2.5,4), (0, 2), (3, 2), (-1, 5), (1, 6) }
|
||||
\node[vertex] (v-\xi) at \pos {$\xi$};
|
||||
|
||||
\foreach \v/\u in {1/4,1/5,1/2,1/3,3/4,3/5,5/2,2/4,1/6,5/6,2/6}
|
||||
\draw (v-\v) -- (v-\u);
|
||||
\end{tikzpicture}
|
11
gfx/wpw-2.tex
Normal file
11
gfx/wpw-2.tex
Normal file
@ -0,0 +1,11 @@
|
||||
\begin{tikzpicture}
|
||||
\foreach \pos/\w [count=\xi] in { (1, 3)/2, (2.5,4)/1, (0, 2)/4, (3, 2)/5, (-1, 5)/2, (1, 6)/3 } {
|
||||
\node[vertex] (v-\xi) at \pos {$\xi$};
|
||||
\node[above right=-1mm of v-\xi, weight] {$\w$};
|
||||
}
|
||||
|
||||
\begin{pgfonlayer}{background}
|
||||
\foreach \v/\u in {1/4,1/5,1/2,1/3,3/4,3/5,5/2,2/4,1/6,5/6,2/6}
|
||||
\draw (v-\v) edge (v-\u);
|
||||
\end{pgfonlayer}
|
||||
\end{tikzpicture}
|
20
main.tex
20
main.tex
@ -17,16 +17,27 @@
|
||||
\usepackage{lmodern}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{mathtools}
|
||||
\usepackage{alphalph}
|
||||
\usepackage{algorithm}
|
||||
\usepackage{algpseudocode}
|
||||
|
||||
\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
|
||||
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}
|
||||
|
||||
\usetikzlibrary{decorations.pathmorphing, arrows.meta}
|
||||
\usetikzlibrary{decorations.pathmorphing, arrows.meta, positioning}
|
||||
\usetikzlibrary{shapes.geometric, arrows}
|
||||
|
||||
\tikzstyle{problem} = [draw,outer sep=0,inner sep=5,minimum size=10]
|
||||
\tikzstyle{solution} = [outer sep=0,inner sep=1,minimum size=10]
|
||||
\tikzstyle{alpha} = [decorate, decoration={snake, amplitude=.5mm}, help lines]
|
||||
\tikzstyle{max edge} = [very thick, blue]
|
||||
\tikzstyle{vertex} = [draw, circle, thick]
|
||||
\tikzstyle{small vertex} = [draw, circle, scale=.75]
|
||||
\tikzstyle{weight} = [scale=.75, fill=white, draw]
|
||||
|
||||
\pgfdeclarelayer{background}
|
||||
\pgfdeclarelayer{foreground}
|
||||
\pgfsetlayers{background,main,foreground}
|
||||
|
||||
% opening
|
||||
\title{PAA - Kolokwia, rozwiązania}
|
||||
@ -45,15 +56,20 @@
|
||||
|
||||
\newcommand{\problem}[1]{\texttt{#1}}
|
||||
|
||||
\newcommand{\taskend}{\par\vspace{.1cm}\hfill$\square$\vspace{.4cm}\par}
|
||||
\newcommand{\task}{\vspace{.25cm}\refstepcounter{task} \noindent\par\texttt{Zadanie \thesection.\thetask.\hspace{.1cm}}}
|
||||
\newcommand{\subtask}[1][]{\refstepcounter{subtask}\noindent\par \hspace{.5cm}\thesubtask#1)\ }
|
||||
\newcommand{\subtask}[1][]{\refstepcounter{subtask}\par\noindent\hspace{.3cm}\thesubtask#1)\ }
|
||||
|
||||
\newcommand{\solution}{\par\vspace{.5cm}\noindent\textbf{Proponowane rozwiązanie:}\par}
|
||||
\newcommand{\tip}[1]{\par\noindent\textit{Wskazówka:} #1\par}
|
||||
\newcommand{\ctip}[1]{\refstepcounter{tip}\par\noindent\textit{Wskazówka \#\thetip:} #1\par}
|
||||
|
||||
\newenvironment{shortcut}{\vspace{.4cm}\noindent\textbf{Na skróty:}\vspace{2mm}\hline\vspace{.4cm}}{\vspace{.4cm}\hline\vspace{.4cm}}
|
||||
\newenvironment{column}[1]{\begin{minipage}{#1\linewidth}}{\end{minipage}\vspace{.5\baselineskip}}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\input{./2013.01.26.tex}
|
||||
\input{./2011.01.18.tex}
|
||||
|
||||
\end{document}
|
||||
|
Loading…
Reference in New Issue
Block a user