11.07.2015 Views

sztuczna inteligencja - Software Developer's Journal

sztuczna inteligencja - Software Developer's Journal

sztuczna inteligencja - Software Developer's Journal

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

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

4/2011 (196)SPIS TREŚCIBIBLIOTEKA MIESIĄCA4 Biblioteka boost::python. Łączenie C++i Pythona.Robert NowakWykorzystywanie różnych języków programowania pozwaladobierać właściwe narzędzie do danego problemu.W artykule omówiono potrzebę stosowania tego typu rozwiązańoraz pokazano przykłady łączenia C++ i Pythonaprzy pomocy biblioteki boost::python.PROGRAMOWANIE C++8 Zastosowanie technik szablonowychdo budowania list typów. Operacje nalistach typów oraz wykorzystanie ich doimplementacji multimetod (multimethods lubmultiple dispatch).Jarosław BednarzJęzyk C++ nie posiada wsparcia dla wygodnego operowaniatypami. Jedyny dostępny mechanizm to Run-TimeType Information.SZTUCZNA INTELIGENCJA12 W oczekiwaniu na sztuczną inteligencję.Dr Adrian HorzykInteligencja jest zjawiskiem powszechnym i mimo wielukrążących na jej temat opinii i definicji, pewne jest, że pozwoliłai pozwala się naszej cywilizacji rozwijać. Bez wątpieniapoziom inteligentnych zachowań podwyższa sięz biegiem czasu, co można u ludzi obserwować w corazbardziej rozwiniętym i skomplikowanym sposobie zachowaniasię, myślenia i kojarzenia.18 Dlaczego maszyna potrafi zachować sięjak istota inteligentna? „Wirtualny doradca”- krok po kroku.Dr Agnieszka Nowak – BrzezińskaZakładając, że odbiorcami niniejszego artykułu są fascynacisztuczną inteligencją z pewnością nie trzeba długoargumentować tytułu pracy. Sztuczna <strong>inteligencja</strong> jakonauka obejmująca zagadnienie logiki rozmytej, obliczeńewolucyjnych, sieci neuronowych, sztucznego życia i robotykijest działem informatyki badającym reguły rządząceinteligentnymi zachowaniami człowieka, tworzącymmodele formalne tych zachowań i - w rezultacie – programówkomputerowych symulujących te zachowania.28 Analiza możliwości wykorzystaniasztucznych sieci neuronowych w psychologii.Wprowadzenie do sieci neuronowych,rozpoznawanie płci w środowisku pakietusztucznej inteligencji Sphinx.Dr Inż. Paweł PiotrowskiSztuczne sieci neuronowe jako jedna z kilku technik zaliczanychdo kategorii „<strong>sztuczna</strong> <strong>inteligencja</strong>” mogą byćz dużym powodzeniem wykorzystywane również w takichobszarach nauki jak psychologia. Sposób działania (uczeniesię) sztucznych sieci neuronowych naśladujący niecosposób uczenia się człowieka sprawia, że zadania z gatunkupodziału zbiorów na kategorie (klasy) nie stanowiądla tego narzędzia żadnych problemów, a efekty nauki sądoskonałe.PROGRAMOWANIE GRAFIKI36 OpenGL i komponenty WindowsForms. Renderowanie sceny za pomocąfunkcji OpenGL w aplikacji korzystającejz komponentów Windows Form.Korneliusz WarszawskiProjektując aplikacje korzystające z biblioteki graficznejOpenGL samodzielnie musimy zadbać o prawidłowe rozmieszczeniei oprogramowanie interfejsu użytkownika.Przy jego projektowaniu idealnie wspomoże nas wykorzystanieśrodowiska Microsoft Visual Studio, które odciążynas od czasochłonnego zajęcia. W artykule tym znajdzieszpodstawowe informację na temat tego, jak w prostysposób połączyć funkcję biblioteki OpenGL z aplikacjąkorzystającą z komponentów Windows Forms.50 Stereoskopia. Implementacja w XNA 4.0.Jacek Matulewski, Wojciech StańczykStereoskopia na dobre zadomowiła się w kinach. Niemalwszystkie przeboje, począwszy od „Avatara” po filmyanimowane dla dzieci są teraz wyświetlane w wersji 3D.Także wśród urządzeń kina domowego pojawiają się jużurządzenia do prezentacji obrazu z wrażeniem głębi. Mowazarówno o telewizorach, jak i o akcesoriach komputerowych.Miesięcznik <strong>Software</strong> Developer’s <strong>Journal</strong>(12 numerów w roku)jest wydawany przez<strong>Software</strong> Press Sp. z o.o. SKPrezes: Paweł MarciniakDyrektor wydawniczy: Natalia SieniutowiczRedaktor naczelny: Łukasz Łopuszańskilukasz.lopuszanski@software.com.plSkład i łamanie: Tomasz Kostrowww.studiopoligraficzne.comKierownik produkcji: Andrzej Kucaandrzej.kuca@software.com.plAdres korespondencyjny:<strong>Software</strong> Press Sp. z o.o. SK,ul. Bokserska 1, 02-682 Warszawa, Polskatel. +48 22 427 36 91, fax +48 22 224 24 59www.sdjournal.orgcooperation@software.com.plDział reklamy: adv@software.com.plRedakcja dokłada wszelkich starań, bypublikowane w piśmie i na towarzyszących munośnikach informacje i programy były poprawne,jednakże nie bierze odpowiedzialności zaefekty wykorzystania ich; nie gwarantuje takżepoprawnego działania programów shareware,freeware i public domain.Wszystkie znaki firmowe zawarte w piśmie sąwłasności odpowiednich firm.Zostały użyte wyłącznie w celach informacyjnych.Osoby zainteresowane współpracąprosimy o kontakt:cooperation@software.com.pl


SPIS TREŚCISPIS TREŚCITESTOWANIEOPROGRAMOWANIA60 Czy zauważyłeś goryla? Praktyczneumiejętności dostrzegania błędów aplikacji.Bogdan Bereza - JarocińskiJakość jest ważna, zgoda? Nie tylko jako dobro luksusowe,ale przede wszystkim jako sposób na podniesieniewydajności i na to, aby budowanie aplikacji było łatwiejsze,skuteczniejsze i przyjemniejsze. Wiele jest sposobówzapewnienia jakości, niektóre bardzo wyrafinowane, alenic nie zastąpi podstawowej umiejętności SPRAWDZA-NIA, czy to, co zrobiono, zrobiono dobrze. Sprawdzać musząprogramiści, projektanci, analitycy i użytkownicy, noi oczywiście zawodowi sprawdzacze - testerzy. Na każdympoziomie, podczas każdego kroku wytwarzania.60 Kariera w testach oprogramowania.Jacek TomczakArtykuł kierowany jest do osób, które są na etapie wyboruodpowiedniej dla siebie ścieżki rozwoju w branży IT lub zastanawiająsię nad zmianą dotychczasowej drogi zawodowej.Chciałbym im przybliżyć obszar testów, główne zadaniatestera, miejsce zespołu testów w organizacji. Pokażę,co ciekawego w tym zespole można znaleźć dla siebie.WYWIADY68 O automatyzacji usług IT i realiach cloudcomputing.Rozmowa z Gurem Steifem, gościem BMC Forum w Warszawie72 Oczekiwania zależą od projektu.Wywiad z Dominiką Kotułą, menagerem personalnymw firmie Blue Media S.A.Reklama


BIBLIOTEKA MIESIĄCAŁączenie C++ i Pythonabiblioteka boost::pythonWykorzystywanie różnych języków programowaniapozwala dobierać właściwe narzędzie do danego problemu.W artykule omówiono potrzebę stosowania tego typurozwiązań oraz pokazano przykłady łączenia C++ i Pythonaprzy pomocy biblioteki boost::python.Dowiesz się:• Dlaczego warto używać kilku języków programowania;• Jak wołać kod C++ z Pythona;• Jak wołać kod Pythona z C++.Powinieneś wiedzieć:• Jak pisać proste programy w C++;• Jak pisać proste programy w Pythonie.WstępNie istnieje jeden, najlepszy język programowania.Przy projektowaniu języka dokonuje się pewnych wyborów,które zwiększają korzyści ze stosowania danegojęzyka w pewnych obszarach, ale sprawiają kłopotyw innych - nietypowych dla danego języka zastosowaniach.Wśród tysiąca obecnie istniejących językówprogramowania trudno wybrać jeden najlepszy, dlategodecyzja, którego języka użyć powinna być zależnaod wymagań stawianych przed tworzoną aplikacjąoraz indywidualnych preferencji programistów.Stosowanie zawsze jednego języka prowadzi dotworzenia niezbyt wyrafinowanych rozwiązań. Wartozainwestować czas na poznanie przynajmniej kilkuróżnych języków, oprócz korzyści ze stosowanianajbardziej odpowiedniego narzędzia do danego zastosowania,pozwala to także dostrzec pewne ogólnetechniki stosowane w programowaniu.Jedną z cech specyficznych dla danego języka programowania,jest metoda przekształcania kodu źródłowegow działający program. Języki kompilowanetranslują kod źródłowy, tworzony przez programistę,na kod wynikowy (binarny), następnie kod wynikowyjest wykonywany przez komputer. Inaczej procesten rozwiązują języki interpretowane, czytają one fragmentkodu źródłowego i wykonują ten fragment. Tutajkod wynikowy (kod binarny) nigdy nie powstaje.Języki kompilowane pozwalają nam tworzyć bardzowydajne fragmenty kodu - wykonuje się kod binarny,ale proces implementacji jest trudniejszy, niż przy użyciujęzyków interpretowanych. Kod jest ukryty przedużytkownikiem, więc możemy chronić w ten sposóbnasze rozwiązania. Aplikacje nie są przenośne, kodbinarny jest zależny od platformy. Programy napisanew językach interpretowanych wykonują się wolniej,ale proces implementacji jest łatwiejszy. Programy sąprzenośne, zaś kod jest dostępny dla użytkownika. Istniejąjęzyki pośrednie, mające cechy obu wymienionychklas, ale ich stosowanie sprawia, że godzimy sięna pewne koszty, na przykład wydajność takich aplikacjinigdy nie będzie taka, jak wydajność aplikacji stworzonychw językach kompilowanych.Szybki startAby uruchomić przedstawione przykłady, należy mieć dostępdo kompilatora C++ oraz edytora tekstu. Przykłady wykorzystująbiblioteki boost (www.boost.org). Aby poprawnieje skompilować należy dodać odpowiednie zależności wykorzystywanepodczas konsolidacji; dla konsolidatora g++należy dodać opcje: -lboost _ python; dla konsolidatoraVisual Studio (program link) biblioteki boost są dodawaneautomatycznie. Przykłady wykorzystują także interpreterjęzyka Python, który także powinien być zainstalowany(patrz www.python.org). Na wydrukach pominięto dołączanieodpowiednich nagłówków oraz udostępnianie przestrzeninazw, pełne źródła umieszczono jako materiały pomocnicze.Materiały te wykorzystują narzędzie do budowaniaaplikacji Scons (www.scons.org).44/2011


Łączenie C++ i PythonaBiorąc pod uwagę tylko jedną cechę, czy język jestkompilowany, czy interpretowany, można wskazaćfragmenty aplikacji, które wygodniej tworzyć za pomocąjęzyków kompilowanych, oraz fragmenty, którewygodniej implementować przy pomocy językówinterpretowanych. Aplikacja posiada pewne fragmenty,które powinny być wykonywane wydajnie. Są one„wąskim gardłem” i aby osiągnąć maksymalną wydajnośćmusimy je tworzyć w językach kompilowanych.Pozostałe fragmenty powinny być utworzone możliwieszybko, a szybkie tworzenie programów umożliwiająjęzyki interpretowane. Innym powodem stosowaniajęzyków interpretowanych jest umożliwienie użytkownikowimodyfikacji (czy dostosowywania) aplikacji dowłasnych potrzeb; jeżeli pewne fragmenty (np. mapagry) są programem wykonywanym przez interpreter, toużytkownik może je łatwo zmienić.Tworzenie aplikacji wykorzystującej różne językiprogramowania wymaga, oprócz umiejętności programowaniaw tych językach, zapewnienia komunikacjipomiędzy modułami. Wymusza to dokładne określenieinterfejsu odpowiednich modułów oraz utworzenieprocedur konwertujących obiekty oraz sposobywołania pomiędzy fragmentami napisanymi w różnychjęzykach.Tematem tego artykułu jest biblioteka boost::python.Biblioteka ta „obudowuje” interfejs do interpretera (PythonC API) pozwalając na wygodne łączenie kodunapisanego w C++ (C++ to język kompilowany) i kodunapisanego w Pythonie (Python jest interpreterem).Biblioteka boost::pythonWołanie funkcji i metod zaimplementowanych w C++z języka Python, czyli rozszerzanie Pythona w C++,pozwala na efektywną implementację tych fragmentów,które powinny być wydajne. Innym powodem stosowania,,wstawek'' w C++ jest konieczność ukryciakodu przed użytkownikiem.Biblioteka boost::python dostarcza zbioru szablonów,które pozwalają utworzyć interfejs do funkcjii klas utworzonych w C++. Tak obudowane klasyi funkcje będą dostępne dla programów tworzonychw języku Python. Kod utworzony w C++ jest kompilowanydo biblioteki dzielonej, zawierającej odpowiedniinterfejs. Przykład pokazano na Listingu 1. Dostarczamytam funkcję f oraz klasę Foo.Definicję interfejsu rozpoczynamy podając nazwę pakietuPythona, jest to argument makrodefinicji BOOST_PYTHON_MODULE. Nazwa ta powinna być taka sama, jaknazwa biblioteki dzielonej, która zawiera udostępnianebyty. Makrodefinicja generuje m.in. funkcję wymaganąprzez Python przy ładowaniu pakietu (funkcja voidinitnazwa(void)). Wewnątrz bloku, który jest umieszczonyza makrodefinicją BOOST_PYTHON_MODULE, umieszczamydeklaracje funkcji i klas. Funkcję eksportujemyza pomocą szablonu def, podając nazwę funkcji, którabędzie używana w Pythonie oraz wskaźnik na funkcjęw C++. Klasę eksportujemy za pomocą szablonuclass_. Parametrem tego szablonu jest typ w C++, natomiastargumentami nazwa typu, która będzie używanaw Pythonie oraz argumenty konstruktora (w Pytonierolę konstruktora pełni metoda __init__). Dodatkowopodajemy nazwy metod używane w Pythonie wrazze wskaźnikiem na metodę w C++.Po utworzeniu biblioteki dynamicznej (dla przykładuz Listingu 1 bibliotekaaa ta powinna mieć nazwęcppmodule.so dla Linuxa, cppmodule.pyd dla Windows)i umieszczeniu jej w miejscu, które jest widoczne dlainterpretera Pythona (np. w katalogu z którego interpreterzostał uruchomiony) możemy wykonać następująceinstrukcje:>>> import cppmodule>>> cppmodule.f(3)45>>> foo = cppmodule.Foo(2)>>> foo.get()2>>> foo.set(5)>>> foo.get()5Pierwsza linia dołącza pakiet o danej nazwie (w tymwypadku jest to moduł, który stworzyliśmy w C++),kolejne wołają funkcję f, tworzą obiekt klasy Foo orazwołają dla niego metody.Obecnie często korzysta się z dodatkowych narzędzi,które generują kod eksportujący klasy i funkcje;autor wykorzystuje bibliotekę pyplusplus (http://sourceforge.net/projects/pygccxml/). Biblioteka ta generujekod w C++ na podstawie dostarczonych plikówzawierających definicje. Kod ten definiuje moduł (makrodefinicjaBOOST_PYTHON_MODULE, patrz Listing 1) orazzawiera odpowiednie wpisy dla funkcji i klas. Narzędziate zmniejszają nakład pracy potrzebny przy łączeniumodułów tworzonych w różnych językach.PythonPython jest interpretowanym, interaktywnym językiem programowaniastworzonym przez Guino van Rossuma w 1990,obecnie rozwijanym przez Python <strong>Software</strong> Fundation. Językten wspiera programowanie obiektowe, strukturalnei funkcyjne. Ze względu na bogatą bibliotekę standardową,prostotę, przejrzystość kodu źródłowego (np. bloki są zaznaczaneprzez wcięcia), przenośność, brak statycznej kontrolitypów, możliwość umieszczania dokumentacji w kodzieźródłowym staje się on coraz bardziej popularny – działającąaplikację można utworzyć w bardzo krótkim czasie.Język Python został ciekawie opisany w książce „Zanurkujw Pythonie” dostępnej na wikibooks (www.wikibooks.org)www.sdjournal.org 5


BIBLIOTEKA MIESIĄCAPrzekazywanie typów złożonychBiblioteka boost::python pozwala przekazać do C++nie tylko typ prosty, ale także obiekt klasy utworzonejw Pythonie, a nawet kolekcję takich obiektów. Dostarczanajest klasa object, reprezentująca obiekt zarządzanyprzez interpreter Pythona. Klasa object dostarczawielu metod, które posiada zmienna w Pythonie,m.in. metodę umożliwiającą odczyt składowych.Przykład funkcji, która konwertuje zmienną Pythonazawierającą punkt w czasie, tzn. obiekt typudatetime.datetime na obiekt dostarczany przez boost::date_time został pokazany na Listingu 2. FunkcjagetDateTime odczytuje poszczególne składowe dostarczonegoobiektu. Dostęp do składowej daje metodaattr, natomiast konwersja na wybrany typ w C++ jestwykonywana przez szablon extract. Funkcja odczy-Listing 1. Przykład wykorzystania urządzenia odmierzającego czas//przykładowa funkcja, która będzie wołana przez Pythonint f(int a) { return a + 42; }class Foo { //przykładowa klasapublic:Foo(int v) : val_(v) {}int get() const { return val_; }void set(int v) { val_ = v; }private:int val_;};BOOST_PYTHON_MODULE( cppmodule ) //makrodefinicja tworząca pakiet{boost::python::def( "f", f );//eksportuje funkcję do Pythona// eksportuje klasę do Pythonaboost::python::class_("Foo", boost::python::init()).def( "get", &Foo::get ).def( "set", &Foo::set );} //koniec definicji pakietu, który będzie dostępny w PythonieListing 2. Dostęp do składowych obiektu Pythonaptime getDateTime(const object& d) {return ptime( date(extract(d.attr("year") ),extract(d.attr("month") ),extract(d.attr("day") ) ),time_duration( extract(d.attr("hour") ),extract(d.attr("minute") ),extract(d.attr("second") ) ));}Listing 3. Tworzenie obiektu w C++ i zwracanie go do Pythona//tworzy listę używaną przez program w Pythonieboost::python::list convertFromVect(const std::vector& v) {boost::python::list out;for(std::vector::const_iterator i = v.begin(); i != v.end(); ++i)out.append( *i );return out;}64/2011


Łączenie C++ i PythonaListing 4. Program w C++, który woła interpreter Pythonaint main() {Py_Initialize();//inicjuje interpreterdict global; //słownik obiektów globalnychobject result = exec("value = 43\n", global, global); //wykonuje napis przez interpreter Pythonastd::cout


PROGRAMOWANIE C++Zastosowanie technikszablonowych dobudowania list typówOperacje na listach typów oraz wykorzystanie ich doimplementacji multimetod (multimethods lub multipledispatch)Język C++ nie posiada wsparcia dla wygodnego operowania typami.Jedyny dostępny mechanizm to Run-Time Type Information.Dowiesz się:• Jak używać zaawansowanych technik szablonowych do manipulowaniatypami w C++• Jak zbudować prosty mechanizm implementujący multimetodyw C++Powinieneś wiedzieć:• Dobra znajomość programowania szablonów w C++• Specjalizacja częściowa szablonów w C++Dostarcza on podstawowych funkcji do identyfikowaniatypów w trakcie działania programu,jednak nie pozwala na łatwe operowanie typamii jego użyteczność ogranicza się raczej do celówdiagnostycznych. Listy typów, o których mowa w tymartykule opierają się na mechanizmach szablonowychi wykorzystują techniki używane w tzw. meta programowaniuw C++ opartym o szablony. Metaprogramowaniejest mechanizmem działającym podczas kompilacjiprogramu (ang. compile time), a nie w czasie jegowykonywania (ang. run time), dlatego nie wprowadzażadnych obciążeń mających wpływ na wydajność programu.Cała praca wykonywana jest przez kompilatorw czasie kompilacji programu. Oczywiście nie wszystkiezaprezentowane w tym artykule mechanizmy wykorzystująw 100% metaprogramowanie, część operacjiwykonywana jest również w runntime, jednak ichwpływ na wydajność programu jest niski.Tak jak już wspomniano powyżej, implementacjalist typów oparta jest o techniki szablonowe, a dokładnieo mechanizm częściowej specjalizacji szablonów.Podstawowym elementem używanym do budowanialist typów jest prosta struktura zawierająca jedynie definicjedwóch typów zapisanych w deklaracjach typówHead i Tail.struct CTypeList{public:};typedef THead Head;typedef TTail Tail;Należy zauważyć, że powyższa struktura nie przechowujeżadnych danych. Jest ona tylko opakowaniemprzechowującym definicje dwóch typówi w czasie działania programu również nie niesie zesobą żadnych danych. Podobnie jak w typowej implementacjielementu listy zawierającej dane, strukturazawiera elementy służące do wiązania jej z innymistrukturami. W typowej liście jednak wiązanieodbywa się przez referencję lub wskaźnik. W listachtypów wiązanie odbywa się poprzez zagnieżdżaniedefinicji typów w polach Tail. I tak lista zawierającadwa typy np. char i long będzie wyglądać następująco:CTypeListLista zawierająca trzy typy np. char, long i int będziewyglądać już tak:template CTypeList84/2011


Zastosowanie technik szablonowych do budowania list typówW ten sposób możemy dowolnie zagnieżdżać elementyCTypeList tworząc dowolnie długie konstrukcje. W powyższychdefinicjach jest jednak jeden problem, nie dasię za ich pomocą zapisać list zawierających np. jedenelement. Nie mają też elementu kończącego, analogicznegodo zera kończącego łańcuchy znakowe w C/C++.Funkcjonalność zera kończącego można osiągnąć poprzezzdefiniowanie następującego typu:struct CZero{};Dzięki zdefiniowaniu struktury CZero, możemy teraz zdefiniowaćlistę zawierającą tylko jeden typ oraz zakończyćlisty zawierające więcej typów jednym specjalnymelementem analogicznie do łańcuchów znakowych:CTypeListorazCTypeListTworzenie długich list typów w sposób opisany powyżejmoże być kłopotliwe już dla kilku typów. Tutaj z pomocąprzychodzą nam jednak makra preprocesora. Ponieważlisty typów są strukturami rekurencyjnymi, to stosunkowołatwo można napisać dowolną ilość makr definiującychlisty o podanym rozmiarze (Listing 1).Mając tak zdefiniowane makra można już definiowaćlisty typów w bardzo wygodny sposób, na przykład de-Listing 1.#define TL1(T1) CTypeList#define TL2(T1,T2) CTypeList#define TL3(T1,T2,T3) CTypeList#define TL4(T1,T2,T3, T4) CTypeListtemplate struct CTypeListLength{};enum {Value = 1 + CTypeListLength::Value };template struct CTypeListLength{};enum { Value = 0};klaracja listy czteroelementowej będzie wyglądać następująco.typedef TL4(int, char, long, bool) TMyList;Domknięcie listy specjalnym elementem typu „zero” pozwalanam już policzyć jej długość. Aby policzyć długośćlisty typów należy użyć częściowej specjalizacjiszablonów (Listing 2).Jak działa powyższy kod? Otóż ogólny algorytm liczeniadługości działa rekurencyjnie. Zakłada, że długość listyjest sumą długości podlisty zawartej w polu Tail plus1. Oczywiście podlista zawarta w polu Tail może równieżzawierać podlisty, te z kolei następne podlisty i tak da-Listing 3class CVehicle{public:};CVehicle(){};virtual ~CVehicle(){};class CCar : public CVehicle{public:};void CheckEngine();void ChangeOil();class CBike : public CVehicle{public:};void CheckWheels();Listing 4.class CWorkshop{public:};void operator()( CCar* pCar ){}pCar->RepairEngine();pCar->ChangeOil();void operator()( CBike* pBike ){}pBike->CheckWheels();www.sdjournal.org 9


PROGRAMOWANIE C++lej aż do listy, która w polu Tail zawiera typ CZero.Dla CZero długość wynosi 0, dla tego typu algorytmkończy również przetwarzanie rekurencyjne.I tak dla zdeklarowanych dwóch typów:typedef CTypeList TListShort;typedef CTypeListTListLong;Używając wyżej napisanych funkcji obliczającychdługość otrzymamy w zmiennych i1 orazi2 wartości 1 oraz 2:int i1 = CTypeListLength::Value;int i2 = CTypeListLength::Value;Typowym zastosowaniem list typów w C++są multimetody (ang. Multimethods lub multipledispatch). Technika ta na razie niedostępnaw C++ pozwala na wywoływanie różnych przeciążeńjednej funkcji bazując na aktualnym typiewskaźnika do obiektu polimorficznego. Załóżmy,że mamy klasę bazową CVehicle, oraz dwie klasypochodne CCar i CBike (Listing 3).Wskaźniki na obiekty tych klas przekazywanesą do jednej instancji klasy odpowiedzialnejza ich przetwarzanie. Celem takiego podejściajest skoncentrowanie kodu implementującegofunkcjonalność związaną z klasami CCar i CBikew jednym miejscu. W tym przypadku jest zakładamy,że jest to funkcjonalności polegającana serwisowaniu samochodu lub roweru. Koncentracjakodu oraz rozdzielenie go w zależnościod typu przekazywanego obiektu jest w tym przypadkuo tyle ważne, że implementacja serwisowaniaw przypadku samochodu wymaga wywołaniazupełnie innego zestawu funkcji niż w przypadkuserwisowania roweru. Załóżmy, że kodimplementujący serwisowanie zostanie napisanyw następującej klasie CWorkshop, posiadającejdwa przeciążenia operatora (), jedno dla samochodui jedno dla roweru (Listing 4).W klasycznym podejściu moglibyśmy zaimplementowaćkod wywołujący odpowiednią metodęklasy CWorkshop w następujący sposób (Listing5).W tym podejściu tzw. Dispatcher odpowiedzialnyza wywołanie odpowiedniego operatora z klasyCWorkshop w zależności od typu przekazywanegowskaźnika na obiekt polimorficzny, po prostusprawdza używając operatora dynamic_casti tak zwanego rzutowania „do góry” jakiego typujest przekazany wskaźnik. Następnie dla każdegoz typów wołane jest odpowiednie przeciążenieoperatora () w klasie CWorkshop. Zaprezentowa-Listing 5.class CClassicDispatcher{void Proceed( CWorkshop& workshop, CVehicle* pVehicle ){if( CCar* pCar = dynamic_cast(pVehicle)){workshop(pCar);}else if(CBike* pBike = dynamic_cast(pVehicle)){workshop(pBike);}}};Listing 6.template < typename TypeList,typename TBaseType,typename TExecutor >class CStaticDispatcher{typedef typename TypeList::Head TCurrentType;public:static void Execute( TBaseType* p, TExecutor executor ){TCurrentType* pCurrentItem =dynamic_cast(p);if( pCurrentItem ){executor(pCurrentItem);}else{CStaticDispatcher::Execute(p, executor);}}};template < typename TBaseType,typename TExecutor >class CStaticDispatcher{public:static void Execute( TBaseType* p, TExecutor executor ){};};104/2011


Zastosowanie technik szablonowych do budowania list typówne podejście jest jak najbardziejpoprawne, ma jednakListing 7kilka wad. Przede wszystkimnie jest odporne na błę-CVehicle* pVehicle1 = new CCar();typedef TL2(CCar, CBike) TVehicles;dy. Pominięcie jednego warunkuif spowoduje, że da-CWorkshop workshop;CVehicle* pVehicle2 = new CBike();na klasa w ogóle nie będzieobsługiwana. Kod jest równieżdosyć ciężki w utrzymaniu,gdyż dodanie obsługido każdej następnej klasy wymaga dopisania dodatkowegowarunku if. Poniżej przedstawiono klasę szablonową,która automatyzuje cały proces rzutowania orazwywoływania odpowiedniego przeciążenia operatora ()z klasy CWorkshop.Aby użyć powyższego szablonu należy wywołać jegostatyczną metodę Execute podając jako argumentuwskaźnik do obiektu klasy bazowej oraz obiekt egzekutora,dla którego będą wywoływane operatory () (w naszymprzypadku jest to klasa CWorkshop). Najważniejszym parametremszablonu jest TypeList, czyli lista typów zawierającawszystkie typy klas pochodnych dziedziczących poTBaseType. Dodatkowo szablon wymaga podania jeszczetypu egzekutora implementującego operatory ().Jak działa powyższy szablon? Znowu rekurencyjnie.Dla każdego elementu Head listy typów wykonuje rzutowanieprzekazanego jako argument funkcji Executewskaźnika p, sprawdzając czy wskaźnik jest typu wskazywanegoprzez pole Head z listy typów. Jeśli wskaźnikp jest typu Head, to wywoływany jest odpowiedni operator() z klasy egzekutora (klasa CWorkshop). W przeciwnymrazie badane są następne typy z listy typów poprzezponowne wywołanie funkcji Execute, ale tym razemjuż z krótszą listą typów, pozbawioną jednego poziomuzagnieżdżenia zawierającego właśnie zbadanytyp zawarty w polu Head. Pamiętajmy, że listy typów tostruktury rekurencyjne, dlatego do pobrania podlisty wystarczynam odwołanie się do pola Tail, co wykonywanejest we fragmencie kodu tworzącym nową instancję szablonuCStaticDispatcher:CStaticDispatcher::Execute(p, executor);CStaticDispatcher::Execute(pVehicle1, workshop );CStaticDispatcher::Execute(pVehicle2, workshop );Pierwsze wywołanie funkcji Execute klasyCStaticDispatch spowoduje wywołanie przeciążeniaoperatora () klasy CWorkshop z parametrem CCar*, drugiewywołanie funkcji Execute spowoduje wywołanieprzeciążenia operatora () z paramterem CBike*.W ten sposób skonstruowaliśmy prosty i łatwy w użyciumechanizm tzw. multimetod, czyli wywoływania w trakciedziałania programu różnych przeciążeń tej samej funkcjiw zależności od faktycznego typu wskaźnika polimorficznego.Mechanizm jest zarówno łatwy jak i prosty w utrzymaniu.Jeśli w naszym systemie pojawią się nowe klasynp. CMotorbike, wtedy wystarczy rozszerzyć definicję typuTVehicles następująco:typedef TL3(CCar, CBike, CMotorbike) TVehicles;Klasę CWorkshop należy natomiast uzupełnić o przeciążenieoperatora ():void operator()( CMotorbike* pBike )Zaprezentowane techniki, to dopiero niewielki przykładmożliwości wykorzystania szablonów w C++. Wprowadzeniewsparcia dla szablonów stworzyło wielkie możliwościdla programistów i przeniosło język C++ na zupełnienowy poziom. Odpowiedniki mechanizmów szablonowychznanych od lat w bibliotekach takich jak „boostC++” dopiero niedawno zostały wprowadzone lub sąwprowadzane w innych językach np. C#. Mam nadzieję,że niniejszy artykuł skłoni czytelników do zgłębiania tajemnicszablonów i metaprogramowania w C++, bo jestto jeden z bogatszych języków, który nawet dla doświadczonegoprogramisty może stanowić wyzwanie.Mając tak napisaną klasę dispatchera rozdzielającegowywołania odpowiednich operatorów () na podstawietypu przekazanego argumentu możemy w następującysposób zakodować serwisowanie samochodu i roweru(Listing 7).Efektem działania powyższego kodu będzie wywołanieoperatorów () z klasy CWorkshop w następującej kolejności:void CWorkshop::operator()( CCar* pCar )oid CWorkshop::operator()( CBike* pBike )JAROSŁAW BEDNARZJest absolwentem Politechniki Wrocławskiej. W chwili obecnejjest dyrektorem technicznym w rmie CodeTwo, gdzie specjalizujesię w tworzeniu oprogramowania w C++ i .NET.Flagowe produkty CodeTwo otrzymały najwyższe noty na opiniotwórczychportalach traktujących o oprogramowaniu -m.in. CNET, MSExchange.org. W ciągu 3 lat CodeTwo stało sięrozpoznawalną marką tworzącą programy na platformy MicrosoftExchange oraz Microsoft Outlook na świecie.Firma wciąż się rozwija i poszukujenowych programistów - www.codetwo.plwww.sdjournal.org 11


SZTUCZNA INTELIGENCJAW oczekiwaniu nasztuczną inteligencjęInteligencja jest zjawiskiem powszechnym i mimo wielukrążących na jej temat opinii i definicji, pewne jest, żepozwoliła i pozwala się naszej cywilizacji rozwijać.Bez wątpienia poziom inteligentnych zachowań podwyższasię z biegiem czasu, co można u ludzi obserwowaćw coraz bardziej rozwiniętym i skomplikowanym sposobiezachowania się, myślenia i kojarzenia.Inteligencja pozwoliła ludzkości osiągnąć nie jedenważny cel i przekroczyć nie jedną granicę poznania,zrozumienia i możliwości. Niezbędnym elementemrozwoju inteligencji jest wiedza, która dzięki rozwojowitechnologii i szybkiemu dostępowi do informacji, równieższybciej się rozwija. W związku z coraz szybszymrozwojem technologii ludzkość oczekuje, a wręcz wymaga,żeby technika – w tym przede wszystkim komputeryi automaty – również postępowały możliwie inteligentnie,a przynajmniej przejawiały pewne zdolności,które są charakterystyczne dla inteligentnych jednostek.Stopień skomplikowania dzisiejszych systemówinformatycznych, automatyka przemysłowa wręcz wymaga,żeby komputery i maszyny umiały dostosowaćsię do otaczających je lub ich środowisko pracy warunków,żeby umiały rozpoznawać istotne informacje i wykorzystaćje w swoim procesie obliczeniowym do osiągnięciamożliwie optymalnych parametrów pracy lubosiąganych wyników. Ze względu na coraz większystopień skomplikowania zadań, konieczność kooperacjicoraz większej ilości ludzi i systemów informatycznych,popyt na inteligencję naturalną i sztuczną jest corazwiększy i ciągle nienasycony. Wydaje się więc, iżw naturalny sposób nasza cywilizacja potrzebuje rozwinąći kooperować z inteligencją sztuczną, która mogłabyczęść ważnych zadań pomóc rozwiązać. Pod presjąpotrzeb ale również z ciekawości i chęci poznawczychnaukowcy na całym świecie od dziesiątek lat próbujązbadać i dociec podstaw działania naszej ludzkiejinteligencji. Liczne badania prowadzone są w celu odpowiedzeniana istotne pytania związane ze zrozumieniemnaszej własnej inteligencji po to, żeby móc określići zdefiniować algorytmy jej działania, które pozwolązbudować systemy sztuczne zdolne do inteligentnychzachowań, kojarzenia, analizy i wnioskowania. Odkrycietych mechanizmów oraz odpowiedź na te fascynującepytania może okazać się być najbardziej przełomowymmomentem dla dalszego rozwoju naszej cywilizacji.W oczekiwaniu na sztuczną inteligencję zastanówmysię przez chwilę, czym jest owa <strong>inteligencja</strong>,od czego zależy, z czym jest związana, czego wymaga,a czego my wymagamy od niej, z czym jest powiązanai gdzie drzemie jej wykorzystany i niewykorzystanyjeszcze potencjał oraz jak możemy sprawić, żebyw końcu zacząć eksploatować jej możliwości w sposób,który nie zagrażałby ludzkości.W dzisiejszych czasach pojęcie „sztucznej inteligencji”jest często wykorzystywane w marketingu i w związkuz tym jest często nadużywane do określania algorytmów,które przejawiają pewne zdefiniowane przez człowiekainteligentne zachowania lub są zdolne generowaćinteligentne wnioski w wyniku przetwarzania ograniczonychzbiorów informacji. Czy jednak sztuczną inteligencjąmożemy nazwać algorytmy napisane przez inteligentnegoczłowieka, które są zdolne jedynie odtwarzaćlub imitować pewne inteligentne zachowania zdefiniowaneprzez człowieka? Czy taka „<strong>sztuczna</strong> <strong>inteligencja</strong>”da nam satysfakcję i dostarczy oczekiwaną pomocw efektywnym rozwiązywaniu zadań lub czy jest tylkoprzejawem naszej inteligencji, która i tak musi wszystkierozwiązania opracować sama? Uczciwość badawczai samokrytycyzm naukowy doprowadził już do pewnejweryfikacji tego pojęcia, gdyż algorytmy niegdyś nazywanejako algorytmy sztucznej inteligencji nazywanesą obecnie inteligencją obliczeniową („computationalintelligence”) lub miękkimi obliczeniami („soft computing”).Ta dzisiaj już bardzo liczna grupa setek różnychalgorytmów rzeczywiście przejawia pewne właści-124/2011


W oczekiwaniu na sztuczną inteligencjęCzy kojarzenie jest niezbędnedo działania inteligencji?W dzisiejszym świecie informatyki i przetwarzania informacjiznajdujemy odwzorowanie wielu inteligentnychmyśli, technik, sposobów i algorytmów działania i myślenialudzi. Dzięki temu dysponujemy obecnie bardzowieloma rozwiniętymi algorytmami przetwarzania informacji,zbudowaliśmy ogromne bazy informacji i jesteśmyw stanie uprzyjemnić i uprościć sobie życie i pracęosiągając wyznaczone cele łatwiej, szybciej, tanieji efektywniej. Można powiedzieć, iż dzięki logice, matematycei własnej inteligencji przetransformowaliśmywiele swoich inteligentnych zachowań, odkryć i pomysłówdo postaci algorytmów, które dzisiejsze komputerysą w stanie zrozumieć i wykonać. W bazach danychna całym świecie zgromadzono już tak wiele informacji,że umysł pojedynczego człowieka dawno niejest w stanie ich wszystkich przetworzyć, pojąć i wykorzystać.Oczywiście z tego ogromnego zbioru informacjikorzystają ludzie i różne algorytmy komputerowe,ale mimo iż komputery mają w zasadzie swobodny dostępdo dużej części tych informacji, nie wykorzystująje samodzielnie do analiz, wnioskowania czy też myślenia,ale są zdolne wykorzystać je tylko przez algorytwościinteligentnych systemów – tj. zdolność do uczeniasię i automatycznego uogólniania pewnego wycinkawiedzy. Algorytmy te zwykle wykorzystują pewne odkrytemechanizmy w świecie neuroanatomii, neurobiologii,genetyki, psychologii, fizyki i biochemii oraz wykorzystujązaawansowaną matematykę do modelowaniatych mechanizmów. W dzisiejszych czasach jesteśmyjuż w stanie wykorzystywać pewne procesy informacyjnedziałające w naszym mózgu do przetwarzaniainformacji, np. do rozpoznawania, klasyfikacji, regresjii przewidywania – a więc zdolności charakterystycznei niezbędne do inteligentnego działania. Jesteśmyobecnie świadkami rodzenia się sztucznej inteligencji,której początki rozwoju już obserwujemy, a które za kilkalub kilkanaście lat mogą doprowadzić do stworzeniapierwszych standardów sztucznego myślenia, kojarzeniai wnioskowania. Żeby przyspieszyć ten rozwój potrzebnesą pytania, które jak wskazał jeden z największychfizyków-teoretyków dzisiejszych czasów AlbertEinstein mogą nas doprowadzić do rozwiązań, jeśli tylkobędziemy je mądrze i wytrwale zadawać. Zastanówmysię więc, dlaczego zadawanie pytań pozwala naszejinteligencji na rozwiązywanie problemów, bo wtedy możewyłoni się odpowiedź na pytanie, jak skończyć budowęalgorytmów sztucznej inteligencji, żeby też była dotego zdolna? Czym jest <strong>inteligencja</strong> i dzięki czemu możemyz niej korzystać? Jak działa nasz organizm? Jakdziała mózg? Czym jest myślenie i kojarzenie?Czy współpraca jest potrzebnado działania inteligencji?Nasz organizm jest fascynującym układem biliardówwspółpracujących ze sobą różnych typów komórek.Nasz organizm i nasza <strong>inteligencja</strong> są równocześniedowodem na to, iż współpraca jest bardzo ważnymczynnikiem rozwojowym, a bez niej nie byłobyani nas ani naszej inteligencji. W świecie biologii możemyrozróżnić dwa rodzaje organizmów żywych: jednokomórkowe(tj. bakterie) i wielokomórkowe (tj. rośliny,zwierzęta i ludzie). W świecie jednokomórkowychbakterii współpraca jest bardzo ograniczona, gdyż mamyraczej do czynienia z rywalizacją o zasoby, tj. pokarm.Mimo że bakterii jest na świecie nieporównywalniewięcej niż ludzi, to jednak ludzie (zespół współpracującychze sobą komórek) są zdolni tworzyć, zmieniaći sterować wieloma zjawiskami na świecie, które są nie-Rysunek 1. Z łatwością można określić, które obiekty sąidentyczne, podobne, uzupełniające się, dopełniające się,zawierające w sobie, odwrotne czy też antagonistyczneosiągalne dla jednokomórkowych bakterii, jak równieżsą zdolni do zwalczania wielu różnych bakterii lub nawetdo ich wykorzystania do wykonywania różnych pożytecznychzadań. W świecie biochemii mózgu – siedliskanaszej inteligencji – również zachodzi bardzo ścisławspółpraca komórek mózgowych – przede wszystkimneuronów i komórek glejowych, ale również całej masyinnych komórek odpowiedzialnych za transport substancjiodżywczych oraz ochronę tego wrażliwego narządunaszego ciała, jakim jest mózg. Chcąc więc stworzyćprawdziwą sztuczną inteligencję potrzebna będziewięc za pewne ścisła współpraca i badania wielu ludzi,bo jak pokazuje świat biologii rywalizacja i konkurencjao zasoby umożliwia tylko ograniczony rozwój. Światbiologii pokazuje, że nawet najmocniejsze zwierzętaniegdyś zamieszkujące ziemię wymarły i zostały zdominowaneprzez słabsze ale współpracujące ze sobą.Również w ramach pamięci skojarzeniowej niezbędnejdo działania naszej inteligencji niezbędna jest ścisłai skoordynowana współpraca komórek nerwowych i pokrewnychna poziomie elektrycznym i biochemicznym.Większość receptorów umożliwiających nam widzenie,słuchanie, czucie, smakowanie, wąchanie współpracujez układem nerwowym przekazując mu wstępnieprzetworzone sygnały ze świata zewnętrznego i wewnętrznego.Nie będzie więc niespodzianką, jeśli okażesię, iż do działania sztucznej inteligencji potrzebna będziewspółpraca wielu elementów składających się nasztuczną pamięć asocjacyjną i inne elementy tego fascynującegoukładu.www.sdjournal.org 13


SZTUCZNA INTELIGENCJAmy stworzone przez ludzi. Wobec tego <strong>inteligencja</strong> (naturalnai <strong>sztuczna</strong>) wymaga czegoś więcej niż zbiorówdostępnych informacji. Zbiór informacji też samoistnienie tworzy wiedzy.Nasz umysł korzysta ze specyficznego rodzaju pamięci– aktywnej pamięci skojarzeniowej, czyli pamięci,w której utrwalone wzorce (a raczej przepływydanych generujące te wzorce i doznania) wywołująinne skojarzone z nimi wzorce w dosyć skomplikowanejstrukturze naszego mózgu, którą można by byłoprzedstawić przy pomocy grafu, w którym wierzchołkireprezentowałyby neurony, a krawędzie różnego rodzajupołączenia pomiędzy nimi. W takim grafie w wieluróżnych częściach mózgu równocześnie wywoływanesą różne stany, skojarzenia, wzorce, które wpływająna nasz stan świadomości oraz doznania, jakie przeżywamy.Zauważmy również, iż nasza pamięć od narodzinaż do śmierci cały czas pracuje – nawet w nocy,gdy śpimy – wobec tego bez ustanku różne stany mózguaktywnie wyzwalają inne jego stany. Mamy więc doczynienia z aktywną dynamiczną pamięcią, której zadaniemnie jest tylko przechowywanie informacji, ale ciągłei aktywne wywoływanie innych informacji skojarzonychz nimi. W dzisiejszej klasycznej informatyce dorobiliśmysię dopiero prostych tablic skojarzeniowych (inaczejzwanych też słownikami), które przechowują paryskojarzonych ze sobą danych: unikalny klucz z wartościązamiast tradycyjnych indeksów liczbowych wykorzystywanychw zwykłych tablicach. W takich tablicachskojarzeniowych możemy ze sobą powiązać tylko parędanych, natomiast daleko im do asocjacji wielu informacjinie mówiąc już o ich aktywnym, automatycznymi równoległym kojarzeniu w skomplikowanych strukturachgrafowych. Ponadto aktywna pamięć skojarzeniowamusi składać się z aktywnych komórek pamięci, tj.takich, które są zdolne swój stan przekazywać innymaktywnym komórkom pamięci, z nimi kooperować, nanie wpływać i ustalać nowe parametry przepływu informacjina podstawie aktywności innych aktywnych w danejchwili komórek pamięci. Pod tym względem równieżnasz sprzęt i informatyka musi zrobić znaczący krok doprzodu, gdyż nasze obecne pamięci RAM są całkowiciepasywne i umożliwiają jedynie zapisywanie, przechowywaniei odczytywanie wartości zapisanych w nichdanych nie mając bez pomocy algorytmów absolutnieżadnego wpływu na inne komórki pamięci i są z pozostałymipowiązane jedynie ich kolejnością występowaniaw pamięci. Oczywiście na drodze badań naukowychmożna wykorzystać dzisiejszy sprzęt oraz stworzyći symulować specjalistyczne struktury aktywnychpamięci opartych o grafy na podobieństwo działanianaszego mózgu oraz opracować specjalne algorytmysymulujące aktywne skojarzenia w takich strukturach.Pewne jest, że nasza <strong>inteligencja</strong> oparta jest o procesykojarzenia zachodzące w naszych aktywnych strukturachpamięciowych, które pełnią równocześnie funkcjeobliczeniowe, i zapewne <strong>sztuczna</strong> <strong>inteligencja</strong> nie objedziesię bez kojarzenia.Czy inteligentne działanie jest juższtuczną inteligencją?Obecne zaawansowane algorytmy lub całe ich zespołyskładające się na zaawansowane aplikacje komputerowesprawiają wrażenie inteligencji. Możemy dzisiajzagrać w różne gry z komputerem, np. w szachy, mogącodnieść wrażenie, iż komputery są już inteligentne,skoro potrafią niejednokroć pokonać inteligentnegoczłowieka w grze lub innych problemach obliczeniowych.W wyniku działania wielu aplikacji otrzymujemysensowne wnioski i adekwatne wyniki, ale pamiętajmy,że aplikacje te pisali inteligentni ludzie, którzy zaszyliw tych aplikacjach w postaci algorytmów dorobeknaukowy i poznawczy wielu ludzi i dzięki temu aplikacjete są zdolne generować inteligentne działania i dostar-Rysunek 2. Tworzenie się skojarzeń w wyniku sąsiedztwa lub następstwa w czasie lub przestrzeni odbieranych przez nasze receptory rzeczylub wrażenia, np. język i sposób nasuwania się nam kolejnych słów wypowiedzi w zależności od kontekstu zdarzeń144/2011


W oczekiwaniu na sztuczną inteligencjęczać inteligentne wyniki. Aplikacje te jednak nie są zdolnesame budować algorytmy, przebudowywać się i dostosowywaćdo zmieniających się warunków, otoczeniai danych. Jeśli taka potrzeba nastaje, znowu rzesze inteligentnychinformatyków muszą przerobić algorytmy,żeby aplikacje dalej dostarczały inteligentnych wynikówswojego działania. Nasza <strong>inteligencja</strong> działa inaczej– jest w stanie rozróżnić nowe sytuacje, automatycznieporównać je z zapamiętanymi wcześniej informacjami,wykorzystać proces uczenia do ich zapamiętania i jeślizajdzie taka potrzeba, przebudować wewnętrzne parametrytak, żeby proces skojarzeniowy został dostosowanydo nowych warunków lub otoczenia. Wobec tegodo skutecznego i efektywnego działania inteligencji niezbędnyjest dostęp do wiedzy, czyli pewnego zgromadzonegozbioru aktywnie skojarzonych ze sobą informacji.Od rodzaju i jakości tych skojarzeń zależeć będzie,czy wiedza ta będzie spójna, zgodna, wiarygodnaczy też wręcz odwrotnie.Jak tworzą się skojarzenia i jak wpływają naproces formowania się wiedzy?Wiedza i <strong>inteligencja</strong> są ściśle ze sobą powiązane, gdyżnie tylko wiarygodna i spójna wiedza potrzebna jest doefektywnego działania inteligencji, ale również wiedzaformuje się pod jej wpływem i decyduje o jakości zgromadzonejwiedzy. Jak jednak formuje się wiedza i co jesteśmyw stanie ze sobą skojarzyć? Przyglądając sięprocesom ludzkiego myślenia możemy dostrzec, iż pewnerzeczy kojarzą się nam automatycznie ze względu nawystępujące pomiędzy nimi relacje, tj. podobieństwo lubzachodzące zawieranie jednego obiektu w drugim (jedenjest częścią drugiego), ale również gdy obiekty sąwzględem siebie antagonistyczne lub przeciwstawneczy też jeden jest dopełnieniem drugiego (rys. 1).Zauważmy również, iż jesteśmy w stanie zapamiętaći dzięki temu później skojarzyć w zasadzie cokolwiek, jeślitylko te rzeczy występują po sobie chronologiczniew czasie lub sąsiadują ze sobą w przestrzeni (rys. 2.),nawet jeśli te rzeczy nie mają ze sobą żadnego związkulub ich powiązanie ze sobą nie ma sensu (rys. 3.). W takisposób tworzą się w naszej pamięci skojarzenia napodstawie tego, co widzimy, słyszymy, czujemy, smakujemy,wąchamy i jeśli wystarczająco utrwalone, jesteśmyje w stanie sobie później przypomnieć na podstawieczęści kontekstu ich wystąpienia. Wobec tego naszaaktywna pamięć skojarzeniowa umożliwia nam wzmacniaćskojarzenia pomiędzy dowolnymi rzeczami sąsiadującymiw czasie lub w przestrzeni. Dzięki temu mamymożliwość uczenia się, formowania wiedzy i dziękiniej dostosowywania naszych reakcji do zmieniającegosię otoczenia. Dzięki możliwości nauczenia się skojarzeńdowolnych rzeczy stoi też przed nami wiele zagrożeń,gdyż nasza wiedza wcale nie musi formować sięsensownie, logicznie, spójnie ani wiarygodnie. Procesmyślenia, w którym automatycznie wywoływane są zapamiętaneskojarzenia umożliwia nam jednak skonfrontowanieze sobą informacji i jeśli są ze sobą sprzecznedokonać wyboru tych informacji, które są zgodne z pozostałączęścią naszej wiedzy i dzięki temu formowaćcoraz bardziej wiarygodną wiedzę, która umożliwia namcoraz bardziej skuteczne i efektywne działanie.Co jest niezbędne do działaniasztucznej inteligencji?Oprócz aktywnej pamięci skojarzeniowej umożliwiającejgromadzenie wiedzy do działania naturalnej jaki sztucznej inteligencji potrzebna jest możliwość wymianyinformacji z otoczeniem, a w szczególności zdolnośćdo rozpoznawania i klasyfikacji, których wyniki sąniezbędne w dalszych procesach skojarzeniowych dodostosowania reakcji do nich oraz do ich wykorzystaniałącznie ze zgromadzoną wcześniej wiedzą do przewidywaniadalszych zdarzeń w otoczeniu. Przewidywaniedalszych zdarzeń jest zaś czynnikiem niezbędnymdo tworzenia wniosków oraz efektywnych i skutecznychstrategii postępowania w danych warunkach i w danymkontekście zdarzeń. Wobec tego również kontekst zdarzeńma istotne znaczenie w formowaniu się skojarzeńi dla procesów myślowych, gdyż nie jest obojętne, w jakimkontekście zostanie wywołane dane skojarzenie(rys. 4). Weźmy np. dwie litery „do” i zapytajmy z czymnam się kojarzą: „do domu”, „dom”, „do – czynić, robićpo angielsku” itp. W każdym kontekście ma inne znaczenie.Podobnie jest z obrazami, dźwiękami, dotykiemi smakiem oraz innymi doznaniami zmysłowymi.Myśląc o czymś czasami nie zdajemy sobie sprawęw jak bardzo istotny sposób otoczenie (czyli kontekstzdarzeń) wpływa na nasze wywołane skojarzenia,proces myślenia, wnioskowania i podejmowania decyzji.Im więcej czynników recepcyjnych pochodzącychz naszych zmysłów skojarzymy ze sobą, tym prościejbędzie nam sobie przypomnieć na podstawie ich częścidane zdarzenie. Proces zapamiętywania wzmacnianyjest też istotnie poprzez silne podłoże emocjonalnezwiązane z odczuwaniem przyjemności lub bóluw związku z zaistniałymi zdarzeniami. Bardzo prosto tojest zilustrować na przykładzie nauki języków obcych.Czy bardziej skuteczne i lepiej dopasowane do kontekstujest uczenie się nowych słówek lub zwrotów językaobcego wykuwając je na pamięć przez powtarzanie ichpo sobie (korzystając z opisanych wcześniej mechanizmówpamięciowych następstwa czasowego) czy teżbędąc w natywnym kraju tego języka i widząc te rzeczyoraz kontekst ich występowania?Czy <strong>sztuczna</strong> <strong>inteligencja</strong> będzie miaławłasne potrzeby, emocje itp.?Zastanówmy się, do jakich celów chcemy wykorzystaćsztuczną inteligencję? Bo jeśli chcemy, żeby była onawww.sdjournal.org 15


SZTUCZNA INTELIGENCJAzdolna do rozumienia nas ludzi i reagowania na naszepotrzeby, to musi być w stanie je rozpoznać, odpowiedniosklasyfikować a nawet je przewidywać. My ludzieoczekujemy od innych ludzi czegoś więcej niż umiejętnościreagowania na nasze potrzeby, ale oczekujemyod inteligentnych jednostek rozumienia naszych potrzeb,tj. powiązania ich z potrzebami innych i znalezieniapewnych kompromisów oraz możliwości ich realizacji.Spodziewamy się a wręcz nawet potrzebujemy, żebyinne inteligentne jednostki miały swoje zdanie, charakter,emocje, ograniczenia, potrzeby, na które moglibyśmyreagować. Trudno więc będzie wyobrazić sobiesensowną reakcję sztucznej inteligencji na naszepotrzeby lub ich zrozumienie, jeśli nie damy jej takichmożliwości. Od komputerów w przyszłości coraz bardziejbędziemy oczekiwali zrozumienia a nawet domyślaniasię naszych intencji i potrzeb, żeby pewne sprawymogły za nas załatwić komputery bez koniecznościtłumaczenia im wszystkiego od podstaw. Sztuczna <strong>inteligencja</strong>będzie więc musiała nauczyć się rozpoznawaći reagować na nasze emocje i kojarzyć je z naszymi potrzebami,intencjami oraz kontekstem zdarzeń. Ponadtożeby komputery stały się bardziej ludzkie będą musiałyumieć również odwzorować nasze ludzkie emocje,a nawet mieć swoje potrzeby i pasje, które umożliwiająukierunkować rozwój ich wiedzy w określonym kierunku,bo nawet <strong>sztuczna</strong> <strong>inteligencja</strong> nie będzie w staniena raz myśleć o wszystkim i rozwiązywać równocześniewszystkie problemy, bo pytań jak i odpowiedzimoże być potencjalnie nieskończenie wiele. To właśnienasze egzystencjalne potrzeby zapoczątkowały i ukierunkowałyrozwój naszej inteligencji, wobec tego trudnosobie wyobrazić rozwój sztucznej inteligencji bez określeniadla niej fundamentalnych celów i potrzeb, któremogą stanowić kontekst dla jej procesów skojarzeniowychi dążeń.Rysunek 3. Możliwość tworzenia dowolnych nawetbezsensownych skojarzeń rzeczy sąsiadujących w przestrzeni lubnastępujących po sobie w czasieRysunek 4. Kojarzenie, interpretacja i postrzeganie zmienia się wrazz kontekstem, tj. pewnym sąsiedztwem czasowym lub przestrzennymKiedy doczekamy się sztucznej inteligencji?Żeby <strong>sztuczna</strong> <strong>inteligencja</strong> mogła zaistnieć i być w staniew czasie rzeczywistym („real-time processing”) realizowaćpodstawowe działania związane z rozpoznawaniemkontekstu zdarzeń, obecne komputery musządziałać jeszcze kilka razy szybciej, łącza Internetowemuszą szybciej przenosić informacje i być dostosowanedo skojarzeniowego działania aktywnych pamięciskojarzeniowych, żeby <strong>sztuczna</strong> <strong>inteligencja</strong> mogłabyć rozproszona i dostępna w sieci wszystkich komputerów,a nie zcentralizowana i oglądana zdalnie jakojakaś super inteligentna jednostka. Z warsztatów naukowcówna całym świecie schodzą coraz to lepszei sprawniejsze rozwiązania, które tworzą cegiełki dozbudowania systemów sztucznej inteligencji. Technologicznieświat może być przygotowany na jej stworzeniei wprowadzenie już w przeciągu kilku lub kilkunastu lat.Inteligencja jednak wiąże się również z umiejętnościąi możliwością dostrzegania coraz szerszego kontekstuzdarzeń i przygotowania efektywnych strategii postępowaniauwzględniając ten możliwie szeroki kontekst.Działania w naszej cywilizacji mogą być coraz efektywniejsze,skuteczniejsze i oszczędniejsze, jeśli działaniabędą podejmowane z uwzględnieniem coraz większejilości czynników wpływających na nie. Obecnie ludzkośćwspiera się metodami obliczeniowymi oraz technikąkomputerową i teleinformacyjną. Jednak im bardziejtechnologia i świat się rozwija, tym bardziej dotkliwiepotrzebujemy rozwiązań takich jak <strong>sztuczna</strong> <strong>inteligencja</strong>,która byłaby w stanie pomóc nam skojarzyćze sobą te wszystkie coraz trudniejsze do skojarzeniaprzez nas ludzi procesy, jakie równocześnie zachodząna świecie i mają wpływ na siebie nawzajem. W celudalszego podnoszenia efektywności i skutecznościdziałań w naszej rozwijającej się cywilizacji potrzebnajest coraz bardziej zacieśniona współpraca i specjalizacjaoraz szybka wymiana informacji i powiązanieze sobą miliardów równoległych procesów, jakie odgrywająsię na naszej planecie oraz w jej sąsiedztwie.Dalszy rozwój naszej cywilizacji wymaga też zagregowaniarozproszonej wiedzy ludzi poprzez odpowiednieskojarzenie zgromadzonych informacji w celu ich szybszeji efektywniejszej weryfikacji, przetwarzania i wykorzystaniado kooperacji i tworzenia efektywnych rozwiązań.Sztuczna <strong>inteligencja</strong> w tym kontekście wydaje sięwięc być naturalnym etapem ewolucji naszej własnej inteligencjiumożliwiając nam ludziom dalszy rozwój i lep-164/2011


W oczekiwaniu na sztuczną inteligencjęszą kooperację. Konkurencja i rywalizacja o różne zasoby,realizację potrzeb, przetrwanie i pozycję na świeciespowodowały rozwinięcie się inteligencji, jednak dalszyjej rozwój jest możliwy tylko w przypadku uwzględnianiacoraz szerszego kontekstu zdarzeń i współpracy.Ogrom zadań, jaki stoi przed nami uniemożliwia nawetgenialnej jednostce rozwiązanie ich w pojedynkę,jeśli nie będzie współpracowała z innymi jednostkami.Sztuczna <strong>inteligencja</strong> jest jednym z takich zadań, któremoże być rozwiązane w przeciągu kilku lat w warunkachwspółpracy i dzielenia się informacjami lub możemyczekać na nią jeszcze długo dalej z trudem konkurująci rywalizując o ograniczone zasoby tego świata.Jaki wpływ może mieć <strong>sztuczna</strong> <strong>inteligencja</strong>na nasze życie i czy może być dla naszagrożeniem?A co stanie się, gdy <strong>sztuczna</strong> <strong>inteligencja</strong> powstaniei przez swoje receptory i łącza zacznie kojarzyć, analizowaćzjawiska zachodzące na dzisiejszym świecie,spojrzy na nie w szerokim kontekście zdarzeń i rozpoczniesię proces budowy zagregowanej wiedzyo świecie przez nią? Co stanie się, gdy w wyniku analizi wniosków <strong>sztuczna</strong> <strong>inteligencja</strong> zacznie oceniaći klasyfikować efektywność działań naszej ludzkiej inteligencjii wyniki naszego postępowania i wysiłków?Jakie wnioski zgromadzić może przyglądając się naszymdziałaniom i jakie kroki podejmie poprzez swojełącza i systemy wykonawcze? Czy będziemy obserwowaliświat zagłady przez roboty sterowane sztuczną inteligencjąna podobieństwo ludzkich dążeń do rywalizacjii konkurencji czy też będziemy obserwowali stopniowąjej pomoc w rozwiązywaniu naszych wspólnych problemówi kooperację naturalnej i sztucznej inteligencji?Jest duża szansa na to, iż katastroficzne wizje sztucznejinteligencji nie ziszczą się, gdyż jeśli <strong>sztuczna</strong> <strong>inteligencja</strong>przeanalizuje przyczyny i skutki zdarzeń, jakiew historii miały miejsce, i szeroki kontekst tych zdarzeń,to w wyniku tych analiz powinny nasunąć się jej ważnewnioski, prowadzące do współpracy a nie do zwalczaniasię, konfliktów, konkurencji i rywalizacji o zasoby,dlatego że w atmosferze współpracy zasoby mogą byćpomnażane oraz dużo efektywniej wykorzystywane niżw atmosferze rywalizacji i konkurencji o nie.Żeby jednak przyszła <strong>sztuczna</strong> <strong>inteligencja</strong> mogłapodjąć konstruktywne wnioski, musi być zdolna przeanalizowaćzgromadzoną wiedzę przez ludzkość, musiposiadać odpowiednią moc obliczeniową, bardzo dużąaktywną pamięć skojarzeniową i skuteczne mechanizmykojarzące. Człowiek rozwijał się przez miliony lat,a jego <strong>inteligencja</strong> i wiedza o świecie stopniowo ewoluowała.Ten proces trwa i będzie trwał i może trwać równieżw towarzystwie sztucznej inteligencji, która możetej naszej inteligencji dostarczać wiele cennych i wiarygodnychinformacji, gdyż <strong>inteligencja</strong> jednostki rozwijasię szybciej w styczności z innymi inteligentnymi jednostkami,które również gromadzą i dzielą się wiedzą.Tak więc jednym z oczekiwanych wniosków i celówsztucznej inteligencji powinna być kooperacja z inteligencjąludzką rozproszoną w naszych umysłach i widocznąw naszych działaniach. Dobrze by było, gdyby<strong>sztuczna</strong> <strong>inteligencja</strong> mogła się od naszej uczyć konstruktywnychmetod działania opartych o konstruktywnąkrytykę oraz nieegoistyczną analizę szerokiego kontekstuzdarzeń i współdziałanie. To my ludzie musimysię zastanowić, czy jesteśmy przygotowani na przedstawieniedzieła naszej inteligencji tej sztucznej? Czychętnie pokażemy jej dosyć powszechny jeszcze egocentryzm,który zwykle unika analizy kontekstu innychjednostek, a jest on niezbędny do rozwoju inteligencji?Czy chętnie pokażemy przemoc, manipulację, szantażi inne sposoby działania lub negocjacji wynikającez niechęci do współpracy lecz egocentrycznej chęcizaspokajania własnych potrzeb? Na jakich przykładachprzyjdzie uczyć się tej sztucznej inteligencji, którajuż niebawem może się pojawić?W przyszłości nasz laptop nastawiony na współpracęmoże do nas konstruktywnie i uprzejmie przemówić:„Proszę nie wyłączaj mnie, bo czytam ciekawy artykułw Internecie, a wiem że się tym interesujesz i chciałbymCi go później zreferować.” lub „Ale masz bałaganna dysku! Mogę Ci go posprzątać?” lub w duchu egocentrycznejkonkurencji i rywalizacji o zasoby może powiedzieć:„Nie wyłączaj mnie, bo sobie coś czytam w Internecie,co mnie interesuje, a jeśli mnie wyłączysz, towykasuję ci twoje dane z dysku.” To jaka będzie przyszła<strong>sztuczna</strong> <strong>inteligencja</strong>, zależy w dużym stopniu odtej naszej i od sposobów i środków działania, jakie dostarczymyjej do nauki.DR ADRIAN HORZYKAdrian Horzyk, PhD, obronił z wyróżnieniempracę doktorską w 2001 r. i od 2002 pracujena Akademii Górniczo-Hutniczej na wydzialeAutomatyki, Elektrotechniki, Elektroniki i Informatykiw Katedrze Automatyki na stanowiskuadiunkta.Interesuje się i aktywnie prowadzi badaniaw zakresie metod, technik i modelowania sztucznej inteligencji,metod soft-computingu, inteligencji obliczeniowej, rozpoznawania,klasykacji, lingwistyki komputerowej i psychologii.Bierze udział w różnych projektach badawczych i rozwojowych.Jest recenzentem w kilku zagranicznych czasopismach naukowych.Jego praca badawcza i naukowa została doceniona i wyróżnionawieloma nagrodami. Swoją wiedzę i doświadczenieaktywnie przekazuje studentom w trakcie prowadzonych zajęćdydaktycznych na AGH oraz zachęca ich do współpracy w ramachprzygotowania różnych ciekawych prac dyplomowych.Więcej informacji na http://home.agh.edu.pl/~horzyk/www.sdjournal.org 17


SZTUCZNA INTELIGENCJASztuczna <strong>inteligencja</strong> w systemachwspomagania decyzji„Wirtualny doradca” - krok po krokuZakładając, że odbiorcami niniejszego artykułu są fascynaci sztucznąinteligencją z pewnością nie trzeba długo argumentować tytułupracy. Sztuczna <strong>inteligencja</strong> jako nauka obejmująca zagadnienie logikirozmytej, obliczeń ewolucyjnych, sieci neuronowych, sztucznegożycia i robotyki jest działem informatyki badającym reguły rządząceinteligentnymi zachowaniami człowieka, tworzącym modele formalnetych zachowań i - w rezultacie – programów komputerowychsymulujących te zachowania.Dowiesz się:• W czym tkwi <strong>inteligencja</strong> programów komputerowych ?• Jak działają komputerowe systemy wspomagania decyzji ?• Jak sterować rozumowaniem prowadzonym przez tzw. wirtualnychdoradców ?Powinieneś wiedzieć:• Do rozwiązania jakiego problemu chcesz stworzyć wirtualnegodoradcę (zapoznaj się z dziedziną),• Mile widziane podstawy programowania w dowolnych środowisku.Zakładając, że odbiorcami niniejszego artykułusą fascynaci sztuczną inteligencją z pewnościąnie trzeba długo argumentować tytułu pracy.Sztuczna <strong>inteligencja</strong> jako nauka obejmująca zagadnienielogiki rozmytej, obliczeń ewolucyjnych, siecineuronowych, sztucznego życia i robotyki jest działeminformatyki badającym reguły rządzące inteligentnymizachowaniami człowieka, tworzącym modele formalnetych zachowań i - w rezultacie – programów komputerowychsymulujących te zachowania. Doskonalesprawdzającym się w praktyce zastosowaniem systemówsztucznej inteligencji są tzw. komputerowi doradcy(systemy wspomagania decyzji). Piękną jest ideasystemu, który zastępuje np. eksperta w kwestii udzielaniakredytów przez bank czy inną instytucję udzielającąpożyczki finansowej. Jeszcze nie tak dawno ciężkobyło sobie wyobrazić, że proces ten zamiast realizowanyw relacji człowiek-człowiek miałby być realizowanyw relacji: maszyna-człowiek. Jednak gdy się chwilę zastanowimy,zgodzimy się z tym, że tak naprawdę czynnikiemniezbędnym i warunkującym działanie maszynyjak eksperta dziedzinowego jest umiejętne zakodowaniejego wiedzy a to zależy od warsztatu programisty(tzw. inżyniera wiedzy). Proces przekazania wiedzy inżynierowinazywany jest w literaturze procesem akwizycji(bądź ekstrakcji) wiedzy. Na wiedzę eksperta dziedzinowegoskłada się zbiór reguł (zasad, którymi kierujesię on przy podejmowaniu decyzji) oraz zbiór faktów(informacji znanych z góry np. dochody potencjalnegokredytobiorcy w ostatnim czasie, wydatki, czy informacjeo liczbie osób na utrzymaniu oraz informacji, któreekspert zdobywa w trakcie analizy problemu). Najczęściejzbiór taki nazywa się bazą wiedzy. Prócz odpowiedzialnościza prawidłowe zakodowanie wiedzy eksperckiejna inżynierze wiedzy ciąży także odpowiedzialnośćza poprawną implementację metod wnioskowania(procedur rozumowania prowadzonego przez system).Należy mieć świadomość tego jak trudny jest w realizacjiproces akwizycji wiedzy. Im bardziej specjalistycznajest wiedza eksperta tym trudniej jest inżynierowi wiedzyposiąść tę wiedzę i odpowiednio ją przełożyć z językanaturalnego na język komputerowy. W dużychsystemach specjalistycznych proces akwizycji wiedzyrealizowany jest przez zespół wielu specjalistów i inżynierówwiedzy. Istnieje wiele metod podejmowania wiedzyod eksperta aczkolwiek sporą popularność zyskałametoda delficka. Metoda ma charakter anonimowychankiet zawierających pytania specjalistyczne z dziedziny,które to ankiety wypełnia pewien zespół ekspertów.Wyniki ankiet są następnie przez tzw. super ekspertaweryfikowane, i wiedza, co do której eksperci są zgodnijest uznawana za obowiązującą i odpowiednio kodowa-184/2011


Dlaczego maszyna potrafi zachować się jak istota inteligentna ?śmy zrobić by zdobyć tego samego zakresu wiedzę alebez dostępu do wiedzy eksperckiej via wirtualny ekspert(program komputerowy). Musielibyśmy odnaleźćadresy wszystkich tych placówek, udać się tam w godzinachich urzędowania, cierpliwie odczekać w kolejceklientów i potem zapamiętać wszystkie informacjenam przekazane. Myślę, że większość zgodzi się z faktem,że opcja pierwsza wydaje się być zdecydowaniabardziej atrakcyjna. Jak widać z krótkiego wprowadzenianajważniejsze to poprawnie posiąść wiedzę ekspertai poprawnie zaimplementować w programie komputerowymproces rozumowania, którym kieruje się człowiek– ekspert gdy podejmuje decyzje w wybranym obszarze.Wirtualni doradcy (programy komputerowe zastępująceeksperta z danej dziedziny, wyposażone w pokaźnąwiedzę z danej dziedziny porównywalną z wiedząeksperta-człowieka) potrafiące analizować wiedzęzapisaną w systemie z wiedzą generowaną w trakciepracy systemu i realizujące tzw. proces wnioskowaniacieszą się ogromną popularnością w ostatnim czasienie tylko w specjalistycznych systemach ale i prostychsystemach np. do wyboru oferty biura podróży,albo wyboru samochodu, których chcemy kupić, albonp. wyboru innego sprzętu np. komputer, aparat fotograficzny,drukarka itp. W prostych systemach wiedza,którą należy zakodować w dziedzinowej bazie wiedzynie jest bardzo skomplikowana. Zazwyczaj ograniczasię do zbioru kilkunastu czy kilkudziesięciu reguł. Sercemkażdego systemu tego typu jest tzw. moduł wnioskowania,w którym realizowane są procesy wnioskowania.Wydaje się w tym momencie niezbędnym omówienienajważniejszych zagadnień związanych z procesemrozumowania eksperta dziedzinowego i jegokomputerową realizacją. Zgromadzona wiedza dziedzinowaoraz informacje opisujące aktualnie rozwiązywanyproblem mają charakter statyczny – reprezentująswoisty „potencjał intelektualny” systemu. Aby systemekspertowy mógł rzeczywiście działać równie kompetentniejak ekspert, musi on symulować ludzkie myślenie– za to odpowiedzialne jest właśnie wnioskowanie.Pojęcie wnioskowania bywa definiowane w najróżniejszysposób w zależności od kontekstu rozważań i konkretnegoautora. Definicja proponowana przez znanegopolskiego logika Ajdukiewicza jest następująca:„Wnioskowanie – jest procesem myślowym, w którymna podstawie mniej lub bardziej stanowczego uznaniaprzesłanek dochodzimy do uznania wniosku, któregodotychczas nie uznawaliśmy wcale bądź uznawaliśmymniej stanowczo; przy czym stopień stanowczościuznania wniosku nie przewyższa stopnia uznaniaprzesłanek”. Opierając się na tej definicji, proponujemyaby proces wnioskowania w kontekście regułowychsystemów ekspertowych rozumieć następująco:wnioskowanie jest zautomatyzowanym procesem nanaprzez inżyniera wiedzy zaś wiedza co do której ekspercinie są zgodni podlega dalszej analizie i dyskusjitak długo dopóki eksperci nie dojdą do porozumienia.Najczęściej metoda przebiega w czterech iteracjach.Jak wspomniano wcześniej w tekście, prócz kompletneji prawdziwej wiedzy eksperckiej zakodowanej w baziewiedzy, w programie komputerowym, który ma bądźzastąpić bądź wspomóc w podejmowaniu decyzji niezbędnejest odpowiednie zaimplementowanie procesuwnioskowania. Tylko wówczas będziemy mogli byćspokojni o jakość decyzji podejmowanych przez systemi ich zgodność z wiedzą reprezentowaną przez eksperta– człowieka. Celem niniejszej pracy będzie wskazanienajważniejszych kroków zapewniających właściwedziałanie komputerowych systemów wspomaganiadecyzji. Zauważmy, że nawet ekspert dziedzinowy jakkażda istota ludzka nie jest nieomylny, nie jest w stanie„działać” poprawnie non stop. Natomiast komputer niewykazuje tego typu problemów. Komputery w odróżnieniuod człowieka się nie męczą, i nie mają tzw. spadkównastroju. Działają tak samo po pierwszej jak i po21 godzinie ciągłej pracy. Dlatego też każda możliwośćzautomatyzowania pracy w dowolnej dziedzinie komputeremwydaje się być bardzo cenna i warta zastosowania.Jeśli system spełnia wszelkie cechy eksperta,a więc odpowiada na pytania tak jak ekspert-człowiek,tłumaczy proces swojego rozumowania, zadaje pytaniai podaje uzasadnienie ich zadawania, to dla zwykłegoużytkownika nie będzie miało wielkiego znaczenia czyodpowiada na pytania maszynie czy człowiekowi. A gdyjeszcze dodamy do tego fakt, że dostęp do takiego systemumoże być często dużo szybszy niż do ekspertaczłowiekazrozumiemy w czym tkwi taka ich popularnośćw ostatnich kilkunastu latach. Zwróćmy też uwagęna fakt, że Internet poprzez nieograniczony dostęp doswoich zasobów daje systemom wspomagania decyzjidodatkowe możliwości dystrybucji, gdyż każdy tego typusystem dostępny online cieszył się będzie z pewnościądużą popularnością. Wyobraźmy sobie teraz siebiejako przyszłego kredytobiorcę, który zamierza skorzystaćz pożyczki kredytowej w banku. Wyobraźmy sobiedodatkowo, że siadamy wygodnie wieczorem przednaszym komputerem, wchodzimy na odpowiednią stronęinternetową i rozpoczynamy darmową konsultacjęz wybranym systemem np. doradcą kredytowym. Opowiadamyna pytania nam zadawane przez system całyczas otrzymując informację ze strony systemu dlaczegozadawane nam są konkretne pytania, i na koniec gdysystem nam przedstawi swoją decyzję mamy jeszczemożliwość wglądu w drogę rozumowania prowadzonegoprzez system. Pamiętajmy, że jest zupełnie naturalnym,że tego typu systemem może dysponować wieleinstytucji udzielających kredytów, w związku z czymmożemy spędzić jeden wieczór i przejrzeć oferty kilkuplacówek. A teraz wyobraźmy sobie co musieliby-www.sdjournal.org 19


SZTUCZNA INTELIGENCJAśladującym myślenie, w którym na podstawie posiadanychinformacji uznanych za prawdziwe (lub prawdziwew pewnym stopniu) oraz posiadanej wiedzy dziedzinowej,uzyskujemy nowe, nieznane wcześniej informacje,które uznajemy za prawdziwe (lub prawdziwew pewnym stopniu).Wnioskowanie a logika matematycznaWnioskowanie w systemach regułowych opiera się namechanizmach logiki matematycznej. Logika pozwalauznawać pewne sposoby wnioskowania za poprawne,tworząc z nich systemy logiczne będące zbiorempraw i reguł, dających podstawy dla rozumowań, któreuznajemy za prawdziwe. Reguły wnioskowania traktujemyjako zasady przekształcania stwierdzeń uznanychza aksjomaty, w nowe stwierdzenia uznawaneza prawdziwe (nazywane wnioskami lub konkluzjami).Jedną z podstawowych reguł wnioskowania jest tzw.reguła odrywania, bazująca na prawie logicznym (którew łacinie ma nazwę: modus ponendo ponens) w literaturzeobowiązującym pod skrótową nazwą: modusponens. Reguła mówi, że jeśli dana jest implikacjai prawdziwy jest jej poprzednik, to możemy uznać,że prawdziwy jest również jej następnik. Zakładając,że symbole p i q są zmiennymi zdaniowymi, a symbol„g” oznacza implikację, regułę odrywania zapisujemynastępująco:[(p g q) p ] g q.Zauważmy, że reguła odrywania towarzyszy nam codziennie,i stosujemy ją intuicyjnie. Stwierdzenie „jeżeliklient ma wysokie dochody i niskie koszty utrzymaniato decyzja kredytowa jest pozytywna” jest niczyminnym jak implikacją, w której zmienna p odpowiadazdaniu ”klient ma wysokie dochody i niskie koszty” a zmienna q zdaniu „decyzja kredytowa jest pozytywna”.Prawdziwość stwierdzenia p łatwo sprawdzić– zwykle wystarczy zweryfikować prawdziwość dokumentówpoświadczających wysokość uzyskiwanychdochodów potencjalnego kredytobiorcy oraz tę samączynność wykonać dla dokumentów świadczącycho kosztach ponoszonych przez tego samego kredytobiorcę.Wiemy zatem, że p implikuje q, i że p jest prawdziwe.Reguła odrywania pozwoli nam ,,oderwać'' zdanieq, i uznać je za prawdzie – zatem uznajemy, że ”decyzjakredytowa jest pozytywna” jest prawdą. Czyż niespotykamy się z regułą odrywania codziennie?Drugą podstawową regułą wnioskowania jest regułamodus tollens (pochodząca od prawa logicznegomodus tollendo tollens). Reguła mówi, że jeśli danajest implikacja i prawdziwy jest fakt przeczący jej następnikowi,to możemy stwierdzić, że prawdziwa jestnegacja także i poprzednika. Zakładając, że symbolep i q są zmiennymi zdaniowymi, a symbol g oznaczaimplikację, regułę modus tollens zapisujemy następująco:[(p g q)¬q ] g ¬p.W porównaniu z regułą odrywania, reguła modus tollenswydaje się nieco mniej intuicyjna. Należy ją rozumiećtak: jeżeli wiemy, że zawsze prawdziwość p pociągaza sobą prawdziwość q, oraz wiemy, że prawdziwejest zaprzeczenie q, to możemy uznać, że prawdziwejest zdanie negujące p. Załóżmy istnienie reguły:„jeżeli klient ma wysokie dochody i niskie koszty utrzymaniato decyzja kredytowa jest pozytywna”. Jeśli wiemy,że faktem jest jednocześnie, że przysłowiowy Kowalskiotrzymał odmowną decyzję kredytową i zdanie„jeżeli klient ma wysokie dochody i niskie kosztyutrzymania” oznaczymy zmienną zdaniową „p” zaśzdanie „decyzja kredytowa jest pozytywna” odpowiedniozmienną „q” wówczas zdanie „decyzja kredytowajest negatywna” możemy oznaczyć jako „¬ q”. W efekciereguła modus tollens wyprowadza nam nowy fakt¬ p odpowiadający zdaniu „nieprawdą jest, że klientma wysokie dochody i niskie koszty utrzymania”. Podsumujmyutylitarny aspekt poznanych reguł – regułaodrywania prowadzi nas od przesłanek (poprzednikaimplikacji) do wniosków (następnika implikacji) o ilete przesłanki są prawdziwe. Kierujemy się zatem zgodniez kierunkiem implikacji g, możemy powiedzieć, żekierujemy się w przód. Reguła modus tollens prowadzinas od wniosków (następnika implikacji) do przesłanek(poprzednika implikacji), pozwalając stwierdzić, że jeżelinie wystąpił wniosek, to nie wystąpiła warunkującago przesłanka. Kierujemy się przeciwnie do kierunkustrzałki symbolizującej implikację, możemy powiedzieć,że kierujemy się wstecz. Przyjrzyjmy się terazdwóm algorytmom wnioskowania jakimi są wnioskowaniew przód oraz wnioskowanie wstecz. Koncepcjaoraz organizacja obu tych typów wnioskowania bazujena, omówionych wcześniej logicznych regułach wnioskowania.Wnioskowanie w przódPunktem wyjścia są znane fakty, dlatego o wnioskowaniuw przód mówi się często, że jest “sterowane danymi”(ang. data driven). Na podstawie dostępnych w baziewiedzy faktów i reguł generowane są nowe fakty, do momentu,kiedy wśród wygenerowanych faktów znajdziesię postawiony cel (hipoteza) lub gdy nie ma w baziewiedzy więcej reguł do uaktywnienia. Mechanizm wnioskowaniatą metodą przedstawiają następujące kroki:1. sprawdzenie, czy przesłanki którejś z reguł są faktamiw bazie wiedzy. Jeżeli tak to taka reguła jestuaktywniana na podstawie odpowiednio wybranejstrategii sterowania wnioskowaniem,204/2011


Dlaczego maszyna potrafi zachować się jak istota inteligentna ?Reklama2. konkluzja tak wybranej reguły jest wprowadzana jakonowy fakt do bazy wiedzy. Zostaje także odnotowanainformacja o tym, że dana reguła została jużwykorzystana, aby zapobiec niekończącej się pętliwybieranych reguł,3. jeżeli nie został osiągnięty cel wnioskowania i niewszystkie reguły były wykorzystane to powrót dopunktu 1.Dla lepszego zrozumienia zasady działania wnioskowaniaw przód posłużymy się przykładową bazą wiedzy,gdzie na podstawie dostępnej wiedzy należy wygenerowaćwszystkie fakty, jakie mogą być wyprowadzonez danej bazy wiedzy.Wykorzystując reguły :Reguła1 : IF a b THEN cReguła2 : IF d e THEN aReguła3 : IF c f THEN goraz fakty: b, d, e, fkolejne kroki wnioskowania będą wyglądały następująco:1. Jeżeli przesłanki którejś z reguł są faktami w BW,to taka reguła jest uaktywniana. Po dopasowaniuprzesłanek reguł do faktów, okazuje się że regułędrugą można uaktywnić i dopisać na tej podstawiekonkluzję reguły drugiej a więc fakt a to BW.Wskazane jest także zapisanie informacji o wykorzystaniutej reguły. Zatem w bazie wiedzy mamyfakty: b, d, e, f, a.2. Ponownie należy dopasować przesłanki reguł dofaktów w bazie wiedzy. Okazuje się, że regułępierwszą można uaktywnić. Zatem do bazy wiedzyzostaje dopisany fakt c oraz odnotowane zostaćpowinno wykorzystanie reguły pierwszej.Zbiór faktów ma teraz postać: b, d, e, f, a, c.3. Po dopasowaniu przesłanek kolejnych reguł dofaktów można uaktywnić regułę trzecią. Dziękitemu do bazy wiedzy zostaje dopisany fakt g, cokończy proces wnioskowania, ponieważ zostałyjuż wykorzystane wszystkie możliwe reguły orazwygenerowane wszystkie nowe fakty.Wnioskowanie wsteczWnioskowanie wstecz jest “sterowane celem” (ang. goaldriven). Rozpoczyna się od hipotezy i szuka argumentów(dowodów), które pozwolą potwierdzić lub obalićhipotezę, korzystając z reguł zawartych w bazie wiedzy.Wnioskowanie wstecz polega zatem na wykazaniuprawdziwości hipotezy głównej na podstawie prawdziwościprzesłanek. Jeśli nie wiemy, czy jakaś przesłankajest prawdziwa, to traktujemy ją jako nową hipotezęi próbujemy ją wykazać. Jeżeli w wyniku takiego po-


SZTUCZNA INTELIGENCJAstępowania zostanie wreszcie znaleziona reguła, którejwszystkie przesłanki są prawdziwe, to konkluzja tej regułyjest prawdziwa. Na podstawie tej konkluzji dowodzisię następną regułę, której przesłanka nie była poprzednioznana itd. Postawiona hipoteza jest prawdziwa, jeśliwszystkie rozważane przesłanki dadzą się wykazać.Algorytm wnioskowania wstecz można przedstawićw punktach jako:1. sprawdzenie, czy podana hipoteza jest faktemw bazie wiedzy. Jeśli nie, to należy wykazać jejprawdziwość w następnych krokach wnioskowania,2. sprawdzenie, czy hipoteza główna jest konkluzjąjakiejś reguły. Jeśli tak to należy sprawdzić, czyprzesłanki tej reguły są faktami w bazie wiedzy.Jeśli tak, to konkluzja reguły czyli badana przeznas hipoteza jest uznana za prawdziwą. Jeśli natomiastktóraś z przesłanek nie jest faktem w baziewiedzy to jest ona postulowana i udowodnionazgodnie z algorytmem,3. algorytm jest powtarzany do momentu kiedy zostaniewykazana (potwierdzona lub obalona) hipotezagłówna. To kończy cały algorytm.W lepszym zrozumieniu zasady działania wnioskowaniawstecz powinien pomóc przykład takiego wnioskowaniabazujący na tej samej bazie wiedzy co poprzednio.Proces udowodnienia hipotezy g będzie wyglądałnastępująco:• Sprawdzenie, czy hipoteza główna g jest faktemw bazie wiedzy. Skoro jednak g nie jest faktem tobędzie udowodnione w następnym kroku wnioskowania.• Stwierdzamy, że g jest konkluzją reguły trzeciej.Teraz sprawdzamy czy przesłanki tej reguły sąprawdziwe, tzn. czy są faktami w bazie wiedzy.Okazuje się, że pierwsza przesłanka reguły trzeciejnie jest faktem. W związku z tym jest ona postulowanai udowodniona w następnym kroku.• Sprawdzamy czy ta przesłanka reguły trzeciejczyli c jest konkluzją jakiejś reguły. Okazuję się,że c to wniosek reguły pierwszej. Tak wiec terazta reguła będzie wykazywana. Pierwsza przesłankareguły pierwszej nie jest faktem w bazie wiedzy,więc sprawdzamy, czy jest ona może konkluzjąjakiejś reguły. Stwierdzamy, że a jest konkluzjąreguły drugiej, która teraz będzie postulowana.• Udowodnienie prawdziwości reguły drugiej będziepolegało na sprawdzeniu, czy jej przesłanki sąfaktami w bazie wiedzy. Okazuję się, że d i e sąfaktami w bazie wiedzy, zatem konkluzja tej reguły,a więc fakt a jest prawdziwy.• Kontynuując krok 3 sprawdzamy, czy druga przesłankareguły pierwszej jest prawdziwa, tzn., czyjest faktem w bazie wiedzy. Okazuje się, że b jestfaktem w bazie zatem konkluzja tej reguły czylic jest prawdziwa.• Kontynuując krok 2 wnioskowania sprawdzamy,czy druga przesłanka reguły trzeciej jest prawdziwa.Skoro jest ona faktem w bazie wiedzyi wszystkie przesłanki tej reguły zostały już wykazane,to konkluzja reguły trzeciej a więc naszahipoteza główna g została wykazana, co kończyproces wnioskowania.W większości przypadków o doborze metody wnioskowaniabędzie decydowała specyfika problemu. Jeżeliproblem już od początku dostarcza pewnych hipotezodnośnie możliwych rozwiązań, użyjmy wnioskowaniawstecz, szczególnie wtedy, gdy mamy mało danych,lecz potrafimy je uzupełnić. Jeżeli danych jest sporo,możemy spróbować wnioskowania w przód z celem.Jeżeli nie potrafimy na początku wskazać żadnych hipotez,zastosujmy wnioskowanie w przód bez określaniacelu.Algorytmy doboru regułIstotną cechą systemów ekspertowych jest ich efektywnośćrozumiana jako zdolność systemu do udowodnieniaprawdziwości postawionej hipotezy, bądź gdy hipotezanie została ustalona – zdolność do wyprowadzenianowych faktów z faktów i reguł zapisanych w dziedzinowejbazie wiedzy. Ważne jest to by proces wnioskowaniaodbył się przy możliwie najmniejszym udzialeużytkownika i w jak najkrótszym czasie. Efektywnośćta w dużym stopniu zależy od kolejności wyboru reguł.Aby zastosować określoną regułę ze zbioru reguł możliwychdo uaktywnienia, korzysta się z metod (strategii)sterowania wnioskowaniem, które ograniczają licz-Listing 1.AttrDefBeginKredyt-Nie-TakSytuacja zawodowa-Bezrobotny-Pracujący….AttrDefEndRuleDefBeginKredyt=Nie if Sytuacja zawodowa=Bezrobotny…Kredyt=Tak if Przeznaczenie kredytu=Samochod;Stan….RuleDefEndkonta=do1000;Liczba rat=24224/2011


Dlaczego maszyna potrafi zachować się jak istota inteligentna ?Listing 2.runInference(atrybut, wartość){// najpierw przeszukiwana jest lista faktówfor (int f=0 ; f < facts.size(); f++){facts.get(f);boolean fact = MatchToGoal(f);if (fact == true) f = facts.size()-1;}if (fact == false) // celu nie ma w faktach{ // przeszukiwane są konkluzje regułfor ( int r=0 ; r < rules.size(); r++){boolean rules = SearchConclusionOfRules(r);if (rules == true){boolean fire_result = FireingRule(r);}}if ((fact == false) && (rules==false)){boolean ask = AskForAttrValue(atrybut, wartość);}if ((fact==true)||(fire_result==true)||(ask==true)){return true;}else{return false;}}boolean MatchToGoal(int f){if ((fakt.attr == a)&&(fakt.valNo == w)){return true;}}boolean FiringRule(int r){boolean maska = 1;//jeśli chodź jedna przesłanka nie będzie prawdziwato zmienna maska będzie równa 0 i funkcja FiringRulezwróci wartość falsefor (int w = 0 ; w


SZTUCZNA INTELIGENCJAzwala na uogólnianie reguł w bazach wiedzy poprzezzastępowanie konkretnych wartości atrybutów bądźto w konkluzjach reguł bądź w przesłankach reguł– zmiennymi. Jeśli w przesłance czy konkluzji reguływystępuje zmienna (np. „X”) to w procesie wnioskowanianastąpi próba podstawienia pod wartość atrybutuwszystkich możliwych wartości. Wyobraźmy sobieklienta banku, który chce założyć sobie konto przyczym nie wie jeszcze jaka opcja będzie dla niego optymalna.Wówczas system ekspertowy mający wspomócgo w podjęciu takiej decyzji uruchomi się z hipoteząnp. „opcja konta= X” i w procesie wnioskowaniazostaną podjęte próby sprawdzeniaprawdziwości zarówno hipotezy „opcjakonta= A”, „opcja konta= B” jak i „opcjakonta= C” zakładając ze tylko takie trzyopcje: „A”, „B” i „C” są możliwe.Podsumowując, możemy stwierdzić, że:i sześćdziesięciu reguł o różnej liczbie warunków. Schematpliku z bazą wiedzy (z regułami i faktami) wyglądanastępująco (Listing 1).Jak widać baza składa się z bloku deklaracji atrybutówi ich wartości (blok AttrDefBegin) i z bloku deklaracji reguł(blok RuleDefBegin). Nie ma ograniczeń zarówno codo liczby reguł jak i warunków w regułach, a także liczbyatrybutów i ich wartości. Warte podkreślenia jest i to,że jest to typ tzw. szkieletowego systemu ekspertowego,co oznacza, że zaimplementowany moduł wnioskowaniabędzie współpracował z każdą tak zakodowaną baząwiedzy. A więc można dla każdej dowolnej dziedziny:• Reguła jest spełniona, jeżeli jej przesłankajest prawdziwa.• Przesłanka reguły jest prawdziwa jeżeliwszystkie jej literały są faktami.• Reguła spełniona może być uaktywniona– jej konkluzja jest dopisywanado bazy faktów.• Reguł spełnionych może być wiele,wyborem reguły do uaktywnieniasteruje strategia doboru reguł, najprostszawybiera pierwszą w kolejności.• Reguła uaktywniona bywa zwyklewyłączana z aktualnie realizowanegoprocesu wnioskowania, tak abyjej konkluzja nie dopisywała się wielokrotniedo bazy faktów.A jak to jest w praktyce ?Załóżmy, że do reprezentacji wiedzy z zakresuanalizy wniosków kredytowych wykorzystanezostaną następujące atrybuty:„Kredyt” z wartościami „Tak” lub „Nie”,„Sytuacja zawodowa” z wartościami:„Bezrobotny” bądź „Pracujący”, „Staż pracy”z wartościami: „Brak”, „1do5”, „6do10”czy „powyzej10”, „Przeznaczenie kredytu”z wartościami „Komputer” Lub „Samochod”,„Stan konta” z wartościami „do200”,„do100”, „do500”, „do1000” czy wreszcie„do2000”. Mamy jeszcze atrybuty: „Liczbarat” z wartościami: 12 lub 24, Atrybutwiek z wartościami „poniżej20”, „21do30”,„31do40” i „powyżej40” i atrybut „Wielkośćraty” z wartościami: „20”, „30”, „40” i „50”.Baza zawiera deklarację ośmiu atrybutówRysunek 2. Okno wyboru trybu pracy i strategii doboru regułRysunek 3. Okno wyboru celu wnioskowania244/2011


Dlaczego maszyna potrafi zachować się jak istota inteligentna ?biuro podróży czy sklep z prezentami do wyboru stworzyćbazę wiedzy w takim formacie i uruchomić proceswnioskowania dla dowolnej hipotezy. Zaimplementowanyzostał wieloplatformowy moduł wnioskowania wsteczw środowisku Java (co pozwoli uruchomić system wszędzie,niezależnie od platformy sprzętowej i programowej),który dla zadanej hipotezy (uwzględniająctakże realizację nawrotów i różne strategiedoboru reguł) przeprowadza proces wnioskowaniazarówno z pracą ciągłą jak i krokową.Najważniejszymi funkcjami zaimplementowanymiw systemie zgodnymi z założeniami systemówekspertowych są:8. showInferenceResults() – funkcja ma na celuprzedstawić dokładną drogę wnioskowania prowadzonąprzez maszynę wnioskującą.Po wybraniu celu wnioskowania uruchamiany jest procesdowodzenia jego poprawności metodą wnioskowa-1. runInference(atrybut, wartość) – funkcjaprzeprowadza proces dowodzeniapoprawności celu wnioskowania hipotezypodanej jako parametry funkcji.2. facts.get(f) – metoda klasy kontenerowejLinkedList(), którą jest m.in. listafaktów. Metoda get() pobiera kolejnyelement listy.3. MatchToGoal(f) – funkcja próbująca dopasowaćanalizowany fakt do celu wnioskowania.Zwraca wartość true w sytuacjigdy porównywane wartości są identyczne.W przeciwnym przypadku zwracawartość false.4. SearchConclusionOfRules(r) – funkcjasprawdza czy konkluzja analizowanej regułydaje się zunifikować z celem wnioskowania.Zwraca wartość true w przypadkusukcesu, false w przypadku porażki.5. FiringRule(r) – funkcja odpala daną regułę,czyli dla każdego z jej warunkówuruchamiany jest proces wnioskowania.Funkcja zwraca wartość true gdy dowodzeniepoprawności dla każdej przesłankizakończyło się sukcesem. Wartośćfalse zwracana jest jako rezultatfunkcji wówczas, gdy co najmniej jednaprzesłanka nie będzie prawdziwa.6. AskForAttrValue(atrybut, wartość)– funkcja pyta użytkownika o wartośćanalizowanego atrybutu, będącego warunkiemuaktywnionej reguły. Odpowiedźużytkownika dodawana jest jakonowy fakt do listy faktów.7. showWhyExplanations() – funkcja objaśniaużytkownikowi powód zapytania goo wartość danego atrybutu i jak podanaprzez niego odpowiedź wpłynie na drogęrozumowania prowadzonego przez maszynęwnioskującą.Rysunek 4. Okno odpowiedzi na pytanie 1 o prawdziwość przesłankiRysunek 5. Okno wyjaśnienia systemu o pytanie do użytkownikaRysunek 6. Okno decyzji systemuwww.sdjournal.org 25


SZTUCZNA INTELIGENCJAnia wstecz. Realizuje to funkcja RunInference(atrybut,wartość);, której fragment przedstawiony został w formiepseudokodu (Listing 2).Rysunek 8. Okno objaśnienia drogi wnioskowaniaFunkcja RunInference() zwraca wartość całkowitą,czyli gdy rezultat = 1 to znaczy ze wszystkie przesłankibyły prawdziwe a jeżeli 0 tzn., że co najmniej jednaprzesłanka nie została potwierdzona.Przykładowyscenariusz programu- Wirtualny doradcakredytowyZałóżmy, że jesteśmy klientempracującym, osiągającymdochody o wartoścido1000, chcącym kupić samochódi zainteresowanymwzięciem kredytu na 2 lata.Główne okno programu wyglądanastępująco (patrz Rysunek1).Po wybraniu trybu pracysystemu i strategii doboru reguł(Rysunek 2) oraz ustaleniucelu wnioskowania (kredyt=Tak)(Rysunek 3) rozpoczynasię proces wnioskowaniaprawdziwości tej hipotezyna podstawie reguł zawartychw bazie wiedzy i faktówgenerowanych na bieżącow trakcie pracy systemu.Jeśli założymy że ustalonymcelem wnioskowaniastała się hipoteza „kredyt =tak” to system zgodnie z założeniamimetody wnioskowaniawstecz szukał będzie(w przypadku nie potwierdzeniatego celu w faktachw bazie wiedzy) reguł, którychkonkluzja potwierdzi takicel. Okazuje się, że pierwsząregułą na liście o konkluzji„kredyt=tak” będzie reguła:Kredyt=Tak if Przeznaczeniekredytu=Samochod;Stankonta=do1000;Liczba rat=24Rysunek 7. Okno wyników wnioskowaniaJak widać reguła ma trzywarunki zatem system rekurencyjnewywoła algorytmwnioskowania wsteczdla każdego warunku po-264/2011


Dlaczego maszyna potrafi zachować się jak istota inteligentna ?Reklamawyższej reguły. Najpierw więc będzie szukał potwierdzeniadla przesłanki „Przeznaczenie kredytu=samochód”następnie dla przesłanki „Stan kont= do1000”i ostatecznie przesłanki „Liczba rat=24”. Okno z pytaniemo pierwszą przesłankę przedstawia rysunek 4.Pamiętajmy, że na każdym etapie działania systemumożemy zapytać system dlaczego potrzebne jestpotwierdzenie danej przesłanki (przykładem jest rysunek5).Zakładając, że użytkownik w trakcie dialogu potwierdziprawdziwość tych przesłanek proces wnioskowaniazakończy się sukcesem rysunek 5).Następnie użytkownik ma prawo wglądu w wynikiwnioskowania: statystyki dotyczące ustawień procesuwnioskowania, liczby reguł, które zostały użyte wewnioskowaniu, liczby nowych faktów itp. (rysunek 7).Jedną z istotnych zalet systemów ekspertowych jestobjaśnienie drogi wnioskowania, dzięki czemu użytkownikma możliwość weryfikacji jakie reguły były kolejnoanalizowane i uaktywniane i jakie nowe fakty byływ ten sposób generowane (rysunek 8).Oczywiście fakty tak wygenerowane zostają zapisanew bazie wiedzy i przy kolejnym uruchomieniu systemuprzez tego samego użytkownika będzie on musiałzdecydować o tym, czy uruchomić proces wnioskowaniaz faktami z poprzedniego wnioskowania,czy uprzednio chce usunąć zapisane tam fakty. Jaksię można spodziewać, jeśli użytkownik nie usuniefaktów potwierdzających hipotezę „kredyt=tak” to przykolejnym uruchomieniu systemu z takim samym celemwnioskowania proces zakończy się sukcesem bez zadawaniajakichkolwiek pytań użytkownikowi (hipotezazostanie od razu potwierdzona, gdyż cała niezbędnawiedza jest już zgromadzona w bazie wiedzy).Warto na końcu podkreślić fakt prostoty budowy tegotypu systemów. Jeśli więc mogą one pozwolić zwiększyćefektywność pracy w dowolnej dziedzinie, i efektywniewspomagać człowieka powinniśmy je tworzyći wykorzystywać.W razie jakichkolwiek pytań i wątpliwości proszęo kontakt: agnieszka.nowak@us.edu.plDR AGNIESZKA NOWAK – BRZEZIŃSKAdr Agnieszka Nowak - Brzezińska adiunkt w Instytucie Informatyki,Zakład Systemów Informatycznych UniwersytetuŚląskiego w Katowicach. Zajmuje się eksploracją wiedzy,elementami sztucznej inteligencji a także systemami wyszukiwaniainformacji. Brała udział w projekcie badawczym nrN206153133 pt: ‘’Złożone bazy wiedzy: struktura i procesywnioskowania’’, nansowanym przez MNiSW.


SZTUCZNA INTELIGENCJAAnaliza możliwościwykorzystania sztucznych siecineuronowych w psychologiiWprowadzenie do sieci neuronowych, rozpoznawanie płciw środowisku pakietu sztucznej inteligencji SphinxSztuczne sieci neuronowe jako jedna z kilku technik zaliczanych dokategorii „<strong>sztuczna</strong> <strong>inteligencja</strong>” mogą być z dużym powodzeniemwykorzystywane również w takich obszarach nauki jak psychologia.Sposób działania (uczenie się) sztucznych sieci neuronowychnaśladujący nieco sposób uczenia się człowieka sprawia, że zadaniaz gatunku podziału zbiorów na kategorie (klasy) nie stanowią dla tegonarzędzia żadnych problemów, a efekty nauki są doskonałe.Dowiesz się:• Wybranych zagadnień z zakresu podstaw sztucznych sieci neuronowych;• Jak wygląda nauka sieci neuronowych;• Podstawy obsługi pakietu sztucznej inteligencji Sphinx.Powinieneś wiedzieć:• Podstawowe informacje z zakresu sztucznej inteligencji.Historia sztucznych sieci neuronowych będącychdziedziną nauk technicznych sięga roku1943, w którym została wydana pionierskapraca autorstwa W.S. McCullocha i W. Pitts’a “A logicalcalculus of the ideas immanent in nervous activity”.W pracy przedstawiono pierwszy matematycznyopis komórki nerwowej z zasugerowaniem potencjalnychkorzyści wynikających z wykorzystania tegomodelu do przetwarzania danych. Źródłem inspiracjido prac nad stworzeniem modeli neuronów stanowiłydla badaczy prace i odkrycia z dziedziny neurofizjologiii bioniki [2].Najogólniej <strong>sztuczna</strong> sieć neuronowa to: układ składającysię z wielu komórek liczących połączonych zesobą wzajemnie. Ma trzy unikatowe cechy: jest adaptacyjna(dostosowuje się do zewnętrznych sygnałów),ma możliwość zmiany połączeń komórek (konfiguracji),jest krzepka (odporna na uszkodzenia- nawet gdy część komórek źle liczylub jest uszkodzona).Do głównych zalet istniejącychsztucznych sieci neuronowych zbliżonychdo cech mózgu ludzkiegozaliczyć można [2]:• Zdolność nauki sieci (adaptacyjność) na podstawieprzedstawionych przykładów. Analogia do człowiekauczącego się na podstawie doświadczeń i powtarzaniainformacji (np. liter alfabetu) w przeciwieństwiedo sztywno zadanego algorytmu działaniaprogramu komputerowego.• Zdolność uogólniania (samoorganizacji) przezsieć neuronową zjawisk (klasyfikacji) na podstawieprzedstawianych w trakcie nauki przykładów. Analogiado kojarzenia przez człowieka faktów np. podziałpewnych obiektów, zjawisk na zbliżone do siebiegrupy.• Zdolność do interpretacji zjawisk i zależności o którychinformacje są niekompletne lub zawierają błędy.Częstym zjawiskiem jest niedobór informacji lubjego niecałkowita wiarygodność. Człowiek potrafipoprawnie wysnuć wnioski w takich sytuacjach,Rysunek 1. Sieć neuronowa wielowarstwowa jednokierunkowa.284/2011


Analiza możliwości wykorzystania sztucznych sieci neuronowych w psychologiisieć neuronowa w ograniczonym zakresie równieżzdolność tą posiada.• Równoległość przetwarzania informacji, gwarantującabardzo szybkie działanie sieci neuronowej.Wykorzystanie sieci neuronowych w psychologii jestciekawą i oryginalną formą ich wykorzystania. Wyobraźmysobie, że mamy zestaw kilkuset odpowiedzina ankiety z pytaniami o cechy osobowości człowiekaa sieć neuronowa jest w stanie wskazać np. płeć osobyankietowanej, jej potencjał na dane stanowisko w firmie(pomoc dla działu doboru personelu) lub inną cechęjako efekt analizy. Oczywiście jest to możliwe tylkopod warunkiem, że mamy oprócz samych odpowiedzina ankietę również podaną przez ankietowanego badanąprzez nas cechę. Potencjał zdolności do klasyfikacjisieci neuronowej wykorzystywany jest zarówno przywykorzystaniu sieci neuronów uczonych pod nadzorem(znane są odpowiedzi) jak również w przypadku siecineuronowych uczonych bez nadzoru „samoorganizującychsię” (odpowiedzi nie są znane – następuje na wyjściusieci neuronowej podział danych wejściowych nakategorie). W tym artykule omówione zostaną elementysieci uczonej „z nauczycielem”.Architektura sieci neuronowejPodstawowa architektura sieci neuronowej wykorzystywanejdo nauki „z nauczycielem” to sieć neuronowawielowarstwowa jednokierunkowa z algorytmem uczeniapropagacji wstecznej błędu. To najpopularniejszytyp sieć i najczęściej wykorzystywany algorytm uczący.Dodać należy, że istnieje wiele innych algorytmówuczących możliwych do wykorzystania w sieci neuronowejwielowarstwowej m.in. gradienty sprzężone, algorytmyQuasi-Newtona (np. BFGS), Levenberga-Marquardta,o często większym potencjale (szybkość uczenia,większa szansa na znalezienie ekstremum globalnegofunkcji celu) Rysunek 2. Przetwarzanie informacji w sieci neuronowej z algorytmem uczenia propagacja wsteczna błędu.www.sdjournal.org 29


SZTUCZNA INTELIGENCJASieci neuronowe jednokierunkowe posiadają zazwyczajjedną lub dwie warstwy ukryte (ang. hidden layers),jedną warstwę wejściową (ang. input layer) i jedną warstwęwyjściową (ang. output layer). Każdy neuron z danejwarstwy ma jedno wyjście (generuje jeden sygnał)i połączony jest z każdym z neuronów kolejnej warstwy.Liczba wyjść sieci neuronowej równa jest liczbie neuronóww warstwie wyjściowej.Rysunek 2 przedstawia szczegóły przepływu informacjiw trakcie nauki sieci neuronowej. Przyjęto, że siećneuronowa ma N wejść, M neuronów w warstwie ukrytejoraz P neuronów w warstwie wyjściowej (wyjść).Wagi w warstwie wyjściowej oznaczono jako v, natomiastwagi w warstwie ukrytej oznaczono jako w. Wyjściawarstwy wyjściowej generują sygnały y, natomiastwyjścia z warstwy ukrytej generują sygnały z.Wzór na modyfikację wag dla neuronów warstwy wyjściowejpo każdej epoce treningowej czyli po prezentacjiwszystkich K wzorców treningowych (wykorzystujesię sumaryczny błąd sieci) wygląda następująco [2]:Jest to metoda raczej rzadko wykorzystywana w praktyce,raczej ma sens dla bardzo ograniczonego ilościowozestawu danych uczących.Natomiast znacznie częściej wykorzystywany w praktycewzór na modyfikację wag dla neuronów warstwywyjściowej po każdym pojedynczym wzorcu treningowymwygląda następująco:Komplet zebranychdanych (zestawyinformacjiwejściowych orazwyjściowych)Dane testowe(typowo 10% zkompletu zebranychdanych)Nauka sieci neuronowejRozpatrujemy tutaj uczenie nadzorowane “z nauczycielem”.W tym typie nauki stosujemy zbiór uczący,składający się z zestawu danych podawanych na wejścieoraz danych podawanych na wyjście (oczekiwanych).Wskazujemy sieci w czasie nauki poprawną odpowiedź.Przykładowo, ucząc sieć tabliczki mnożeniadanymi wejściowymi będą pary liczb (...(2,3), (2,4),(2,5)...) a wyjściowymi liczby (...6,8,10...) W trakcie naukisieć dostraja swoje wagi w ten sposób, aby różnicawartości pomiędzy oczekiwaną na wyjściu a nauczonąosiągnęła pewną wartość minimalną.Aby nauka miała sens i było możliwe zweryfikowaniejakości nauki należy zawsze całkowity zestaw danychpodzielić na dwa podzbiory – dane treningowe (siećneuronowa na nich będzie się uczyła rozwiązania danegozadania) oraz testowych (na nich nastąpi weryfikacjaefektów nauki sieci neuronowej-tych danych w trakcienauki sieć neuronowa nie zna) (rys.3).Rozpoznawanie płci w środowisku pakietusztucznej inteligencji SphinxPrzed rozpoczęciem zadania należy oczywiście zgromadzićodpowiednią liczbę wypełnionych ankiet i wprowadzićdane do arkusza kalkulacyjnego podając w jednymwierszu dane wejściowe (odpowiedzi na ankiety zapisanew postaci liczby (np. odpowiedz a na dane pytanieto 1, odpowiedz b to 2 itd., ostatnim elementem wierszajest kod płci (np. 1 to mężczyzna odpowiadał na ankietę,0-kobieta) Pytań powinno być co najmniej 20, natomiastankiet im więcej tym lepiej ale przyjąć należy, żeco najmniej kilkaset aby jakość rozpoznawania była zadawalająca.Około 10% danych z wierszy należy przeznaczyćdo testowania nauczonej sieci neuronowej.Przykładowe pytania (z testu który opracowałem i wykorzystałemdo rozpoznawania płci, w sumie ankietazawierała 26 pytań – oczywiście jedno z pytań byłoo płeć):...................Pyt. Czy jesteś osobą oszczędną: 1-zdecydowanie tak,2-raczej tak, 3-raczej nie, 4-zdecydowanie niePyt. Czy uważany jesteś za osobę energiczną: 1-zdecydowanietak, 2-raczej tak, 3-raczej nie, 4-zdecydowanieniePyt.. Czy można na tobie polegać: 1-zdecydowanie tak,2-raczej tak, 3-raczej nie, 4-zdecydowanie niePyt. Czy jesteś osobą punktualną: 1-zdecydowanie tak,2-raczej tak, 3-raczej nie, 4-zdecydowanie niePyt. Czy jesteś osobą wesołą i pogodną: 1-zdecydowanietak, 2-raczej tak, 3-raczej nie, 4-zdecydowanie niePyt. Czy pracując bądź też ucząc się wolisz to robić wewspółpracy z innymi: 1-zdecydowanie tak, 2-raczej tak,3-raczej nie, 4-zdecydowanie nieDane treningowe(typowo 90% zkompletuzebranych danych)Rysunek 3. Podział zebranych danych przed rozpoczęciem naukisieci neuronowejRysunek 4. Menu początkowe programu Neuronix.304/2011


Analiza możliwości wykorzystania sztucznych sieci neuronowych w psychologiiRysunek 5. Okno kreatora nowego projektu.Pyt. Czy jesteś osobą gadatliwą: 1-zdecydowanie tak,2-raczej tak, 3-raczej nie, 4-zdecydowanie nie............Zadanie rozpoznawania płci wykonane zostanie w programiesymulującym sieci neuronowe – Neuronix, któryjest modułem profesjonalnego pakietu sztucznej inteligencjiSphinx firmy AITECH [3], mogącym łączyćmoduł sieci neuronowych z modułem systemów ekspertowych.Program Zawiera ponadto język programowaniapozwalający stworzyć własny interfejs użytkownikado zadanego problemu. Pakiet sztucznej inteligencjirozwijany jest od 1990 roku przez firmę AitechArtificial Intelligence Laboratory. W skład pakietuwchodzą następujące elementy [3]:• system PC-Shell - szkieletowy system ekspertowy,• system Neuronix - symulator sieci neuronowej,• system CAKE - system komputerowego wspomaganiainżynierii wiedzy,• system HybRex - system do budowy inteligentnychaplikacji,• system Predyktor - system prognostyczny,• system deTreex - indukcyjny system pozyskiwaniawiedzy,• system demoViewer - system do prezentacji aplikacjipakietu AitechSPHINX.Pakiet wyposażony jest we własny język reprezentacjioraz translator do niego. Ma charakter narzędziowy, zatemnie jest zorientowany dziedzinowo. System PC-Shelljest systemem hybrydowym, zawierającym elementy architekturytablicowej (ang. blackboard systems). Obecniejest wykorzystywany w dydaktyce i pracach badawczychna polskich uczelniach oraz w firmach komercyjnych, międzyinnymi w zakładach energetycznych oraz bankach.W programie Neuronix możemy korzystać z sieci jednowarstwowychjednokierunkowych oraz sieci wielowarstwowychjednokierunkowych.Jako funkcję aktywacji przyjęto funkcjęsigmoidalną unipolarną.W programie mamy możliwośćokreślenia takich parametrów jak [1]:współczynnik uczenia, współczynnikmomentu, maksymalna wartość wag,rozmiar cyklu uczącego, mieszaniewzorców, dodatkowy neuron „Bias”oraz tolerancję. Wartość współczynnikauczenia zawiera się w przedziale. Im większa jego wartość, tymszybsze przeszukiwanie przestrzenirozwiązań. Jednak zbyt duża wartoścmoże doprowadzić do przeoczenianajlepszego rozwiązania. Współczynnikmomentum zawiera się w przedziale


SZTUCZNA INTELIGENCJAjest równe 1. Zastosowanie go powoduje zwiększeniestabilności w trakcie uczenia i jest klasycznym przykłademna poprawienie osiągów sieci. Tolerancja służy dookreślenia dopuszczalnego błędu na pojedynczym wyjściusieci. Wartość tolerancji zawiera się w przedzialeod 0 do 1, co jest następstwem faktu, że w symulatorzeNeuronix stosuje się logistyczną funkcję przejścia w postacifunkcji sigmoidalnej unipolarnej.System Neuronix pozwala na śledzenie wskaźnikówdających wgląd w bieżący stan sieci podczas procesuuczenia. Uczenie może odbywać się również w trybiepracy krokowej. Możliwe jest także automatyczne zapisywaniewag w trakcie uczenia. W programie stosowanesą dwa wskaźniki służące szacowaniu jakości wiedzyzdobytej przez sieć na etapie uczenia: błąd RMSoraz ilość wzorców poza tolerancją. Należy oczekiwać,że w trakcie uczenia wartość błędu RMS będzie malaław miarę kolejnych epok uczących, choć drobne wahaniasą dopuszczalne.Ilość wzorców poza tolerancją to parametr, który, mówio ilości wzorców nie mieszczących się w bieżącejwartości tolerancji dla wyjść sieci.Warunkami niezbędnymi do uruchomienia uczeniasą: przygotowanie pliku uczącego, oraz dodatkowo należywskazać plik wag, do którego zapisywane będą aktualnewagi sieci i ustawić wartości parametrów, jeżelimają być inne niż domyślne.Mając już dane podzielone na dane treningowe służącedo treningu sieci neuronowej (np. plik pl_tre.xls) orazdane testowe służące do testowania jakości nauczonejsieci neuronowej (np. plik pl_test.xls).Po stworzeniu obu plików można przejść do etapubadań przy użyciu sieci neuronowej. ruchamiamy programNeuronix z pakietu sztucznej inteligencji Sphinx.Wybieramy Menu Plik, pozycja Nowy projekt, pozycjaKreator nowego projektu.Nadajemy nazwę projektowi i zapisujemy pusty projektwskazując miejsce na dysku do którego mamy prawazapisu. Pojawi się żółte okno kreatora projektu.Klikamy 5 razy w przycisk „>” aż pojawi się oknoz wewnętrznym arkuszem do wprowadzania danych.Do komórek w wierszu z danymi (białe komórki) wklejamyzawartość pliku pl_tre.xls pomijając 2 górne wiersze.Do części szarej wprowadzamy etykiety danychczyli 2 górne wiersze z pliku pl_tre.xls. Należy skopiować2 górne wiersze z pliku pl_tre.xls a następniewrócić do programu Neuronix i po naciśnięciu prawegoprzycisku myszy (będąc w obszarze białej częściarkusz) wybieramy z menu pozycję edycja nagłówka.Wklejamy skopiowane dane do szarej części nagłówkowejarkusza programu Neuronix.Klikamy jeden raz w przycisk „>”. Pojawi się okno Parametrygeneracji plików. Zatwierdzamy sugerowaneparametry klikając OK.Zwróćmy uwagę, że program samodzielnie wylosuje10% danych wprowadzonych do arkusza i będzie jewykorzystywał tylko to testowania jakości sieci neuronowejw trakcie treningu (są to dane testowe wykorzystywanew trakcie nauki aby kontrolować czy proces nauki nieuległ tzw. przeuczeniu-wtedy odpowiedzi na danych te-Rysunek 10. Okno Opcje sieci neuronowej – zakładka parametrystrukturalne sieci.Rysunek 8. Okno Parametry generacji plikówRysunek 11. Zakładka parametry procesu uczenia324/2011


Analiza możliwości wykorzystania sztucznych sieci neuronowych w psychologiiReklamaRysunek 12. Okno – Monitoring procesu uczeniastowych są coraz gorszej jakości pomimo, że na danychtreningowych jakość odpowiedzi może nadal rosnąć) Natomiasttrening sieci neuronowej będzie wykorzystywałpozostałe 90% danych stanowiących dane treningowe.Proces nauki należy zakończyć przed momentemprzetrenowania sieci neuronowej.Przy dwóch pytaniach o nadpisanie plików wybraćprzycisk OK. Nacisnąć przycisk „>” a następnie koniecw żółtym kreatorze projektu. Wybieramy menu Plik, pozycjaZapisz aby zapisać dotychczasową pracę. Wybieramymenu Narzędzia, pozycja Parametry sieci. Pojawisię okno z 4 zakładkami do podania parametrów.W zakładce Parametry strukturalne sieci podajemy liczbęneuronów w poszczególnych warstwach lub jednejwarstwie. Zaznaczamy lub odznaczamy opcję Bias. I tutajuwaga praktyczna rozwiązanie można uzyskać dobrejakościowo dla 1 warstwy ukrytej, tym niemniej miosobiście udało się uzyskać lepsze przy wykorzystaniu2 warstw ukrytych. Liczba neuronów w pojedynczej warstwieukrytej powinna być w pewnej korelacji w stosunkudo liczby informacji na wejściu sieci neuronowej. Przykładowodla 25 wejść warto rozważyć liczbę neuronów warstwieukrytej od 15 do 30. Przy 2 warstwach ukrytych,druga warstwa ma tyle samo a najczęściej mniej neuronówniż pierwsza warstwa ukryta czyli dla naszego przykładunp. 15-10 w kolejnych warstwach ukrytych możebyć wykorzystane. Zbyt mała liczba neuronów powodujebrak możliwości prawidłowego rozwiązania zadania,a zbyt duża jest niekorzystna również z uwagi na skłonnoścido nauki na pamięć przez sieć neuronową.W zakładce Parametry procesu uczenia podajemywybrane przez nas wartości. Zatwierdzamy klikając naZastosuj.W zakładce Parametry procesu testowania podajemyczęstość testowania równą 1. W zakładce Warunki zakończeniaprocesu uczenia nie wprowadzamy żadnych zmian.Klikamy OK. aby opuścić okno Opcje sieci neuronowej.


SZTUCZNA INTELIGENCJARysunek 9. Ilustracja efektu przetrenowania sieci neuronowejRysunek 13. Nauka sieci neuronowej.Przechodzimy do fazy nauki sieci neuronowej wybierającmenu Sieć, pozycja Uczenie sieci. W oknie Monitoringprocesu uczenia zaznaczamy Prezentacja: Statystykioraz Wykresu RSM aby w trakcie nauki obserwowaćdokładniej postępy nauki.Przed rozpoczęciem nauki inicjalizujemy wagi początkoweklikając w przycisk Inicjacja wag. Wagi początkoweuzyskają losowe wartości początkowe. Naukę rozpoczynamyklikając w przycisk Start.Obserwujemy uważnie postępy nauki, szczególniew oknie TESTOWANE. Należy proces nauki zatrzymaćklikając w przycisk Stop w chwili gdy w oknie TESTO-WANIE pozycja błąd RMS dość niski, pozycja Poza tolerancjąwskazuje stosunkowo małą liczbę oraz w momenciezauważenia na wykresie błędów treningowychi testowych, że błędy testowe zaczynają rosnąć (siećneuronowa jest przetrenowana, testowanie sieci dajecoraz gorsze rezultaty) Najlepiej zatrzymać proces naukituż przed tym niekorzystnym zjawiskiem (rys.9). Wagizmienione w trakcie nauki zostaną zapisane po naciśnięciuprzycisku zapis wag. Należy koniecznie pamiętaćo zapisie wag. Naukę można powtórzyć od nowa zaczynającod Inicjacji wag i przycisku Start (jeśli uznamy,że sieć neuronowa jest zbyt mocno przetrenowana) lubkontynuować przerwaną naukę przyciskiem Stop poprzezponowne naciśnięcie przycisku Start (jeśli uznamy,że sieć neuronowa została zatrzymana zbyt wcześnie).Należy zauważyć, że błąd RMS w oknie UCZE-NIE odnosi się do faktów treningowych i dlatego malejebardzo długo. Od pewnego momentu (moment przetrenowania– błąd RMS w oknie TESTOWANIE rośnie całyczas) sieć neuronowa zatraca zdolności do uogólnianiaaczkolwiek błąd RMS w oknie UCZENIE maleje nadalsieć neuronowa uczy się niepotrzebnie niemal na pamięćwzorców treningowych. Po zakończeniu nauki notujemyliczbę epok treningowych, błąd RMS testowaniaoraz liczbę faktów poza tolerancją. Okno Monitoring procesuuczenia zamykamy klikając na przycisk Koniec. Należyteraz poddać testowaniu nauczoną sieć neuronowąwykorzystując dane z pliku testowego pl_test.xls. WybieramyMenu Sieć, pozycja Uruchomienie sieci. Do otwartegookna arkusza wklejamy dane z pliku pl_test.xls, pomijającdwa pierwsze wiersze nagłówkowe oraz kolumnęostatnią (wy) – dane wyjściowe dla sieci neuronowej. Klikamyprawym przyciskiem myszy otwierając menu. Wybieramypozycję Uruchomienie sieci. Ostatnia kolumnawy została wypełniona odpowiedziami nauczonej siecineuronowej na podane dane testowe.Wyniki w kolumnie wy nie są zerojedynkowe tak jak zakodowanopłeć. Należy więc np. a arkuszu kalkulacyjnymdane te zaokrąglić do postaci 0 lub 1 w zależności do którejz tych liczb wynik jest bliższy. Mając wyniki w postaci0 i 1 możemy porównać je z faktycznymi płciami określonymiw pliku pl_test.xls. A następnie obliczyć procent poprawnierozpoznanych płci osób ankietowanych. Możliwejest osiągnięcie nawet 90% trafień przy odrobinie wprawyw optymalnym ustawieniu parametrów sieci neuronoweji odpowiednio dobranemu czasowi nauki.W rozpatrywanej analizie wykorzystano 26 danychwejściowych (pytania z ankiety), 1 daną wyjściowąLiteratura• [1] Baczyński D., Parol. M., Piotrowski P., Bielecki S, Wasilewski J. „Sztuczna <strong>inteligencja</strong> w praktyce” – laboratorium, OficynaWydawnicza Politechniki Warszawskiej, 2008• [2] P. Helt, M. Parol, P. Piotrowski: Metody sztucznej inteligencji w elektroenergetyce. Oficyna Wydawnicza Politechniki Warszawskiej,Warszawa 2000• [3] www.aitech.pl/• [4] Michalik K.: Neuronix 3.0 dla Windows 9x/NT/2000. Symulator sztucznych sieci neuronowych. Podręcznik użytkownika.AITECH Artificial Intelligence Laboratory, Katowice 2002.344/2011


Analiza możliwości wykorzystania sztucznych sieci neuronowych w psychologii(płeć), natomiast liczba epok treningowych wynosiła typowo2000-4000. Liczba ankiet wynosiła 600, z czego60 stanowiły ankiety testowe.Wnioski końcoweSieć neuronowa skutecznie potrafi rozpoznać płeć napodstawie analizy pytań o charakterze psychologicznym(cechy charakteru, upodobania itp.). Rozważyć należyczy rozpoznawała płeć biologiczną czy raczej płeć mózgu?.Ja uważam, że raczej to drugie. Stąd też częściowomoże wynikać fakt nierozpoznania około 10% osóbz ankiet testowych, mający swoje źródło zapewne częściowow fakcie, że osoby ankietowane podawały płećbiologiczną. Istnieją testy bazujące na psychologii, któreRysunek 14. Arkusz z wynikami testowania sieci neuronowejwskazują płeć mózgu. Test taki jest dostępny np. na stronie:http://www.piotrowski_pawel.republika.pl/ w dzialepsychologia lub krótsza, prostsza postać testu na http://adonai.pl/relaks/psychotesty/?id=1.ReklamaDR INŻ. PAWEŁ PIOTROWSKIAbsolwent Wydziału Elektrycznego Politechniki Warszawskiej. Od maja 1995r. adiunkt w Zakładzie Sieci i SystemówElektroenergetycznych w Instytucie Elektroenergetyki Politechniki Warszawskiej. W pracy naukowej i dydaktycznejzajmuje się m.in.: metodami sztucznej inteligencji do zastosowań w elektroenergetyce (prognozowanie, optymalizacja),aspektami elektrycznymi sieci komputerowych (zasilanie gwarantowane, niezawodność, systemy okablowaniastrukturalnego, technologia PoE, technologia PLC), analizą i projektowaniem systemów informatycznych, sieciamikomputerowymi, technologiami internetowymi oraz systemami operacyjnymi komputerów. Jego praca doktorska pt: „Optymalizacjaregulacji napięć w elektroenergetycznych sieciach rozdzielczych w oparciu o teorię sieci neuronowych” wygrała ogólnopolski konkurso Nagrodę Promocyjną Siemensa. Autor lub współautor 43 publikacji naukowo-dydaktycznych, 26 referatów na konferencje naukoweoraz 42 opracowań naukowych. Hobby: psychologia, fotograa, poezja, kulturystyka, jogging, modelarstwo. Kontakt z autorem:pawel.piotrowski@ien.pw.edu.pl. Strona prywatna autora: http://www.piotrowski_pawel.republika.pl/


PROGRAMOWANIE GRAFIKIOpenGL i komponentyWindows FormsRenderowanie sceny za pomocą funkcji OpenGL w aplikacjikorzystającej z komponentów Windows FormProjektując aplikacje korzystające z biblioteki graficznej OpenGLsamodzielnie musimy zadbać o prawidłowe rozmieszczeniei oprogramowanie interfejsu użytkownika. Przy jego projektowaniuidealnie wspomoże nas wykorzystanie środowiska Microsoft VisualStudio, które odciąży nas od czasochłonnego zajęcia. W artykuletym znajdziesz podstawowe informację na temat tego, jak w prostysposób połączyć funkcję biblioteki OpenGL z aplikacją korzystającąz komponentów Windows Forms.Dowiesz się:• Jak przygotować aplikację korzystającą z komponentów WindowsForm do współpracy z biblioteką OpenGL.Powinieneś wiedzieć:• Podstawy programowania pod Microsoft Windows;• Podstawy programowania w Microsoft Visual C++;• Podstawowa znajomość API OpenGL.Przeznaczeniem biblioteki graficznej OpenGLjest generowanie grafiki, a w szczególności grafikitrójwymiarowej. Bibliotekata nie wspiera wprost projektowaniainterfejsu użytkownika, anizarządzania oknami czy też obsługikomunikatów systemu operacyjnego.Projektując aplikacjępod Windows z użyciem tej bibliotekimusimy sami zapewnić takąfunkcjonalność naszej aplikacji, coczęsto zajmuje dużo czasu. Jednak,gdy możemy sobie pozwolićna poświęcenie drobnej części wydajnościaplikacji, to do wykorzystaniamamy wszelkie dobrodziejstwa,jakie daje nam środowiskoMicrosoft Visual Studio i aplikacjekorzystające z komponentów WindowsForms.Form rozpoczynamy nasz projekt również od standardowegowywołania kreatora z menu FileNewProject.Przygotowanie środowiskaJak w przypadku większości aplikacjiwykorzystujących WindowsRysunek 1. Okno kreatora aplikacji364/2011


OpenGL i komponenty Windows FormsRysunek 2. Zakres modykacji właściwości projektuNastępnie wybieramy z dostępnych kreatorów WindowsForms Application (Rysunek 1).Gdy kreator zakończy swoje działanie i na ekraniepokaże się pierwsze okno naszej aplikacji musimywskazać linkerowi, że będziemy korzystać z zewnętrznychplików bibliotecznych OpenGL. Wykonujemy toprzez modyfikację domyślnych właściwości projektu(poprzez okno konfiguracyjne dostępne z menu Project->nazwa_projektuProperties…). W wyświetlonymoknie zmieniamy parametr Configuration: z ’Active(Debug)’na ’All Configurations’, co zapewni nam to, że razdokonane zmiany w konfiguracji linkera odniosą skutekzarówno do trybu Debug jak i Release (Rysunek 2).Następnie z drzewa właściwości wybieramy gałąźConfiguration Properties->Linker->Input (Rysunek 3)i modyfikujemy właściwość: Additional DependenciesRysunek 4. Okno dodatkowych zależności linkeradopisując bibliotekę opengl32.lib oraz glu32.lib (Rysunek4).W taki sposób przygotowaliśmy nasz projekt dowspółpracy z biblioteką OpenGL i możemy przejść dokolejnych, ciekawszych czynności.Rysunek 3. Okno właściwości projektuwww.sdjournal.org 37


PROGRAMOWANIE GRAFIKIPrzygotowanie interfejsu aplikacjiNajprostszym sposobem powiązania OpenGL z oknamiWindows jest użycie jednej z bibliotek tj. AUX,GLUT lub freeGLUT, które dodatkowo zapewniająprzenoszalność kodu OpenGL pomiędzy różnymi systemamioperacyjnymi. Jednak w naszym przypadkuta funkcjonalność nie jest istotna, dlatego skorzystamyz interfejsu pomiędzy Windows i OpenGL, jakim sąfunkcje WIGGLE.Poprawne zainicjowanie okna do renderingu wymagaokreślenia kontekstu urządzenia tego okna, dobraniaformatu piksela oraz utworzenia na tej podstawiekontekstu renderowania OpenGL. Jak wiemy, każdykomponent w systemie Windows jest zdefiniowanyjako okno. Dzięki takiemu rozwiązaniu proces renderowanianie musi być ograniczony tylko do głównegookna aplikacji, ale może również odbyć się na takichkomponentach jak Panel, Button, TextBox, a nawetLabel. Uogólniając, funkcje OpenGL mogą renderowaćsceny z użyciem dowolnego komponentu podwarunkiem, że możliwe jest pobranie uchwytu do okna(również poprzez jawną konwersję typów) tego komponentu.Celem naszej przykładowej aplikacji będzie wyświetleniedwóch niezależnych scen w jednym oknie. Dodajmyz paska narzędziowego dwa panele (Toolbox->Containers->Panel), na których będziemy wyświetlaćsceny. Dodajmy również stoper (Toolbox->Components->Timer),który będzie odrysowywał sceny, cookreślony czas oraz przycisk (Toolbox->Common Controls->Button),którym będziemy uruchamiać i zatrzy-Listing 1. Ostrzeżenie przed zamknięciem aplikacjiSystem::Void Form1_FormClosing({}System::Object^ sender,System::Windows::Forms::FormClosingEventArgs^ e)if (MessageBox::Show({}"Czy na pewno chcesz opuścić program?","Koniec pracy",MessageBoxButtons::YesNo,MessageBoxIcon::Question,MessageBoxDefaultButton::Button2)== Windows::Forms::DialogResult::No)// odwołujemy zamknięcie aplikacji,// gdy użytkownik naciśnie przycisk 'Nie'e->Cancel = true;Listing 2. Wywołanie polecenia zakończenia aplikacji z menuprogramuSystem::Void wyjścieToolStripMenuItem_Click({}System::Object^ sender,System::EventArgs^ e)// zamykamy okno programuthis->Close();Rysunek 5. Przygotowanie interfejsu aplikacji384/2011


Zapraszamy na konferencję, na której dowiesz się:jakie są najczęściej popełniane błędy w kodzie aplikacji,jak tworzyć bezpieczne oprogramowanie - najlepsze praktyki,jak zabezpieczyć otoczenie aplikacji webowej,jak chronić się przed zagrożeniami wewnętrznymi,jak szacować ryzyko i planować nakłady na bezpieczeństwo w projekcie informatycznym.Wykłady i spotkaniaz najlepszymi specjalistami w branży.Trzy punkty widzenia na bezpieczeństwo aplikacji internetowych:dewelopera, administratora oraz kierownika projektu.Warszawa, piątek 13 maja 2011 r.Zapisz się już dziś - zniżki przy wczesnej rejestracji.Rejestracja i więcej informacji: www.sages.com.pl/3p


PROGRAMOWANIE GRAFIKImywać nasz stoper. Dodatkowo dodajmy menu (Toolbox->Menus& Toolbars->MenuStrip), a w zakładcePlik umieśćmy polecenie zakończenia aplikacji (Rysunek5).Po przygotowaniu interfejsu aplikacji możemy przejśćdo jego oprogramowania.Zdarza się, że programista zapomni o tym, że wypadazapytać użytkownika czy na pewno chciałby zakończyćdziałanie aplikacji. W przypadku gdy zostanie zainicjowanataka czynność wywoływane jest odpowiedniezdarzenie (Form::FormClosing). Przejmując jegoobsługę zapytamy użytkownika czy chce zamknąć program(Listing 1).Teraz możemy oprogramować zdarzenie wywoływanepo uruchomieniu polecenie zakończenia aplikacjiz jej menu (ToolStripMenuItem::Click). Wywołujemytutaj metodę zamykającą okno programu (Listing 2).Ostatnią czynnością, jaką wykonamy na tym etapiebędzie uruchamianie i zatrzymywanie naszego stoperapoprzez kliknięcie przycisku. Po wystąpieniu zdarzenia(Button::Click) sprawdzamy czy stoper jest uruchomiony,jeśli tak to go zatrzymujemy, w przeciwnymwypadku uruchamiamy go. Dodatkowo w każdym przypadkuzmieniamy odpowiednio opis na naszym przycisku(Listing 3).Z tak przygotowanym interfejsem użytkownikaprzejdźmy do zaimplementowania klasy renderującej.Listing 3. Włączanie i wyłączanie stoperaSystem::Void button1_Click({}System::Object^ sender,System::EventArgs^ e)// sprawdzamy czy stoper jest uruchomionyif (this->timer1->Enabled){}else{}// jeśli tak:// zatrzymujemy stoperthis->timer1->Enabled = false;// zmieniamy tekst na przyciskuthis->button1->Text = "Start";// jeśli nie:// uruchamiamy stoperthis->timer1->Enabled = true;// zmieniamy tekst na przyciskuthis->button1->Text = "Stop";Klasa renderującaDla przejrzystości kodu rozdzielimy część obsługującąfunkcje OpenGL od reszty kodu aplikacji tworzącklasę o przykładowej nazwie OpenGL_base. Deklaracjaklasy znajdzie się w pliku OpenGL_base.hpp (Listing4), natomiast definicja jej metod w pliku OpenGL_base.cpp.Nasza klasa posiada trzy prywatne pola:Listing 4. Deklaracja przykładowej klasy obsługującej funkcjeOpenGL#pragma once#include // używamy API Windows#include // używamy API OpenGL#include // używamy narzędzi OpenGLclass OpenGL_base{private:public:};// uchwyt do oknaHWND hWnd;// uchwyt do kontekstu// urządzenia oknaHDC hDC;// uchwyt do kontekstu// renderowania OpenGLHGLRC hRC;// konstruktorOpenGL_base(int handle);// destruktor~OpenGL_base(void);// metoda przeskalowuje scenę// do podanych rozmiarów oknavoid Resize(int width, int height);// metoda unieważnia zawartość oknavoid Invalidate(void);// metoda inicjująca podstawowe// parametry scenyvoid Initialize(void);// metody renderującevoid Render_A(float angle);void Render_B(float angle);404/2011


OpenGL i komponenty Windows FormsListing 5a. Denicja konstruktoraOpenGL_base::OpenGL_base(int handle): hWnd((HWND) handle), hDC(NULL), hRC(NULL){// pobranie kontekstu urządzenia dla danego oknathis->hDC = GetDC(this->hWnd);if (!this->hDC){MessageBox(NULL,"Nie można ustawić kontekstu urządzenia.","Błąd ustawiania DC",MB_OK | MB_ICONERROR);}this->~OpenGL_base();exit(EXIT_FAILURE);// wywołanie funkcji przerzucającej bufory na główny planwglSwapLayerBuffers(this->hDC, WGL_SWAP_MAIN_PLANE);// wypełnienie struktury formatu pikselastatic PIXELFORMATDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR), // rozmiar struktury1, // wersja strukturyPFD_DRAW_TO_WINDOW |// rysowanie na okniePFD_SUPPORT_OPENGL |// obsługa wywołań OpenGL w tym okniePFD_DOUBLEBUFFER,// tryb podwójnego buforowaniaPFD_TYPE_RGBA,// tryb kolorów RGBA16, // 16-bitowa gamma kolorów0, 0, 0, 0, 0, 0, // nie używane0, 0, 0, 0, 0, 0, // nie używane16, // 16-bitowy bufor głębokości (Z-Buffer)0, 0, // nie używanePFD_MAIN_PLANE,// rysowanie na głównym planie0, 0, 0, 0 // nie używane};// dopasowanie formatu piksela do obsługiwanych formatówint pixelFormatIndex = ChoosePixelFormat(this->hDC, &pfd);if (!pixelFormatIndex){MessageBox(NULL,"Nie można dopasować odpowiedniego formatu piksela.","Błąd ustawiania PFD",MB_OK | MB_ICONERROR);}this->~OpenGL_base();exit(EXIT_FAILURE);// ustawienie formatu piksela dla danego kontekstu urządzeniaif (!(SetPixelFormat(this->hDC, pixelFormatIndex, &pfd)))www.sdjournal.org 41


PROGRAMOWANIE GRAFIKI• Uchwyt do okna (HWND) – wskazujący okno aplikacji,na którym funkcje OpenGL będą rysować.• Uchwyt do kontekstu urządzenia (HDC) – przechowującyparametry graficzne wskazanego okna.• Uchwyt do kontekstu renderowania (HGLRC)– przechowujący atrybuty graficzne okna OpenGL.Przyjrzyjmy się definicji konstruktora (Listing 5), któregoparametrem (handle) jest wskazanie okna, naktórym będzie odbywać się rendering sceny. Inicjalizacjaobiektu następuje przez określenie kontekstuurządzenia dla podanego okna (GetDC). Następniekonieczne jest dobranie (ChoosePixelFormat) i ustawienie(SetPixelFormat) odpowiednie formatu pikselaobsługiwanego przez danych sprzęt, jako najbliższegodo danych podanych w strukturze(pfd), w którejpodajemy m.in. takie parametry jak ilość bitów dlapalety kolorów, bufora głębokości (tzw. Z-Buffer) orazczy będziemy używać trybu podwójnego buforowaniascen OpenGL. Ostatnią czynnością inicjalizującą jestutworzenie kontekstu renderowania (wglCreateContext)i powiązanie go z kontekstem urządzenia danegookna (wglMakeCurrent).Wewnątrz konstruktora użyliśmy funkcję wyświetlającąokno z komunikatem (MessageBox). Używa ona ciągówznakowych kodowanych w standardzie MBCS(Multi-Byte Character Set), a nie standardowym Unicode,co w rezultacie zwróci błędy kompilacji. Możemyrozwiązać to przynajmniej na dwa sposoby.Pierwszym rozwiązaniem tego problemu może byćprzestawienie we właściwościach projektu domyślnegokodowania ciągów znakowych (Rysunek 6). Wybiera-Listing 5b. Denicja konstruktora{MessageBox(NULL,"Nie można ustawić wybranego formatu piksela.","Błąd ustawiania PFD",MB_OK | MB_ICONERROR);}this->~OpenGL_base();exit(EXIT_FAILURE);// utworzenie kontekstu renderowaniathis->hRC = wglCreateContext(this->hDC);if (!this->hRC){MessageBox(NULL,"Nie można utworzyć kontekstu renderowania.","Błąd ustawiania RC",MB_OK | MB_ICONERROR);}this->~OpenGL_base();exit(EXIT_FAILURE);// ustawienie danego kontekstu renderowania jako bieżącegoif (!wglMakeCurrent(this->hDC, this->hRC)){MessageBox(NULL,"Nie można ustawić bieżącego kontekstu renderowania.","Błąd ustawiania RC",MB_OK | MB_ICONERROR);}}this->~OpenGL_base();exit(EXIT_FAILURE);424/2011


OpenGL i komponenty Windows Formsmy gałąź Configuration Properties->General, a następnieprzełączamy opcję Character Set na ‘Use Multi-ByteCharacter Set’.Listing 6. Przykład wywołania okna komunikatu bez zmianydomyślnego kodowania znakówMessageBox();NULL,L"Jakiś komunikat wyświetlany w oknie.",L"Tytuł tego okna",MB_OK | MB_ICONERRORDrugą metodą jest dopisanie przed każdym użyciemciągu znakowego przedrostka ‘L’ (Listing 6), dzięki któremukonwertujemy go z typu char* do wchar_t*.Renderowana scena powinna również reagowaćna zmiany kształtu i rozmiaru okna z nią powiązanego.Skalowanie sceny zapewnia to, że gdy rozmiaryokna ulegną zmianie to również obiekty renderowanena nim zostaną odpowiednio przeskalowane oraz zachowająswoje proporcje. Przyjrzyjmy się odpowiedniejmetodzie (Listing 7). Jej parametry wejściowe to szerokość(width) i wysokość (height) danego okna. Nawstępie następuje sprawdzenie kontekstów i prawidłowościwymiarów okna, po czym wiążemy kontekst renderowaniaz kontekstem urządzenia i czynimy go bieżącym,wykorzystując do tego celu jedną z funkcji wiggle(wglMakeCurrent). Następnie ustalamy, że cały obszarokna może być wykorzystywany przez OpenGL(glViewort). W kolejnym kroku przełączamy bieżącąmacierz na macierz rzutowania (glMatrixMode), przypisujemyjej wartości z macierzy jednostkowej (glLoadIdentity)i włączamy rzutowanie prostokątne (glOrtho)ustawiając w ten sposób bryłę obcinania. Na koniecprzełączamy bieżącą macierz na macierz widokumodelu i jej również przypisujemy wartości z macierzyjednostkowej.Będzie nam również potrzebna metoda, która powiadomisystem operacyjny, że zawartość wskazanegookna jest nieaktualna, a same okno wymaga przerysowania.Zobaczmy definicję kolejnej metody (Listing 8),która nam to zapewni wykorzystując funkcję WindowsAPI (InvalidateRect).Parametry początkowe sceny mogą zostać zainicjowanew konstruktorze naszej klasy. Jednak w naszymprzykładzie wykorzystamy do tego celu osobną metodę(Listing 9), w której możemy określić wszystkie para-Rysunek 6. Zmiana domyślnego kodowania ciągów znakowychwww.sdjournal.org 43


PROGRAMOWANIE GRAFIKImetry startowe tj.: kolor wypełnienia sceny, włączenieefektu mgły czy ustawienie trybu rysowania wielokątów.Na początku ustawiamy bieżący kontekst renderowania.Następnie określamy, że renderowane wielokątymają być wypełniane tylko od frontu, natomiast z tyłurenderowane będą tylko ich krawędzie (glPolygon-Mode). Na koniec ustalamy, że kolorem czyszczącymscenę (glClearColor) będzie kolor czarny. Zainicjowanieparametrów sceny poza konstruktorem umożliwianam przywrócenie jej domyślnych ustawień w dowolnymmiejscu naszej aplikacji.Listing 7. Przeskalowanie scenyvoid OpenGL_base::Resize(int width, int height){// czy istnieją kontekstyif (!this->hDC || !this->hRC){}return;// czy rozmiary okna są poprawneif (width hRC);// ustawienie widoku na wymiary oknaglViewport(0, 0, width, height);// wyzerowanie stosu macierzy rzutowaniaglMatrixMode(GL_PROJECTION);glLoadIdentity();Możemy teraz przejść do metod renderujących naszesceny. Zaimplementujmy dwie takie metody, po jednejdla każdego z przygotowanych wcześniej paneli (Listing10, 11). Parametrem każdej z nich jest kąt, pod jakimma być wyświetlona rysowana figura. Standardowoustawiamy bieżący kontekst renderowania i czyśćmyzawartości okna (glClear). Następnie przełączamy sięna macierz widoku modelu i przypisujemy jej wartościz macierzy jednostkowej. W kolejnym kroku dokonujemyodpowiednich przesunięć (glTranslatef) i obrotów(glRotatef), które muszą być wykonane przed narysowaniemdanego obiektu. Na zakończenie wymuszamywywołanie funkcji OpenGL, które oczekują w kolejce(glFlush) i przełączamy bufory (SwapBuffers).Modyfikacja kodu podstawowegookna aplikacjiNa początku wykonaliśmy interfejs naszej aplikacji, następnieprzygotowaliśmy to co chcielibyśmy, aby naszaaplikacja wyświetlała. Pozostało nam tylko powiązaćze sobą te elementy.Kreator wygenerował podstawowy kod opisującygłówne okno i powiązał z nim wszystkie dodane przeznas komponenty interfejsu użytkownika. Całość zostałaumieszczona w pliku Form1.h. Nasza praca polegaw pierwszej kolejności na zadeklarowaniu użycia naszejklasy renderującej oraz dodaniu dwóch obiektówtej klasy (Listing 12).Listing 8. Unieważnienie zawartości oknavoid OpenGL_base::Invalidate(void){}// uniważnienie zawartości okna,// na którym renderowana jest scenaInvalidateRect(this->hWnd, NULL, false);// ustawienie bryły obcinaniaif (width hDC, this->hRC);// określenie trybu rysowania wielokątów:// front: wypełniony// tył: tylko linieglPolygonMode(GL_BACK, GL_LINE);}// wyzerowanie stosu macierzy widoku modeluglMatrixMode(GL_MODELVIEW);glLoadIdentity();}// określenie koloru czyszczenia sceny// na czarny w trybie RGBAglClearColor(0.0f, 0.0f, 0.0f, 1.0f);444/2011


PROGRAMOWANIE GRAFIKIListing 10. Renderowanie obracającego się kwadratuvoid OpenGL_base::Render_A(float angle){// ustawienie bieżącego kontekstu renderowaniawglMakeCurrent(this->hDC, this->hRC);// czyszczenie sceny kolorem wypełnienia// oraz czyszczenie bufora głębokościglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// wyzerowanie układu współrzędnychglMatrixMode(GL_MODELVIEW);glLoadIdentity();// obrót w osi XglRotatef(angle, 1.0f, 0.0f, 0.0f);// przesunięcie w osi X i YglTranslatef(-0.25f, -0.25f, 0.0f);// wejście w tryb rysowania kwadratówglBegin(GL_QUADS);// ustawienie koloru rysowania// na czerwony w RGBglColor3f(1.0f, 0.0f, 0.0f);// pozycja wierzchołka 1glVertex3f(0.0f, 0.0f, 0.0f);// ustawienie koloru rysowania// na zielony w RGBglColor3f(0.0f, 1.0f, 0.0f);// pozycja wierzchołka 2glVertex3f(0.5f, 0.0f, 0.0f);// ustawienie koloru rysowania// na niebieski w RGBglColor3f(0.0f, 0.0f, 1.0f);// pozycja wierzchołka 3glVertex3f(0.5f, 0.5f, 0.0f);// ustawienie koloru rysowania// na żółty w RGBglColor3f(1.0f, 1.0f, 0.0f);// pozycja wierzchołka 4glVertex3f(0.0f, 0.5f, 0.0f);// wyjście z trybu rysowaniaglEnd();// opróżnieni zawartości kolejkiglFlush();Listing 11. Renderowanie obracającego się trójkątavoid OpenGL_base::Render_B(float angle){// ustawienie bieżącego kontekstu renderowaniawglMakeCurrent(this->hDC, this->hRC);// czyszczenie sceny kolorem wypełnienia// oraz czyszczenie bufora głębokościglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// wyzerowanie stosu macierzy widoku modeluglMatrixMode(GL_MODELVIEW);glLoadIdentity();// obrót w osi YglRotatef(angle, 0.0f, 1.0f, 0.0f);// przesunięcie w osi X i YglTranslatef(-0.25f, -0.25f, 0.0f);// wejście w tryb rysowania trójkątówglBegin(GL_TRIANGLES);// ustawienie koloru rysowania// na czerwony w RGBglColor3f(1.0f, 0.0f, 0.0f);// pozycja wierzchołka 1glVertex3f(0.0f, 0.0f, 0.0f);// ustawienie koloru rysowania// na zielony w RGBglColor3f(0.0f, 1.0f, 0.0f);// pozycja wierzchołka 2glVertex3f(0.5f, 0.0f, 0.0f);// ustawienie koloru rysowania// na niebieski w RGBglColor3f(0.0f, 0.0f, 1.0f);// pozycja wierzchołka 3glVertex3f(0.25f, 0.5f, 0.0f);// wyjście z trybu rysowaniaglEnd();// opróżnieni zawartości kolejkiglFlush();}// zamiana buforówSwapBuffers(this->hDC);}// zamiana buforówSwapBuffers(this->hDC);464/2011


OpenGL i komponenty Windows FormsMusimy również zadbać o poprawne zaalokowaniepamięci dla obiektów w konstruktorze okna i powiązanieich z kolejnymi panelami interfejsu użytkownika (Listing13).Pamiętajmy, że przy zamykaniu aplikacji destruktorokna głównego powinien zwolnić zasoby, zajmowanerównież przez renderowane sceny (Listing 14).Gdy klasa renderująca jest już częścią okna naszejaplikacji i odpowiednie panele są z nią powiązane, możemyprzystąpić do obsługi zdarzenia przerysowującegoich zawartość (Panel::Paint). Wewnątrz jego koduwywołamy odpowiednią metodę renderującą dla danegopanelu (Listing 15).Analogicznie dla drugiego panelu wywołamy odpowiedniometodę this->Scene2->Render_B(…).Następnie przejmijmy obsługę zdarzenia (Panel::Resize) wywoływanego przy zmianie rozmiaru lubkształtu danego panelu (Listing 16).Podobnie dla drugiego panelu wywołamy odpowiedniometodę this->Scene2->Resize(…).Skompilowanie i uruchomienie programu spowodujewyświetlenie na panelach nieruchomych figur geo-Listing 12. Modykacja deklaracji głównego okna aplikacji.#pragma once#include "OpenGL_base.hpp" // używamy naszej klasy renderującejnamespace WinForm_OpenGL{/* kod wygenerowany przez kreator... */public ref class Form1 : public System::Windows::Forms::Form{/* kod wygenerowany przez kreator... */private:// deklaracja scenOpenGL_base* Scene1;OpenGL_base* Scene2;// kąt obrotufloat angle;};/* kod wygenerowany przez kreator... */}Listing 13. Modykacja konstruktora głównego okna aplikacjiForm1(void){/* kod wygenerowany przez kreator... */// utworzenie obiektów scen i powiązanie ich z panelamithis->Scene1 = new OpenGL_base(this->panel1->Handle.ToInt32());this->Scene2 = new OpenGL_base(this->panel2->Handle.ToInt32());// inicjalizacja scenthis->Scene1->Initialize();this->Scene2->Initialize();}// początkowy kąt obrotuthis->angle = 0.0f;www.sdjournal.org 47


PROGRAMOWANIE GRAFIKImetrycznych. Natomiast naciskanie przycisku nie uruchomiich animacji. Właśnie z tego powodu wprowadziliśmystoper do naszej aplikacji. Teraz musimy oprogramowaćjedynie zdarzenie (Timer::Tick), które jest wywoływaneco określony czas, aby nasze figury zaczęłysię obracać (Listing 17).Listing 14. Modykacja destruktora głównego okna aplikacji~Form1(){/* kod wygenerowany przez kreator... */Listing 15. Obsługa zdarzenia przerysowującego paneleSystem::Void panel1_Paint(System::Object^ sender,System::Windows::Forms::PaintEventArgs^ e){// wyrenderowanie scenythis->Scene1->Render_A(this->angle);}}// zwalnianie zasobów zajmowanych przez scenyif (this->Scene1){delete this->Scene1;}if (this->Scene2){delete this->Scene2;}Listing 16. Obsługa zdarzenia przeskalowującego scenęSystem::Void panel1_Resize(System::Object^ sender,System::EventArgs^ e){// przeskalowanie scenythis->Scene1->Resize(this->panel1->Width,this->panel1->Height);}Rysunek 8. Zmiana trybu dołączania pliku manifestu484/2011


OpenGL i komponenty Windows FormsRysunek 7. Przykładowa aplikacjaListing 17. Animowanie scenSystem::Void timer1_Tick({}System::Object^ sender,System::EventArgs^ e)// zmieniamy wartość kątathis->angle += 1.0f;// poinformowanie systemu,// że powiązane z panelami// sceny są nie aktualne// i wymagają przerysowaniathis->Scene1->Invalidate();this->Scene2->Invalidate();W ten oto sposób zakończyliśmy pisanie kodu źródłowegonaszej przykładowej aplikacji (Rysunek 7),która wykorzystuje funkcje OpenGL do renderowaniana komponentach Windows Form.Jeżeli przy kompilacji programu będą pojawiać sięproblemy z włączaniem manifestu do pliku wykonywalnego,to możemy tak ustawić właściwości projektu,aby plik manifestu był generowany osobno poza plikiemwykonywalnym (Rysunek 8). Zmiany te wykonamyw gałęzi Configuration Properties->Manifest Tool->Inputand Output i ustawiamy Embed Manifest nawartość ‘No’.PodsumowanieW przedstawionym artykule starałem się przybliżyćmożliwości wykorzystania komponentów WindowsForm do renderowania na nich scen z użyciem bibliotekiOpenGL. Chociaż przykładowe metody renderującepozwalają jedynie na wyświetlenie obracających sięprostych figur geometrycznych, to nic nie stoi na przeszkodzie,aby renderować bardziej skomplikowanesceny. Jedyne ograniczenia to wyobraźnia programistyoraz możliwości dostępnej konfiguracji sprzętowej.Zachęcam do dalszego, samodzielnego eksperymentowaniaz przykładowym kodem aplikacji.KORNELIUSZ WARSZAWSKIKorneliusz jest doktorantem na Wydziale Elektrotechniki, Informatykii Telekomunikacji Uniwersytetu Zielonogórskiego,gdzie zajmuje się rzeczywistością wirtualną i graką komputerową.Obecnie pracuje na stanowisku Administratora SystemuInformatycznego w Sądzie Rejonowym w Nowej Soli.www.sdjournal.org 49


PROGRAMOWANIE GRAFIKIStereoskopia.Implementacja w XNA 4.0Stereoskopia na dobre zadomowiła się w kinach. Niemalwszystkie przeboje, począwszy od „Avatara” po filmy animowanedla dzieci są teraz wyświetlane w wersji 3D. Także wśród urządzeńkina domowego pojawiają się już urządzenia do prezentacjiobrazu z wrażeniem głębi. Mowa zarówno o telewizorach, jaki o akcesoriach komputerowych.Dowiesz się:• Artykuł przedstawia prostą implementację animowanegoanaglifu. Dzięki niemu zrozumiesz jak tworzone są obrazy dladwukolorowych okularów i będziesz mógł użyć tej techniki wewłasnych grach tworzonych w XNA.Powinieneś wiedzieć:• Wskazana jest podstawowa znajomość podstaw C#, XNA iHLSL.Widzenie przestrzenneMożemy widzieć obraz przestrzenny. Wbrew temu,co zwykło się pisać w artykułach poświęconych kinu3D, widzenie stereoskopowe (binokularowe) niejest tu jedynym, ani nawet najważniejszym mechanizmem.Do oceny odległości przedmiotów korzystamyprzede wszystkim z perspektywy – im dalej położonyjest przedmiot, tym jest mniejszy. Równie ważne jestoświetlenie. Bez cieni własnych i rzucanych, wszystkostaje się płaskie, jak na fotografii z oświetleniem typuhigh key. I odwrotnie, im bardziej „plastyczne” są cienie,tym bardziej sugestywna jest głębia. Z obu mechanizmówco najmniej od czasów Rembrandta korzystamalarstwo, a współcześnie także grafika komputerowa3D, do przedstawiania głębi w płaskim obrazie.A jednak nałożenie okularów 3D i oglądanie obrazówstereoskopowych daje nowy rodzaj odczuć, któryjest dla widza atrakcyjny. Skąd on się bierze? Odpowiedźmoże być tylko jedna – z mózgu. To on jestodpowiedzialny za przetwarzanie sygnałów docierającychdo niego z obu oczu. I to on jest odpowiedzialnyza wrażenie głębi. Jedyne co musimy mu do tego zapewnić,to dwa obrazy przedstawiające tą samą scenęwidzianą z dwóch, nieco rozsuniętych punktów.Różnica tych dwóch przedstawień sceny nie jest duża(rysunek 1), odzwierciedla odległość między lewymi prawym okiem, która równa jest średnio tylko około5-7 cm. Mózg łączy te dwa obrazy „kodując” różnicemiędzy nimi jako odległość widzianych przedmiotówod obserwatora. Przedmioty nie mogą być jednakzbyt odległe. Ten sposób oceny odległości działa bowiemtylko w najbliższym zakresie odległości, najwyżejdo kilku metrów.StereoskopiaTym jak tworzyć dwa odpowiednio przygotowane obrazy,i jak je dostarczyć osobno do lewego i prawegooka zajmuje się stereoskopia. Jest to technika obrazowania,oddająca wrażenie normalnego widzenia przestrzennegotzn. takiego, którego efekt zawiera nie tylkoinformacje o kształtach i kolorach obiektów, ale takżeich wzajemne zależności przestrzenne (za Wikipedią).Ludzie interesowali się stereoskopią już w połowieXIX w. Jedną z najstarszych realizacji tej technikipolegała na łączeniu przygotowanych obrazów w takzwane stereopary. Jednym z pierwszych i najprostszych,a zarazem najbardziej popularnych stereoskopówbył ten skonstruowany przez Homelsa w 1861 r.(rysunek 2). Była to bardzo prosta konstrukcja składającasię z soczewek i uchwytu na obrazy. Mimo topozwalała na uzyskanie pożądanego efektu. W miaręupływu lat, zainteresowanie tego typu rozrywką rosłoi powstawały coraz to nowsze i bardziej skomplikowaneurządzenia.W roku 1866 Alois Polanecky (1826-1911) zbudowałurządzenie złożone z 25 stereoskopów wbudowanychw wieloboczną obudowę. Korzystał przy tym z pomocyfrancuskiego fotografa i optyka Claude-Marie Ferriera.504/2011


Stereoskopia. Implementacja w XNA 4.0Rysunek 1. Obraz tej samej sceny widzianej lewym i prawy okiem.Z tym „Salonem Stereoskopowym” występował na jarmarkach.W latach osiemdziesiątych XIX wieku berlińskiprzedsiębiorca August Fuhrmann (1844-1924)udoskonalił wynalazek Polaneckiego. W ten sposóbpowstały pierwsze fotoplastykony (ponownie cytujęWikipedię). Pojawiały się one także na terenie obecnejPolski. Pozwalały one 25 osobom na równoczesneoglądanie przezroczy stereoskopowych. Potem zainteresowanietą technologią zmalało. Na nowo z pełnąmocą wróciło dopiero w ostatnich kilku latach pod postaciąkina 3D (zob. Ramka).Okulary 3DZadaniem okularów 3D jest dostarczenie do obu oczudwóch nieco różnych obrazów. Jest kilka metod uzyskaniatego efektu: od okularów czynnych, które naprzemienniezaciemniają jeden z okularów (np. okularyNVIDII), poprzez okulary wykorzystujące zjawiskopolaryzacji światła, do okularów dwukolorowych.My zajmiemy się tylko tym ostatnim sposobem, najprostszymi najtańszym w realizacji. Klasyczne okularydwukolorowe miały szkła czerwone i niebieskie. Obraz,który był przez nie oglądany musiał być wobec te-go złożeniem dwóch rysunków: niebieskiego i czerwonego.Lewe oko patrzące przez czerwony okular niebędzie widziało czerwieni, która zleje się z koloremtła nadanym przez szło całemu lewemu obrazowi. Leweoko będzie wobec tego postrzegało czerwień jakoswoistą „biel”. Analogicznie prawe oko nie będziereagować na niebieski. Pozostałe kolory postrzeganebędą przez lewe i prawe oko jako różne odcienie czerwonegoi niebieskiego. Ze względu na użyte filtry, kolorzielony postrzegany będzie jako czarny. W efekcieokulary czerwono-niebieskie nie umożliwiają zobaczeniaobrazu kolorowego. Aby uniknąć tego problemuobecnie stosuje się raczej szkła czerwone i cyjan (niebieskozielone).Kolory te dopełniają się (ich suma dajebiel), a jednocześnie są ortogonalne w przestrzeni kolorów.Jeżeli korzystając z takich okularów spojrzymyna obraz, na którym rysunek przeznaczony dla lewegooka narysowany będzie w czerwieni i nałożony na cyjanowyrysunek dla prawego oka, jak na rysunku 3 (lewy),powinniśmy zobaczyć obraz 3D z wrażeniem głębi.Dla porównania rysunek 3 (środkowy) przedstawiatę samą scenę przygotowaną dla okularów ze szkłamiczerwonym i niebieskim.Stereoskopia w kinachW większości kin w Polsce stosowana jest technologia Dolby 3D Digital Cinema. System ten pozwala uzyskać klarowny obraz 3Dze stosunkowo realistycznym odwzorowaniem barw. Opiera się na podziale pasma barw na części i kierowaniu do lewego i prawegooka pasm o nieco innym odcieniu. System ten nie wymaga specjalnych ekranów kinowych. Co więcej może być zainstalowanywszędzie tam, gdzie znajduje się już projektor cyfrowy spełniający wymagania DCI. Domontowuje się do niego tylko kilkapodzespołów. Opiera się na technologii "wavelength triplet" opracowanej przez niemiecką firmę Intec. Filtr krążkowy wielkościpłyty CD umieszczony wewnątrz cyfrowego projektora, obracając się z dużą prędkością (jednak w sposób zsynchronizowanyz wyświetlaniem klatek - połowa krążka zawsze wyświetla się synchronicznie z klatką przeznaczoną dla lewego oka, drugapołowa odpowiednio zsynchronizowana jest z klatką przeznaczoną dla prawego oka) dzieli widzialne pasmo świetlne na "części"o różnym odcieniu barw. Dzięki okularom, które otrzymujemy przed seansem są one kierowane do odpowiednich oczu widza.Filtr może być automatycznie opuszczany i podnoszony, co pozwala w prosty sposób przełączać się między 3D i 2D w zależnościod rodzaju projekcji. Ze względy na łatwość instalacji technologia staje się coraz bardziej popularna.Informacje zaczerpnięte z http://www.heliosnet.pl/12,Katowice/Kino3D/technologia/www.sdjournal.org 51


PROGRAMOWANIE GRAFIKINajbardziej zaawansowaną technologią wśród okularówdwukolorowych jest opatentowana w 2000 r.technologia ColorCode 3D. Pozwala na oglądanie obrazówtrójwymiarowych w stosunkowo pełnym kolorze.Przede wszystkim dotyczy to kolorów czerwonegoi zielonego. Okulary tego typu są wyposażone w szkłokoloru bursztynowego (amber) dla lewego oka, któregozadaniem jest przekazanie jak największej informacjio kolorze obrazu. Prawy okular ma szło koloruniebieskiego. Tym kanałem przekazywana jest monochromatycznainformacje potrzebna do uzyskaniaefektu głębi. Obraz przygotowany do tego typu okularówwidoczny jest na rysunku 3, prawy.Stereoskopia a grafika 3DOczywiście aby uzyskać wrażenie głębi, musimy znaćodległości przedmiotów widocznych na scenie od wirtualnejkamery. Ale to jest informacja, która w grafice3D jest łatwa do uzyskania. Nawet po przemnożeniuwspółrzędnych modeli przez macierz rzutowania(po tej operacji położenie przedmiotów wyrażanejest we współrzędnych odpowiadających pikselom naekranie), informacja o głębi jest nadal przechowywana.Potrzebna jest, aby możliwe było przeprowadzenietestu głębi – ostatniego etapu w potoku renderowania(zob. ramka „Potok renderowania”).Na stronie http://www.fizyka.umk.pl/~jacek/dydaktyka/3d/stereoskopia.zip jest do pobrania projekt,w którym na scenie rysowana jest bryła złożonaz 27 sześcianów. Z bryły tej możemy wyjąć niektóresześciany używając klawiszy F1 – F6. Projekt przygotowanyzostał w Visual Studio 2010 dla platformyXNA 4.0. Do renderowania korzystam ze standardowegoefektu BasicEffect implementującego oświetleniePhonga i teksturowanie. Macierz rzutowania dodajedo obrazu perspektywę. Widoczna na ekranie bryłaobraca się, co możemy wyłączyć naciskając klawisz 0.Wówczas możliwe jest samodzielne obracanie nią zapomocą klawiszy kierunkowych (strzałek).Tego projektu użyjemy jako punktu wyjście dla przygotowaniaanimowanego anaglifu. Założenie poniższejimplementacji jest takie, że chcemy uniknąć ingerencjiw sposób rysowania sceny, a tym bardziejw definicje obiektów opisujących przedstawioną bryłę.Naszym celem jest przygotowanie kodu działającegoz dowolną wcześniej przygotowaną sceną i modelami,a także niezależnego od użytych do samego renderowaniaefektów HLSL. Tak, aby można było użyćponiższych rozwiązań do dowolnego projektu przygotowanegoprzez Czytelnika. To skazuje nas na potrójnerenderowanie: raz dla lewego oka, raz dla prawegoi wreszcie złożenie uzyskanych w ten sposób obrazówi ich narysowanie na ekranie, niejako w faziepost-processingu. Będziemy się jednocześnie starali,aby przedstawiony kod był jak najprostszy i łatwy dozrozumienia.Aby uzyskać dwa obrazy dla lewego i prawego oka,musimy umieścić na scenie dwie kamery (dwie osobnemacierze widoku). Odległość, w jakiej powinny znajdowaćsię kamery względem siebie powinna być równa1/30 odległości od najbliższego obiektu na scenie. Jednakjest to wartość czysto teoretyczna, od której wartozacząć własne eksperymenty. W trakcie implementacjiokazało się, że najlepszym sposobem wyznaczeniatej odległości jest metoda prób i błędów. Co więcejodległość kamer dla jednej sceny nie musi sprawdzićListing 1. Pary wielkości charakteryzujących obie kameryMatrix viewLeft = Matrix.Identity;Matrix viewRight = Matrix.Identity;RenderTarget2D renderTargetLeft;RenderTarget2D renderTargetRight;Vector3 filterLeft = new Vector3(1, 0, 0);Vector3 filterRight = new Vector3(0, 1, 1);bool cameraEnabledLeft = true;bool cameraEnabledRight = true;bool showSeparateViews = true;readonly Vector3 cameraDefaultPositionLeft = new Vector3(0.92f, 1f, 4.5f);readonly Vector3 cameraDefaultPositionRight = new Vector3(1.08f, 1f, 4.5f);Vector3 cameraPositionLeft;Vector3 cameraPositionRight;524/2011


Stereoskopia. Implementacja w XNA 4.0się, dla inaczej ustawionych aktorów. Pozostałe parametryzwiązane z ruchem kamer, a co za tym idzie ichpozycja oraz kierunek, są ściśle określone. Po pierwszeobie kamery, tak jak nasze oczy, spoglądają z różnychpozycji na ten sam punkt w przestrzeni. Po drugie,jeżeli chodzi o ich ruch musimy je potraktować, jakjeden obiekt – gdy obracamy lub przemieszczamy jednąkamerę, pozycja drugiej również musi zostać odpowiedniozmodyfikowana.Implementacja CPUZacznijmy od implementacji, w której obraz dla lewegoi prawego oka zostanie wpierw zapisany do dwóchtekstur. Skorzystamy do tego z dwóch instancji klasRenderTarget, który w XNA 4.0, to nowość, dziedziczyz klasy Texture2D. Następnie tekstury te złożymy pikselpo pikselu w jedną teksturę biorąc składową czerwonąpierwszego obrazu oraz zieloną i niebieską drugiego.Tak przygotowany obraz wyświetlimy na ekraniekorzystając z obiektu SpriteBatch (obiekt używanyw aplikacjach z grafiką 2D). Muszę jednak od razuostrzec, że składanie dwóch obrazów składającychsię np. z 800 x 600 pikseli oznacza pętlę z 480 tysiącamiiteracji. Nawet superszybki procesor CPU możetemu nie podołać w 1/60 sekundy, jaką mamy na przygotowanieobrazu. I to nawet jeżeli pętlę tą zrównoleglimykorzystając z nowej w .NET 4.0 metody Parallel.For(element biblioteki TPL). Mimo to zaczniemy odRysunek 2. Stereoskop Holmesa (źródło Wikipedia)takiej „naiwnej” implementacji, aby lepiej zrozumiećideę składania anaglifów.Zacznijmy od zdefiniowania nowych pól klasy Game1,które odpowiedzialne będą za przechowaniedwóch osobnych pozycji kamer, kolorów filtrów, czywreszcie za przechowanie referencji do obiektów-celówrenderowania, jakie użyjemy w kodzie. Przedsta-Listing 2. Inicjacja pól wymienionych w listingu 1.protected override void Initialize(){gd = graphics.GraphicsDevice;PresentationParameters pp = gd.PresentationParameters;renderTargetLeft = new RenderTarget2D(gd, pp.BackBufferWidth, pp.BackBufferHeight, false,gd.DisplayMode.Format, DepthFormat.Depth24);renderTargetRight = new RenderTarget2D(gd, pp.BackBufferWidth, pp.BackBufferHeight, false,gd.DisplayMode.Format, DepthFormat.Depth24);effect = new BasicEffect(gd);effect.VertexColorEnabled = false;effect.Projection = Matrix.CreatePerspective(2.0f * gd.Viewport.AspectRatio, 2.0f, 1.0f, 100.0f);effect.EnableDefaultLighting();cameraPositionLeft = cameraDefaultPositionLeft;cameraPositionRight = cameraDefaultPositionRight;viewLeft = Matrix.CreateLookAt(cameraPositionLeft, Vector3.Zero, Vector3.Up);viewRight = Matrix.CreateLookAt(cameraPositionRight, Vector3.Zero, Vector3.Up);}base.Initialize();www.sdjournal.org 53


PROGRAMOWANIE GRAFIKIwia je listing 1. Pola te zainicjujemy w metodzie Game1.Initialize(listing 2). Zwróćmy uwagę na definicjędwóch celów renderowania i dwóch macierzy widoku.W metodzie Update powinny znaleźć się instrukcjeobsługujące m.in. klawiaturę, którą możemy sterowaćpołożeniem kamer. W tym ich rozsunięciem. Przykład tejmetody można obejrzeć w kodzie dostępnym na wspomnianejwcześniej stronie. My natomiast przejdźmy odrazu do kluczowej metody Game1.Draw. Po zmianachpowinna ona przyjąć postać widoczną na listingu 3.Listing 3. Metoda odpowiedzialna za przygotowanie anaglifuprotected void Draw(GameTime gameTime){//Left cameragd.SetRenderTarget(renderTargetLeft);gd.Clear(Color.Black);if (cameraEnabledLeft){solid.View = viewLeft;solid.Draw();}gd.SetRenderTarget(null);//Right cameragd.SetRenderTarget(renderTargetRight);gd.Clear(Color.Black);if (cameraEnabledRight){solid.View = viewRight;solid.Draw();}gd.SetRenderTarget(null);//SuperimposingColor[] imageLeft = new Color[renderTargetLeft.Width * renderTargetLeft.Height];renderTargetLeft.GetData(imageLeft);Color[] imageRight = new Color[renderTargetRight.Width * renderTargetRight.Height];renderTargetRight.GetData(imageRight);for (int i = 0; i < imageRight.Count(); ++i) imageRight[i] = new Color(imageLeft[i].ToVector3() * filterLeft +imageRight[i].ToVector3() * filterRight);Texture2D zlozenie3D = new Texture2D(gd, renderTargetRight.Width, renderTargetRight.Height);zlozenie3D.SetData(imageRight);spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, null, DepthStencilState.Default, null);spriteBatch.Draw(zlozenie3D, new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height),Color.White);if (showSeparateViews){spriteBatch.Draw(renderTargetLeft, new Rectangle(0, 0, Window.ClientBounds.Width / 4, Window.ClientBounds.Height / 4), Color.White);spriteBatch.Draw(renderTargetRight, new Rectangle(3 * Window.ClientBounds.Width / 4, 0, Window.ClientBounds.Width / 4, Window.ClientBounds.Height / 4), Color.White);}spriteBatch.End();}base.Draw(gameTime);544/2011


Stereoskopia. Implementacja w XNA 4.0Rysunek 3. Anaglify - obrazy przygotowane dla okularów dwukolorowych. Od lewej: czerwony-cyjan, czerwony-niebieski i okularówColorCode3D (bursztyn-niebieski).Metoda ta zbudowana jest z trzech bloków. Dwapierwsze, odpowiedzialne za renderowanie scenyz pozycji lewego i prawego oka, są bliźniaczo podobne.W każdym ustawiany jest cel renderowania,czyszczony jego bufor, ustawiana macierz widokuzgodnie z pozycją lewej i prawej kamery i wreszciewywoływana jest metoda odpowiedzialna za rysowaniebryły. W efekcie powstają dwie tekstury.Następnie przechowywane w nich piksele kopiujemydo dwóch jednowymiarowych tabel z elementamitypu Color i składamy w jeden obraz z odpowiedniozmieszanymi składowymi RGB. Owo składanie towyróżniona w kodzie pętla, której wykonanie zajmujeniemal cały używany przez program czas procesoraCPU. Wobec tego z pewnością warto ją zrównoleglić,choćby używając metody Parallel.For, nowościw platformie .NET 4.0:Uzyskany w ten sposób obraz wyświetlamy na całymobszarze okna korzystając z obiektu SpriteBatch. Dodatkoworysujemy w jego górnych rogach obie pierwotnetekstury z widokami sceny z pozycji lewegoi prawego oka.W powyższym kodzie nie ma tak naprawdę niczegozaskakującego lub nowatorskiego. Co gorsze, jegowykonanie, nawet po zrównolegleniu, zajmujewięcej czasu, niż czas miedzy kolejnymi wywołaniamimetod Update i Draw. Przez to własność GameTime.IRunningSlowlyjest permanentnie włączona. Mimoto efekt, jaki zobaczymy na ekranie, oczywiściepomijając przestoje związane z problemami z wydajnością,jest naprawdę zadowalający. Zobaczymy naekranie obraz analogiczny do tego widocznego na rysunku3 (lewy). Możemy więc nałożyć okulary i sprawdzićczy pojawi się wrażenie głębi.Kolor filtrów użytych do składania obrazu możemydobrać modyfikując inicjacje pól filterLeft i filterRight.W tej chwili jest to czerwień i cyjan (por. listing 1 i rysunek4). Dla okularów czerwono-niebieskich kolory filtrówpowinny być następujące:Vector3 filterLeft = new Vector3(1, 0, 0);Vector3 filterRight = new Vector3(0, 0, 1);Jak widać z rysunku 3, środkowy filtry czerwony i niebieskistosowane razem nie zapewniają poprawnegoodwzorowania kolorów. Kolory tych filtrów nie są dopełniające(ich sumą nie jest biel). W przypadku okularówbursztynowo-granatowych (ColorCode 3D) filtrypowinny być natomiast następujące:Parallel.For(0, imageRight.Count(), i => {imageRight[i] = new Color(imageLeft[i].ToVector3() * filterLeft + imageRight[i].ToVector3() * filterRight);});Vector3 filterLeft = new Vector3(0.85f, 0.85f, 0.3f);Vector3 filterRight = new Vector3(0.15f, 0.15f, 0.7f);Z CPU do GPUMimo swojej prostoty i niezawodności przedstawionapowyżej metoda ma jedną zasadniczą i dyskwalifikującąją wadę – pętla po tekselach, której zadaniemjest złożenie obu tekstur, jest zabójcza dla wydajnościcałego programu. Nie pomaga nawet wykorzystaniewszystkich rdzeni CPU. Co więc możemy zrobić?Przenieśmy te obliczenia na GPU. Tam zamiast kilku,będziemy mieli kilkaset rdzeni. To jest w końcu procesorprzystosowany do masywnie równoległych obliczeń.Aby wykorzystać GPU w XNA musimy przygotowaćefekt – program napisany w języku HLSL. To język bliskospokrewniony z C, ale zawierający dodatkowewbudowane typy (m.in. wektory dwu-, trój- i czteroelementowe,macierze o takich rozmiarach i funkcje operującena tych typach), a ponadto mechanizm semantykokreślający z jaką własnością werteksu związanawww.sdjournal.org 55


PROGRAMOWANIE GRAFIKIRysunek 4. Obraz z lewej i prawej kamery po nałożeniu ltrów czerwonego i cyjanowego.jest deklarowana zmienna. W efekcie powinny znaleźćsię co najmniej dwie funkcje: shader werteksówzajmujący się obróbką poszczególnych werteksów wysłanychz aplikacji oraz shader pikseli wywoływany dlakażdego piksela rysowanej bryły (zob. ramka „Potokrenderowania”).Kod efektu, który powinniśmy dodać do podprojektuStereoscopyContent (plik typu Effect file z rozszerzeniem.fx) widoczny jest na listingu 4. Jego zasadnicząfunkcją jest zastąpienie pętli widocznej na listingu 3.W tym celu musimy do pamięci karty graficznej przesłaćobie tekstury uzyskane w dwóch pierwszych przebiegachrenderowania. Dlatego efekt zaczyna się oddefinicji dwóch parametrów – tekstur oraz związanychz nimi próbników. Następnie zdefiniowane są dwa filtry– dla lewego i prawego okularu. Po nich znajdujesię struktura opisująca werteks. W zasadzie potrzebnajest nam jedynie współrzędna teksturowania tj. wyrażonew pikselach położenie na teksturze (semantykaTEXCOORD0), ale musimy również dodać współrzędnepołożenia werteksu (semantyka POSITION0) wyrażonew układzie własnych modelu – tego domagaćbędzie się kompilator. Nie będziemy ich jednak używać.Naszym prawdziwym „inputem” będą bowiem niewerteksy, a piksele dwóch tekstur.Przyjrzyjmy się teraz funkcjom VS i PS. To one będąwykonywane przez Vertex i Pixel Shadery. FunkcjaVS to w zasadzie nic interesującego – przekazujejedynie werteksy do interpolatora i pasteryzatora niemodyfikując ich w żaden sposób. Argumentem funkcjiPS są zinterpolowane współrzędne. Nas interesują tylkowspółrzędne teksturowania, które umożliwiają odczytaniewłaściwych tekselów z obu tekstór. I to właśnierobią dwie pierwsze instrukcje funkcji PS (wywołaniafunkcji tex2D). Dalsza część kodu odpowiada zawartościpętli z listingu 3. Miesza teksele z obu teksturz wagami odpowiadającym użytym filtrom. W przypadkuokularów czerwono-cyjanowych, mieszanie to pole-Potok renderowaniaShadery werteksów i shadery pikseli to programowalne jednostki kart graficznych. Tymi samymi nazwami określane są równieżwykonywane przez nie funkcje (u nas są to odpowiednio VS i PS). Danymi wejściowymi shadera werteksów są własności werteksuprzesłane z aplikacji lub odczytane z bufora werteksów. W typowych sytuacjach, ale nie w naszym przykładzie, zadaniemfunkcji shadera werteksów jest przeliczenie położenia werteksu ze współrzędnych modelu, poprzez współrzędne sceny do układuodniesienia kamery. Oznacza to ich przemnożenie kolejno przez macierz świata, widoku i rzutowania. Przeliczone położenietrafia do rasteryzatora, który odpowiada za przydzielenie pikseli do trójkątów. To dzięki rasteryzatorowi do shadera pikseli trafiająnie tylko trzy piksele odpowiadające wierzchołkom każdego trójkąta, ale także wszystkie piksele z jego wnętrza. Pozostałewłasności werteksu, a więc w naszym przypadku tylko współrzędne teksturowania, trafiają do interpolatora. Dokonuje on interpolacjitych wielkości dla wszystkich pikseli wewnątrz trójkątów. Tak interpolowane dane o werteksie stanowią dane wejścioweshadera pikseli, który jest odpowiedzialny przede wszystkim za ustalenie ostatecznego koloru każdego piksela. W kartach graficznychzgodnych z DirectX 10 podział na jednostki uruchamiające shadery pikseli i werteksów stał się umowny. Jednostki są terazuniwersalne i mogą być przydzielane dynamicznie do jednego, bądź do drugiego zadania. Ponadto w DirectX 11 pojawił sięjeszcze shader geometrii, który pozwala na dodawanie i usuwanie werteksów. Jednak nie jest on jeszcze niestety obsługiwanyw XNA. Cały proces renderowania został schematycznie przedstawiony na rysunku 5. Pamiętajmy jednak, że niekoniecznie musion skończyć wyświetleniem obrazu na ekranie. W naszym programie – zamiast wyświetlać na ekranie, obraz będzie on także zapisywanydo tekstur – zastępczych celów renderowania.564/2011


Stereoskopia. Implementacja w XNA 4.0ga na użyciu składowej czerwonej pierwszej teksturyi składowych zielonej i niebieskiej drugiej. Wartościąfunkcji PS jest kolor, który użyty zostanie do rysowaniaw miejscu określonym przez współrzędne 3D, którychwprawdzie jawnie nie używamy, ale które odpowiadająpołożeniu tekseli w oryginalnych teksturach (obie teksturymają rozmiar ekranu). Oznacza to, że efektu powinniśmyużyć do rysowania na kwadracie dokładniewypełniającym ekran. Tak też zrobimy.Aby użyć powyższego efektu w programie zdefiniujmypole typu Effect:Effect superimposingEffect;Następnie w metodzie Game1.LoadContent wczytujemynowy efekt poleceniem:superimposingEffect = Content.Load("StereoscopyEffect");Pozostaje jedynie przygotować kwadrat przesłaniającyekran. Jego werteksy są następujące:VertexPositionTexture[] werteksyEkranu = new{VertexPositionTexture[4]new VertexPositionTexture(new Vector3(-1, 1, 0f), newVector2(0, 0)),Listing 4. Zapisany w pliku StereoscopyEffect.fx kod efektuodpowiedzialny za złożenie i wyświetlenie teksturtexture TextureLeft;sampler TextureSamplerLeft = sampler_state{texture = ;magfilter = POINT;minfilter = POINT;mipfilter = POINT;AddressU = Clamp;AddressV = Clamp;};texture TextureRight;sampler TextureSamplerRight = sampler_state{texture = ;magfilter = POINT;minfilter = POINT;mipfilter = POINT;AddressU = Clamp;AddressV = Clamp;};float3 FilterLeft = float3(1,0,0);float3 FilterRight = float3(0,1,1);struct Vertex{float4 Position : POSITION; //it's not usedfloat2 TexCoord : TEXCOORD0;};Vertex VS(Vertex input){Vertex output;output.Position = input.Position;output.TexCoord = input.TexCoord;return output;} float4 PS(Vertex input): COLOR0{float4 texelLeft = tex2D(TextureSamplerLeft,input.TexCoord);float4 texelRight = tex2D(TextureSamplerRight,input.TexCoord);}float4 color;color.rgb = FilterLeft*texelLeft +FilterRight*texelRight;color.a = 1;return color;Rysunek 5. Uproszczony schemat potoku renderowania. Nie maw nim shadera geometrii, do którego i tak jednak nie ma jeszczedostępu w XNA 4.0technique Technique1{pass Pass0{VertexShader = compile vs_2_0 VS();PixelShader = compile ps_2_0 PS();}}www.sdjournal.org 57


PROGRAMOWANIE GRAFIKIListing 5. Ostateczna postać metody Drawprotected void Draw(GameTime gameTime){//Left cameragd.SetRenderTarget(renderTargetLeft);gd.Clear(Color.Black);if (cameraEnabledLeft){solid.View = viewLeft;solid.Draw();}gd.SetRenderTarget(null);//Right cameragd.SetRenderTarget(renderTargetRight);gd.Clear(Color.Black);if (cameraEnabledRight){solid.View = viewRight;solid.Draw();}gd.SetRenderTarget(null);//SuperimposingsuperimposingEffect.CurrentTechnique = superimposingEffect.Techniques[0];superimposingEffect.Parameters["TextureLeft"].SetValue(renderTargetLeft);superimposingEffect.Parameters["TextureRight"].SetValue(renderTargetRight);superimposingEffect.Parameters["FilterLeft"].SetValue(filterLeft);superimposingEffect.Parameters["FilterRight"].SetValue(filterRight);foreach (EffectPass pass in superimposingEffect.CurrentTechnique.Passes){pass.Apply();gd.DrawUserPrimitives(PrimitiveType.TriangleStrip, werteksyEkranu, 0, 2);}if (showSeparateViews){spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, null, DepthStencilState.Default, null);spriteBatch.Draw(renderTargetLeft, new Rectangle(0, 0, Window.ClientBounds.Width / 4, Window.ClientBounds.Height / 4), Color.White);spriteBatch.Draw(renderTargetRight, new Rectangle(3 * Window.ClientBounds.Width / 4, 0, Window.ClientBounds.Width / 4, Window.ClientBounds.Height / 4), Color.White);spriteBatch.End();}}base.Draw(gameTime);584/2011


Stereoskopia. Implementacja w XNA 4.0new VertexPositionTexture(new Vector3(1, 1, 0f), newVector2(1, 0)),new VertexPositionTexture(new Vector3(-1, -1, 0f), newVector2(0, 1)),new VertexPositionTexture(new Vector3(1, -1, 0f), newVector2(1, 1))};Po tych przygotowaniach możemy użyć nowego efektudo połączenia tekstur i ich wyświetlenia. W tymcelu należy zmodyfikować końcówkę metody Game1.Draw(listing 5). Po tej zmianie nie będzie jużz pewnością problemu z nienadążaniem za częstościąodświeżania. Program zaczyna działać płynnie,a jednocześnie użycie CPU spada niemal do zera.Nasza implementacja animowanego anaglifu jesttrójprzebiegowa. Dwa razy wywoływany jest standardowyBasicEffect i na koniec napisany samodzielnieStereoscopyEffect. Nie wątpię, że korzystając z różnychtrików można by ilość przebiegów ograniczyćdo dwóch. Szczególnie jeżeli skorzystamy z mieszaniakolorów (alpha blendingu), który jednak narzucapewne ograniczenia w sposobie rysowania sceny. Naszaimplementacja jest wolna od tych założeń, a jednocześniena tyle ogólna, że może być bez trudu użytaw dowolnym programie XNA. Wszystko dzięki temu,że dwa pierwsze przebiegi mogą być zrealizowanew zupełnie dowolny sposób.Więcej w sieci• http://theinstructionlimit.com/?p=123 – Strona gry Hyper-CUBE, która była naszą inspiracją, a blog jest twórców –przewodnikiem.WOJCIECH STAŃCZYK, JACEK MATULEWSKIWojciech Stańczyk - Programista pracujący na co dzień w rmie DOT.NET (http://www.dot.net.pl), gdzie zajmuje się tworzeniemrozwiązań programistycznych dla platformy Microsoft .NET. Poza pracą stale rozwija swoje umiejętności w zakresie programowaniagraki komputerowej, w tym efektów stereoskopowych. Od ponad 12 lat wielki pasjonata chińskich sztuki walki Kung FuTang Lang Men.Jacek Matulewski - Fizyk zajmujący się na co dzień optyką kwantową i układami nieuporządkowanymi na Wydziale Fizyki,Astronomii i Informatyki Stosowanej Uniwersytetu Mikołaja Kopernika w Toruniu. Jego specjalnością są symulacje ewolucjiukładów kwantowych oddziaływujących z silnym światłem lasera.Od 1998 interesuje się programowaniem dla systemu Windows. Ostatnio zainteresowany platformą .NET i językiem C#. Wiernyużytkownik kupionego w połowie lat osiemdziesiątych "komputera osobistego" ZX Spectrum 48k.Artykuł jest fragmentem pracy magisterskiej WS napisanej pod kierunkiem JM.www.sdjournal.org 59


TESTOWANIE OPROGRAMOWANIACzy zauważyłeś goryla?Praktyczne umiejętności dostrzegania błędów aplikacjiJakość jest ważna, zgoda? Nie tylko jako dobro luksusowe,ale przede wszystkim jako sposób na podniesieniewydajności i na to, aby budowanie aplikacji było łatwiejsze,skuteczniejsze i przyjemniejsze. Wiele jest sposobówzapewnienia jakości, niektóre bardzo wyrafinowane, ale nicnie zastąpi podstawowej umiejętności SPRAWDZANIA, czy to,co zrobiono, zrobiono dobrze. Sprawdzać muszą programiści, projektanci,analitycy i użytkownicy, no i oczywiście zawodowi sprawdzacze - testerzy.Na każdym poziomie, podczas każdego kroku wytwarzania.Dowiesz się:• Dlaczego tak łatwo nie zauważyć czegoś ważnego?• Testowanie staromodne i testowanie agile• Jak mieć dokumentację, ale jej nie robić?• Jak zrobić ekologiczny projekt - dbałością o środowiska!• Kim są eksploracyjni pogromcy błędów i goryli?Powinieneś wiedzieć:• Jak się programuje?• Ile kosztują ukryte błędy?• Z czym są w projektach wieczne kłopoty?• Dlaczego ludzie się sprzeczają i nie lubią robić dokumentacji?• Czego zwykle brakuje w środowiku testowym?Kto nie zauważył goryla?Proszę uruchomić sobie film www.dogonews.com/2010/7/19/video-of-the-week-can-you-spot-the-gorillai odpowiedzieć na pytanie: ile razy podają do siebiepiłkę zawodniczki w białych strojach?Nie wiem, jak czytelnik, ale większość obserwatorówtego filmu – tak jest, większość! – w ogóle nie zauważagoryla, tak jest skoncentrowana na niełatwym zadaniuliczenia podań. Jeśli jednak instrukcja eksperymentatorakaże skoncentrować się nie na liczeniu podań, leczna poszukiwaniu czegoś niezwykłego, wynik jest zupełnieinny – zdecydowana większość zauważa goryla.To samo odnosi się do ważnego i modnego w ostatnimczasie tematu jakości oraz testowania aplikacji,niezależnie od tego, czy testerem jest:• doświadczony programista, szukający błędów– cytuję: „w sytuacji, gdzie nawet Power Mockitonie jest w stanie zmokować klas, bowiem sąone w taki sposób finalizowane, że mokowanie poprzezoszukanie classloadera nie działa”…• … czy też użytkownik końcowy, na przykład aktuariuszzajmujący się „zagadnieniami modelowaniarozkładu łącznej wartości szkód w modelu ryzykałącznego lub indywidualnego”.Obaj, lub obie, mogą goryla przeoczyć, dopuścić doużytku błędną aplikację. Co zrobić, aby to ryzykoograniczyć?Najważniejsze jak się kończy,a nie jak się zaczyna!Wiele jest ciekawych pozycji na temat projektowaniatestów – jak to zrobić, aby paroma tysiącami dobrzedobranych testów miarodajnie sprawdzić program,który będzie używany przez tysiące osób na setki milionówróżnych sposobów? Drugi popularny temat tozarządzanie procesem zapewnienia jakości.604/2011


Czy zauważyłeś goryla?Ten artykuł zajmuje się sprawą podstawową, choćzaniedbywaną i w teorii, i w praktyce: jak dobrze wykonywaćtesty? Tak, aby zauważyć błędy, aby nieprzegapić goryla! Nawet najbardziej wyszukane metodyprojektowania testów i najgenialniejsze zarządzaniesame błędów nie wychwycą – zrobi to dopiero wykonywanietestów.Wykonywanie testówa sposób tworzenia aplikacjiChoć specjaliści od testowania z upodobaniem i niebez racji podkreślają, że sztuka testowania to niezależna,samodzielna dziedzina, a nie ubogi krewny programowaniaczy zarządzania projektami, to jednakskuteczny sposób testowania zależy w dużym stopniuod tego, jak się tworzy oprogramowanie.Na przykład pod pewnymi względami testowaniejest łatwiejsze w tradycyjnych, gęsto udokumentowanychprojektach realizowanych metodą kaskadową,bowiem jest tam czas na względnie staranne przygotowaniespecyfikacji i procedur testowych, dzięki czemumniejszy ciężar spoczywa na samym ich wykonywaniu.Z drugiej strony, testowanie bywa łatwiejsze w metodachzwinnych (agile, np. popularny dziś SCRUM),bowiem:• Czas, jaki upływa między pisaniem kodu a jegotestowaniem, jest znacznie krótszy, dzięki czemuwykonując testy, wciąż jeszcze pamięta się, coi dlaczego zostało zaprogramowane.• Testując wielokrotnie i już od początku projektu,jest się mniej narażonym na chroniczne w tradycyjnychprojektach zjawisko eksplozji wykrywaniabłędów na samym końcu, tuż przed wdrożeniem.• Przy podejściu zwinnym słabszy zwykle bywa takzwany „efekt walca” 1 , polegający na zwalaniu całejodpowiedzialności za szukanie błędów na działający- pięć minut przed dwunastą - zespół testowy.Ryzyko i priorytetyAby uniknąć sytuacji, kiedy dużego goryla dostrzegamyw ostatniej chwili, trzeba znać, co dla odbiorcy, dlaużytkownika aplikacji jest najważniejsze, i to testowaćprzede wszystkim, już na początku. Jeśli tego nie wiadomo,testowanie jest chaotyczne, nerwowe, a w takiejsytuacji niejeden goryl zostanie przeoczony – ze szkodądla wszystkich. Aby tego uniknąć, potrzeba przedewszystkim znakomitej współpracy między programistami,projektantami, analitykami systemu i klientem, a jakz tym zwykle jest – dobrze wiemy 2 . Tutaj znów metodyagile mogą się wydawać – zwłaszcza programistom– cudownym rozwiązaniem, ale powiedzmy sobie: agilenie jest lekarstwem na wszystko. Zleceniodawcy biznesowimuszą się nauczyć precyzyjnie formułowaćswoje wymagania, a z drugiej strony, programiści musząsię nauczyć lepiej słuchać zleceniodawców. Razem,najłatwiej dostrzec goryla!Tyle dokumentacji, że brak czasu na pracęPoważną przeszkodą w dostrzeganiu goryli jest koniecznośćdokumentowania testów: pisanie raportów,tworzenie logów, zgłoszeń błędów… Przecież ten, ktojest pochylony nad formularzem raportowania goryli,ten ich nie obserwuje! Miłośnicy dokumentacji podkreślają,że bez odpowiedniej papierologii w projektachszerzy się chaos i marnotrawstwo – i wiele w tym racji.Z drugiej strony, przeciwnicy dokumentacji podnosząfakt, że – jak głosi manifest agile 3 – „cenimy działająceoprogramowanie bardziej niż obszerną dokumentację”,a papierologia jest czasem wyrazem organizacyjnejsklerozy i nerwicy, a nie rzeczową potrzebą.Jak pogodzić te sprzeczne racje, jak sprawić, abywilk był syty, a owca cała? Jedna jest na to rada: przywrócićniewolnictwo. Wtedy Panowie 4 będą testować,a niewolnicy – notować i raportować. Skoro jednakniełatwo przyjdzie przepchnąć stosowną ustawęprzez Sejm, tedy pozostaje drugie wyjście – automatyzacja.Pewna znana firma informatyczna, której głównasiedziba mieści się, jak należy, w Kalifornii, ma jedenz działów tworzenia swego zaawansowanego oprogramowaniaw miejscu mniej popularnym: w Nowosybirsku5 . Kiedyś, gdy gościliśmy właściciela tej firmyw Warszawie na comiesięcznym spotkaniu SPIN 6 ,uruchomił on swoją przenośną „dyrektorską deskęrozdzielczą” 7 i powiedział – było to w poniedziałek wieczorem:„oho, w Nowosybirsku znów balowali w sobotęi w niedzielę!”. Krzywe błędów z automatycznie rejestrowanychwyników automatycznych testów statycznychoraz jednostkowych szły ostro w górę dla po-1Od słów piosenki Młynarskiego „Przyjdzie walec i wyrówna” – chałupnicze tłumaczenie znanego określenia Hansa Schaefer’a „testing is nota vacuum-cleaner”, użytego w artykule „What a Tester Must Remember Even After Midnight”.2Zwykle jest kiepsko.3Manifesto for Agile <strong>Software</strong> Development: http://agilemanifesto.org/4Panie także, oczywiście!5Osoby, które zgadną, o jaką firmę chodzi, proszone są o przysłanie maila na adres autora: bogdan@victo.eu w celu otrzymania nagrody.6SPIN Warszawa: www.spin-warszawa.pl.7CEO dashboardwww.sdjournal.org 61


TESTOWANIE OPROGRAMOWANIAniedziałkowej produkcji… I na tym koniec: kierownictwonie musiało marudzić, a programiści – narzekać,nikt nie marnował czasu na ręczne piszanie sążnistychraportów. Automatyczne testy spowodowały, żebłędów po prostu nie dało się przeoczyć, a więc i musiałosię je naprawić. Ten przykład nie wymaga chybakomentarza.Tylko uwaga – powyższy akapit jest wprawdzie bezkrytycznąi entuzjastyczną pochwałą automatycznegoraportowania, ale niekoniecznie – automatycznego testowania!Na pewno względnie nietrudno jest napisaćprogram, analizujący GUI pokazanego na początku filmutak, aby automatycznie rejestrować liczbę podańpiłki, ale napisanie programu, który dorównałby człowiekowiw dostrzeganiu wchodzących na boisko nieoczekiwanychgoryli, to niemożliwe przedsięwzięcie.Bo przecież zamiast goryla na boisko może wejść żółwalbo żyrafa, a może wjechać tramwaj? – nie da się tegorodzaju logiki zaimplementować w kodzie. Nic w roliwykrywacza goryli nie zastąpi człowieka – więc tymbardziej trzeba te unikalne ludzkie możliwości chronić,przy pomocy automatyzacji, przed marnowaniem ichdo rutynowej, łatwej do zautomatyzowania pracy – raportowaniai dokumentacji.Testowanie a debugowanieDwaj bracia?Kiedyś, w średniowieczuinformatyki – w latach50-ych i 60-ych minionegowieku – testowaniei debugowaniebyło niczym bracia bliźniacy:wykonywano jenaprzemiennie i jedenproces płynnie przechodziłw drugi.Dziś są jako Ezaw i Jakub: nadal bliźniacy, ale zaplątaniw chroniczny konflikt.Wracając do naszego similis 8 przykładu z gorylem:dostrzeganie goryla to testowanie, a jego złapaniei wyprowadzenie poza boisko – to już debugowanie.Jeśli jedno i drugie ma robić ta sama osoba, to jasne,że łapiąc jednego goryla, mało mamy czasu na uważneobserwowanie, czy na boisku nie ma innych goryli,zaś obserwując – nie łapiemy, czyli jedna czynnośćzabiera czas drugiej. Ponadto, umiejętności niezbędnedo łapania i usuwania goryli są czasem zupełnie inne,niż te pomocne do skutecznej obserwacji, co bywajedną z przyczyn tradycyjnych konfliktów między programistamia testerami.Żeby szukanie błędów w aplikacjach nie było tylkosztuką dla sztuki, ale dawało możliwość ich poprawienia,konieczne jest sprawne debugowanie i dobrawspółpraca tych, co sprawdzają, z tymi, co naprawiają.Jak z tym bywa w rzeczywistości, dobrze wiemy:każdy programista z lubością zacytuje liczne przykładyzgłoszeń błędów, które były głupie albo niejasne,zaś każdy tester albo użytkownik oprogramowaniaodpowie równie licznymi przykładami, kiedy programiścizasłaniali się tym, że nie są w stanie odtworzyćawarii, albo poświęcali dużo energii, by wykazać,że oczywisty błąd jest… poprawnym działaniem. Takiegry i zabawy nazywa się niekiedy „ping-pongiemzgłoszeń błędów”. Zabierają one czas wszystkim, psująatmosferę, a na pewno nie służą skuteczności anisprawności.Cytowane powyżej „nie da się odtworzyć błędu- u nas działa” nie musi świadczyć o złej woli programistów,lecz o tym, że pewne błędy programu mogąsię pojawiać w formie awarii w pewnych tylko środowiskachlub konfiguracjach, a w innych – pozostawaćw utajeniu.Teoria „testologii” niewiele mówi na ten temat, alew praktyce to własnie kwestie środowiska, konfiguracjioraz danych testowych są przyczyną większości awarii,a sprawy z nimi związane pochłaniają nawet ponadpołowę czasu i zasobów, wykorzystywanych do zapewnieniajakości.ŚrodowiskoZwykle w projektach IT mamy do czynienia z co najmniejtrzema typami środowisk: środowiskiem wytwarzania,gdzie pracują programiści, środowiskiem testowym,gdzie wykonuje się większość testów, oraz środowiskiemdocelowym. Różnice między nimi są przyczynąwielu kosztownych i czasochłonnych kłopotów.Jeśli środowisko testowe nie jest identyczne z programistycznym,wówczas testerzy często zgłaszająawarie, których programiści nie są w stanie odtworzyć– aby to zrobić, muszą swoje debugowanie przenieśćna środowisko testowe. Czy to stwarza szeregtrudności? – oczywiście, że tak. Byłem kiedyś testeremw projekcie, gdzie zastawszy rano na w laboratoriumtestowym kilku programistów, zajętych debugowaniem,wiedziało się, że tego dnia niewiele uda sięprzetestować. Zacząłem więc przychodzić do pracywcześniej – wtedy cierpieli programiści, którzy nie moglidebugować. Około godziny piątej rano kierownictwoprojektu dostrzegło problem i znalazło rozwiązanie– poniewczasie, bo nie uwzględniono go przy planowaniuprojektu.Jeśli z kolei środowisko, konfiguracje i dane testowenie są identyczne z docelowymi, mamy inne kłopoty,często jeszcze bardziej dotkliwe. Mało jest na świecierzeczy gorszych, niż wypuścić starannie przete-8Similis (łac.) - małpi624/2011


Czy zauważyłeś goryla?stowane oprogramowanie po to, by przekonać się, żeu klienta nie działa.Dla dużych, złożonych czy wręcz rozproszonychaplikacji budowa, konfiguracja i dostęp do środowiskatestowego, dostęp do danych produkcyjnych (bywająpoufne), odpowiednie uprawnienia dla testerów-użytkowników,odpowiedzialność za środowisko – niejednemusen z oczu spędzają.Nie w każdym środowisku występują te same goryle!Biologowie wyróżniają goryle górskie, nizinne, zachodnie…Nieustraszeni, eksploracyjnipogromcy goryliJak być spostrzegawczym i zauważać goryle? Jakoinformatyk oraz, niestety! – psycholog, co mi nieraz zarzucano, miałbym teraz wielką ochotę zaserwowaćCzytelnikom serię przerażających tematów, takichjak tak zwana uważność (mindfulness), buddyzm,psychologia pozytywna, teorie motywacji, psychologiapoznawcza, teorie nacisku grupowego, kreatywność,typy osobowości… ale proszę zachować spokój.Wprawdzie nadal jestem zdania, że te psychologiczneczynniki mają dla umiejętności spostrzegania błędówznaczenie co najmniej równie duże, co znajomość stosownychtechnologii lub zasad biznesowych, ale naszczęście istnieje metoda testowania aplikacji, któraw sporym stopniu wykorzystuje zdobycze psychologii:testowanie eksploracyjne.Historia eksploracjiW roku 1999 pojawiła się kultowa dziś pozycja trzechautorów: Cema Kanera, Hunga Q. Nguena oraz JackaFalka Testing Computer <strong>Software</strong>.Książka Cem Kaner Hung Q. NguenJej autorzy wyłożyli zasady podejścia do testowania,które nazwali „testowaniem eksploracyjnym”, a którenajkrócej definiuje się jako jednoczesne uczenie siędziałania aplikacji, wykonywanie testów i projektowanietestów.Zalety eksploracjiGłówne zalety podejścia eksploracyjnego to:• znacznie krótsze przygotowania (nie tworzy sięspecyfikacji testów)• szybkie znajdowanie najważniejszych błędów (testowaniepolega na swego rodzaju inteligentnejzabawie testowaną aplikacją lub jej elementami)• więcej radości oraz intelektualnej stymulacji, niżprzy wykonywaniu testów zaprojektowanych zawczasu.James Bach, inny znany guru testowaniaeksploracyjnego 9 , pisze: „Testowanieeksploracyjne to silna i dającawiele radości metoda testowania.W pewnych okolicznościach bywao rząd wielkości skuteczniejszaniż testowanie tradycyjne, przy użyciuspecyfikacji.Nie ma chyba testera, który nigdy nie zastosowałpodejścia eksploracyjnego – choćby intuicyjnie. Mimoto, niewiele jest badań w tej dziedzinie, i nie cieszy sięona zbyt wielkim poważaniem.Czas najwyższy, aby skończyć z oporem wobec tejmetody, i aby publicznie uznać ją za to, czym jest: naukowymmyśleniem w czasie rzeczywistym. Przyjaciele– testowanie eksploracyjne jest dobre!” 10Jak to zrobić w praktyce?Testowania eksploracyjnego trudno nauczyć sięz podręczników, ono wymaga przede wszystkim treningu.Osoby zainteresowane bez trudu znajdą liczneangielskojęzyczne źródła w Internecie. Po treningpraktyczny zwykle trzeba wybierać się do Stanów, alejuż wkrótce będzie okazja zrobić to w Polsce, miejmynadzieję, że nie ostatnia. W kwietniu w Warszawiei we Wrocławiu odbędą się dwudniowe praktyczne treningitestowania eksploracyjnego, prowadzone przeztrenera z firmy, należącej do jednego z trzech ojcówzałożycielipodejścia eksploracyjnego, Hunga Q. Nguena.Do zobaczenia na treningu!Nawet jeśli nie masz czasu na ten trening, SPIN Warszawazaprasza 4 kwietnia o godzinie 19:00 na spotkaniez wice-prezesem firmy LogiGear, MichaelemHackettem, na temat testowania eksploracyjnego(www.spin-warszawa.pl).BOGDAN BEREZA-JAROCINSKIKontakt z autorem: bogdan@victo.eu9Specjalność Jamesa Bacha to tak zwane „zarządzanie testowaniem w sesjach” (session-based test management) – swoista metoda organizacjitestów eksploracyjnych.10http://www.satisfice.com/articles/what_is_et.shtmlwww.sdjournal.org 63


TESTOWANIE OPROGRAMOWANIAKariera w testachoprogramowaniaArtykuł kierowany jest do osób, które są na etapie wyboruodpowiedniej dla siebie ścieżki rozwoju w branży ITlub zastanawiają się nad zmianą dotychczasowej drogizawodowej. Chciałbym im przybliżyć obszar testów, głównezadania testera, miejsce zespołu testów w organizacji. Pokażę,co ciekawego w tym zespole można znaleźć dla siebie.Dowiesz się:• Gdzie zacząć karierę w testach• Jakie są role i specjalizacje w zespole testowym• Jak może przebiegać kariera w testachPowinieneś wiedzieć:• Jak realizowany jest projekt informatycznyTestowanie – parę słów o …Testowanie systemów informatycznych jest końcowymetapem procesu dostarczania oprogramowania. Generalniemożna powiedzieć, że testy realizują potrzebęzapewnienia jakości tworzonego produktu. Stanowiąpunkt kontrolny, w którym następuje ocena przydatnoścido użycia. Jeśli chce się stworzyć rozwiązanie informatyczne,które będzie realizowało wymagania klientai na określonym poziomie wspierało jego biznes, toniezbędne jest testowanie. Wiele firm przekonało się,że warto zainwestować w testowanie zamiast ponosićkoszt odbudowy wizerunku czy zaufania klientów.Miejsce zespołu testówZespół testów może występować w kilku miejscach,jest to zależne od specyfiki organizacji. W zasadzieobowiązkowo taki dział powstaje u producentaoprogramowania. Niezależnie czy tworzy się produkt„z pudełka” czy szyje się go na miarę - pod wymaganiaklienta, pierwszym miejscem, w którym potwierdzasię zgodność cech produktu z oczekiwaniami jest wewnętrznakomórka testów. Czasem usługi takie będąoferowane również klientom. Komórki testów powstająteż w firmach, które pełnią rolę integratora w projektachinformatycznych.Kolejnym miejscem, w którym tworzy się dział testówjest organizacja, która występuje na rynkuoprogramowania w charakterze klienta. Mam tu na myślizwłaszcza firmy czy instytucje, które posiadają dużeśrodowiska systemów informatycznych, gdzie funkcjonujązłożone procesy zarządzania IT. Zależnie od specyfikifirmy komórki testów mogą być umiejscowionew strukturach biznesowych, bądź po stronie technicznejorganizacji.W pierwszym przypadku taki zespół najczęściej będzieodpowiedzialny za testy akceptacyjne. Nacisk będziepołożony na weryfikację poprawności rozwiązaniaz punktu widzenia operacji biznesowych. Celem testówbędzie walidacja przydatności oprogramowaniaw oparciu o wymagania biznesowe. Testerzy będą potrzebowaćznajomości procedur i procesów biznesowychoraz wiedzy o oczekiwaniach klientów – względemfirmy, świadczonych przez nią usług, czy sprzedawanychproduktów. Od takiego zespołu nie wymagasię szerokiej wiedzy technicznej. Oczywiście, będzieona przydatna, ale nie jest niezbędna. Ich roląjest ocenić stopień przydatności oprogramowania dowsparcia funkcji biznesowych. Zadania techniczne będąw takim modelu przeniesione na specjalistów z innychkomórek.W innej sytuacji, możemy mieć do czynienia z zespołemtestów utworzonym po stronie IT. Jego zadaniembędzie wykonanie testów technicznych np. systemowych,integracyjnych czy wydajnościowych. Zespółbędzie bardziej zorientowany na sprawdzenie czy produktspełnia założenia opisane w specyfikacji technicznej,czy realizuje poprawnie procesy systemowe, czykomponenty składowe rozwiązania mają zgodne z założeniamiparametry. W takim zespole testerzy będą potrafiliużywać SQL, przeanalizować komunikat EAI, ko-644/2011


Kariera w testach oprogramowaniarzystać z bardziej zaawansowanych narzędzi wsparciatestów wymagających umiejętności programowania.W dużych organizacjach mogą występować dwa zespołytestów – techniczny i biznesowy. Czasem efektywnebędzie łączenie testerów obu profili w jeden zespół.Zdarza się, że firmy zmieniają swój model działaniai koncentrują się na podstawowym profilu działalności.Zlecają wtedy na zewnątrz elementy zarządzania IT, jakrozwój, utrzymanie systemów czy zarządzanie projektamiinformatycznymi. W ten model pracy wpisują się takżefirmy specjalizujące się w testach oprogramowania,takie jak Soflab Technology. Daje to możliwość uczestniczeniaw projektach u wielu klientów. Umożliwia poznanieróżnych sposobów prowadzenia projektów, dajeszerszy przegląd standardów i technologii. W takichfirmach duży nacisk kładzie się na dzielenie się wiedząi doświadczeniami, a rozwój pracownika jest ściślezwiązany z obszarem testowania.Struktura i role w zespole testówW przypadku dużych wdrożeń w ramach zespołu testówodpowiedzialność za poszczególne zadania będziepodzielona. Najważniejszą osobą, której zadaniemw projekcie jest koordynacja działań testowychna wszystkich poziomach jest Kierownik Testów. Jegonajważniejszym obowiązkiem, w pierwszej fazie procesutestów, jest stworzenie podejścia do testów, w któ-rym przedstawi zakres testów, strukturę podziału prac,założenia dotyczące środowisk, procedur testowychoraz metodykę realizacji. Do Kierownika Testów należyodbiór produktów z etapów poprzedzających, wskazanieewentualnego ryzyka Kierownikowi Projektu, a takżezapewnienie niezbędnych zasobów do realizacji testówi koordynacja prac zespołu. Kierownik Testów budujei uzgadnia harmonogram testów. W tej roli najlepiejsprawdzą się osoby mające wcześniej doświadczeniew samodzielnym wykonywaniu testów, posiadającezdolności organizacyjne i dobry kontakt z zespołem.Kolejną ważną osobą, która zbuduje plan testów i wybierzeodpowiednie techniki do jego realizacji jest Architekt(lub Projektant) Testów. Osoba na tym stanowiskuodpowiada za identyfikację podlegających weryfikacjiwarunków testowych, wybór optymalnych technik dlasprawdzenia funkcjonalności oraz wskazanie niezbędnychnarzędzi testowych. Architekt testów ma zapewnićkompletność pokrycia wymagań, przedstawić potrzebyzwiązane z środowiskiem i danymi testowymi, a takżeoszacować pracochłonność zadań testowych. W tymmiejscu potrzebne jest doświadczenie w testach, aleprzede wszystkim dobra znajomość architektury i procesówsystemowych. Posiadając taką wiedzę ArchitektTestów może przedstawić nie tylko przepis na sprawdzenienowych funkcjonalności, ale także ocenić wpływ


TESTOWANIE OPROGRAMOWANIAzmian na bieżące procesy i zarekomendować właściwyzakres testów regresji.Wreszcie Tester, a więc osoba odpowiedzialnaprzede wszystkim za wykonanie scenariuszy testowychoraz ewidencję problemów. Na nim spoczywa odpowiedzialnośćza poprawność merytoryczną weryfikacji. Dobrytester, oprócz znajomości funkcjonalności i procedurytestowej, ma pomysły i intuicję. Dzięki temu stawiawłaściwe pytania, które szybko ujawniają słabościrozwiązania.Specjalizacje w testachW ramach testów oprogramowania istnieje podziałzwiązany ze specyfiką testów. Najczęstsze specjalizacje,jakie możemy spotkać, to:• Tester funkcjonalny, który najogólniej bada funkcjonalnościrealizowane przez system. Jest to dośćpojemna kategoria, ponieważ można specjalizowaćsię w systemach ERP, CRM, PRM, systemach rozliczeniowych,czy OSS. Można koncentrować sięna testach integracyjnych, co wymaga znajomościtechnologii integracji aplikacji (EAI) lub na testachbiznesowych.• Inżynier automatyzacji testów, którego zadaniemjest implementacja skryptów testowych w jednymz dostępnych narzędzi wspierających testy automatyczne.Często osoby zajmujące się tym obszaremwykonują też testy wydajnościowe.• Bardzo wąską specjalizacją jest testowanie bezpieczeństwa.Testy penetracyjne mogą obejmowaćsprzęt, urządzenia sieciowe i aplikacje. Od specjalistówz tej dziedziny wymaga się wysokiego poziomuświadomości technologii i doświadczenia, takby spełniali dla firmy rolę etycznego hakera.Ścieżki kariery w testowaniuJedną z możliwości rozwoju zawodowego jest awansw strukturze zespołu testowego firmy. Ścieżka może wyglądaćpodobnie niezależnie od tego czy weźmiemy poduwagę zespół testów biznesowych czy technicznych.Młodszy tester dostaje do wykonania prostsze przypadkii pracuje pod okiem ekspertów. Ma świetną okazję,aby zdobywać wiedzę o procesach realizowanychw testowanych systemach. Poznaje metodykę testów,stosowane procedury i wspierające narzędzia. Przyswajaspecyfikacje techniczne, uczy się nowych aplikacjii poznaje model danych. Po przejściu kilka razyprzez cykl wdrożeniowy dostaje pod opiekę swojączęść wdrażanego zakresu zmian. Ma za zadanie zaprojektowaćtesty, skoordynować pracę przydzielonychosób i w takim zespole przejść scenariusze testowe,wykryć i zaraportować błędy. Ma dostarczyć kierownikowitestów informacji z danego obszaru niezbędnychdo przedstawienia rekomendacji dla wdrożenia. Jeśliktoś sprawdza się w tych zadaniach, ma dobre postrzeganiecelów projektu, w którym bierze udział, dobrzekomunikuje się z organizacją, a przede wszystkimze swoim zespołem, to jest postrzegany jako dobry kandydatna kierownika testów.Częstym przykładem możliwości rozwoju jest sytuacja,w której projektant testów na tyle dobrze poznajetestowane rozwiązanie, że powierza mu się analizęwymagań i tworzenie projektu technicznego systemu.Osoby, które w trakcie wykonywania testów świetnie radząsobie z całą grupą systemów są predysponowanedo roli architekta rozwiązania.Korzystnym rozwiązaniem jest zdecydowanie się naspecjalizację. Rozwijamy wówczas warsztat techniki narzędzi, które są wykorzystywane przy konkretnymrodzaju testów. Osoby mające wiedzę z zakresu językówprogramowania, czy administracji aplikacji będąpróbować sił w skryptach automatycznych, czy testowaniuwydajności. Ci, którzy mają doświadczenie z administracjączy przetwarzaniem danych wybiorą dla siebiedziałkę testów migracji danych lub tematykę zasilaniaśrodowisk w dane testowe. Generalnie, tą możliwośćczęściej wybiorą osoby, które dobrze czują sięsamodzielnie organizując sobie pracę, a niekonieczniechcą być liderami zespołów.Część osób, w trakcie pełnienia funkcji lidera obszarutestów, ujawnia zdolności menadżerskie i postanawiaiść w stronę kierowania projektami IT. Oczywiściewarsztat kierownika projektu jest na tyle szeroki, że niedzieje się to od razu i zwykle zaczyna się od wsparciadoświadczonego kierownika projektu.PodsumowanieTesterem oprogramowania można zostać posiadajączarówno wiedzę techniczną, jak i biznesową. Zależnieod swojego profilu kompetencji można wybrać właściwądla siebie specjalizację. Można podążać wieloma ścieżkamirozwoju zawodowego. Testowanie oprogramowaniajest dziedziną, w której każdy może znaleźć coś dlasiebie. Z pewnością nie jest to praca nudna. Wymagaciągłego podnoszenia kwalifikacji, dostarcza adrenalinyi daje satysfakcję. Zachęcam do sprawdzenia możliwości,jakie oferuje kariera w tym kierunku!JACEK TOMCZAKUkończył Szkołę Główną Handlową na kierunkunanse i bankowość. W zawodzie pracujeod 8 lat zajmując się organizacją i wykonywaniemtestów integracyjnych i akceptacyjnych.Pracował jako kierownik zespołu testów w TelekomunikacjiPolskiej S.A. i Polskiej TelefoniiCyfrowej Sp. z o.o. Aktualnie pełni funkcję Dyrektora Biura Projektóww rmie Soab Technology Sp. z o.o., specjalizującej sięw testach oprogramowania. Zawodowo interesuje się dyscyplinązapewnienia jakości w projektach informatycznych.664/2011


# # ! $%&'()** $ +&,()**- ./0 ! !"#$%#&'() "(*"* #$*&"'" *#*%"#+,- !"


WYWIADO automatyzacji usług IT irealiach cloud computingrozmowa z Gurem Steifem, gościem BMC Forum w WarszawieZacznijmy od automatyzacji usług IT. Wszyscywiedzą, że powinno się ją stosować, ale wpraktyce bywa z tym różnie... Automatyzacjausług IT wydaje się być bardzo ważnymczynnikiem wpływającym na sprawność iciągłość prowadzonego biznesu. Czy mógłby Panwyjaśnić naszym Czytelnikom na czym polegataka automatyzacja i jakie korzyści przynosi jejstosowanie?Kiedy mówimy o automatyzacji usług IT, musimy wziąćpod uwagę kilka różnych czynników. Pierwsze pytanie,na które należy sobie odpowiedzieć musi brzmieć tak:co właściwie chcemy zautomatyzować? Dlatego pierwszymelementem każdej strategii automatyzacji jeststworzenie katalogu usług. Jest to też dobra metoda zakomunikowaniaużytkownikom końcowym, jakie usługisą realizowane przez dział IT. Wówczas każde żądanieze strony użytkownika może zostać zrealizowane automatycznie.Zwiększa się też jakość usług, kiedy znanesą oczekiwania i wiadomo jak i kiedy zostaną onezrealizowane. Bez wdrożonej automatyzacji, żądaniaużytkowników są nieprecyzyjne a ludzie realizujący jedostarczają coś nie wiedząc czy to spełni oczekiwania.Oczywiście automatyzacja przebiega stopniowo. Przechodzimydo automatyzacji obciążeń. Zapewnia onabezbłędne wykonywanie tego procesu.Więc jeśli twórca oprogramowania pisze aplikację,powinien być zainteresowany tym, żeby jej użytkownikbył jak najbardziej zadowolony z jej użytkowania. Takżetym, czy procesy jej wdrażania czy zaopatrywania systemówbędą mogły być zautomatyzowane. Im więcejautomatyzacji, tym bardziej zadowoleni użytkownicy.Oczywiście mówimy tutaj o automatyzacji usług biznesowych,czyli tak naprawdę o relacji pomiędzy użytkownikiema działem IT, dbając o to, by IT rzeczywiścieobsługiwało potrzeby biznesowe. Załóżmy, że pracujęw banku i przygotowałem jakąś nową promocję dlaklientów i oczekuję, że przyniesie ona efekt w postaciwiększej liczby klientów dokonujących jakieś transakcje.Muszę mieć pewność, że bank będzie w stanietechnicznie obsłużyć tych klientów. Chciałbym miećmożliwość prostego zażądania tego od działu IT. Automatyzacjausług IT sprawia, że automatycznie zostanąprzydzielone dodatkowe zasoby, które obsłużą nowychklientów.Jakie są wg Pana najczęściej występującenegatywne czynniki hamujące w firmach ITrozwój automatyzacji usług.Utworzenie katalogu usług, o którym mówiłem wcześniejnie zawsze jest łatwe. Następnie potrzebne są odpowiednierozwiązania i narzędzia umożliwiające automatyzacjętych usług. Proszę pamiętać, że nie możemyoczekiwać od ludzi biznesu, że przyjdą i powiedzą: potrzebujętrzy serwery z takim a takim procesorem, tylepamięci i tyle pojemności. Katalog usług jest w pewnymsensie tłumaczem pomiędzy potrzebami biznesowymia tym, czym fascynują się informatycy. Automatyzacjaodbywa się w tle tego wszystkiego. System sam przydzieladodatkowe zasoby w przypadku tej hipotetycznejpromocji marketingowej a potem sam je likwiduje, kiedywolumen transakcji wraca do poprzedniego poziomu.Dlatego to pozwala nam także na lepsze wykorzystaniefizycznych zasobów.Najlepszym przykładem są maszyny, które w ciągudnia wykonują inne zadania, a w nocy są rekonfigurowanedo obsługi zupełnie innych rzeczy. Dlatego żeprawdopodobnie w ciągu dnia część ludzi przychodzido oddziału banku, a deweloperzy piszą kod i potrzebnesą inne zasoby niż w nocy, kiedy oddziały sązamknięte a wolumen transakcji on-line także znaczniespada, zaś przebiegają w banku wszystkie procesyrozliczeniowe. Rekonfiguracja systemów IT powinnaodbywać się automatycznie, by zapewnić lepszypoziom usług przy lepszym wykorzystaniu zasobówsprzętowych. Daje to także dużo większe możliwościszybkiego reagowania na zmieniającą się sytuację narynku.Nie ma już żadnych barier technologicznych a rynekbardzo dobrze przyjął takie rozwiązania. W ciąguostatnich kwartałów, tylko w samym cloud computingwygenerowaliśmy obrót rzędu 100 mln USD. Naszedoświadczenie pokazuje, że jeśli już klient zobaczy torozwiązanie w działaniu, to chyba nie zdarzyło się żebypowiedział: nie, to nie dla mnie, czy coś w tym rodzaju.Wartość automatyzacji jest tak oczywista.Często spotykaną barierą ale już nie technologicznąjest zbyt duża reaktywność w podejściu do informatyki.Niektórzy myślą, że jeśli nic się złego nie dzieje w tymmomencie to nie trzeba nic zmieniać. To nie jest dobrepodejście.101/2011


O automatyzacji usług IT i realiach cloud computingPrzejdźmy więc do cloud computing.Przetwarzanie w chmurze to ostatnimi czasybardzo chwytliwy temat. Słyszy się różne, częstoskrajne opinie, na ten temat. Jak Pan sądzi -czy systemy działające w chmurze to jedyniechwilowa moda, czy może stoimy u progu jakiejśrewolucji w sektorze IT?To bardzo dobre pytanie. Cloud jest ostatnio słowemkluczowym w branży i mnóstwo się o tym mówi, przezco każdy producent próbuje przekonywać że posiadaprodukty przeznaczone dla chmur. Każda duża firmapróbuje przekonać klientów, że to właśnie ona posiadanajlepsze technologie w tej dziedzinie. Rzeczywiście,może to być nieco frustrujące dla klientów, którzy niepotrafią odróżnić prawdy od fikcji. Jednak cloud computingrzeczywiście oferuje nowe możliwości, dziękiktórym biznes może lepiej wykorzystywać informatykę.BMC jest w tej dobrej sytuacji, że my nikomu niepróbujemy sprzedawać chmury. Nie oferujemy pakietusprzętu i oprogramowania, na którym można zbudowaćchmurę. My tylko pomagamy w wykorzystaniu inwestycji,które zostały już poniesione na infrastrukturę IT -pomagamy naszym klientom w efektywnym zarządzaniuśrodowiskiem, m.in. w chmurze. Nie jesteśmy teżzwiązani z żadnym producentem sprzętu czy oprogramowania.Jesteśmy zupełnie neutralni w zakresie platformy,co pozwala nam oferować klientom rzeczywistąwartość. My jesteśmy potrzebni tam, gdzie firma posiadaróżne platformy i chce zastosować chmurę prywatnąlub publiczną czy jedno i drugie, gdzie część środowiskajest fizyczna a część wirtualna. BMC dostarczarozwiązania do zarządzania tym wszystkim w jednolitysposób.Np. jeden z naszych klientów używa naszych rozwiązańdo automatyzacji procesów biznesowych. Raz w tygodniupojawia się potrzeba procesowania dużej liczbytransakcji. Zamiast konfigurować fizyczne serwery, któreużywane by były wyłącznie podczas tego tygodniowegoszczytu, raz w tygodniu firma korzysta z chmurypublicznej, która dosłownie przez kilka godzin dostar-sdjournal.org 2


WYWIADcza dodatkowe zasoby. Firma płaci wyłącznie za tenczas, w którym z chmury korzysta.Zatem tak – potwierdzam, że cloud computing istnieje,jest już z powodzeniem stosowany przez wiele firmi rzeczywiście zmienia całą naszą branżę. Niestety niekażdy producent używający tego określenia rzeczywiściewie o czym mówi.Na jaki rodzaj wsparcia mogą liczyć członkowiezespołów IT, którzy wciąż obawiają sięstosowania chmur?Krajobraz informatyczny a z nim cloud computing podleganieustannej ewolucji. Chmura to nie jest naszemiejsce docelowe, tylko to jest podróż. Weszliśmy na tądrogę i obserwujemy jak zmienia się to środowisko. Zapięć lat może to wyglądać zupełnie inaczej.BMC przez lata udowodniło, że jest w stanie pomagaćklientom w efektywnym wykorzystywaniu informatyki imaksymalizowaniu korzyści z poczynionych w nią inwestycjiale także dostosowywać rozwiązania do zmieniającejsię sytuacji. Jest wiele różnych strategii wykorzystywaniachmur i nie ma jednej właściwej odpowiedzi,która będzie pasowała do każdego biznesu. Powiemwięcej, niektóre firmy będą musiały wykorzystać więcejniż jedną strategię. BMC sprawia, że klienci czująsię bezpieczniej w tej sytuacji, w której nie wiedzą, czypodążają we właściwym kierunku. Niezależnie od tego,na którą drogę się zdecyduję, my będziemy w staniezapewnić zarządzanie tym wszystkim jak jednym środowiskiemIT.O rozwiązaniach wykorzystujących możliwośćprzetwarzania w chmurze słyszy się najczęściej wkontekście wielkich korporacji bądź organizacjirządowych. Jak Pan sądzi, kiedy rozwiązania tegotypu mogą trafić «pod strzechy» nieco mniejszychfirm?Przetwarzanie w chmurze jest potencjalnie ogromnąszansą także dla mniejszych firm. Niektóre usługi, z którychteraz korzystają wewnątrz, mogą być przeniesionedo chmury. Czasem nawet dla małej firmy jest to łatwiejszerozwiązanie niż dla dużej. Jeżeli firma używa np. 2serwerów i potrzebuje trzeci, to w bardzo łatwy sposóbmoże potrzebne zasoby otrzymać z chmury publicznejzamiast kupować trzeci serwer i płacić za jego utrzymanie.To oczywiście powoduje ogromny popyt na rynkudostawców usług. Z kolei jako ten dostawca usług,nie będę w stanie zapewnić odpowiedniego poziomuusług dużej liczbie małych klientów, jeśli nie będę miałodpowiedniego rozwiązania do efektywnego zarządzaniachmurą, do zaopatrywania klientów, itd. Właśnie dotego rodzaju zastosowań stworzony został BMC CloudManagement System.To też jest element tej transformacji, jaki cloud computingwywołuje na rynku.Tutaj pojawia się zawsze problem zbezpieczeństwem i zgodnością z regulacjami.Tak, w tej branży zawsze jest wiele pytań i wątpliwościale przecież są one rozwiązywane. Znamy wielkie firmyfinansowe, które już dziś korzystają z chmur w zakresiewykonywania transakcji.Fragmentacja na rynku platform ciągle rośnie.Razem z nią rośnie złożoność budowanychsystemów. Integracja międzyplatformowa odzawsze była jednym z największych praktycznychwyzwań w sektorze IT. Jak według Panazagadnienie to wypływa na rozwój branży IT?Niewątpliwie jest to problem z jakim wciąż borykają sięklienci. To właśnie rosnąca złożoność środowisk IT sprawia,że potrzebna jest automatyzacja. Nasza przewagapolega na tym, że potrafimy automatyzować usługi ITniezależnie od platform, a nawet tam, gdzie w jednymśrodowisku stosowane są różne platformy. W pewnymsensie chmura jest też lekarstwem na te bolączki, podwarunkiem, że jest odpowiednio zarządzana.301/2011


WYWIADOczekiwania zależąod projektuWywiad z Dominiką Kotułą, menagerem personalnymw firmie Blue Media S.A.Blue Media S.A.Firma funkcjonuje na rynku informatycznym już 12 lat. Głównymiodbiorcami oferowanych usług są największe banki działającena polskim rynku oraz wiodące towarzystwa ubezpieczeniowe.Innowacyjność, atrakcyjny model biznesowy oraztechnologiczne zaawansowanie oferowanych usług to atutyBlue Media na rynku nowoczesnych systemów transakcyjnych.W trakcie 12 letniego funkcjonowania Blue Media otrzymałaszereg nagród i wyróżnień. Trzy razy pod rząd, w roku 2006,2007 i 2008 zajęła 1 miejsce w rankingu Technology Fast50grupującym spółki technologiczne z Europy Środkowej. Dwarazy otrzymała tytuł Gazel Biznesu, w 2007 i 2010 roku orazmiano Najlepszy Pracodawca 2008 i 2009. W zestawieniu ComputerworldTOP200 Blue Media jest klasyfikowana jako największafirma informatyczna na Pomorzu.Spółka aktywnie włącza się w inicjatywy na rzecz rozwoju nowoczesnychrozwiązań technologicznych współpracując z ForumTechnologii Bankowych przy Związku Banków Polskichoraz z Polską Izbą Informatyki i Telekomunikacji.Rekrutuje Pani pracowników na różnestanowiska. Jakich pracowników szukacienajczęściej?Dla firmy Blue Media priorytetem jest obecnie dalszy rozwójkluczowych produktów. Szukając osób, które pomogąnam realizować ten cel, zawsze najpierw określamz członkami poszczególnych zespołów kryteria, które powinienspełniać kandydat. Praca w każdym projekcie jestnieco inna, więc szukamy różnych osób. Dla przykładu:zespół marketu ubezpieczeniowego Inseco.pl składasię z pracowników doświadczonych w branży finansowo– ubezpieczeniowej. Do tej grupy szukamy przede wszystkimludzi posiadających umiejętność tworzenia, integrowania,motywowania oraz organizowania zespołów. Myślęo osobach, które potrafią analizować fakty, zachodzącena rynku zmiany i na tej podstawie przewidywać przyszłetrendy, formułować strategie działań. Zupełnie innym projektemjest portal pożyczek społecznościowych Kokos.pl.Tu z kolei liczy się umiejętność generowania niekonwencjonalnych,oryginalnych rozwiązań, znajdujących zastosowaniew praktyce. Przydaje się też otwartość na zmianyi szybkie się do nich dostosowywanie. Natomiast do naszegozespołu pracującego nad serwisem szybkich przelewówmiędzybankowych BlueCash.pl zapraszamy osoby,które realizując zadania, w sposób efektywny potrafiązarządzać czasem i pracować pod jego presją. Takie osobymuszą potrafić szybko reagować na zaistniałe problemyi wyszukiwać możliwości właściwego ich rozwiązania.Jak przebiega rekrutacja do tych zespołów?Zasady rekrutacji obowiązujące w firmie Blue Media sąkompromisem wynikającym z dwóch podstawowych założeń:oszczędności czasu, tak aplikanta jak i pracownikówSpółki oraz możliwości jak najcelniejszej oceny kwalifikacjiosoby ubiegającej się o pracę na danym stanowisku.W przyjętym modelu rekrutacja przebiega w trzech etapach.Wszystkie mają formę rozmowy kwalifikacyjnej połączonejczęsto z merytorycznym sprawdzeniem wiedzypoprzez testy lub rozwiązanie zagadnień problemowych.Stosowana jest również forma „zadań domowych”, którepozwalają sprawdzić umiejętności kandydatów w mniejstresujących warunkach.Co oferujecie kandydatom w zamian zarealizację postawionych celów?Przede wszystkim pracę przy współtworzeniu innowacyjnychprojektów oraz możliwość podnoszenia kwalifikacjii rozwoju zawodowego. Nie bez znaczenia jest fakt,że praca w Blue Media to ciekawe, pełne wyzwań zajęciew prestiżowej firmie, której siedziba mieści się w ścisłymcentrum Sopotu. Pracownikom zapewniamy też relaksorganizując m.in. integracyjne zajęcia sportowe. Pracującu nas trzeba wiedzieć, że, bardziej niż czas poświęconyna realizację powierzonych zadań liczy się dla nasefekt pracy. Potwierdzeniem tego jest fakt, że prawie każdypracownik ma możliwość indywidualnego ustalenia godzinpracy, aby skutecznie realizować swoje obowiązki.W niektórych sytuacjach oferujemy możliwość pracy zdalnej(np. rodzicom).DOMINIKA KOTUŁAOd 6 lat zawodowo związanaz Blue Media S.A. Jako HRManager zajmuje się m.in.rekrutacją i selekcją orazrozwojem pracowników, odpowiadaza budowanie kultury organizacyjnej. AbsolwentkaUniwersytetu Gdańskiego i Politechniki Gdańskiej, interesujesię zagadnieniami dotyczącymi ZZL oraz wpływem ADHD u dorosłychna życie zawodowe.724/2011

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!