Aktualna verzia diplomovej prace - TUKE
Aktualna verzia diplomovej prace - TUKE
Aktualna verzia diplomovej prace - TUKE
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