Závěrečná zpráva 2

Jakub Holý: Řešení problému přelévání vody
(resp. zobecněný problém dvou kýblů)
36PAA LS 2002
Aktualizace 5.11.2009: Dodány chybějící solution a trace soubory.

Úvod

Teoretický úvod s dovolením vynechám, neboť jsou obsaženy v zadání (pro zvědavé viz odkazy).

Popis heuristiky

Heuristika staví na prohledávání do šířky, které je vylepšeno záměnou fronty za frontu s předbíháním vzhledem k prioritě (o tom viz dále). Aby bylo zabráněno smyčkám a neefektivnímu prohledávání již navštívených částí stavového prostoru, stavy už známé zahazujeme.

Priorita stavu ve frontě by měla odrážet jeho vzdálenost k cílovému stavu. Protože to se těžko odhaduje, rozhodl jsem se ohodnotit jednotlivé operace vzhledem k tomu, jak přibližují konečné řešení. Přitom jsem vycházel z předpokladu, že cesta k cíli vede hlavně přes získávání takových objemů, které je obtížné vytvořit. Proto je cílem mého ohodnocení podporovat takové kombinace, které vedou ke vzniku objemů, jež se dosud nevyskytly. Čísla použitá pro ohodnocení jsem stanovil čistě odhadem, pro skutečné použití by bylo zapotřebí určit je na základě experimentů.
Protože heuristika má mít nulovou hodnotu pro cílový stav, platí pro ohodnocení "čím vyšší tím horší":

- plný a prázdný kýbl: nejvíce "trestných bodu" (nejjednodušeji získatelný)
- již jednou získaný objem: hodně (zajímavé jsou hlavně nové kombinace)
- zcela nový objem: málo
- cílový objem: nula

Popis algoritmu

1. Vlož počáteční stav do fronty
2. opakuj {
2.1 Vezmi čelo fronty
2.2 Je vzatý stav konečný? Pokud ano, ohlaš úspěch a skonči.
2.3 Získej všechny potomky stavu (postupným uplatněním všech smysluplných operací)
- pokud je potomek již navštíveným stavem (tzn. je ve vertices[]), zahoď jej
- jedná-li se o nový stav, spočti jeho prioritu a vlož jej do fronty
} až dokud prioritní fronta není prázdná (pak ohlaš neúspěch);

Výsledky

1. tabulka zadání

Instance Délka cesty
k řešení
Počet navštívených bodů
stavového prostoru
Stav 1 23 973
Stav 2 24 587
Stav 3 12 193
Stav 4 4 46

2. tabulka zadání

Instance Délka cesty
k řešení
Počet navštívených bodů
stavového prostoru
Stav 1 53 3317
Stav 2 55 1232
Stav 3 54 3192
Stav 4 8 103
Stav 5 22 1072

3. tabulka zadání

Instance Délka cesty
k řešení
Počet navštívených bodů
stavového prostoru
Stav 1 17 862
Stav 2 40 3512
Stav 3 23 840
Stav 4 8 91
Stav 5 25 1589
Stav 6 31 1945

Závěr

Heuristika pokaždé našla řešení v rozumném čase, přičemž můžeme vysledovat zdánlivou závislost mezi délkou cesty a počtem navštívených stavů, což je dáno tím, že oboje se odvíjí od složitosti žádaného cílového stavu (částečně však závisí na štěstí jak brzy na jak kvalitní řešení narazíme). Otázka je, jak moc se to které řešení blíží řešení optimálnímu co do počtu operací s kýbly. Kdyby se trochu experimentovalo s hodnotami heuristiky pro ohodnocování stavů, s největší pravděpodobností by se povedlo najít takové, pro něž by byl obvykle výsledek lepší. Co se týče počtu navštívených stavů a náročnosti na paměť, stálo by za uvážení vnést do výpočtu víc inteligence a nezkoušet kombinace všech kýblů, ale s ohledem na to, že operacemi na dvou kýblech o nesoudělných objemech lze docílit jakéhokoliv množství tekutiny v rozmezí těchto objemů, mohli bychom se omezit pouze na pár kýblů po většinu výpočtu. V tomto nenáročném případě však je mé řešení postačující.

Přílohy

Zdrojové kódy programového řešení: