36 PAA - Problémy a algoritmy

Úloha 2: Problém kýblů

Jan Dohnal (dohnaj1@fel.cvut.cz)



Zadání a specifikace problému

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.


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

 

Řešení problému

Pro řešení daného problému byla použita metoda s využitím prioritní fronty pro ukládání stavů. Priorita prvku je určena pomocí tohoto pravidla: Pokud se v aktuální konfiguraci vyskytuje kýbl se stejným obsahem vody na správné pozici jako v koncovém stavu, zvýší se priorita o 2. Pokud se vyskytuje správný objem ale na špatné pozici, zvýší se priorita o 1. V další iteraci se pak vybírá prvek s nejvyšší prioritou.

Naměřené hodnoty

V následujících tabulkách jsou naměřené počty operací a zanoření do stavů pro použitou heuristiku. Šedomodrá pole popisují parametry kýblů, růžové jsou koncové stavy kýblů a žluté jsou výsledky.



kýble (objem)1410 6 2 8BFSheuristika
počátek 0 0 1 0 0#operací#stavů#operací#stavů
stav 112 6 4 1 810899113 36
stav 214 4 5 0 4 8832213439
stav 312 6 6 2 4 8796115 40
stav 4 0 2 1 2 8 3 249 4 5


kýble (objem)1512 8 4 6BFSheuristika
počátek 0 0 0 0 0#operací#stavů#operací#stavů
stav 1 5 5 5 0 1164935038292
stav 212 1 3 4 5123998245492
stav 311 1 3 4 5113274223204
stav 4 312 4 0 6 5 790 8 72
stav 5 2 0 4 3 6 7 463016246


kýble (objem)141012 3 8BFSheuristika
počátek 0 0 0 0 0#operací#stavů#operací#stavů
stav 113 912 2 7145919917 69
stav 2 1 5 5 3 4125870332202
stav 3 0 9 6 3 1104365017 62
stav 412 012 0 2 5 998 5 24
stav 5 7 3 7 0 0 7 733910 39
stav 6 7 0 7 0 7 92740113 58


Závěr

Naměřené hodnoty ukazují, že použitá heuristika je jednoduchá a vcelku účinná. Hodnoty pro výpočet priority jsou definovány staticky, pro dosažení lepších výsledků by bylo výhodnější provádět dynamický výpočet v závislosti na konkrétní instanci problému. Další možností by bylo neuvažovat všechny kombinace přelívání kýblů, ale jen ty, které mohou vést k výsledku. To by si však vyžádalo vyšší inteligenci algoritmu.

Příloha

Ke stažení je k dispozici zabalená celá úloha, nebo jen zdrojový kód vytvořený v programovacím jazyku C: