Petr Malát Úloha 1 Úloha 2 Úloha 3 Úloha 4 Úloha 5 Úloha 6 Pondělí 11:00

Řešení problému kýblů

Popis problému

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í

Navrhněte a implementujte heuristiku řešící zobecněný problém dvou kýblů. Heuristiku otestujte na všech následujících příkladech a srovnejte s prohledáváním stavového prostoru do šířky (BFS). Volitelně srovnejte i s prohledáváním do hloubky (DFS). Zvolenou heuristiku popište ve zprávě.

Řešení

Popis implementace

Program je napsán tak, že umožňuje výměnou hlavní datové struktury provést měření pro heuristiku (prioritní fronta), DFS (zásobník) i BFS (fronta). Volba se provede definováním DFS (pro DFS) či BFS (pro BFS) při překladu. V přídě že není definováno ani jedno z maker, použije se heuristika. Dále je možné předefinovat počet kýblů předefinováním makra KYBLU. Zdrojový kód programu, brutal-force testování parametrů heuristiky a vyhodnocovač.

Popis heuristiky

Heuristická funkce ohodnotí stav na základě toho, jak "hodně se blíží" cílovému stavu. Každá podobnost s cílovým stavem je ohodnocena a cena stavu je součet těchto jednotlivách cen. Dále se ještě znevýhodňují stavy, kterých je snadné dosáhnout.

Bere se v úvahu:

Problém je jen to, jak správně ohodnotit jednotlivé vlastnosti stavu. Nejdříve jsem hodnoty určil intuitivně, ale pak jsem použil systematické zkoušení všech kombinací na jednotlivé instance. Počet různých cen jsem snížil na pět a každá postupně nabývala jedné z deseti hodnot (z různých rozsahů). Bohužel jsem rozsahy nezvolil úplně optimálně, protože výsledné hodnoty ležely u jejich hranic a výpočet jsem již nemohl opakovat z časových důvodů.

Pro porovnání jsem vybral 3 různé heuristiky - první z nich se snaží o co nejkratší cestu, druhá o co nejmenší počet generovaných stavů a třetí o kombinaci obojího (minimalizuje výraz délka_cesty × délka_cesty × délka_cesty × počet_stavů)

Pozorování

#i Prohledávání do šířky Prohledávání do hloubky Heuristika 1 Heuristika 2 Heuristika 3
OperacíDélka OperacíDélka OperacíDélka OperacíDélka OperacíDélka
1.1 229761 11 76228 1044 3194 14 1595 25 1704 14
1.2 146426 9 56334 323 10981 13 907 17 10875 14
1.3 1469599 107645 112614 47716 40115
1.4 4754 56036313 695 695 695
2.1 132235017 2798349911 538031 361855 351828
2.2 85745913 2068987460 709540 760141 533537
2.3 59172912 29761110469 1037537 765378 821930
2.4 41556 18289698 10638 1709 13119
2.5 436548 1426685258 658822 200426 326518
3.1 158665715 50657414479 436130 238535 246726
3.2 149010313 2207917978 1176132 319932 313531
3.3 79850511 482901834 340519 105531 84118
3.4 48576 14893566 5896 3508 3868
3.5 632248 451801713 6309 43011 32010
3.6 39060610 1367945064 99514 110218 119815