24.07.2013 Views

Aktualna verzia diplomovej prace - TUKE

Aktualna verzia diplomovej prace - TUKE

Aktualna verzia diplomovej prace - TUKE

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Technická univerzita v Košiciach<br />

Fakulta elektrotechniky a informatiky<br />

Automatická tvorba skriptovaného GUI s<br />

využitím umelej inteligencie<br />

Diplomová práca<br />

2013 Michal Širochman


Technická univerzita v Košiciach<br />

Fakulta elektrotechniky a informatiky<br />

Automatická tvorba skriptovaného GUI s<br />

využitím umelej inteligencie<br />

Diplomová práca<br />

Študijný program: Umelá Inteligencia<br />

Študijný odbor: 9.2.8 Umelá Inteligencia<br />

Školiace pracovisko: Katedra Kybernetiky a Umelej Inteligencie (KKUI)<br />

Školiteľ: Ing. Rudolf Jakša, PhD.<br />

Konzultant:<br />

Košice 2013 Michal Širochman


Erráta<br />

Automatická tvorba skriptovaného GUI s využitím umelej<br />

inteligencie<br />

Michal Širochman<br />

Košice 2013<br />

Ak je potrebné, autor na tomto mieste opraví chyby, ktoré našiel po vytlačení práce.<br />

Opravy sa uvádzajú takým písmom, akým je napísaná práca. Ak zistíme chyby až<br />

po vytlačení a zviazaní práce, napíšeme erráta na samostatný lístok, ktorý vložíme<br />

na toto miesto. Najlepšie je lístok prilepiť (Katuščák, 1998).<br />

Forma:<br />

Strana Riadok Chybne Správne<br />

12 6 publikácia prezentácia<br />

22 23 internet intranet


Abstrakt v AJ<br />

This thesis investigate possibilities of automatic creation of graphical user interface<br />

via tools of artificial intelligence. Importance of graphical user interface is common<br />

knowledge, as for developers and administrators who are using more complex soft-<br />

ware solutions day by day focused mainly on assisting them with their tasks, and as<br />

for common users which can not know every owned program so thoroughly that they<br />

could use command prompt, not to mention today multimedial needs of users. They<br />

need intuitive and simplistic interface so they could input their mostly abstract re-<br />

quirments for programs. For contemporary large software companies is common to<br />

have vast design department for graphical user interface, as in general this applies:<br />

more effective comunication with device I can have, more productive I can become.<br />

Also, learning curve for user friendly interfaces tends to be smoother, allowing users<br />

for faster and better accommodation to the new technology. Therefore this thesis’s<br />

goal is to cover possibilities of potential use cases of artificial intelligence technology<br />

and obstacles related to them. This applies mainly to a question, whether we are<br />

capable of creating system that designs graphical user interface in innovative way,<br />

and to a question of whether we are able to create system that can even remotely<br />

get close to the quality work of their human counterparts. Throughout the thesis<br />

we will present kind of wrapper, which creates simplified API to graphical interface<br />

toolkit suitable for use with means of artificial intelligence, in this case an evolu-<br />

tionary algorithm, and also suitable for human operator. At the end of the Thesis,<br />

there will be demonstration of using this API.<br />

Kľúčové slová v AJ<br />

Automatic creation of graphical user interface, artificial intelligence<br />

Abstrakt v SJ


FEI KKUI<br />

Táto práca skúma možnosť automatickej tvorby grafického užívateľského rozhra-<br />

nia pomocou prostriedkov umelej inteligencie. Dôležitosť grafického rozhrania je<br />

všeobecne známa, ako pre vývojárov a administrátorov používajúcich toto rozhranie<br />

pre manažovanie čoraz komplexnejších systémov určených najmä pomáhať im pri<br />

ich práci, tak aj pre bežných užívateľov, ktorí nemôžu poznať všetky svoje zakúpené<br />

programy tak, aby im stačil príkazový riadok, nehovoriac o multimediálnych potre-<br />

bách dnešných užívateľov. Potrebujú intuitívne a zjednodušené rozhranie, ktoré<br />

im pomôže vyjaviť programu ich abstraknté požiadavky. Dnes je bežné pre veľké<br />

softvérové firmy, aby mali rozsiahlé oddelenie zaoberajúce sa návrhom grafického<br />

užívateľského rozhrania, pretože v princípe platí: čím efektívnejšie sme schopní ko-<br />

munikovať s daným zariadením, tým sa stávame pri práci s ním produktívnejši.<br />

Taktiež učiaca krivka na zariadeniach s priateľským užívateľským rozhraním zvykne<br />

byť plynulejšia a užívateľ sa s danou technológiou skôr stotožní. Preto si táto práca<br />

dáva za cieľ zistiť možnosti efektívnej implementácie týchto technológií a možné<br />

prekážky s tým spojené. Týka sa to najmä otázok, či sme schopní zostrojiť systém<br />

schopný inovatívneho návrhu grafického rozhrania, a či sme schopní zostrojiť as-<br />

poň systém schopný priblížiť sa kvalite dnešných grafických užívateľských rozhraní<br />

tvorených človekom. V priebehu práce uvedieme príklad kvázi wrappera, ktorým<br />

vytvoríme zjednodušené API ku nástrojom grafického prostredia vhodné pre spra-<br />

covanie prostriedkami umelej inteligencie, v tomto prípade evolučným algoritmom, a<br />

rovnako použiteľné pre ľudského pracovníka, spolu s ukážkami na záver <strong>diplomovej</strong><br />

práce.<br />

Kľúčové slová<br />

Automatická tvorba grafického užívateľského rozhrania, umelá inteligencia<br />

5


Zadanie práce


Čestné vyhlásenie<br />

Vyhlasujem, že som diplomovú prácu vypracoval(a) samostatne s použitím uvedenej<br />

odbornej literatúry.<br />

Košice, April 29, 2013 . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

Vlastnoručný podpis


Poďakovanie<br />

Rád by som vyjadril vďačnosť svojemu školiteľovi Ing. Rudolf Jakša, PhD. za jeho<br />

podporu a pomoc počas tvorby a písania celej <strong>diplomovej</strong> práce, a najmä za pomoc<br />

pri tom, keď som sa zasekol a nevedel ako ďalej. Všetkým ostatným, ktorí prispeli<br />

nejakou myšlienkov, patrí moje ďakujem.


Contents<br />

Introduction 1<br />

1 Úvod do problematiky toolkitov pre tvorbu grafického užívateľského<br />

rozhrania 2<br />

1.1 Toolkit wxWidgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3<br />

1.2 Toolkit Qt/KDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

1.3 Toolkit Gtk+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />

1.4 Perl Gtk+ toolkit <strong>verzia</strong> 3 . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2 Umelá inteligencia 11<br />

2.1 Evolučný Algoritmus . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

3 Systém pre podporu tvorby skriptovaného grafického užívateľského<br />

rozhrania 17<br />

3.1 API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

3.1.1 Výber programovacieho jazyka . . . . . . . . . . . . . . . . . . 18<br />

3.1.2 Gtk wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

3.1.3 Návrh AItk API . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

3.2 Evolučný Algoritmus . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

3.2.1 Štruktúra Jedincov . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

3.2.2 Priestor Prehľadávania . . . . . . . . . . . . . . . . . . . . . . 28<br />

3.2.3 Vhodnosť a Výber jedincov . . . . . . . . . . . . . . . . . . . 30<br />

4 Experimenty 31<br />

4.1 Použitie „Spinner“widgetu . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

4.2 Použitie „CheckButton“widgetu . . . . . . . . . . . . . . . . . . . . . 37<br />

4.3 Evolúcia grafického užívateľského rozhrania . . . . . . . . . . . . . . . 43<br />

5 Záver 51


FEI KKUI<br />

Bibliography 53<br />

Appendices 55<br />

Appendix A 56<br />

Appendix B 57<br />

10


FEI KKUI<br />

Úvod<br />

Cieľom tejto práce je navrhnúť a zostrojiť API pre zlepšenie možnosti aplikácie<br />

umelej inteligencie pri návrhu grafického užívateľského rozhrania. Motiváciou pre<br />

toto zadanie bola diplomová práca Milana Ilavského (ilavsky, 2011), ktorá sa za-<br />

oberala interaktívnou evolúciou pri návrhu používateľského rozhrania. V danej práci<br />

používal, tak ako ďalší ľudia spomínaní v jeho práci, najmä XML, a jeho rozšírená o<br />

CSS a JavaScript forma XUL. Princípom interaktívnej evolúcie je navrhovať XML<br />

templaty, ktoré užívateľ ohodnocuje, a postupne privádza algoritmus ku želanému<br />

výsledku. Zadanie tejto práce spočíva vo vytvorení možnosti pre to, aby sa pri gen-<br />

erácii GUI použitím prostriedkov umelej inteligencie nemuseli používať nepriame a<br />

komplikované metódy, ktoré treba šiť na mieru ako v prípade (ilavsky, 2011), ale<br />

aby bolo možné manipulovať priamo s widgetami toolkitu priamo v programe, ktorý<br />

ich definuje. Toho je snaha dosiahnuť tak, že zaobaľuje jednotlivé funkcie Gtk+ API<br />

do malých blokov funkcií, ktoré zjednodušujú ich volanie, nastavujúc prednastavené<br />

hodnoty a ukladajúc jednotlivé widgety do zoznamu, spolu s ďalšími vlastnosťami,<br />

podľa ktorých sa algoritmy budú môcť lepšie orientovať pri ich spracovaní. Vlast-<br />

nostiam ako farba widgetu, pozadia, typ písma a pod., ktorým bolo v práce môjho<br />

predchodcu venovaná značná časť, budú vynechané ako nepodstatné. Farba a ďalšie<br />

drobnosti by mali byť nastavované voľbou „témy“, ktorých funkcionalita je bežne<br />

dostupná v moderných toolkitoch. Dôraz sa bude klásť na funkčnú časť grafického<br />

užívateľského rozhrania, teda na štruktúru widgetov, a najmä kontajnerov.<br />

1


FEI KKUI<br />

1 Úvod do problematiky toolkitov pre tvorbu grafick-<br />

ého užívateľského rozhrania<br />

GUI je skratkou pre anglické „Graphical User Interface“, čoho slovenský preklad<br />

znamená „grafické užívateľské rozhranie“. Jedná sa o rozhranie komunikujúce s uží-<br />

vateľom pomocou obrázkov namiesto textových príkazov. Informácie sa zobrazujú<br />

pomocou vizuálnych prvkov a zadávanie inštrukcií zvyčajne prebieha formou ma-<br />

nipulácie ku tomu dedikovaných vizuálnych komponentov.<br />

V priebehu rokov vzniklo množstvo systémov implementujúcich GUI, využívajúc<br />

pri tom rôzne prístupy spracovania informácií ako výstupných, tak aj vstupných<br />

od užívateľa. Niektoré systémy sú proprietárne, alebo zakomponované priamo do<br />

aplikácie, ktorej slúžia, iné majú otvorený zdrojový kód. Vo všeobecnosti sa pro-<br />

gramové vybavenie, umožňujúce tvorbu GUI, nazýva „grafický toolkit“.<br />

Existuje nepreberné množstvo grafických toolkitov. Niektoré z najrozšítenejších<br />

zahrňajú Qt, wxWidgets, KDE a Gtk. V princípe každý grafický toolkit používa<br />

elementy pre zobrazenie obsahu, pričom tie sa zvyknú spájať a reťaziť do kompaktnej<br />

a ucelenej formy, tvoriac tak výsledný obraz aplikácie. Aplikácia je vykreslená v<br />

okne, v ktorom sú vykreslené ovládacie prvky ako menu, východ z aplikácie, vykonaj<br />

činnosť, a podobne. Tieto ovládacie prvky sú však tiež uložené v ďalších malých<br />

„okienkach“, ktoré sú usporiadané tak, aby každý set ovládacích prvkov bol na<br />

svojom mieste, aby správy boli vypísané na mieste pre ne určenom, a podobne.<br />

Všetky tieto elementy sa zhodne volajú „widgety“.<br />

Okno je napríklad widget, ktorý slúži ako najhraničnejší widget medzi grafickým<br />

rozhraním poskytovaným pre stolový počítač, a medzi samotnou aplikáciou a ich<br />

elementami. Tu sa nastavujú vlastnosti ako „stále na vrchu“ alebo „nezobrazuj sa<br />

v panely otvorených aplikácií“. Avšak také okno akceptuje len jedného potomka,<br />

len jeden widget, pretože widgety sú štruktúrované pre maximálnu efektivitu kódu<br />

2


FEI KKUI<br />

a tvorby prostredia. Do okna sa vloží tabuľka, „box“, alebo iný element, ktorý<br />

ovplyvňuje výsledné rozloženie aplikácie. Takýto widget akceptuje len technicky<br />

limitované množstvo potomkov, ale ich usporiadanie je podľa možností daného wid-<br />

getu nastaviteľné do značnej miery. Kombináciou takýchto widgetov sa dosahuje<br />

výsledný efekt ako ho väčšinou poznáme, a to menu navrchu, zaberajúce len úzky<br />

pásik, tlačidlá schované do štruktúr prepínajúc sa záložkami, panel s nástrojmi po<br />

ľavom boku, a podobne. Až potom nasledujú widgety, do ktorých vieme vložiť<br />

funkčný kód, implementujúci jednu či druhú funkcionalitu našej aplikácie, ako sú<br />

tlačidlá, textový vstup, ukladanie práce na disk, a ľubovoľné iné, ktoré aplikácia<br />

implementuje.<br />

1.1 Toolkit wxWidgets<br />

wxWidgets je grafický toolkit s otvoreným zdrojovým kódom. Napísaný je v jazyku<br />

C++, a prístup ku jeho API je možný pomocou mnohých programovacích jazykov.<br />

Projekt bol začatý v roku 1992 a v priebehu rokov sa rozrástol na veľmi používaný a<br />

obľúbený toolkit. Podľa domovskej stránky projektu ?? našiel wxWidgets použitie<br />

aj v týchto oblastiach:<br />

Priemysel - geologické modely pre ropný priemysel, software pre tlačiarne, testo-<br />

vanie nových polovodičových čipov, simulácia a kontrola bezpilotného lietadla,<br />

grafika a spracovanie audia.<br />

Výučba a verejný sektor - National Human Genome Reaseach Institute, 3D model<br />

prehliadač pre biomolekulárne štruktúry, simulácia prechodu rentgenových<br />

lúčov cez fantómové objekty, interaktívna vizualizácia a analýza 3D lazerových<br />

snímaní pre archeológov.<br />

Projekty s otvoreným kódom - existuje nepreberné množstvo verejných projek-<br />

tov, medzi najznámejšie patria Code::Blocks IDE, FTP klient FileZilla, a<br />

3


FEI KKUI<br />

Figure 1 – 1 Ukážka aplikácie používajúcej wxWidgets pre svoje GUI<br />

Caedium, ktorý simuluje správanie sa plynu alebo kvapaliny v spojitosti s<br />

rôznymi objektami.<br />

Individuálne projekty - projekty vedené jednotlivcom alebo malou skupinou ľudí<br />

s nízkym rozpočtom alebo nedostatkom času sa často obracajú práve na wxWid-<br />

gets, lebo im dovoľuje vytvoriť aplikácie pre viacero platforiem za relatívne<br />

malého vynaloženého úsilia.<br />

Medzi dôležité vlastnosti wxWidgets podľa ich vlastných slov ?? patria aj tieto z<br />

nich vybrané:<br />

Cross-platform - možnosť skompilovať ten istý kód pre použitie na viacerých plat-<br />

formách, umožňujúc sprístupniť program viac užívateľom.<br />

Otvorený zdrojový kód - môže byť použitý pre iné opensource projekty alebo aj<br />

pre proprietárne systémy.<br />

4


FEI KKUI<br />

Dokumentácia - dôkladne vypracovaná dokumentácia s množstvom príkladov v<br />

podobe minimalistických aplikácií.<br />

Tlač - zabudovaná podpora pre tlač na Windowse aj UNIX platformách.<br />

Debugging - detekovanie pretekania pamäti a jej asociácia s kódom, kde bola<br />

alokovaná.<br />

Prekladače - rozsiahla podpora prekladačov, umožňujúca kompiláciu na širokej<br />

škále platform.<br />

Drag & Drop - podpora na všetkých platformách.<br />

Multithreading - dovoľuje programátorovi lepšie využiť výpočtový potenciál mod-<br />

erných mnoho-jadrových procesorov.<br />

Taktiež treba spomenúť, že narozdiel od iných toolkitov, ktoré emulujú natívny<br />

vzhľad na rôznych platformách, wxWidgets v skutočnosti používa abstraktnú vrstvu,<br />

ktorú prekladá do natívneho toolkitu danej platformy. To spôsobuje priredzenejšie<br />

vyzerajúcu aplikáciu, častokrát aj zlepšujúc jej výkon oproti toolkitom emulujúcich<br />

natívny vzhľad.<br />

1.2 Toolkit Qt/KDE<br />

KDE toolkit vyšiel prvý krát v roku 1997. Vychádza z Qt frameworku, ktorý posky-<br />

tuje okrem iného prostriedky pre tvorbu GUI. Je to moderný grafický toolkit, a<br />

jeden z dvoch najrozšírenejších toolkitov na Linux platforme, po boku s Gtk toolk-<br />

itom. Je pôvodom z grafického prostredia pre stolové počítače, ktorý sa neskôr<br />

rozrástol do plnohodnotného projektu s množstvom produktov. Narozdiel od už<br />

spomínaného wxWidgets, KDE emuluje natívny vzhľad na platformách, nepoužíva<br />

ich natívne knižnice na viac ako na overenie svojich predpokladov pri vykreslovaní<br />

5


FEI KKUI<br />

Figure 1 – 2 Ukážka aplikácie používajúcej Qt pre svoje GUI<br />

widgetov. Taktiež, KDE nie je cross-kompilovateľný, ale je portovaný na platformy<br />

mimo Linuxu. Pri jeho komplexnosti to však nie je žiadne prekvapenie.<br />

Dokáže vytvoriť GUI na základe XML pomocou svojeho XML GUI Builder-u, a<br />

dokáže vložiť jednu aplikáciu do druhej akoby sa jednalo o widget. Implementuje<br />

aj aplikačné I/O rozhranie v separátnom procese, umožňujúc tvorbu neblokujúceho<br />

GUI s prístupom k mnohým protokolom ako napríklad HTTP, FTP, POP, IMAP,<br />

LDAP alebo proste prístup ku lokálnym súborom, a povoľuje pridať ďalšie pro-<br />

tokoly, ktoré sa takto stávajú automaticky viditeľné pre všetky aplikácie používa-<br />

júce KDE. Poskytuje tiež KHTML Rendering Engine, čo v stručnosti znamená, že<br />

dokáže vykresliť čokoľvek podľa inštrukcií jazykov ako sú javaScript, Java, HTML<br />

4.0, CSS-2.<br />

Elementárna architektúra KDE na Linux platforme je zobrazená na obrázku 1 – 3.<br />

6


FEI KKUI<br />

Figure 1 – 3 Základná architektúra KDE toolkitu na platforme Linux<br />

1.3 Toolkit Gtk+<br />

Názov Gtk+ nachádza svôj pôvod v názve Gtk - „Gimp Toolkit“, ktorý bol vytvorený<br />

pre program GIMP. Znak „+“ bol pridaný až neskôr, aby sa zdôraznila nová vylepšená<br />

<strong>verzia</strong>. Je dostupný natívne pre Linux, na iných platformách neemuluje natívny<br />

vzhľad, a je dostupný len ako port. Je na ňom založené jedno z najpopulárnejších<br />

grafických rozhraní pre stolové počítače používajúce Linux, prostredie „Gnome“.<br />

Developeri tohoto prostredia teraz pokračujú v údržbe a vylepšovaní Gtk+ toolk-<br />

itu, ktorý je základom mnohých ďalších aplikácií a dokonca aj ďalších grafických<br />

rozhraní, zamierených na ďalšie platformy alebo na minimalistický dizajn. Medzi<br />

najdôležitejšie patria:<br />

Gnome - Jeden z najobľúbenejších a najrozšírenejších grafických rozhraní pre Linux<br />

vôbec, spolu už so spomínaným KDE.<br />

Xfce - zjednodušené rozhranie, zamerané na nájdenie rovnováhy medzi náročnostou<br />

prostredia a jeho dostupnými funkciami.<br />

LXDE - jeho cieľom je minimalistické prostredie.<br />

Sugar - zameraný na interaktívnu výučbu detí.<br />

7


FEI KKUI<br />

Figure 1 – 4 Ukážka aplikácie používajúcej Gtk+ pre svoje GUI<br />

Figure 1 – 5 Základná architektúra KDE toolkitu na platforme Linux (Gtk overview, 2013)<br />

Gtk+ API je prístupné z asi dvoch tuctoch programovacích jazykov. Dokonca exis-<br />

tuje aj niekoľko aplikácií zamerané na dizajn GUI, ktoré umožňujú „naklikať“ si wid-<br />

gety vizuálne. Po dokončení sa vytvorí XML súbor reprezentujúci naše GUI, ktorý<br />

je možné naťiahnuť do aplikácie pomocou na to určených funkcií v Gtk+. Gtk+<br />

narozdiel od niektorých iných prostredí nevyžaduje, aby práve aktívne prostredie<br />

bolo vytvorené pomocou Gtk+. To znamená, že aplikácia s Gtk+ GUI pôjde bez<br />

problémov aj v iných rozhraniach, pokiaľ sú nainštalované potrebné knižnice. Toho<br />

využívajú aj mnohé aplikácie, ktoré si želajú osloviť viac užívateľov sprístupnením<br />

8


FEI KKUI<br />

svojich aplikácii pre platformy iné ako Linux. Jediné, čo ku tomu potrebujú, sú<br />

knižnice, ktoré stačí pribaliť priamo ku programu. Naznámejšie aplikácie založené<br />

na Gtk+ sú tieto (Gtk+ app, 2013):<br />

AbiWord - textový procesor.<br />

Anjuta - integrované vývojové prostredie.<br />

Chromium - webový prehliadač.<br />

Firefox - webový prehliadač.<br />

Ekiga - VoIP a video konferenčná aplikácia.<br />

Epiphany - oficiálny webový prehliadač prostredia Gnome.<br />

gconf - nástroj pre konfiguráciu Linux kernelu.<br />

GIMP - editor rastrovej grafiky.<br />

GRAMPS - program pre ukladanie genealogických dát.<br />

Inkscape - editor vektorovej grafiky.<br />

LiVES - video editor.<br />

Midori - minimalistický webový prehliadač.<br />

Pidgin - aplikácia pre „rýchle správy“ (pozn.: z anglického „Instant Messenger“).<br />

Wireshark - analyzér paketov.<br />

9


FEI KKUI<br />

1.4 Perl Gtk+ toolkit <strong>verzia</strong> 3<br />

Gtk3 jenázov modulu pre programovací jazyk Perl, ktorý poskytuje prístup ku<br />

funkciám Gtk+. Kapitola „3.1“ pojednáva o výbere programovacieho jazyka pre<br />

tento účel, avšak tu je potrebné podoktnúť, že bol vybraný Perl. Je to prepis mod-<br />

ulu Gtk2 určeného pre predchádzajúcu verziu Gtk+, a sprístupňuje skoro všetky<br />

funkcionality Gtk knižníc. Tých pár čo chýba sú zvláštneho typu, a pre nápravu<br />

je potrebné nájsť riešenie v module Glib-Object-Introspection, ktorý dynamicky<br />

vytvára konekcie ku API funkciám Gtk+, a na ktorom je modul Gtk3 závyslí. S<br />

použitím tohoto modulu sa vytvorí nový modul, pomenovaný AItk - „Artificial In-<br />

telligence Toolkit“.<br />

10


FEI KKUI<br />

2 Umelá inteligencia<br />

Umelá inteligencia nemá jednu, univerzálnu definíciu. Z časti za to môže aj fakt, že<br />

aj samotná „inteligencia“ nemá jednoznačnú definíciu. Odpoveď na otázku „Čo je<br />

to inteligencia?“ sa úspešne vyhýba odborníkom z oblasti matematiky, psychológie,<br />

ale aj filozofom všetkých vekov. Niektoré definície inteligencie z rôznych hľadísk<br />

zahŕňajú:<br />

∙ Inteligencia je schopnosť získavať a aplikovať vedomosti. Schopnosť myslieť a<br />

uvažovať.<br />

∙ Inteligencia je rozumová schopnosť, nadanie, chápavosť.<br />

∙ Inteligencia je schopnosť úspešne reagovať na ľubovoľnú, najmä novú situáciu<br />

pomocou odpovedjúcich korekcií správania. Schopnosť chápať súvislosti medzi<br />

faktami reálneho sveta za účelom vypracovania akcií vedúcich k dosiahnutiu<br />

vytýčeného cieľa.<br />

∙ Inteligencia je to čo sa meria v inteligenčných testoch.<br />

Po dôkladnom zamyslení sa je človek schopný nájsť niektoré paralely, naprílad prvý<br />

bod tvrdí, že „Inteligencia je schopnosť získavať a aplikovať vedomosti“, čo imp-<br />

likuje tvrdenie tretieho tvrdenia, že „Inteligencia je schopnosť úspešne reagovať na<br />

ľubovoľnú, najmä novú situáciu pomocou odpovedjúcich korekcií správania“, a vice<br />

versa. Posledné tvrdenie zasa reprezentuje všeobecný prístup psychológov ku otázke<br />

inteligencie.<br />

Čo však s ostatnými tvrdeniami? Ako zadefinovať napodobeninu niečoho, čo nevieme<br />

definovať? Najschodnejšie, a samozrejme najvšeobecnejšie, by bolo definíciu „nahradiť“<br />

opisom vlastností, ktoré sa snažíme napodobniť. Asi tri najrozšírenejšie definície<br />

umelej inteligencie sú tieto:<br />

11


FEI KKUI<br />

M. Minský - UI je veda o vytváraní strojov alebo systémov, ktoré budú na riešenie<br />

úloh používať postup, ktorý, ak by ho použil človek, by sme považovali za<br />

prejav jeho inteligencie.<br />

Z. Kotek - UI je vlastnosťou človekom umelo vytvoreného systému, vyznačujúceho<br />

sa schopnosťou rozpoznávať javy, predmety, situácie, analyzovať vzťahy medzi<br />

nimi a tak vytvárať vnútorné modely sveta a na základe toho robiť účelné<br />

rozhodnutia, vrátane schopnosti predvídať dôsledky týchto rozhodnutí a schop-<br />

nosti objavovať nové zákonitosti.<br />

M. Arbin - UI možno charakterizovať ako snahu programovať počítače tak, aby<br />

sa chovali spôsobom, ktorý by sme nazvali inteligentným, keby šlo o človeka<br />

(keby sme nevedeli, že to dokáže aj počítač).<br />

V ďalšej sekcii sa budeme zaoberať evolučným algoritmom. Prečo práve tomuto<br />

prístupu a nie inému je vysvetlené v sekcii „Návrh, Evolučný Algoritmus“.<br />

2.1 Evolučný Algoritmus<br />

Evolučný algoritmus je nedeterministická metóda riešenia problému, a patrí medzi<br />

slabé algoritmy. Jedinec je označenie pre reprezentanta bodu v stavovom priestore,<br />

ktorý plní funkciu nosiča informácie. Jedinec má v sebe zakódované hodnoty jed-<br />

notlivých „dimenzií“ priestoru prehľadávania, ktoré jednoznačné určujú jeho polohu<br />

v tomto priestore. Generácia je súbor takýchto jedincov. Všetky jedince jednej<br />

generácie sa nazývajú populáciou. Evolučný algoritmus podľa pravidiel určených<br />

jeho implementátorom vyberá najvhodnejších jedincov, ktorých informácie ďalej<br />

zúžitkuje, a zvyšných jedincov zahodí. Z vybraných jedincov vznikne nová gen-<br />

erácia, ktorej údel je rovnaký, ako tej predchádzajúcej.<br />

Silný algoritmus sa vyznačuje vysokým výkonom ale len pre špecifický okruh<br />

12


FEI KKUI<br />

úloh, väčšinou sa jedná o konkrétny typ problému, pre ktorý bol navrhnutý.<br />

Slabý algoritmus je narozdiel od silného algoritmu všeobecný a mal by pokrývať<br />

široké spektrum úloh, ktoré je schopný riešiť.<br />

Vo všeobecnosti sa evolučný algoritmus používa vtedy, neexistuje silná metóda pre<br />

daný problém alebo keď požadovaný výsledok nie je presne špecifikovaný. Jeho<br />

výhodou sú relatívne dobré výsledky a rýchlosť hľadania suboptimálnych riešení.<br />

Jeho nevýhodou je častá potreba vytvoriť prekladač, prevádzajúci kandidátov medzi<br />

priestorom prehľadávania a priestorom kandidátov, a množstvo parametrov algo-<br />

ritmu, pre ktoré neexistuje žiadny jednoznačný postup, podľa ktorého dôjdeme ku<br />

optimálnemu nastaveniu parametrov. Všeobecná štruktúra evolučného algoritmu je<br />

ilustrovaná na obrázku 2 – 1.<br />

Inicializácia jedincov je začiatok každého evolučného algoritmu. Pokiaľ nemá jed-<br />

incov, nemá čo evaluovať a ani čo evolvovať. Spôsob inicializácie je veda sama<br />

o sebe, lebo inicializácia vie ovplyvniť výsledok naozaj výrazným spôsobom.<br />

Generovanie jedincov môže nadobúdať rôzne formy. Môžeme jedincov gen-<br />

erovať náhodne, alebo aby rovnomerne pokrývali priestor prehľadávania,<br />

alebo napríklad použiť heuristiku v prípade, že sú dostupné nejaké infor-<br />

mácie, ktoré by mohli napomôcť k nájdeniu vhodného kandidáta.<br />

Evaluácia jedinca je funkcia, alebo súbor funkcií, ktoré sú schopné jednoz-<br />

načne kvantifikovať vhodnosť jedinca. Je to kritický blok programu,<br />

ktorý umožňuje evolučnému algoritmu určiť relatívnu vhodnosť jedincov<br />

medzi sebou. Takto vieme jednoznačne identifikovať najlepšieho jedinca<br />

z generácie, rovnako ako aj najhoršieho. Pokiaľ sa ohodnotí každý bod<br />

priestoru prehľadávania, vytvorí sa plocha vhodnosti, kde každý jedinec<br />

existuje na tejto ploche vhodnosti ako bod. Plocha vhodnosti je často–<br />

krát „hrboľatá“, tzn. vyskytujú sa na nej údolia a pohoria. Tu je presne<br />

13


FEI KKUI<br />

vidno silu inicializácie - pokiaľ napríklad zinicializujem jedincov v lokál-<br />

nom extréme, tak podľa možností genetických operátorov sa ľahko môže<br />

stať, že sa generácie „zaseknú“ v tomto lokálnom extréme. Presne kôli<br />

tomuto existujú metódy, ktoré sa snažia rozprestrieť jedince po väčšej<br />

ploche, zabraňujú zhlukovaniu jedincov alebo generujú prvú populáciu<br />

podľa špeciálnych pravidiel tak, aby sa jedince vyskytli v rôznych „kú-<br />

toch“ tejto plochy vhodnosti.<br />

Podmienka je najčastejšie obmedzenie, ktoré kladieme na kandidátov, pokiaľ majú<br />

byť pridaný medzi riešenia. Vyjadrujú isté minimálne požiadavky pre to,<br />

aby jedinec mohol byť akceptovaný ako riešenie. Menej časté, avšak nemenej<br />

dôležité je zadefinovať ukončovaciu podmienku ako maximálny počet preskú-<br />

maných generácii, alebo ako počet generácií, počas ktorých sa nenašiel lepší<br />

jedinec ako ten, ktorého už máme. Mnoho ukončovacích podmienok zahŕňa<br />

obe prístupy, keďže evolučný algoritmus generuje generácie nových jedincov<br />

donekonečna.<br />

Reprodukcia je blok, v ktorom sa pokúša algoritmus vziať najlepšie vlastnosti<br />

jedincov aktuálnej generácie, a implementovať ich do novej generáce, aby sa v<br />

nej vyskytovali lepšie ohodnotení jedinci ako v aktuálnej generácii.<br />

Selekcia vyberá jedincov, ktorí sa stanú rodičmi nasledujúcej generácie. Výber<br />

je najčastejšie uskutočnovaný podľa vhodnosti jedincov, a jedinec s lepšou<br />

vhodnosťou nebude vybraný menej–krát ako jedinec s horšou vhodnosťou.<br />

Genetické operátory rozhodujú o tom, ako a aké informácie budú z rodičov<br />

vyextrahované a a ako ich spoja v novom jedincovi. Podľa počtu rodičov,<br />

ktorých potomkovia potrebujú, poznáme genetické operátory asexuaálne<br />

(1 rodič), sexuálne (2 rodičia) a panmiktické (2+ rodičov). Najčastejšie<br />

v praxi vidno použitie mutácie ako asexuálneho operátora, a kríženia ako<br />

sexuálneho operátora. Mutácia zahŕňa zmenu náhodnej informácie v jed-<br />

14


FEI KKUI<br />

incovi, kým kríženie je výmena zodpovedajúcich si segmentov informácií<br />

medzi rodičmi.<br />

Evaluácia v tomto bloku je tou istou ako evaluácia v bloku „Inicializácia“.<br />

Náhrada je proces, ktorý nahradí existujúcu aktuálnu populáciu novou, ktorá sa<br />

stane aktuálnou populáciou nasledovnej generácie.<br />

Migrácia je špeciálny blok, ktorý zabezpečuje komunikáciu medzi oddelenými evolučnými<br />

cyklami, pokiaľ sa uvažuje o viac ako jednom evolučnom cykle pre generáciu.<br />

Poskytuje možnosť výmeny jedincov medzi týmito samostatne vystupujúcimi<br />

populáciami.<br />

t = t + 1 reprezentuje prechod od generácie „t“ ku generácii „t + 1“.<br />

15


FEI KKUI<br />

Figure 2 – 1 Všeobecná štruktúra evolučného algoritmu (MACH, 2009)<br />

16


FEI KKUI<br />

3 Systém pre podporu tvorby skriptovaného grafick-<br />

ého užívateľského rozhrania<br />

V úvode boli uvedené základné pojmy, vzťahujúce sa na danú problematiku, a bolo<br />

uvedených niekoľko zaujímavých grafických toolkitov, z ktorých je nutné si jeden<br />

vybrať. Gtk+ toolkit vyšiel ako jednoznačná voľba spomedzi uvedených toolkitov.<br />

∙ Rozšírenosť Gtk+ vytvorila bohatú komunitu a bude možné dohľadať na in-<br />

ternete mnoho relevantných materiálov týkajúcich sa vývoja GUI v Gtk+,<br />

napriek slabšej dokumentácii oproti wxWidgets.<br />

∙ Nezávisloť od grafického rozhrania bežiacom na operačnom systéme. Stačí<br />

nainštalovať knižnice a zavolať ich. KDE vyžaduje nainštalované celé prostredie.<br />

∙ Množstvo programovacích jazykov, ktoré Gtk+ podporuje.<br />

3.1 API<br />

Prvou úlohou potrebnou pre splnenie zadania je pripraviť vhodné prostredie pre<br />

implementáciu prostriedkou umelej inteligencie. Poskytnúť algoritmom umelej in-<br />

teligencie vhodné abstratkné prostriedky pre manipuláciu aspektov súvisiacich s<br />

cieľovými atribútami je kľúčové, pokiaľ je cieľom mať možnosť vybudovať pomerne<br />

ľahko zrozumiteľný a priamočiary program. To zamedzí problémom, ktoré by mo-<br />

hol spôsobiť prekladač. Pod pojmom „prekladač“ sa bude chápať časť kódu, ktorá<br />

obsluhuje prevod funkčného kódu do jeho reprezentácie v algoritme a späť. Ako<br />

príklad môžeme uviesť nereprezentatívne odozvy vzhľadu aplikácie na zásahy, ktoré<br />

vykoná evolučný algoritmus, alebo problém zakódovať isté požiadavky priamo na<br />

funkčný kód, čo v podstate znamená, že je potrebné vytvoriť priamo v algoritme<br />

istý abstrakt, ktorý bude plniť špecificky túto úlohu. Takýmto komplexným blokom<br />

17


FEI KKUI<br />

kódu treba zamedzovať, lebo sú menej transparentné, ťažšie sa udržiavajú, sú menej<br />

flexibilné, a celkovo komplikujú spôsob spracovania nielen evolučným algoritmom,<br />

ale aj každému inému, ktorý chce prvky GUI reprezentovať abstraktne.<br />

