The Postal Owl

Logged in: Santa Claus (home)   

Algoritmy a datové struktury 2

Back to the course

4. Série - 3. úkol (Hlídání křižovatek)

Deadline: 2022-12-15 14:00 (21 days ago)

Tomáš Domes — 2022-12-04 17:04 (31 days ago) — reply

Mějme graf $G$ reprezentující město (jako na cvičení -- křižovatky jsou vrcholy, ulice jsou hrany). Analýzou policejních dat bylo zjištěno, že naprostá většina zločinů je páchána přímo na křižovatkách. Protože bychom chtěli ušetřit za mzdy strážníků, změníme podmínku pro hlídání města -- bude nám stačit, aby z každé křitovatky bylo vidět nějakého strážníka (Tedy aby pro každý vrchol bez strážníka platilo, že strážník byl umístěn v alespoň jednom z jeho sousedů.). Zadání problému opět zní, zda dokážeme dané město uhlídat pomocí $k$ strážníků. Dokažte že tento problém a SAT jsou na sebe vzájemně převoditelné.

Tomáš Domes — 2022-12-12 13:37 (24 days ago) — reply

*Upozornění:* Zadání nehovoří o vrcholovém pokrytí! Podmínka ve vrcholovém pokrytí zní, že pro každý vrchol, ve kterém není strážník, platí, že ve všech jeho sousedech musí být strážník. Podmínka ze zadání ale říká, že **pro každý vrchol, ve kterém není strážník, platí, že v alespoň jednom jeho sousedovi musí být strážník**. Jedná se tedy o dva rozdílné problémy.

Santa Claus — modified 2022-12-14 15:36 (22 days ago) — editreply

# Převod na SAT

Pro každý vrchol $v_i \in V$ vytvoříme výrokovou proměnnou $x_i$. Dále vytvoříme klauzule pro splnění základní podmínky pokrytí strážníky:

Pro každý vrchol $v_i$ a jeho sousedy $v_{i_1}, ..., v_{i_j}$ přidáme do formule klauzuli

$v_i \vee v_{i_1} \vee ... \vee v_{i_j}$ (A)

Tím máme zaručeno zabezpečení města G, nyní musíme vzít v potaz rozpočtovou stránku, protože takto by nám zatím prošlo i postavení strážníka na každou křižovatku, čímž bychom do rozpočtu vykousli díru.

Pro omezení počtu na nejvýše $k$ strážníků použijeme podobný trik jako na Medvědově přednášce s převodem nezávislé množiny na SAT.

Protože ale na rozdíl od přednášky potřebujeme počet vrcholů omezit shora, použijeme trik a sice omezíme zdola počet strážníkem neobsazených vrcholů.

Stanovme $n$ počet vrcholů $G$ a $t = n - k$

Vytvoříme tabulku $t \times n$ výrokových proměnných $p_{i,j}$, kde $p_{i,j}$ bude indikovat, že vrchol $v_j$ je v množině neobsazených vrcholů $i-tý$.

Nyní budeme muset několika sadami klauzulí zajistit požadované chování:

* (B) V každém řádku tabulky má být právě jedna splněná proměnná. To rozložíme na alespoň jedna a nejvýše jedna:
   * Alespoň jedna $\forall i;  i  \in 1...t: p_{i,1} \vee  p_{i,2} \vee ... \vee p_{i,n}$
   * Nejvýše jedna: $\forall i,j,j^\prime; i  \in 1...t ,  j, j^\prime \in 1...n, j \neq j^\prime : p_{i,j} \implies \neg p_{i,j^\prime}$. 
   Toto je sice implikace, ale jednoduše převedeme na klauzuli:
   $\neg p_{i,j} \vee  \neg p_{i,j^\prime}$

* (C\) V každém sloupci je nejvýše jedna splněná proměnná:
   * Obdobně jako výše, v bodě Nejvýše jedna.

* (D) Pokud je ve sloupci splněná proměnná, v odpovídajícím vrcholu není strážník:
    $\forall p_{i,j}: p_{i,j} \implies \neg x_j$. Implikaci opět převedeme na klauzuli: $\forall p_{i,j}: \neg p_{i,j} \vee \neg x_j$.

Pokud jsou tyto klauzule splněny, máme alespoň $t = n - k$ neobsazených vrcholů, tedy nejvýše $k$ obsazených vrcholů.

## Rozvaha o správnosti
Když je město $k$-ohlídatelné, pak lze pro libovolné $k$-ohlídání najít $n-k$ vrcholů bez strážníků, ty označíme $v_1,...,v_t$, v tabulce vybereme diagonálu a tyto proměnné nastavíme na 1, tím splníme sady klauzulí B,C,D. Klauzule A jsou splněné z premisy, že město je ohlídané.

Naopak když je zkonstrovaná formule splnitelná, pak pro libovolné ohodnocení máme alespoň $n-k$ nulových proměnných, ty z tabulky jako vrcholy bez strážníka, na zbytek vrcholů dáme strážníky a máme validní ohlídání.

## Polynomiálnost převodu
Vytvoříme formuli polynomiální velikosti:

A ... $O(n^2)$ 

tabulka ... $O(nk)$ proměnných

B-D ... $O(n \cdot n^2)$ 

Nerozepisuji, protože je to podle mě triviálně patrné.

## Možnost s právě $k$ strážníky

Zatím jsme pracovali s možností $k$-ohlídatelnosti jako existence ohlídání s nejvýše $k$ strážníky. Pokud je město méně než $k$-ohlídatelné, pak je jistě i $k$-ohlídatelné, tedy pokud má alespoň $k$ křižovatek. Můžeme tedy přidat kontrolu na $k \leq n$.

Dále pokud bychom chtěli zjistit, jestli dané $k$ je nejmenší, pro které je město $k$-ohlídatelné, stačí spojit danou formuli s negací formule pro $k-1$, správnost i polynomialita zůstává, pouze je potřeba převést negaci CNF na CNF, což není složité.

# Převod ze SAT

Vytvoříme graf s vrcholy $v_1...v_n$ a $u_1...u_n$ a $t_1...t_n$, mezi vrcholy se stejnými indexy přidáme hranu. Všimněme si, že tento graf je $n$-ohlídatelný, navíc v každém takovém ohlídání bude platit, že alespoň jeden z vrcholů $u_i, v_i, t_i$ má strážníka. Také bude platit, že právě jeden z těchto vrcholů má strážníka, protože kdyby byli na těchto třech vrcholech strážníci dva, musel by existovat index, pro který by nezbyl strážník žádný.

Toto uspořádání nám dává základ pro SAT - indexům přiřadíme výrokové proměnné - $n$ tedy bude počet prvovýroků. V ohlídání bude vyběr mezi $u_i, v_i a t_i$ rozhodovat ohodnocení výrokové proměnné příslušící indexu $i$ - stanovme $u_i$ jako $0$ a $v_i$ jako $1$, pokud bude strážník na spojovacím vrcholu $t_i$, znamená to, že v ohodnocení můžeme zvolit libovolnou hodnotu, tedy že výrok je nezávislý. Pokud bychom chtěli generovat jednoznačná ohodnocení, můžeme přidat spojnice $t^\prime_i$ obdobné vrcholům $t_i$.

Pro klauzuli nad $n$ proměnnými tedy vytvoříme naši konstrukci s $3n$ vrcholy, pro každou klauzuli přidáme vrchol a přidáme hrany mezi klauzulí a obsaženými literály (máme vrchol pro každou proměnnou i její negaci). 

Pak zkusíme najít $n$-ohlídání.

### Správnost

Pokud existuje $n$-ohlídání, pak existuje splňující ohodnocení - každá klauzule je splněná, protože alespoň jeden příslušný literál má strážníka tedy je nastaven na 1. Zároveň platí, že nenastavujeme proměnnou i její negaci zároveň - pak by totiž graf nemohl být $n$-ohlídatelný.

Dále pokud existuje ohodnocení - existuje i $n$-ohlídání - každá proměnná má nějakou hodnotu, postavíme na příslušný vrchol strážníka. Tím máme zajíštěny vrcholy $u, v, t$. Všechny vrcholy klauzulí jsou ale také pod dohledem, protože každá klauzule má alespoň jeden literál se strážníkem.

### Polynomiálnost

Převod je polynomiální, protože použijeme $3n$ vrcholů a hran plus počet klauzulí a součet jejich velkostí.

Tomáš Domes — 2022-12-23 00:10 (13 days ago) — reply

To je zcela správně, 14/14

Points: 14.00

Tomáš Domes — 2023-01-04 01:15 (39 hours ago) — reply

Se svolením autora si dovoluji zveřejnit jedno hezké řešení.

Tomáš Domes — 2023-01-04 01:15 (39 hours ago) — reply

# Převod na SAT

Pro každý vrchol $v_i \in V$ vytvoříme výrokovou proměnnou $x_i$. Dále vytvoříme klauzule pro splnění základní podmínky pokrytí strážníky:

Pro každý vrchol $v_i$ a jeho sousedy $v_{i_1}, ..., v_{i_j}$ přidáme do formule klauzuli

$v_i \vee v_{i_1} \vee ... \vee v_{i_j}$ (A)

Tím máme zaručeno zabezpečení města G, nyní musíme vzít v potaz rozpočtovou stránku, protože takto by nám zatím prošlo i postavení strážníka na každou křižovatku, čímž bychom do rozpočtu vykousli díru.

Pro omezení počtu na nejvýše $k$ strážníků použijeme podobný trik jako na Medvědově přednášce s převodem nezávislé množiny na SAT.

Protože ale na rozdíl od přednášky potřebujeme počet vrcholů omezit shora, použijeme trik a sice omezíme zdola počet strážníkem neobsazených vrcholů.

Stanovme $n$ počet vrcholů $G$ a $t = n - k$

Vytvoříme tabulku $t \times n$ výrokových proměnných $p_{i,j}$, kde $p_{i,j}$ bude indikovat, že vrchol $v_j$ je v množině neobsazených vrcholů $i-tý$.

Nyní budeme muset několika sadami klauzulí zajistit požadované chování:

* (B) V každém řádku tabulky má být právě jedna splněná proměnná. To rozložíme na alespoň jedna a nejvýše jedna:
   * Alespoň jedna $\forall i;  i  \in 1...t: p_{i,1} \vee  p_{i,2} \vee ... \vee p_{i,n}$
   * Nejvýše jedna: $\forall i,j,j^\prime; i  \in 1...t ,  j, j^\prime \in 1...n, j \neq j^\prime : p_{i,j} \implies \neg p_{i,j^\prime}$. 
   Toto je sice implikace, ale jednoduše převedeme na klauzuli:
   $\neg p_{i,j} \vee  \neg p_{i,j^\prime}$

* (C\) V každém sloupci je nejvýše jedna splněná proměnná:
   * Obdobně jako výše, v bodě Nejvýše jedna.

* (D) Pokud je ve sloupci splněná proměnná, v odpovídajícím vrcholu není strážník:
    $\forall p_{i,j}: p_{i,j} \implies \neg x_j$. Implikaci opět převedeme na klauzuli: $\forall p_{i,j}: \neg p_{i,j} \vee \neg x_j$.

Pokud jsou tyto klauzule splněny, máme alespoň $t = n - k$ neobsazených vrcholů, tedy nejvýše $k$ obsazených vrcholů.

## Rozvaha o správnosti
Když je město $k$-ohlídatelné, pak lze pro libovolné $k$-ohlídání najít $n-k$ vrcholů bez strážníků, ty označíme $v_1,...,v_t$, v tabulce vybereme diagonálu a tyto proměnné nastavíme na 1, tím splníme sady klauzulí B,C,D. Klauzule A jsou splněné z premisy, že město je ohlídané.

Naopak když je zkonstrovaná formule splnitelná, pak pro libovolné ohodnocení máme alespoň $n-k$ nulových proměnných, ty z tabulky jako vrcholy bez strážníka, na zbytek vrcholů dáme strážníky a máme validní ohlídání.

## Polynomiálnost převodu
Vytvoříme formuli polynomiální velikosti:

A ... $O(n^2)$ 

tabulka ... $O(nk)$ proměnných

B-D ... $O(n \cdot n^2)$ 

Nerozepisuji, protože je to podle mě triviálně patrné.

# Převod ze SAT

Vytvoříme graf s vrcholy $v_1...v_n$ a $u_1...u_n$ a $t_1...t_n$, mezi vrcholy se stejnými indexy přidáme hranu. Všimněme si, že tento graf je $n$-ohlídatelný, navíc v každém takovém ohlídání bude platit, že alespoň jeden z vrcholů $u_i, v_i, t_i$ má strážníka. Také bude platit, že právě jeden z těchto vrcholů má strážníka, protože kdyby byli na těchto třech vrcholech strážníci dva, musel by existovat index, pro který by nezbyl strážník žádný.

Toto uspořádání nám dává základ pro SAT - indexům přiřadíme výrokové proměnné - $n$ tedy bude počet prvovýroků. V ohlídání bude vyběr mezi $u_i, v_i a t_i$ rozhodovat ohodnocení výrokové proměnné příslušící indexu $i$ - stanovme $u_i$ jako $0$ a $v_i$ jako $1$, pokud bude strážník na spojovacím vrcholu $t_i$, znamená to, že v ohodnocení můžeme zvolit libovolnou hodnotu, tedy že výrok je nezávislý. Pokud bychom chtěli generovat jednoznačná ohodnocení, můžeme přidat spojnice $t^\prime_i$ obdobné vrcholům $t_i$.

Pro klauzuli nad $n$ proměnnými tedy vytvoříme naši konstrukci s $3n$ vrcholy, pro každou klauzuli přidáme vrchol a přidáme hrany mezi klauzulí a obsaženými literály (máme vrchol pro každou proměnnou i její negaci). 

Pak zkusíme najít $n$-ohlídání.

### Správnost

Pokud existuje $n$-ohlídání, pak existuje splňující ohodnocení - každá klauzule je splněná, protože alespoň jeden příslušný literál má strážníka tedy je nastaven na 1. Zároveň platí, že nenastavujeme proměnnou i její negaci zároveň - pak by totiž graf nemohl být $n$-ohlídatelný.

Dále pokud existuje ohodnocení - existuje i $n$-ohlídání - každá proměnná má nějakou hodnotu, postavíme na příslušný vrchol strážníka. Tím máme zajíštěny vrcholy $u, v, t$. Všechny vrcholy klauzulí jsou ale také pod dohledem, protože každá klauzule má alespoň jeden literál se strážníkem.

### Polynomiálnost

Převod je polynomiální, protože použijeme $3n$ vrcholů a hran plus počet klauzulí a součet jejich velkostí.

New post (You can use Markdown with KaTeX math here)

Preview: