deleted, jestli se vůbec něco mazalo.
V [L6.1] CSP a arc consistency umíš hranu diagnostikovat: $(x_i, x_j)$ je AC ⟺ každá hodnota $a \in D_i$ má v $D_j$ podporu. Zkouškové zadání ale neříká „rozhodni“, říká „reduce the domains to be arc consistent“ — chce zákrok, ne diagnózu. Dnes se naučíš ten zákrok pro jednu hranu; jak hrany správně řadit do fronty (celý AC-3) přijde v [L6.3].
Smazat ji z $D_2$. Bezpečné to je: hodnota bez podpory nemůže být v žádném řešení (řešení musí splnit všechna omezení, tedy i pro $x_3$ by musel existovat partner — a ten neexistuje). Mazáním hodnot bez podpory se množina řešení nemění; zmenšuje se jen prostor, který bude muset prohledávat search. Přesně tohle dělá procedura REVISE — projde všechny hodnoty $a \in D_i$ a ty bez podpory škrtne.
“This procedure deletes every value $a$ from domain $D_i$, if the value is not consistent with domain $D_j$.”
procedure REVISE
Input: Domain D_i to be revised. Domain D_j. Set of constraints C.
Output: Binary variable deleted indicating deletion of some value
from D_i. Revised domain D_i.
deleted := 0;
for a ∈ D_i do
if there is no b ∈ D_j ; x_i = a, x_j = b satisfies all x_i, x_j constraints
then
D_i := D_i \ a; // delete a from D_i
deleted := 1;
end
end
Čtení po řádcích: REVISE dostane doménu počátku $D_i$ (tail — ta, která se bude revidovat), doménu konce $D_j$ (head — ta jen dodává podpory) a omezení. Projde každé $a \in D_i$; když pro něj neexistuje podpora $b \in D_j$ splňující všechna omezení dvojice $x_i, x_j$ najednou, hodnotu smaže a nastaví deleted := 1. Po doběhnutí je hrana $(x_i, x_j)$ zaručeně AC — a příznak deleted říká, jestli se doména vůbec změnila (k čemu je dobrý, uvidíš za chvíli). Jedno volání REVISE = oprava jedné orientované hrany; $D_j$ se nedotkne.
Vezmi instanci, kterou jsi v [L6.1] úloze T01 diagnostikoval: $x_1 \in \{1,2,3\}$, $x_2 \in \{1,2,3\}$, $x_3 \in \{2,3\}$, omezení $x_1 > x_2$, $x_2 \ne x_3$, $x_2 + x_3 > 4$. Tři hrany ze čtyř vyšly non-AC. Slide 27 teď hrany reviduje jednu po druhé v pořadí $(x_1, x_2), (x_2, x_1), (x_2, x_3), (x_3, x_2)$ — krokuj a u každého kroku si nejdřív sám rozmysli, co REVISE smaže:
Slide 27 si o průchodu vede účetnictví — tabulku revizí: kterou hranu revidujeme, co se smazalo, jak vypadá zmenšená doména a které hrany jsou po tomto kroku AC (tabulka 1:1 dle slidu, horní indexy $^{1)}$–$^{4)}$ číslují škrtnutí):
| revised arc | deleted | revised domain | $(x_1, x_2)$ | $(x_2, x_1)$ | $(x_2, x_3)$ | $(x_3, x_2)$ |
|---|---|---|---|---|---|---|
| $(x_1, x_2)$ | $1^{1)}$ | $x_1 \in \{2, 3\}$ | AC | non-AC | non-AC | AC |
| $(x_2, x_1)$ | $3^{2)}$ | $x_2 \in \{1, 2\}$ | AC | AC | non-AC | non-AC |
| $(x_2, x_3)$ | $1^{3)}$ | $x_2 \in \{2\}$ | non-AC | AC | AC | non-AC |
| $(x_3, x_2)$ | $2^{4)}$ | $x_3 \in \{3\}$ | non-AC | AC | AC | AC |
Nejsou! Hrana $(x_1, x_2)$ — kterou jsme revidovali jako první a po revizi byla AC — je na konci průchodu zase non-AC. Mezitím se totiž doména $D_2$ zmenšila na $\{2\}$ a hodnota $2 \in D_1$ tím přišla o svou jedinou podporu ($b = 1$ už v $D_2$ není a $2 > 2$ neplatí). Oprava jedné hrany může rozbít hranu opravenou dříve.
Slide 27 (EN 1:1): “After revision, some of the arcs are still nonconsistent — the reason is that some of the domains have been reduced — continue in the revision until all the arc are consistent (but you have to do it without perpetual AC checking of all arcs — see AC-3 alg.).” Druhý průchod už je krátký:
| revised arc | deleted | revised domain | $(x_1, x_2)$ | $(x_2, x_1)$ | $(x_2, x_3)$ | $(x_3, x_2)$ |
|---|---|---|---|---|---|---|
| $(x_1, x_2)$ | $2^{5)}$ | $x_1 \in \{3\}$ | AC | AC | AC | AC |
Výsledek: $D_1 = \{3\}$, $D_2 = \{2\}$, $D_3 = \{3\}$ — všechny hrany AC; tady dokonce zbylo jediné přiřazení $x_1 = 3$, $x_2 = 2$, $x_3 = 3$ (zkontroluj: $3 > 2$ ✓, $2 \ne 3$ ✓, $2 + 3 = 5 > 4$ ✓). Pozor ale, to je náhoda téhle instance — obecně AC dává jen zmenšené domény, ne řešení ([L6.1] takeaways: produkt domén je nadmnožina řešení).
Opakovat slepě všechny průchody, dokud se nic nemaže, by fungovalo — ale je to plýtvání (slide tomu říká „perpetual AC checking“). Příznak deleted umožňuje chytřejší otázku:
Hrany bez $x_i$ se nezměnily vůbec. Hrany ven z $x_i$, tj. $(x_i, x_k)$: jejich počátek se zmenšil — hodnoty, které zbyly, mají své podpory v $D_k$ pořád, takže AC se pokazit nemůže (ubyly jen „kontrolované“ hodnoty). Pokazit se mohly jen hrany do $x_i$, tj. $(x_k, x_i)$: doména $D_i$ je pro ně zásobárna podpor a ta se právě ztenčila — hodnota $c \in D_k$, jejíž jedinou podporou bylo smazané $a$, je teď bez podpory. Přesně to jsi viděl v příkladu: zmenšení $D_2$ rozbilo hranu $(x_1, x_2)$.
Jedna jemnost navíc (slide 28, EN 1:1): “The revision of $(x_k, x_m)$ does not change the arc consistency of $(x_m, x_k)$.” Proč? Hodnota $a$ smazaná z $D_k$ neměla v $D_m$ žádného partnera — takže nebyla podporou žádné hodnoty $b \in D_m$ a její zmizení hraně $(x_m, x_k)$ nic nevzalo. Protisměrnou hranu právě revidovaného omezení tedy znovu kontrolovat netřeba. Z těchhle dvou pozorování („po smazání z $D_i$ přezkoumej hrany do $x_i$“ + „protisměrku ne“) se v [L6.3] poskládá fronta algoritmu AC-3 — včetně přesného pravidla, které hrany do fronty vracet.
deleted + zmenšenou $D_i$. Po volání je hrana $(x_i, x_j)$ AC; mění se jen doména počátku.“Let us consider the CSP problem given by:
Reduce the domains to be arc consistent. Record the steps of the algorithm (the queue content prior to the revision of each arc).”
Dnešní (vlastní) instrukce — záznam fronty si necháme do [L6.3], dnes proveď redukci ve stylu slidu 27: apply REVISE to the arcs in the order $(x_1, x_2), (x_2, x_1), (x_2, x_3), (x_3, x_2)$; for each call record the deleted value(s) and the revised domain. Then decide which arcs may have become inconsistent again, finish the revision, and state the final arc-consistent domains.
Zkoušková instance Slotu 6 (v [L6.1] T02 už máš její graf a diagnózu: non-AC jsou $(x_2, x_3)$ a $(x_3, x_2)$). Dnes domény skutečně zredukovat: čtyři volání REVISE v pevném pořadí + dokončení druhým kolem tam, kde se něco rozbilo.
U každého volání si nejdřív napiš vzorec podpory: pro $x_1 = x_2$ je to $b = a$ (oba směry), pro hranu $(x_2, x_3)$ je podpora hodnoty $a \in D_2$ rovna $b = a - 1$, pro $(x_3, x_2)$ je to $b = a + 1$. Pak mechanicky škrtej. Po průchodu se ptej: které domény se zmenšily a které hrany do nich vedou? Ty zkontroluj znovu.
Krokuj běh (snímky = stavy po jednotlivých voláních REVISE):
deleted $= 0$.deleted $= 0$.deleted $= 1$.deleted $= 1$.Co se mohlo rozbít? Zmenšily se $D_2$ (krok 3) a $D_3$ (krok 4). Do $x_2$ vedou hrany $(x_1, x_2)$ a $(x_3, x_2)$ — druhá se revidovala až po zmenšení $D_2$, takže stačí znovu $(x_1, x_2)$. Do $x_3$ vede jen $(x_2, x_3)$, což je protisměrka hrany revidované v kroku 4 — dle slidu 28 se rozbít nemohla (a vskutku: $a{=}2 \to b{=}1 \in D_3$ ✓).
deleted $= 1$. Teď jsou všechny čtyři hrany AC.Výsledek: $D_1 = \{2\}$, $D_2 = \{2\}$, $D_3 = \{1\}$ — odpovídá jedinému přiřazení $x_1 = 2$, $x_2 = 2$, $x_3 = 1$ (kontrola: $2 = 2$ ✓, $2 = 1 + 1$ ✓). Stejné domény dává i vzorový průběh AC-3 v bance #41 — v [L6.3] tenhle běh zopakuješ i se záznamem fronty před každou revizí, přesně jak chce zadání.
Poznámka: dochované ruční řešení zkoušky škrtá zrcadlové hodnoty (čte $x_3 = x_2 + 1$) — rozpor je rozebraný v [L6.1] T02; tady počítáme doslovně dle tištěného $x_2 = x_3 + 1$.
“CSP with variables and domains: $x_1 \in \{1, 2, 3\},\ x_2 \in \{1, 2, 3\},\ x_3 \in \{2, 3\}$ and constraints $x_1 > x_2,\ x_2 \ne x_3,\ x_2 + x_3 > 4$.”
Apply REVISE to the arcs in the reversed order $(x_3, x_2), (x_2, x_3), (x_2, x_1), (x_1, x_2)$, then finish the revision wherever an arc may have become inconsistent again. Record the deleted values and the revised domains after each call. Do you obtain the same final domains as with the order used on slide 27?
Stejná instance, jakou výklad propočítal v pořadí slidu 27 — teď hrany revidovat pozpátku. Otázka míří na to, co je na výsledku REVISE „náhoda pořadí“ a co ne.
Mechanika je stejná, jen jiné pořadí — pozor, že u dvojice $\{x_2, x_3\}$ musí podpora splnit obě omezení současně. Po průchodu zkontroluj hrany vedoucí do zmenšených domén. A než začneš počítat, tipni si: vyjde totéž?
deleted $= 0$.Dokončení: zmenšily se $D_2$ (kroky 2, 3) a $D_1$ (krok 4). Do $x_1$ vede jen protisměrka $(x_2, x_1)$ → netřeba. Do $x_2$ vedou $(x_1, x_2)$ — revidována až po posledním zmenšení $D_2$ ✓ — a $(x_3, x_2)$, revidovaná ještě před škrty → znovu:
Výsledek: $D_1 = \{3\}$, $D_2 = \{2\}$, $D_3 = \{3\}$ — přesně totéž co v pořadí slidu 27, jen se hodnoty škrtaly v jiných krocích (a celkem to opět dalo 5 volání REVISE). Pořadí revizí mění průběh, ne výsledné domény — výsledné maximální arc-consistent domény jsou pro danou instanci jednoznačné (vlastní pozorování nad rámec slidů; u zkoušky se na pořadí fronty držte zadaného/kanonického pořadí, ať examinátor snadno kontroluje).