Tento pohľad nás teda privádza na myšlienku oddeliť kód reprezentujúci vykreslenie<br />

Gtk3 a kód obstarávajúci zmeny vo vykreslení aplikácie. Bolo by predsa vhodné,<br />

aby sa nemusel pri každej zmene rozhrania meniť evolučný algoritmus - jediné, čo<br />

by sa zmenilo, by bolo API, o ktorom by evolučný algoritmus ani nemusel vedieť,<br />

ako funguje. Takéto API by malo vyzerať ako skript, ktorý sa ľahko číta, a je s časti<br />

samodokumentujúci. Je potrebné teda naprogramovať prostredníka medzi Gtk3 a<br />

evolučným algoritmom, nezabúdajúc pri tom na už uvedené vlastnosti, ktoré by mal<br />

spĺňať.<br />

1. Abstraktná reprezentácia prvkov Gtk3.<br />

2. Jednoduchá a čitateľná syntax.<br />

3. Prednastaviť niektoré vlastnosti Gtk3 tak, aby som musel nastavovať len tie<br />

parametre, ktoré ma zaujímajú.<br />

3.1.1 Výber programovacieho jazyka<br />

V teoretickej časti bolo spomínané Gtk3 ako voľba pre grafické rozhranie našeho<br />

výberu, avšak Gtk3 je napísané v programovacom jazyku C. To samo o sebe kladie<br />

na systém, ktorý chceme navrhnúť, vzhľadom na spomínané podmienky uvedené o<br />

trošku vyššie v sekcii API, niekoľko závažných obmedzení:<br />

∙ Striktná syntax - C je považovaný za nízko-úrovňový jazyk, no nám treba<br />

jazyk vyššej úrovne, ktorý nám zabezpečí aj abstraktné potreby pre evolučný<br />

algoritmus. Vytvorenie modulárneho a ľahko použiteľného API, ktoré bude<br />

prostredníkom medzi Gtk a evolučným algoritmom, potrebuje taktiež voľnejší<br />

18


FEI KKUI<br />

programovací jazyk.<br />

∙ Zložitosť a časová náročnosť - implementácia API v jazyku C by nám<br />

nedovoľovala vytvoriť samodokumentujúce API, ktoré by prezentovalo samo<br />

seba ako skript. Samozrejme, v C jazyku sa dá napísať skoro čokoľvek, ale<br />

treba si uvážiť, či vynaložená snaha za to naozaj stojí a nepresiahne veľkosťou<br />

samotnú úlohu, ktorú riešime.<br />

Vzhľadom na už spomínané požiadavky v API sekcii, tieto vlastnosti jazyka C sú s<br />

nimi v konflikte. Navyše, pre ich uspokojenie, je potrebné spomenúť ešte niekoľko<br />

bodov, ktoré je potrebné zohľadniť pri výbere jazyka pre implementáciu API. Tieto<br />

body sú:<br />

∙ bind na Gtk C API,<br />

∙ abstraktnosť,<br />

∙ modulárnosť,<br />

∙ tvorba vlastnej syntaxe,<br />

∙ bohaté programové prostriedky.<br />

Už prvý bod vymedzuje skupinu programovacích jazykov, z ktorých sa bude vy-<br />

berať. Podľa oficiálnej dokumentácie(gtk lang bind, 2013) Gtk+ projekt podporuje<br />

v aktuálnej verzii 3.6 bindy pre nižšie uvedené programovacie jazyky, s vynechaním<br />

pre Gtk+ natívneho C.<br />

C++ je rozšírenie jazyka C o triedy/objekty a ďalšie vylepšenia. Nevhodný pre<br />

striktnú syntax.<br />

Java je na tom podobne ako C, striktná syntax a objektovo orientovaný jazyk nie<br />

je vyhovujúci.<br />

19


FEI KKUI<br />

Python je interpretovaný, avšak ďalší natívne objektovo orientovaný jazyk.<br />

Javascript vychádza z jazyku Java, ten istý problém.<br />

Vala je opäť objektovo orientovaný jazyk, ktorý navyše prevádza svoj zdrojový kód<br />

do jazyka C a až z toho sa vykompiluje finálny program.<br />

Perl je moderný jazyk z množstvom funkcií jazykov vyššej úrovne, je interpretovaný<br />

a teda pôsobí ako skriptovací jazyk, poskytuje možnosť vytvorenia funkcií<br />

správajúcich sa podobne ako natívne zabudované funkcie, a poskytuje veľmi<br />

rozsiahlu databázu balíkov s rozšíreniami o dodatočné prostriedky, za čo môže<br />

aj jeho modulárnosť<br />

Pascal má opäť striktnú syntax a slabú modularitu.<br />

Lua bol navrhnutý ako minimalistický skriptovací jazyk s rozšíriteľnou sémantikou.<br />

Nie je až taký populárny ako C, Java, Python či Perl a neposkytuje prostriedky<br />

moderných jazykov vyššej úrovne.<br />

Haskell je funckionálny programovací jazyk, voľnou sémantikou a statickým typo-<br />

vaním. Hlavným programovacím prostriedkom je funkcia, avšak od skriptu a<br />

samodokumentácie má pomerne ďaleko.<br />

FreeBASIC trpý tým istým ako Pascal.<br />

D je modernizovaný a redizajnovaný C++ jazyk, nevhodný pre striktnú syntax.<br />

Z vyššie uvedených programovacích jazykov sa ukazuje ako najlepší kandidát Perl.<br />

Objektovo orientované jazyky boli vyradené najmä kôli striktnej syntaxy, ktorá sa<br />

spája s implementovaním tried a metód.<br />

20


FEI KKUI<br />

3.1.2 Gtk wrapper<br />

Perl používa ako rozhranie ku Gtk3+ API modul Gtk3. Tento modul povoľuje<br />

programovať v API veľmi podobnom originálnemu Gtk API, avšak perlovským spô-<br />

sobom. Je závislý na niekoľkých ďalších moduloch - hlavný komponent je modul<br />

Glib-Object-Introspection. Tento modul dynamicky vytvára konekcie z knižníc<br />

do Perl rozhrania, vytvárajúc tak možnosť volať originálne funkcie priamo z Gtk<br />

knižníc. Narozdiel od wrapperov sa takýto systém ľahšie udržiava a zmena v Gtk<br />

knižnici sa prenesie priamo do Perlu, bez potreby zaktualizovať modul. Tu prichádza<br />

na rad Gtk3 modul, ktorý je vo svojej podstate wrapper, sprístupňujúci toto pre-<br />

nesené API z Gtk knižnice a dopĺňa funkcie na pripájanie kódu, upravuje niek-<br />

toré názvy funkcií a rieši pár ďalších menších nepríjemností, ktoré môžu nastať pri<br />

takomto dynamickom bindovaní API knižnice. Ukázalo sa to ako veľmi efektívny<br />

spôsob, najmä pri vypustení novej verzie Gtk3. Pokiaľ v Gtk3 module ma menilo len<br />

zopár vecí, a dokonca väčšina bola skopírovaná z Gtk2 modulu, tak v Glib-Object-<br />

Introspection sa nemenilo nič v spojení s novou verziou Gtk.<br />

Modulárnosť je jedna z podmienok vytýčených pre tento modul. V princípe sa mod-<br />

ulárnosť bude chápať ako rozčlenenie funkcionality do blokov elementárnych funkcií,<br />

ktorých logickým prepojením sa dosiahne výsledný efekt totožný s tým, ktorý by<br />

nastal v prípade implementácie ako jedného celku. Tomuto účelu poslúži nový perl<br />

modul, ktorého názov je AItk.pm. Skratka „pm“ pochádza z „perl module“, a<br />

„AItk“ je obmenou Gtk, teda namiesto „Gnome toolkit“ znie plný názov „Artificial<br />

Intelligence toolkit“.<br />

3.1.3 Návrh AItk API<br />

Gtk3 ako moderný toolkit poskytuje množstvo prostriedkov pre tvorbu grafického<br />

užívateľského rozhrania. V rámci implementácie vlastnej API je potrebné každú z<br />

21


FEI KKUI<br />

týchto funkcií previesť zvlášť do novej formy pomocnými funkciami. To znamená, že<br />

každej Gtk3 funkcii prináleží aspoň jedna funkcia nového API, ktorá ju zaobaľuje,<br />

dopĺňa o prednastavené hodnoty niektorých atribútov a zjednodušuje prístup ku<br />

nej. Samozrejme, pre potreby výskumu možnosti uplatnenia prostriedkov umelej<br />

inteligencie netreba mať plnú implementáciu, stačí dostatočne početná množina na-<br />

jčastejšie používaných widgetov.<br />

Pre lepšie pochopenie je uvedený skrátený list implementovaných widgetov a niek-<br />

torých vybraných funkcií s ich krátkym popisom.<br />

GtkWindow je jeden z hlavných widgetov. Jedná sa o kontajner, ktorý akceptuje<br />

jedného potomka.<br />

GtkBox predstavuje widget, ktorý akceptuje ľubovoľný počet widgetov ako svojich<br />

potomkov, zoradiac ich do jednej rady. GtkBox môže byť vertikálny alebo<br />

horizontálny, čo zodpovedá tomu, ktorým smerom budú jeho potomkovia zo-<br />

radení.<br />

GtkGrid je náhradou GtkTable, ktorá je od verzie Gtk3 zastaralá a neodporúča<br />

sa jej použitie v nových aplikáciach. Jedná sa o kvázi „raster“, ktorý ak-<br />

ceptuje widgety nastaviteľných pomerných rozmerov do voliteľných slotov.<br />

Zjednodušene je to variabilná tabuľka, ktorej widgety avšak nie sú limitované<br />

veľkosťou jednotlivej bunky, jednotlivý potomkovia sa umiestňujú relatívne je-<br />

den k druhému, narozdiel od absolútneho umiestnenia v tabuľke. To znamená,<br />

že pokiaľ je potrebné vykonať zmenu rozloženia widgetov v Gride, nemusím<br />

prepísať celé rozloženie, ako v prípade tabuľky.<br />

GtkDrawingArea je widget, ktorý povoľuje vykreslenie grafiky pomocou GDK a<br />

Cairo na svoju plochu. V praxi sa väčšinou používa na vloženie obrázku zo<br />

súboru.<br />

GtkButton je asi najdôležitejší widget. Skoro každá aplikácia má nejakú formu<br />

22


FEI KKUI<br />

tlačidla, minimálne na potvrdenie vstupu.<br />

GtkCheckButton je implementáciou zaškrtávacích políčok.<br />

GtkEntry je textový vstup pre užívateľa.<br />

GtkLabel slúži ako menovka. Niektoré widgety ho používajú pre ich pomenovanie<br />

v aplikácií, alebo ako spôsob výpisu správ užívateľovi.<br />

GtkSeparator je presne to čo znie, separátor. Môže byť horizontálny alebo ver-<br />

tikálny. Vykresľuje „čiaru“ v rozpätí relevantnej dimenzie widgetu.<br />

add() je generickou funkciou na pridávanie potomkou widgetom.<br />

remove() je rovnako ako add() generickou funkciou, avšak odoberá potomkov widgetom.<br />

reparent() je funkciou implementujúcou reparent funkciu widget triedy, slúži na<br />

premiestnenie potomka z jedného widgetu do druhého.<br />

expand() je ďalšou funkciou, ktorá zjednodušuje prístup ku atribútom widget<br />

triedy. Dovoľuje nastavit horizontálnu aj vertikálnu expanziu widgetu, ktorá<br />

nastáva, ak dostane widget od jeho rodiča viac priestoru (napríklad rozšírením<br />

dimenzie okna). Prednastavená hodnota nepovoľuje expanziu, teda viac mi-<br />

esta dostupného pre widget by znamenalo len rožšírenie nepoužitej plochy.<br />

homogeneous() funkcia zabezpečuje rovnomerné rozloženie priestoru medzi všetky<br />

potomky widgetu. Gtk implementuje túto funkciu pre GtkBox a GtkGrid<br />

spomedzi tu zmienených widgetov.<br />

signal() funkcia je jednou z najdôležitejších. Spája widget s funkčným kódom,<br />

ktorý sa má vykonať pri aktivácii widgetu.<br />

Z uvedeného listu sa poskladá jednoduché GUI spôsobom, aký je uvedený na obrázku<br />

3 – 1.Do GtkWindow sa vloží GtkBox v horizontálnej orientácii pomocou funkcie<br />

23


FEI KKUI<br />

add(). Ten istý postup platí aj pri vkladaní widgetov „W1“ a „W2“ do GtkBox. Za<br />

predpokladu, že widget W1 má plniť funkciu tlačidla „OK“, a widget W2 funkciu<br />

tlačidla „CANCEL“, pripojíme widgetom pomocou funkcie signal() kód reprezentu-<br />

júci im prislúchajúcu funkcionalitu, spolu s typom signálu, ktorý ma spustiť volanie<br />

kódu. Pod typom signálu môžeme rozumieť napríklad pri stlačení tlačidla, jeho<br />

pustení, a pod.<br />

Figure 3 – 1 Ukážka tvorby jednoduchého GUI použitím niekoľkých kľúčových funkcií<br />

Pokiaľ by sa skladalo toto jednoduché ukážkové GUI podľa pravidiel originálneho<br />

Perl modulu pre Gtk, museli by sme s jednotlyvými widgetami pracovať ako s ob-<br />

jektami, a všetky funkcie, ktoré sa na nich vzťahujú, sú vlastne metódami im pris-<br />

luchajúcich tried. Nežiadúce správanie.<br />

Prototypy v jazyku Perl povoľujú programátorovi zvoliť si, aké vstupy pre danú<br />

funkciu očakáva. Takýto zápis funkcie taktiež umožnuje volať funkciu rovnakým spô-<br />

sobom, ako built-in funkciu. To poskytuje priestor pre prispôsobenie každej funkcie<br />

tak, aby povoľovala skrátené volanie pre tvorbu widgetov, pripájanie signálov, pred-<br />

nastavovania hodnôt priamo pri tvorbe widgetu, a ďalších pomôcok, ktoré šikovný<br />

programátor vymyslý pre uľahčenie svojej ale aj užívateľovej práce. Takto sa pretvo-<br />

24


FEI KKUI<br />

ria aj jednotlivé metódy na funkcie asociované ich triedam. Každá funkcia má<br />

vlastný zoznam prednastavených hodnôt, ktoré aplikuje pri tvorbe nového Gtk ob-<br />

jektu. Tieto prednastavené hodnoty je možné modifikovať či už podsunutím argu-<br />

mentov volanej funkcii, alebo neskôr volaním funkcie reprezentujúcou danú metódu.<br />

Bohužial, takýto prístup je náchylný na zmenu prístupných modifikácii objektov v<br />

Gtk. To znamená, že keď nová <strong>verzia</strong> Gtk odstráni metódu, ktorú používame, alebo<br />

zmení spôsob, akým funguje, je nutné zmeniť v AItk module kód prináležiaci týmto<br />

zmeneným prvkom.<br />

Ďalšou doplňenou funkcionalitou do AItk je možnosť zadefinovať „triedu“ widgetov.<br />

Každý widget môže patriť do inej triedy, podľa toho akú funkciu plní. Používa<br />

sa to najmä pre widgety ako sú tlačidlá, zaškrtávacie políčka, a podobne, a nie<br />

pre kontajnery. Dôvodom je zoskupenie tlačidiel podľa toho, akú úlohu v aplikácii<br />

zastávajú. Pôvodný plán bol zhlukovať jednotlivé funkcie aplikácie podľa ich názvov,<br />

a tak poskladať GUI, ktorý má navzájom relevantné tlačidlá pokope, avšak nakoniec<br />

z toho vyplynula dostatočne zložitá úloha na samostatnú prácu. Pokiaľ nie je zadaná<br />

trieda, priradí sa widgetu prednastavená. Dôležitosť tejto funkcionality je obrovská<br />

pre evolúciu, pretože množstvo nezaradených listových widgetov by zahltil evolučný<br />

algoritmus a drasticky znížil jeho výkon.<br />

3.2 Evolučný Algoritmus<br />

Teória evolučného algoritmu bola vysvetlená v teoretickej časti tejto <strong>diplomovej</strong><br />

práce. Prečo však evolučný algoritmus? V kontexte tejto práce je zapotreby pro-<br />

gram, ktorý je schopný ohodnotiť štruktúru widgetov a rozhodnúť sa, či je aktuálne<br />

riešenie dostatočné. Tento program by mal spĺňať nasledovné požiadavky:<br />

Reprezentácia dát je dôležitou súčasťou každého algoritmu. Ideálne by mala byť<br />

reprezentácia čo najjednoduchšia a intuitívna, keďže spôsob reprezentácie a<br />

25


FEI KKUI<br />

jej odlišnosť od reálneho modelu ovplvňuje zásadným spôsobom funkciu, a<br />

dokonca aj samotnú existenciu, prekladača.<br />

Prekladač je vrstva medzi reálnymi dátami, ktoré je potrebné spracovať, a medzi<br />

dátami transformovanými tak, aby dotyčný program týmto dátam porozumel<br />

a vedel s nimi pracovať. Čím je zložitejší prekladač, tým je väčšia šanca, že<br />

nechtiac orežeme priestor prehľadávania o možnosti, a tým pomalšie algoritmus<br />

pobeží.<br />

Rýchlosť programu je v tomto prípade signifikantná podmienka pre výber vhod-<br />

ného prostriedku z repertoára umelej inteligencie. Ako si neskôr ukážeme,<br />

priestor prehľadávania nelineárne narastá s počtom zadefinovaných tried, ktoré<br />

potrebujem zaradiť do aplikácie.<br />

Inkrementálnosť nie je kľúčová, ale rozhodne sa hodí, keď chceme začat z miesta,<br />

kde posledný pokus prestal.<br />

Evolučný algoritmus bol podľa týchto požiadaviek jednoznačný výber. Každý jedinec<br />

bude môcť byť samostatne ohodnotený ako prípustný a neprípustný a podľa toho<br />

aj posunutý ďalej alebo vyradený. Taktiež obmena riešenia je veľmi jednoducho<br />

realizovateľná.<br />

3.2.1 Štruktúra Jedincov<br />

Každý jedinec populácie je typu Tree::Simple, ktorý poskytuje perl modul ako<br />

jednoduchú implementáciu n-árneho stromu. V podstate sa jedná o objekt, ktorý v<br />

obsahuje vlastnosti daného uzla, jeho obsah, a zároveň odkazy na svojich potomkov.<br />

Strom je vhodná údajová štruktúra pre reprezentáciu objektov Gtk3 a pre evolúciu<br />

hned pre niekoľko dôvodov:<br />

26


FEI KKUI<br />

1. Logická následnosť - samotný Gtk toolkit skladá svoje widgety ako strom.<br />

Ako koreň si môžeme predstaviť widget GtkWindow, jeho potomok bude Gtk-<br />

Box, a jeho potomkovia budu zase GtkButton, čo budú jeho listové uzly.<br />

2. Názornosť reprezentácie - strom bude reprezentovať Gtk widgety presne<br />

1:1, čo umožnuje použiť jedinca ako manuál pre vyskladanie GUI. Stačí si prečí-<br />

tať strom zhora dole a z jednej strany na druhú (funguje to zrkadlovo, nezáleží<br />

či sa postupuje zľava doprava alebo naopak), a máme vytvorené rozhranie<br />

pripravené na zobrazenie.<br />

3. Implicitne jednoduché genetické operátory - jediný dôvod, prečo je<br />

potrebné zmeniť štruktúru stromu je len ten, keď sa rozdelujú alebo spájajú<br />

listové uzly. Zmena sa vykoná proste prepísaním hodnoty daného uzla.<br />

Pre praktické dôvody bol počet uzlov obmedzený takým spôsobom, aby každý uzol<br />

musel byť najďalej 2 uzly od listového uzlu. Toto obmedzenie bolo zavedené preto,<br />

aby sa nestalo, že sa jednotlivé uzly budu kombinovať niekoľkonásobne bez možnosti<br />

zaplniť včetky svoje voľné „sloty“, vytvárajúc mnoho „mŕtveho“, nevyužitého mi-<br />

esta, alebo proti hromadeniu sa uzlov na jednu kopu. Navyše to odľahčuje mutáciu<br />

a netreba aplikovať korekčné funkcie pre jedince každu generáciu, čo zvyšuje výkon<br />

a efektivitu generovania riešení.<br />

Listové widgety sú rozdelené podľa ich „triedy“. Každá trieda widgetov dostane<br />

jedného rodiča, teda jeden kontajner. pre jednoduchosť sa tieto triedy nedelia medzi<br />

viac rodičov. Ich poradie je nešpecifikované a evolučný algoritmus ho neevolvuje.<br />

prvky jednej triedy hadzem do jedneho kontajnera, kontajner musi mat aspon je-<br />

den dalsi kontajner co ma listove uzly alebo mat sam listovy uzol, implementovane<br />

kontajnery: grid, box, notebook implementovane widgety: button, spin, checkbox,<br />

...<br />

27


FEI KKUI<br />

3.2.2 Priestor Prehľadávania<br />

Priestor prehľadávania zavisí na počte prvkov, ktoré je potrebné zaradiť do GUI.<br />

Čím viac grafických prvkov a tried ktorým prináležia bude zadefinovaných, tým<br />

viac kombinácií a tým väčší priestor treba prehľadať. Povedzme, že potrebujeme do<br />

okna aplikácie pridať 2 tlačidlá jednej triedy. Jedinec môže vyzerať aj tak ako je<br />

vyobrazený na obrázku 3 – 2.<br />

Figure 3 – 2 Jednoduchý jedinec s dvomi tlačidlami<br />

Celkom jednoduchá štruktúra, v rámci jedinca môžeme zameniť len kontajner „Box H“<br />

za iný, v podstate nemá zmysel robiť evolúciu. Pokiaľ by sme brali do úvahy len<br />

kontajner typu Box, tak máme na výber z 2 možností: Box H a Box V. Avšak<br />

povedzme, že máme 2 triedy prvkov, a každá trieda má po 4 prvky. Jedinec môže<br />

nadobudnúť rôzne formy, ako vidíme na niekoľkých obrázkoch 3 – 3.<br />

28


FEI KKUI<br />

Figure 3 – 3 Možnné kombinácie horizontálnych a vertikálnych boxov pri statických listových<br />

uzloch.<br />

29


FEI KKUI<br />

Stačilo mať dve triedy na to, aby možnosti len pri implementácii jedného konta-<br />

jneru vzrástli z dvoch na šesť, a to bez ohľadu na počet prvkov v triedach widgetov.<br />

Čo sa stane pri viac triedach? Povedzme že máme päť tried widgetov. Každej z<br />

nich podľa pravidiel bude priradený jeden kontajner. Tieto kontajnery budú ďalej<br />

považované za okrajové. Všetky tieto „okrajové“ kontajnery môžu byť potomkami<br />

jedného rodiča, alebo každý môže mať vlastného rodiča, dokonca rodič jedného okra-<br />

jového kontajnera može byť ďalší okrajový kontajner. Existujú desiatky možnosti<br />

pre usporiadanie kontajnerov. Vynásobené počtom permutácií, a počtom rôznych<br />

kontajnerov, dostávame tisíce možností, ktoré tvoria priestor prehľadávania. Výber<br />

evolučného algoritmu je teda jednoznačný, aj za cenu suboptimálneho výsledku,<br />

pre jeho relatívnu rýchlosť v porovnaní s úplnými algoritmamy, ktoré prehľadávajú<br />

priestor systematicky celý. Bežné aplikácie obsahujú omnoho viac ako smiešnych<br />

päť „tried“ tlačidiel, kontajnery nie sú obmedzené v reťazení, a celkovo obsahujú<br />

viac komponentov. Pri takejto úlohe by nebol problém len prehľadať celý priestor,<br />

ale aj vybrať najvhodnejšie riešenie.<br />

3.2.3 Vhodnosť a Výber jedincov<br />

bol plan robit zhlukovanie na prvkoch GUI, podla ich nazvu, ale nevydalo = trebalo<br />

slovník, korene slov, co ak sa volaju 2 tlacitka s roznou ulohou rovnako? nutnost<br />

poznat kontext... falllback to class<br />

30


FEI KKUI<br />

4 Experimenty<br />

Táto kapitola je venovaná ukážkam schopností AItk, sústreďujúc sa na zjednoduše-<br />

nie volania funkcií, účinnosť novej syntaxe a tvorbe lepšie zrozuminetľného kódu.<br />

Jedná sa o malé ukážky, ktoré sa venujú špecifickému widgetu a jeho implemen-<br />

tácii v tradičnom Perl Gtk3 module, porovnávajúc ho s novým AItk modulom.<br />

Pre reprezentáciu jeho užitočnosti pri aplikácii prostriedkov umelej inteligencie je<br />

posledná podkapitola venovaná vytvoreniu grafického užívateľského rozhrania po-<br />

mocou AItk a evolučného algoritmu.<br />

4.1 Použitie „Spinner“ widgetu<br />

Spinner je widget vyobrazujúci animáciu točenia. Častokrát sa používa namiesto<br />

progress baru, reprezentujúc aktivitu s nejasným časom ukončenia. Tento kód<br />

ukazuje, ako vyzerá implementácia widgetu Spinner spolu s prepínacím tlačidlom,<br />

ktoré ho štartuje a zastavuje.<br />

#!/usr/bin/perl<br />

use strict;<br />

use warnings;<br />

use Gtk3 ’-init’;<br />

my $window = Gtk3::Window->new (’toplevel’);<br />

$window->set_title ("Spinner Example");<br />

$window->set_border_width (5);<br />

$window->signal_connect (’destroy’, sub { Gtk3->main_quit });<br />

$window->set_default_size (250, 100);<br />

31


FEI KKUI<br />

my $vbox = Gtk3::Box->new("vertical", 5);<br />

$window->add ($vbox);<br />

my $spinner = Gtk3::Spinner->new;<br />

my $toggle1 = Gtk3::ToggleButton->new_with_label(’Spin’);<br />

$toggle1->set_active (0);<br />

$toggle1->signal_connect ( toggled => \&toggled );<br />

$vbox->pack_start ($spinner, 1, 1, 5 );<br />

$vbox->pack_start ($toggle1, 1, 1, 5 );<br />

$window->show_all;<br />

Gtk3->main;<br />

sub toggled {<br />

}<br />

my ($widget, $data) = @_;<br />

if ( $widget->get_active == 1 ) {<br />

$spinner->start;<br />

$toggle1->set_label ("Stop");<br />

} else {<br />

}<br />

$spinner->stop;<br />

$toggle1->set_label ("Spin");<br />

return 0;<br />

exit 0;<br />

32


FEI KKUI<br />

Dohromady 39 riadkov, kód vyzerá ako klasický objektovo orientovaný kód. Pre<br />

vytvorenie objektu sa zavolá jedna metóda, pre nastavenie vlastností sa použijú<br />

ďalšie metódy, jedna vlastnosť po jednej metóde. Programátor je donútený štruk-<br />

túrovať svoj kód striktne. Nie veľmi Perlovský spôsob :). Taktiež sa veľmi nehodí<br />

pre užívateľa, ktorý nechce investovať čas do Gtk+ toolkitu ešte naviac, oberajúc<br />

ho o čas, ktorý mohol stráviť programovaním svojej aplikácie. Ťažko si je pred-<br />

staviť aj ako by mala vyzerať implementácia umelej inteligencie pre účely automat-<br />

ickej tvorby GUI pri takto napísanom kóde. Ako vyzerá implementácia Spinnera s<br />

použitím AItk?<br />

#!/usr/bin/perl<br />

use strict;<br />

use warnings;<br />

use AItk qw(:basic);<br />

window my $window, ’Spinner Example’;<br />

size $window, 250, 100;<br />

box my $vbox, "vertical", 5;<br />

add $window, $vbox;<br />

spinner my $spinner;<br />

toggle my $toggle1, ’Spin’, \&toggled;<br />

pack $vbox, $spinner, $toggle1;<br />

main_loop $window;<br />

33


FEI KKUI<br />

sub toggled {<br />

}<br />

my ($widget, $data) = @_;<br />

if ( get_active $widget == 1 ) {<br />

start $spinner;<br />

set_label $toggle1, "Stop";<br />

} else {<br />

}<br />

stop $spinner;<br />

set_label $toggle1, "Spin";<br />

return 0;<br />

exit 0;<br />

Z 39 riadkov nám ostalo 32, pričom ak by sa rátali len riadky týkajúce sa Gtk3 a<br />

AItk, dostali by sme pomer 16:9, keďže sa vo funkcii nič neušetrilo, ale zato v tele<br />

programu sa toho ušetrilo pomerne dosť. Výsledné GUI vytvorené programami je<br />

vyobrazené na tomto obrázku 4 – 3.<br />

Najviac bolo ušetrené na tvorbe widgete „Window“ 4 – 1, kde sa zadal želaný ná-<br />

zov okna rovno do volania pre jeho tvorbu 4 – 2. Atribút „toplevel“ je jeden z dvoch<br />

možných, ktoré tento widget akceptuje. Tým druhým je „popup“, avšak skoro každé<br />

okno je vytvárané ako „toplevel“, preto je táto hodnota prednastavená. Taktiež, v<br />

budúcnosti sa plánuje implementovať funkciu „popup“, aby sa vedel tento typ okna<br />

vytvárať priamo a rozlíšiteľne od okna typu „toplevel“. Prednastavené je aj ohraniče-<br />

nie okna v šírke 5 pixelov, a funkcia ukončujúca program pri stlačení krížika na<br />

okne. V prípade tvorby aplikácie s viac aktívnymi oknami je potrebné prepísať túto<br />

funkciou podľa potreby inou, ktorá len zavrie okno, ale neskončí program. Veľkosť<br />

okna pokrýva funkcia „size“4 – 2, ktorú je možné aplikovať aj na ďalšie widgety.<br />

34


FEI KKUI<br />

my $window = Gtk3::Window->new (’toplevel’);<br />

$window->set_title ("Spinner Example");<br />

$window->set_border_width (5);<br />

$window->signal_connect (’destroy’, sub { Gtk3->main_quit });<br />

$window->set_default_size (250, 100);<br />

Figure 4 – 1 Definícia okna pomocou Perl Gtk3 modulu.<br />

window my $window, ’Spinner Example’;<br />

size $window, 250, 100;<br />

Figure 4 – 2 Definícia okna pomocou AItk modulu.<br />

Figure 4 – 3 Naľavo je GUI vyobrazené pomocou Perl Gtk3 modulu, vpravo je použitý AItk<br />

toolkit. Oba výsledky sú totožné.<br />

V porovnaní tvorby toggle tlačidla 4 – 4 4 – 5 je vidno silu AItk syntaxe. Funkcie<br />

vytvárajúce tlačidlá sú programované tak, aby boli schpné prijať variabilný počet<br />

argumentov. Môžeme definovať tlačidlo aj bez mena a funkcie, lebo jediný povinný<br />

argument je premenná, do ktorej bude widget uložený. V tomto prípade definu-<br />

jeme v jednom riadku na začiatku programu neaktívne toggle tlačidlo s aktivovanou<br />

funkciou „toggled“.<br />

my $toggle1 = Gtk3::ToggleButton->new_with_label(’Spin’);<br />

$toggle1->set_active (0);<br />

$toggle1->signal_connect ( toggled => \&toggled );<br />

Figure 4 – 4 Definícia neaktivovaného toggle tlačidla s pripojenou funkciou pomocou Perl Gtk3<br />

modulu.<br />

35


FEI KKUI<br />

toggle my $toggle1, ’Spin’, \&toggled;<br />

Figure 4 – 5 Definícia neaktivovaného toggle tlačidla s pripojenou funkciou pomocou Perl AItk<br />

modulu.<br />

Aktivovať a deaktivovať tlačidlo sa dá jednoducho pomocou funkcií „active“ a „in-<br />

active“, ako to bude ukázané v ďalšej podkapitole. Typ signálu aktivujúci funkciu<br />

je prednastavený na „toggle“, lebo to je väčšinou to, čo po tlačidle užívateľ očakáva.<br />

36


FEI KKUI<br />

4.2 Použitie „CheckButton“ widgetu<br />

Widget „CheckButton“ sa používa pre funkcie, ktoré môžu mať dve stavy. Jedná sa<br />

o štvorček, ktorý je buď prázdny s hodnotou FALSE, alebo je vyplnený a reprezen-<br />

tuje hodnotu TRUE. Pomocou nich môžeme prepínať rôzne ovládacie prvky GUI<br />

alebo aj meniť funkcionalitu samotného programu. Určite je zaškrtávacie políčko,<br />

čí súhlasím s podmienkami užívania softvéru, všetkým dobre známe. Nižšie je kód<br />

implementujúci CheckButton pomocou Perl Gtk3 modulu.<br />

#!/usr/bin/perl<br />

use strict;<br />

use warnings;<br />

use Gtk3 ’-init’;<br />

my $window = Gtk3::Window->new (’toplevel’);<br />

$window->set_title ("Basic Check Boxes");<br />

$window->set_border_width (5);<br />

$window->signal_connect (’destroy’, sub { Gtk3->main_quit });<br />

$window->set_default_size (200, 100);<br />

my $vbox = Gtk3::Box->new ("vertical", 5);<br />

$window->add ($vbox);<br />

my $entry = Gtk3::Entry->new;<br />

$entry->set_text ("Hello World");<br />

$vbox->pack_start ($entry, 1, 1, 0);<br />

my $hbox = Gtk3::Box->new ("horizontal", 6);<br />

37


FEI KKUI<br />

$vbox->pack_start ($hbox, 1, 1, 0);<br />

my $checkbox1 = Gtk3::CheckButton->new_with_label (’Editable’);<br />

$checkbox1->signal_connect (toggled => \&toggle_checkbox, "editable");<br />

$checkbox1->set_active (1);<br />

$hbox->pack_start ($checkbox1, 1, 1, 0);<br />

my $checkbox2 = Gtk3::CheckButton->new_with_label ("Visible");<br />

$checkbox2->signal_connect (toggled => \&toggle_checkbox, "visible");<br />

$checkbox2->set_active (1);<br />

$hbox->pack_start ($checkbox2, 1, 1, 0);<br />

my $checkbox3 = Gtk3::CheckButton->new_with_label ("Icon");<br />

$checkbox3->signal_connect (toggled => \&toggle_checkbox, "icon");<br />

$checkbox3->set_active (0);<br />

$hbox->pack_start ($checkbox3, 1, 1, 0);<br />

$window->show_all;<br />

Gtk3->main;<br />

sub toggle_checkbox {<br />

my ($widget, $data) = @_;<br />

my $value = $widget->get_active;<br />

if ($data eq ’visible’) {<br />

$entry->set_visibility ($value);<br />

} elsif ($data eq ’editable’) {<br />

$entry->set_editable ($value);<br />

} elsif ($data eq ’icon’) {<br />

38


FEI KKUI<br />

}<br />

}<br />

my $stock_id = undef;<br />

if ($value == 1) {<br />

}<br />

$stock_id = Gtk3::STOCK_FIND;<br />

$entry->set_icon_from_stock (’secondary’, $stock_id);<br />

return 0;<br />

exit 0;<br />

Počet riadkov implementácie Gtk::CheckButton pomocou Perl Gtk3 modulu dosia-<br />

hol 59, a opäť je ukážkou syntakticky striktného objektovane orientovaného kódu.<br />

ďalšia ukážka kódu je implementácia widgetu CheckButton pomocou AItk toolkitu.<br />

#!/usr/bin/perl<br />

use strict;<br />

use warnings;<br />

use AItk qw(:basic);<br />

window my $window, "Basic Check Boxes";<br />

size $window, 200, 100;<br />

box my $vbox, "vertical", 5;<br />

add $window, $vbox;<br />

entry my $entry, "Hello World";<br />

box my $hbox, "horizontal", 6;<br />

pack $vbox, $entry, $hbox;<br />

39


FEI KKUI<br />

checkbox my $checkbox1, "Editable", \&toggle_checkbox, "editable";<br />

checkbox my $checkbox2, "Visible", \&toggle_checkbox, "visible";<br />

checkbox my $checkbox3, "Icon", \&toggle_checkbox, "icon";<br />

active $checkbox1, $checkbox2;<br />

inactive $checkbox3;<br />

pack $hbox, $checkbox1, $checkbox2, $checkbox3;<br />

main_loop $window;<br />

sub toggle_checkbox {<br />

}<br />

my ($widget, $data) = @_;<br />

my $value = get_active $widget;<br />

if ($data eq ’visible’) {<br />

$entry->set_visibility ($value);<br />

} elsif ($data eq ’editable’) {<br />

$entry->set_editable ($value);<br />

} elsif ($data eq ’icon’) {<br />

}<br />

my $stock_id = undef;<br />

if ($value == 1) {<br />

}<br />

$stock_id = Gtk3::STOCK_FIND;<br />

$entry->set_icon_from_stock (’secondary’, $stock_id);<br />

return 0;<br />

40


FEI KKUI<br />

exit 0;<br />

Pomocou AItk zabrala implementácia 46 riadkov, čo je oproti celkom 59 slušné.<br />

Opäť rátajúc len riadky týkajúce sa Perl Gtk3 a AItk, dostávame pomer 26:14.<br />

To je prakticky skrátenie o polovicu. Funkciu obstarávajúcu prepínanie vlastností<br />

widgetov sa veľmi skrátiť nepodarilo, ale to je očakávateľné, keďže vo funkcii očaká-<br />

vame manipuláciu konkrétneho widgetu konkrétnym spôsobom, narozdiel od tela<br />

programu, kde sa využíva syntax spájaním viacerých úloh do jedného volania.<br />

my $checkbox1 = Gtk3::CheckButton->new_with_label (’Editable’);<br />

$checkbox1->signal_connect (toggled => \&toggle_checkbox, "editable");<br />

$checkbox1->set_active (1);<br />

$hbox->pack_start ($checkbox1, 1, 1, 0);<br />

my $checkbox2 = Gtk3::CheckButton->new_with_label ("Visible");<br />

$checkbox2->signal_connect (toggled => \&toggle_checkbox, "visible");<br />

$checkbox2->set_active (1);<br />

$hbox->pack_start ($checkbox2, 1, 1, 0);<br />

my $checkbox3 = Gtk3::CheckButton->new_with_label ("Icon");<br />

$checkbox3->signal_connect (toggled => \&toggle_checkbox, "icon");<br />

$checkbox3->set_active (0);<br />

$hbox->pack_start ($checkbox3, 1, 1, 0);<br />

Figure 4 – 6 Definícia troch CheckButton widgetov spolu s priradením funkcionality,<br />

TRUE/FALSE stavu, a pridaním do vertikálneho checkboxu použitím Perl Gtk3 modulu.<br />

Hlavný rozdiel je zásluhou definície widgetov CheckButton 4 – 6, ktoré AItk zápis<br />

4 – 7 skrátil nesmierne. Okrem možnosti zadefinovať úplný button v jednom volaní<br />

funkcie, ako to bolo vysvetlené v predchádzajúcej podkapitole, sa o to zaslúžila aj<br />

funkcia „pack“. Tá umožňuje priradiť ľubovoľné množstvo widgetov kontajneru typu<br />

41


FEI KKUI<br />

Box. Rozhodnutie, či použije metódu „pack_start“ alebo „pack_end“, spočíva v<br />

umiestnení widgetu vo volaní funkcie. Všetky widgety až po prvý prázdny argument<br />

budú spracované metódou „pack_start“, ostatné metódou „pack_end“.<br />

checkbox my $checkbox1, "Editable", \&toggle_checkbox, "editable";<br />

checkbox my $checkbox2, "Visible", \&toggle_checkbox, "visible";<br />

checkbox my $checkbox3, "Icon", \&toggle_checkbox, "icon";<br />

active $checkbox1, $checkbox2;<br />

inactive $checkbox3;<br />

pack $hbox, $checkbox1, $checkbox2, $checkbox3;<br />

Figure 4 – 7 Definícia troch CheckButton widgetov rovnako ako v kóde vyobrazenom na 4 – 6,<br />

avšak použitím AItk modulu.<br />

Figure 4 – 8 Naľavo je GUI vyobrazené pomocou Perl Gtk3 modulu, vpravo je použitý AItk<br />

toolkit. AItk má kúsok siršie okno, spôsobené prednastavenou hodnotou padding pri packovaní<br />

widgetov do boxu. Originálny kód si zaťiadal padding „0“ pixelov, avšak prednastavená hodnota<br />

AItk je „5“ pixelov<br />

Výsledok obidvoch implementácií je totožný, až na padding checkboxov v boxe,<br />

kde si Perl Gtk3 pýta pri pack_start metóde padding 0 pixelov, avšak AItk má<br />

prednastavenú hodnotu 5 pixelov. Celková efektivita AItk z pohľadu pohodlnosti,<br />

prístupnosti a najmä počet ušetrených riadkov je tesno spätá s komplexnosťou im-<br />

plementácie GUI a početnosti widgetov.<br />

42


FEI KKUI<br />

4.3 Evolúcia grafického užívateľského rozhrania<br />

Pre účel overenia vhodnosti AItk pri implementácii prostriedkov umelej inteligencie<br />

bol aplikovaný principiálne nie zložitý evolučný algoritmus, ktorý mal nájsť vhodné<br />

rozloženie grafického užívateľského rozhrania. Bola použitá mutácia kontajnerov<br />

a ich typov, a funkciu vhodnosti reprezentoval súčet „x“ a „y“ rozmerov okna,<br />

pričom sa hľadalo minimum tejto funkcie. To spôsobí, že budú preferované jedince<br />

bližšie tvaru štvorca, a teda kompaktnejšie. Reprezentácia jedincov ako aj gentoyp<br />

sú uvedené v kapitole číslo 3. Inicializácia jedinca prebieha vygenerovaním stromu<br />

použitím užívateľom definovaných widgetov spojených s rodičmi, ktorí obsahujú kon-<br />

tajner. Kontajner je zatial len textová reprezentácia jeho typu, skutočný sa vytvorí<br />

až neskôr pomocou funkcie, ktorá prekladá tento text do widgetov a následne system-<br />

aticky pospája celý strom. Na tomto obrázku 4 – 9 je príklad čerstvo vygenerovaného<br />

jedinca.<br />

Figure 4 – 9 Príklad vygenerovaného jedinca evolučného algoritmu. Veľmi jasne vidno množstvo<br />

nedostatočne využitej plochy, ako aj nadmerné naťahovanie jednotlivých widgetov.<br />

43


FEI KKUI<br />

Ako selekčný mechanizmus je použité orezanie , ktoré odstráni horšiu polovicu a<br />

nahradí ju lepšou polovicou, ktorú následne zmutuje. Elitizmus zachováva lepšiu<br />

polovicu generácie nedotknutú, teda sa nemôže stať, že sa zníži vhodnosť najlepších<br />

jedincov. Môže jedine stagnovať, alebo stúpať. Povolené kontajnery boli len ver-<br />

tikálny a horizontálny box. Grid bol použitý ako potomok pre okno, a ako kontajner<br />

pre všetky ďalšie widgety, ktoré sa potrebujú zaradiť do okna.<br />

Parametre evolúcie zahŕňali populáciu o veľkosti 100. Počet generácií bol stanovený<br />

na 5 a šanca pre mutáciu kontajnera 30%. Oproti inicializovanému jedincovi, evolú-<br />

cia dokázala zlepšiť výzor a účelnosť jedincov aj napriek primitívnej funkcii vhod-<br />

nosti a slabej mutácii, ktorá nemala povolené premiestňovať podstromy medzi sebou<br />

a meniť ich štruktúru.<br />

Medzi najzaujímavejšie výsledky sa prepracoval jedinec vyobrazený na obrázku 4 –<br />

10. Funkcionalita reprezentovaná tlačidlami sa nachádza oddelená zvislou menu<br />

lištou od textu. Veľmi podobný výsledok je vyobrazený na obrázku 4 – 11 s rozdielom<br />

jedného panela, ktorý je umiestnený pod textovou plochou, vytvárajúc a trochu<br />

kompaktnejší vzhľad.<br />

Iný typ jedinca, uznaného ako najlepšieho svojej poslednej generácie, je zobrazený<br />

na obrázku 4 – 12. Tento jedinec je podlhovastého kompaktného tvaru, s relatívne<br />

dobre rozloženou plochou.<br />

Posledný typ jedinca sa nachádza na obrázku 4 – 13. Tento jedinec má prakticky<br />

tradičné rozloženie GUI podľa dnešného štandartu, teda tlačidlá sa nachádzajú ro-<br />

zložene pri dvoch krajoch okna. Rozdielom je použitie dolného okraja oproti bežne<br />

používanému hornému okraju, a pozícia menu lišty, ktorá plní učel delimitera medzi<br />

textom a panelom.<br />

Vo všeobecnosti sú tieto výsledky nedostatočné pre generáciu reálneho GUI, čo bolo<br />

spôsobené najmä veľmi obmedzenými možnosťami genetických operátorov a funkcie<br />

44


FEI KKUI<br />

Figure 4 – 10 Rozloženie GUI s použitím menu ličty ako predelom medzi textovou časťou a časťou<br />

s tlačidlami.<br />

Figure 4 – 11 Podobne ako 4 – 10, avšak jeden panel nástrojov je vložený pod textovú časť.<br />

vhodnosti. Mutácia bola do naozaj značnej časti závislá od vygenerovaného jedinca,<br />

keďže nemala povolené meniť štruktúru stromu. Jednoducho povedané, mutáciu<br />

45


FEI KKUI<br />

Figure 4 – 12 Zvislo orientované okno aj spolu s tlačidlami, pripomína minimalistickú aplikáciu<br />

pre písanie básničiek.<br />

46


FEI KKUI<br />

Figure 4 – 13 Takmer tradičné rozloženie tlačidiel po dvoch krajoch okna, avšak menu lišta našla<br />

svoje miesto ako predel medzi tlačidlami a plochou venovanej textu.<br />

sa snažila len „doklepnúť“ jedinca na čo najlepšiu úroveň vhodnosti, ale vhodnosť<br />

jedinca bola do značnej miery určená už pri jeho vygenerovaní.<br />

Navyše funkcia vhodnosti závisela len od vonkajčích rozmerov okna, a nebrala do<br />

úvahy vnútorné rozloženie widgetov a ich efektívne umiestnenie v priestore, čo malo<br />

za následok prílišnú veľkosť tlačidiel, ako je vidno na niektorých obrázkoch.<br />

Použitím metódy „add“ namiesto „pack_start“, alebo zrušením atribútov „expand“<br />

a „fill“ pri použití „pack_start“, sa však dá tomuto rozťahovaniu widgetov zamedziť.<br />

47


FEI KKUI<br />

Na obrázkoch 4 – 14 4 – 15 4 – 16 sú znázornené rozloženia widgetov použitím tejto<br />

drobnej úpravy v algoritme. Zlepšenie vidno hneď na prvý pohľad, avšak miestami<br />

zanechávajú widgety nevyužitú plochu, keďže nie sú nastavené, aby ju vypĺňali, ako<br />

pri predchádzajúcich pokusoch.<br />

Figure 4 – 14 Po vypnutí expanzie a vypĺňania sa okamžite prejavili neželané následky. Na druhú<br />

stranu, tlačidlá vyzerajú prirodzenejšie.<br />

Pôvodne bolo zamýšlané aj zhlukovanie tlačidiel podľa ich názvov, ale to sa ukázalo<br />

ako téma na ďalšiu prácu. Taký systém by musel rozumieť čo daný názov reprezen-<br />

tuje v plnom kontexte, čo nie je žiadna sranda. Dve tlačidlá s rovnakým názvom<br />

by ho veľmi ľahko mohli popliesť, a keď už musím pridávať doplňujúcu informáciu<br />

v podobe kontextu, prečo by som rovno ich nezaradil do triedy sám, že.<br />

48


FEI KKUI<br />

Figure 4 – 15 Toto rozloženie tlačidiel v tvare „U“ je celkom príjemne pôsobiace, aj keď umiest-<br />

nenie menu lišty v hornom pravom rohu je kúsok neprirodzené.<br />

49


FEI KKUI<br />

Figure 4 – 16 Ďalšie rozloženie tlačidiel v tvare „U“, tentokrát však pôsobí omnoho elegantnejšie<br />

a kompaktne. Prázdne miesto v dolnom pravom rohu okna nepôsobí rušivo, a menu lišta je uložená<br />

na veľmi vhodnom mieste.<br />

50


FEI KKUI<br />

5 Záver<br />

Po vykonaní experimentov sa ukázalo, že AItk toolkit pre podporu tvorby skripto-<br />

vaného grafického užívateľského rozhrania je naozaj tým, čím si dalo za cieľ byť.<br />

Odstraňuje prísnu syntax, zlepšuje čitateľnosť kódu a v neposlednom rade šetrí<br />

