Úloha č. 2 - problém kýblů

Základní problém je definován takto: K dispozici jsou dva kýble (předem daných obecně rozdílných objemů), vodovodní kohoutek a kanál. Na počátku jsou oba kýble prázdné. Vaším úkolem je docílit toho, aby v jednom kýblu byla voda o předem stanoveném objemu, přičemž můžete pouze naplnit plný kýbl z kohoutku, vylít celý kýbl do kanálu a přelít jeden kýbl do druhého tak, aby druhý kýbl nepřetekl.
Problém lze zobecnit tím, že připustíme užití většího počtu kýblů, aby na počátku řešení byla v kýblech nějaká voda, a že předepíšeme koncový objem vody v každém kýblu.

Zadání úlohy

Navrhněte a implementujte heuristiku řešící zobecněný problém dvou kýblů. Heuristiku otestujte na následujících příkladech:
Kýble (objem) 14 10 6 2 8
Počátek 0 0 1 0 0
Stav 1 12 6 4 1 8
Stav 2 14 4 5 0 4
Stav 3 12 6 6 2 4
Stav 4 0 2 1 2 8

Kýble (objem) 15 12 8 4 6
Počátek 0 0 0 0 0
Stav 1 5 5 5 0 1
Stav 2 12 1 3 4 5
Stav 3 11 1 3 4 5
Stav 4 3 12 4 0 6
Stav 5 2 0 4 3 6

Kýble (objem) 14 10 12 3 8
Počátek 0 0 0 0 0
Stav 1 13 9 12 2 7
Stav 2 1 5 5 3 4
Stav 3 0 9 6 3 1
Stav 4 12 0 12 0 2
Stav 5 7 3 7 0 0
Stav 6 7 0 7 0 7

Řešení

V rámci vytváření vhodného algoritmu pro tuto úlohu, jsem vytvořil řadu různých heuristik a náhodně generovaných zadání testoval počet prošlých uzlů, délku cesty, resp. odchylku a parametr hodnotící zvolenou heuristiku 1/(delka*pocet_proslych_uzlu). Tak mi vznikl graf s poměrným měřítkem (není důležitá hodnota a spíše poměr-porovnání):

Popis implementovaných heuristik

Prohledávání do šířky

Prohledávání do šířky prochází v průměru (existují instance, při kterých prohledávání do hloubky projde více uzlů) nejvíce uzlů, ale zaručeně nachází nejkratší cestu, resp.nejmenší počet operací, které jsou nutné provézt.

Prohledávání do hloubky

Prohledávání do hloubky by v principu měl oproti prohledávání do šířky nalézt řešení rychleji, ale obecně s velmi dlouhou cestou. Samotné prohledávání stavového prostoru je velmi závislé na pořadí vygenerovaných následujících stavů.

Suma absolutních odchylek

Tato heuristika vypočítá rozdíly mezi posuzovaným a cílovým stavem. Z nich vypočte sumu a sečte se vzdáleností od počátku.
Heuristika je velmi jednoduchá a rychlá. Přesto se vyznačuje poměrně dobrou aproximací a tak tato heuristika patří mezi nejlepší.

Eliminace + použitelnost možných změn

Tato heuristika rozdělí kýble do dvou skupin, do první dá kýble, které již mají požadovanou hodnotu. Ze zbylých určí jaké stavy mohou generovat (rozdíly maxim) a ohodnotí je podle aktuální hodnoty v kýblu. V poslední fázi pro každý kýbl hledá, kolik stojí daná operace. Při nenalezení je ohodnocena podle rozdílu od cíle.
Jedná se poměrně o složitou heuristiku, která generuje služné výsledky. Pro svou složitost výpočtu je ale značně nevhodná (především v porovnání s následující).

Správná hodnota, 1 přelití, 2. přelití

Tato heuristika je založena na myšlence, že výsledkem je suma dílčích ohodnocení kýblů. Tzn. že každému kýblu bude přiřaze ohodnocení podle toho do které skupiny patří:
  • v kýbli je požadované množství
  • požadované množství lze realizovat 1 přelitím z jiného kýble
  • požadované množství lze realizovat 2 přelitími z jiných kýblů
  • ani jedna z předchozích

Zbývající voda

Tato heuristika je nejjednoduší, velmi podobná sumě rozdílů. Zde se porovnává rozdíl vody ve všech kýblech na počátku a konci.
Oproti již zmíněné má stejnou složitost, ale mnohem horší výsledky...

Eliminace + Správná hodnota, 1 přelití, 2. přelití

Jak je již patrné, tato heuristika vznikla odvozením jiné. Rozdíl je v tom, že se nejprve provede eliminace - rozdělení do dvou skupin (kýble s vyhovujícím obsahem/ostatní) a na skupině kýblů, kde množství nevyhovuje se provede výše zmíněná heuristika.
Takto upravená heuristika má oproti původní několik rozdílných vlastností. Není zaručeno, že tato heuristika je lepší, její lepší hodnoty jsou patrné až na větším testovaném vzorku. Své výhody získává především na snížení počtu poršlých stavů, za což ale platí větší možnou odchylkou od optimálního řešení.

Výsledky

Protože jako nejlepší heuristika byla vybrána jedna, která byla modifikována a mezi nimiž jsou naprosto rozdílné charakteristiky, zapsal jsem do výsledků obě dvě, přičemž je očekáváno, že jedna bude mít kratší cesty a druhá méně prohledaných uzlů...
úloha prohledávání do šířky Správná hodnota, 1 přelití, 2. přelití Eliminace + správná hodnota, 1 přelití, 2. přelití
počet prošlých uzlů počet operací počet prošlých uzlů počet operací počet prošlých uzlů počet operací
1/1 8991 10 125 11 41 17
1/2 8015 8 77 9 56 14
1/3 7914 8 12 10 13 10
1/4 163 3 4 4 5 4
2/1 49349 16 13288 18 769 32
2/2 41672 12 1390 16 134 41
2/3 35752 11 257 14 54 14
2/4 871 5 15 6 27 8
2/5 6279 7 204 13 85 17
3/1 59199 14 876 14 66 17
3/2 58768 12 1529 17 136 28
3/3 40886 10 255 14 25 14
3/4 1504 5 24 9 14 10
3/5 9042 7 57 9 15 8
3/6 27168 9 193 10 275 14
součet 355573 137 18306 174 1715 248
Naměřené hodnoty zcela splnily očekávání. Součet jednotlivých sloupců jasně nazančuje charaktrerické vlastnosti heuristik a BFS.
Rozdíly v počtu prošlých stavů mezi prohledáváním do šířky a nějakou z heuristik je velký. Dále je vidět, že rozdíl mezi jednotlivými heuristikami není zaručen, ale vcelku se dá říci, že heuristika eliminace+1,2,3 je co se týče náročnosti na počtu prošlých stavů výhodnější.

Program

Aplikace je psaná v Javě 1.5 (JBuilder 2006). Pro spuštění bude možná nutné upravit cestu k interpretu v souboru run.bat.
stáhnout

Závěr

Na aplikaci je zřetelně vidět, jak může správně zvolená heuristika změnit, resp. zrychlit chod aplikace.
Na druhou stranu z pohledu počtu různých heuristik a procházení stavového prostoru lze konstatovat, že každá z heurstik může mít jiné výhody a tak zvolit jednoznačně nejlepší není úplně snadné.
Například heuristika součet absolutních hodnot rozdílů má také dobrou aproximaci, která se blíží k nejlepším, ale narozdíl od nich je velmi snadno implementovatelná a výpočet její hodnoty mnohem rychlejší, a tak by v určitých případech mohla být výhodnější...