V posledních několika měsících se z DecisionRules stal velmi výkonný a efektivní obchodní nástroj, který dokáže snadno řešit složité úlohy a je použitelný v široké škále různých oblastí. Využití DR je vázáno pouze vaší představivostí, proto jsme si jako důkaz připravili článek o tom, jak jsme realizovali skládání Rubikovi kostky v DR.

Víte, čím původně byla Rubikova kostka?

Dnes je Rubikova kostka známá jako nejprodávanější hlavolam na světě, ale kdysi to nebylo nic jiného než způsob, jak pochopit vztahy v trojrozměrném prostoru. Skládá se ze 6 stran. Každá strana má 9 stěn stejné barvy. Cílem tohoto hlavolamu je rozmíchání kostky a následné vrácení do původního stavu. Mícháním kostky můžete dostat přes 43 trilionů různých stavů.

Kdybyste se snažili Rubikovu kostku složit naslepo, zabralo by vám to spoustu času.
Proto používáme algoritmy pro rychlejší řešení. Existuje mnoho metod řešení Rubikovy kostky, například ROUX, ZZ nebo CFOP. Jedná se o různé metody, jak kostku poskládat, ale všechny fungují na stejném principu. Rubikovu kostku řešíme tak, že si ji rozdělíme na podmnožiny (fáze), a poté postupně řešíme každou podmnožinu samostatně.

Využitý algoritmus pro řešení Rubikovy kostky - CFOP

V našem případě jsme se rozhodli řešit Rubikovu kostku v DecisionRules pomocí metody CFOP. Metoda CFOP je celosvětově nejrozšířenější metodou řešení a patří jí první místo v žebříčku nejrychlejšího skládání kostky člověkem, takže pokud se chcete naučit řešit RK sami, rozhodně to zvládnete za pomoci DecisionRules.

Abychom pochopili, jak tuto metodu implementovat v systému DR, musíme se blíže podívat na to, jak metoda CFOP vlastně funguje. Každé písmeno v CFOP vyznačuje jednu fázi, která řeší jinou část krychle. V překladu je to “Kříž, první dvě vrstvy, orientace poslední vrstvy, permutace poslední vrstvy". Prvním krokem tedy bude vytvoření čtyř pravidel, přičemž každé pravidlo představuje jednotlivou fázi. 

Řešení Rubikovy kostky

Nyní musíme řešit jednotlivé fáze po sobě, ale nejprve musíme vyhodnotit aktuální stav kostky jako vstup a pracovat s ním. Z tohoto důvodu musíme vytvořit vlastní notaci, abychom přesně věděli, s jakým dílkem pracujeme a jaká barva je nad ním. Příklad našeho zápisu RC si můžete prohlédnout níže.

Jak můžete vidět, rozdělili jsme naši kostku na 54 čísel, kde každé reprezentuje právě jeden obličej. Tyto informace vezmeme a zaznamenáme do jednoho stringu.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

Tento řetězec představuje vyřešenou kostku. Celá čísla v řetězci vypadají uspořádaně, to proto, že skrývá dvě informace o krychli najednou: za prvé je zde pořadí čísel zleva doprava představující referenční pozice začínající od 0 do 53, které se za každé bílé místo inkrementují o jedničku a za druhé jsou zde názvy stěn, které jsou pod referenčními pozicemi. Podívejte se na číslo 4 v řetězci, to co vidíte je stěna 4, stěna 4 je čtvrté číslo zleva, takže její referenční pozice je také 4. Když se názvy všech stěn shodují s jejich referenčními pozicemi, je krychle vyřešena.

Nyní, když víme, jak číst informace o aktuálním stavu krychle, musíme přemýšlet o tom, jak uživateli sdělit, jaké kroky má udělat jako další, proto použijeme oficiální notaci Rubikovy kostky. Tato notace říká, kterou stranou je třeba otočit v jakém směru. 

Pochopili jsme, jak má vypadat vstup a výstup, nyní je čas vytvořit fáze.

První fáze se nazývá “Kříž” nebo "Cross" 

V této fázi budeme všechny bílé hrany orientovat kolem jejich středu, po dokončení budou vypadat jako kříž. Tuto část vyřešíme pomocí čtyř pravidel.

  • první pravidlo kontroluje složité kombinace (snižuje potřebný počet algoritmů jednoduchou úpravou)
  • druhé zjistí s jakou stranou právě pracujeme
  • třetí přepočítá pozici v závislosti na druhém pravidle
  • čtvrté vyřeší jednu hranu

Druhá fáze se nazývá “F2L (first 2 layers)” nebo "první 2 vrstvy" 

F2L se řeší složením párů hrany a rohu v prvních dvou vrstvách kostky, pomocí čtyř pravidel.

  • první pravidlo zjistí s jakou stranou právě pracujeme
  • druhé přepočítá pozici v závislosti na prvním pravidle
  • první pravidlo kontroluje složité kombinace (jako u Kříže)
  • čtvrté vyřeší jeden pár

Proč složité kombinace voláme jako třetí pravidlo a ne první jako v předchozí fázi?

Je to proto, že Cross má ve složitých kombinacích kombinací mnohem méně, takže nemusíme přepočítávat pozici tak brzy (lepší výkon).

Třetí fáze se nazývá “OLL” nebo "orientaci poslední vrstvy"

V OLL (orientation of the last layer) fázi vyřešíme celou plochu kolem žlutého středu. K tomu používáme tři pravidla.

  • první pravidlo kontroluje složité kombinace
  • druhé orientuje žluté hrany
  • třetí orientuje žluté rohy

Tentokrát není třeba přepočítávat pozici, protože existuje mnohem méně kombinací než v případě F2L nebo Cross.

Čtvrtá a zároveň poslední fáze je "PLL"  nebo "Permutaci poslední vrstvy"

V PLL (permutation of the last layer) části musíme vyřešit permutaci poslední vrstvy, přičemž použijeme pouze dvě pravidla. 

  • první pravidlo orientuje rohy
  • druhé orientuje hrany

Po vytvoření všech těchto pravidel je čas upravit vše ve scripting rules a uvést je do života pomocí jednoho Rule flow. 

Společně jsme implementovali metodu CFOP do DecisionRules, ale nemáme způsob, kterým by jsme si kostku vizualizovali, proto bude dalším krokem výběr vhodného 3D enginu, v našem případě Unity, ve kterém vytvoříme Rubikovu kostku a následně ji připojíme k DR. Ptáte se jak? Pomocí rozhraní Rest API.

Využití a funkce Rest API

Jak funguje rozhraní Rest API s DR? Naším prvním krokem je importovat DR nugget do Unity a poté vygenerovat příklad kódu v .NET z DR Test bench. Před kopírováním kódu se ujistěte, že jste vybrali správný Rule flow. Díky automaticky vygenerovanému kódu se nemusíme starat o žádné další kódování, stačí vložit náš příklad kódu do Unity, odeslat aktuální stav kostky jako řetězec do DR a sledovat, jak se kostka skládá před našima očima.

High-level příklad jak DecisionRules komunikuje s Unity.

Zhodnocení

Jak můžete vidět, rule engine DecisionRules je skvělou volbou pro řešení složitých problémů, jako je řešení Rubikovy kostky, usilovně pracujeme na jeho vývoji a každým dnem posouváme hranice v efektivním řešení obchodních problémů.

Koukněte se i na naše video: https://youtu.be/4H80D6ULDHQ