námahu a čas užívateľov tým, že umožňuje skrátiť zápis GUI o štvrtinu až polovicu.<br />

Tieto vymoženosti slúžia najmä dobru implementácie umelej inteligencie do procesov<br />

návrhu GUI, kde im poskytujúmožnosť jednoduchšej a kompaktnejšej implementá-<br />

cie. Referované práce sa doteraz snažili zmeňiť vzhľad aplikácie až po tom, ako bola<br />

poskladaná, a to úpravou CSS alebo XML kódu, ktorým mohli ovládať niektoré<br />

widgety a ich vlastnosti. AItk toolkit umožňuje priamo vygenerovať grafické uží-<br />

vateľské rozhranie použitím užívateľom definovaných widgetov, čo predstavuje istý<br />

pokrok od obmieňania poradia widgetov v kontajnery a ich farby pomocou CSS a<br />

XML.<br />

Bohužial, dizajn AItk zapĺňa menný priestor programu exportovaním množstva<br />

funkcií, ktoré užívateľovi poskytuje. Odporúčaná implementácia spočíva v zabalení<br />

volania AItk a jeho použitia do jedného bloku kódu, dedikovaného práve tvorbe GUI.<br />

Takýmto spôsobom je možné bezpečne definovať funkcie vo svojom kóde, a naviazať<br />

ich na widgety v zaobalenom kóde implementujúcom GUI. Pri výskyte totožného<br />

mena funkcie si však treba uložiť jej referenciu do premennej, lebo po zavolaní AItk<br />

bude predefinovaná počas trvania bloku. Elegantným spôsobom by bolo definovať<br />

skaláry obsahujúce odkaz na rovnomenné funkcie, ktoré by sme použili v AItk bloku.<br />

Ďalšia skutočnosť je rozsah AItk, ktorý nie je dostatočný. AItk implementuje<br />

niekoľko desiatok widgetov a metód, avšak to pri tvorbe reálnej aplikácie stále nes-<br />

tačí. Okrem iného potrebuje pridať niekoľko dôležitých vlastností pre widgety, ktoré<br />

si zaznačuje do svojho zoznamu. Zatial je tam len jeho trieda, typ, a okno, do<br />

ktorého patrí. V prípade box widgetu by sa napríklad hodilo mať vlastnosť „orien-<br />

tácia“, alebo „expanzia“, a určite sa najde mnoho ďalších atribútov, ktoré umožnia<br />

51


FEI KKUI<br />

prostriedkom umelej inteligencie náležito pracovať so zadefinovanými widgetami.<br />

Trebalo by implementovať aj spôsob, ktorý by globálne diktoval niektoré prednas-<br />

tavené hodnoty niektorých funkcií, pre lepšiu prispôsobiteľnosť konkrétnej aplikácii.<br />

AItk by mohlo aj poskytovať nejaké základné prostriedky umelej inteligencie ako<br />

pomoc programátorovi, ktoré by mu urýchlili a skvalitnili prácu.<br />

Myslím si, že AItk by prospelo použitie reálnym projektom, pri ktorom by mo-<br />

hol autor doplniť niektoré chýbajúce funkcie, a rozhodne by sa AItk dalo lepšie<br />

implementovať so skúsenosťou z návrhu GUI pre nejakú aplikáciu. Ukázalo by to<br />

jednoznačne, ktoré dizajnové rysy sú dostatočné, a ktoré treba pridať alebo prerobiť.<br />

52


FEI KKUI<br />

References<br />

wxWidgets Who uses wxWidgets? http://www.wxwidgets.org/about/whouses.<br />

htm 2013<br />

wxWidgets wxWidgets Features http://www.wxwidgets.org/about/feature2.<br />

htm 2013<br />

Gtk+ project Language Bindings http://www.gtk.org/language-bindings.php<br />

2013<br />

Wikipedia, The Free Encyclopedia GTK+ https://en.wikipedia.org/wiki/GTK+<br />

2013<br />

Gtk+ project Overview of GTK+ and its Libraries http://www.gtk.org/<br />

overview.php 2013<br />

MACH, M. 2009. Evolutionary algorithms: elements and principles. Košice : Elfa,<br />

2009, 250 s. ISBN 978-80-8086-123-0, pp. K 12<br />

Ilavský, M. 2011. Interaktívna evolúcia grafického používateľského rozhrania v toolkite<br />

GTK+. Diplomová práca<br />

BARANČOK, D. et al. 1995. The effect of semiconductor surface treatment on LB<br />

film/Si interface. In: Physica Status Solidi (a), ISSN 0031-8965, 1995, vol. 108,<br />

no. 2, pp. K 87–90<br />

GONDA, V. 2001. Ako napísať a úspešne obhájiť diplomovú prácu. Bratislava : Elita,<br />

2001, 3. doplnené a prepracované vydanie, 120 s. ISBN 80-8044-075-1<br />

Jadrová fyzika a technika: Terminologický výkladový slovník. 2. rev. vyd. Bratislava :<br />

ALFA, 1985. 235 s. ISBN 80-8256-030-5<br />

53


FEI KKUI<br />

KATUŠČÁK, D. 1998. Ako písať vysokoškolské a kvalifikačné práce. Bratislava :<br />

Stimul, 1998, 2. doplnené vydanie. 121 s. ISBN 80-85697-82-3<br />

LAMOŠ, F. – POTOCKÝ, R. 1989. Pravdepodobnosť a matematická štatistika.<br />

1. vyd. Bratislava : Alfa, 1989. 344 s. ISBN 80-8046-020-5<br />

REJTHAROVÁ, V. – SKÁLOVÁ, E. 1981. Příručka anglického odborného stylu.<br />

Praha : Academia, 1981, 220 s.<br />

SÝKORA, F. a iní. 1980. Telesná výchova a šport. 1.vyd. Bratislava : SPN, 1980.<br />

35 s. ISBN 80-8046-020-5<br />

STEINEROVÁ, J. 2000. Základy filozofie človeka v knižničnej a informačnej vede.<br />

In: Kimlička, Š., Knižničná a informačná veda na prahu informačnej spoločnosti.<br />

Bratislava : Stimul, 2000. ISBN 80-2274-035-2, s. 327–334<br />

ŠUMICHRAST, Ľ. 1995. On the performance of higher approximations of radia-<br />

tion boundary conditions for the simulation of wave propagation in structures of<br />

integrated optics. In: Photonics ’95. Prague : CTU, 1995, pp. 159–161<br />

54


Zoznam príloh<br />

Príloha A Prílohy<br />

Príloha B Bibliografické odkazy<br />

Príloha C Vytvorenie zoznamu skratiek a symbolov<br />

Príloha D


FEI KKUI<br />

Príloha B<br />

Bibliografické odkazy<br />

Táto časť záverečnej práce je povinná. V zozname použitej literatúry sa uvádzajú<br />

odkazy podľa normy STN ISO 690–2 (01 0197) (Informácie a dokumentácia. Bib-<br />

liografické citácie. Časť 2: Elektronické dokumenty alebo ich časti, dátum vydania<br />

1. 12. 2001, ICS: 01.140.20). Odkazy sa môžu týkať knižných, časopiseckých a iných<br />

zdrojov informácií (zborníky z konferencií, patentové dokumenty, normy, odporúča-<br />

nia, kvalifikačné práce, osobná korešpondencia a rukopisy, odkazy cez sprostredku-<br />

júci zdroj, elektronické publikácie), ktoré boli v záverečnej práci použité.<br />

Forma citácií sa zabezpečuje niektorou z metód, opísaných v norme STN ISO 690,<br />

1998, s. 21. Podrobnejšie informácie nájdete na stránke http://www.tuke.sk/anta/<br />

v záložke Výsledky práce/Prehľad normy pre publikovanie STN ISO 690 a STN ISO 690-2.<br />

Existujú dva hlavné spôsoby citovania v texte.<br />

∙ Citovanie podľa mena a dátumu.<br />

∙ Citovanie podľa odkazového čísla.<br />

Preferovanou metódou citovania v texte vysokoškolskej a kvalifikačnej práce je podľa<br />

normy ISO 7144 citovanie podľa mena a dátumu (Katuščák, 1998; Gonda, 2001).<br />

V tomto prípade sa zoznam použitej literatúry upraví tak, že za meno sa pridá rok<br />

vydania. Na uľahčenie vyhľadávania citácií sa zoznam vytvára v abecednom poradí<br />

autorov.<br />

Príklad: . . . podľa (Steinerová, 2000) je táto metóda dostatočne rozpracovaná na to,<br />

aby mohla byť všeobecne používaná v . . .<br />

Druhý spôsob uvedenia odkazu na použitú literatúru je uvedenie len čísla tohto<br />

57


FEI KKUI<br />

zdroja v hranatých zátvorkách bez mena autora (autorov) najčastejšie na konci<br />

príslušnej vety alebo odstavca.<br />

Príklad: . . . podľa [13] je táto metóda dostatočne rozpracovaná na to, aby mohla<br />

byť všeobecne používaná v . . . ako je uvedené v [14].<br />

Citácie sú spojené s bibliografickým odkazom poradovým číslom v tvare indexu alebo<br />

čísla v hranatých zátvorkách. Odkazy v zozname na konci práce budú usporiadané<br />

podľa týchto poradových čísel. Viacero citácií toho istého diela bude mať rovnaké<br />

číslo. Odporúča sa usporiadať jednotlivé položky v poradí citovania alebo podľa<br />

abecedy.<br />

Rôzne spôsoby odkazov je možné dosiahnuť zmenou voľby v balíku natbib:<br />

% Citovanie podla mena autora a roku<br />

\usepackage[]{natbib}\citestyle{chicago}<br />

% Možnosť rôznych štýlov citácií. Príklady sú uvedené<br />

% v preambule súboru natbib.sty.<br />

% Napr. štýly chicago, egs, pass, anngeo, nlinproc produkujú<br />

% odkaz v tvare (Jones, 1961; Baker, 1952). V prípade, keď<br />

% neuvedieme štýl citácie (vynecháme \citestyle{}) v "options"<br />

% balíka natbib zapíšeme voľbu "colon".<br />

Keď zapneme voľbu numbers, prepneme sa do režimu citovania podľa odkazového<br />

čísla.<br />

% Metoda ciselnych citacii<br />

\usepackage[numbers]{natbib}<br />

Pri zápise odkazov sa používajú nasledujúce pravidlá:<br />

V odkaze na knižnú publikáciu (pozri príklad zoznamov na konci tejto časti):<br />

58


FEI KKUI<br />

∙ Uvádzame jedno, dve alebo tri prvé mená oddelené pomlčkou, ostatné vynecháme<br />

a namiesto nich napíšeme skratku et al. alebo a i.<br />

∙ Podnázov sa môže zapísať vtedy, ak to uľahčí identifikáciu dokumentu. Od<br />

názvu sa oddeľuje dvojbodkou a medzerou.<br />

∙ Dlhý názov sa môže skrátiť v prípade, ak sa tým nestratí podstatná informá-<br />

cia. Nikdy sa neskracuje začiatok názvu. Všetky vynechávky treba označiť<br />

znamienkami vypustenia „. . . “<br />

Pri využívaní informácií z elektronických dokumentov treba dodržiavať tieto zásady:<br />

∙ uprednostňujeme autorizované súbory solídnych služieb a systémov,<br />

∙ zaznamenáme dostatok informácií o súbore tak, aby ho bolo opäť možné vy-<br />

hľadať,<br />

∙ urobíme si kópiu použitého prameňa v elektronickej alebo papierovej forme,<br />

∙ za verifikovateľnosť informácií zodpovedá autor, ktorý sa na ne odvoláva.<br />

Pre zápis elektronických dokumentov platia tie isté pravidlá, ako pre zápis „klasick-<br />

ých“. Navyše treba uviesť tieto údaje:<br />

∙ druh nosiča [online], [CD-ROM], [disketa], [magnetická páska]<br />

∙ dátum citovania (len pre online dokumenty)<br />

∙ dostupnosť (len pre online dokumenty)<br />

Poradie prvkov odkazu je nasledovné: Autor. Názov. In Názov primárneho zdroja:<br />

Podnázov. [Druh nosiča]. Editor. Vydanie alebo <strong>verzia</strong>. Miesto vydania : Vyda-<br />

vateľ, dátum vydania. [Dátum citovania]. Poznámky. Dostupnosť. ISBN alebo<br />

ISSN.<br />

59

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!