Problem chronometrii zdarzeń w uk³adzie cz³owiek

Transkrypt

Problem chronometrii zdarzeń w uk³adzie cz³owiek
www.pwt.et.put.poznan.pl
Piotr Rojewski
Walery Susłow
Politechnika Koszalińska
Wydział Elektroniki i Informatyki
ul. Śniadeckich 2, 75-543 Koszalin
[email protected]
2005
Poznańskie Warsztaty Telekomunikacyjne
Poznań 8 - 9 grudnia 2005
APLIKACJA JAVA, UMOŻLIWIAJĄCA ZAAWANSOWANE
ĆWICZENIA PRAKTYCZNE Z ZAKRESU LICZB PSEUDOLOSOWYCH
Streszczenie: Przedstawiono projekt autorskiej aplikacji
dydaktyczno-naukowej
Java,
przeznaczonej
do
konstruowania
i
testowania
generatorów
liczb
pseudolosowych.
Aplikacja
stwarza
warunki
do
szczegółowego sterowania modelem generatora oraz
parametrami produkowanych ciągów pseudolosowych.
Weryfikacji wybranych algorytmów symulacyjnych
dokonano poprzez zbadanie pracy generatorów znanych
modeli, jak generator Fishmana.
1. WSTĘP
Metoda wytwarzania ciągów liczb pseudolosowych
poprzez wykorzystanie programu implementującego
konkretny model matematyczny generatora zyskała
wielu zwolenników wraz z upowszechnieniem się
komputerów jako przeciwstawna do wykorzystania
generatorów fizycznych oraz tablicowych. Wszelkie
programowe metody wytwarzania takich ciągów oparte
są na ścisłej procedurze matematycznej. Tak, więc
wytworzone w ten sposób zbiory liczb nie stanowią
rzeczywistych ciągów losowych. Jednak niektóre z nich
spełniają postawione przed nimi wymagania praktyczne
na tyle dobrze, że z pewnym przybliżeniem mogą być
traktowane jako generatory liczb losowych.
Programowe generatory liczb pseudolosowych
znajdują swoje zastosowania np. w kryptografii,
algorytmach symulacyjnych lub grach komputerowych,
do których wnoszą one zmienność i przypadkowość w
wynikach obliczeń. Generatory te tworzą liczbowe ciągi,
które w ramach danego zastosowania są nieodróżnialne
od ciągów losowych. Oznacza to, że dla użytkownika
aplikacji każda z liczb ciągu wydaje się być wybrana w
sposób zupełnie przypadkowy, bez jakiegokolwiek
związku z pozostałymi elementami tegoż ciągu.
Jednocześnie, każda z tych liczb mieści się w dowolnym,
ustalonym
zakresie
wartości
z
określonym
prawdopodobieństwem, co tworzy ciąg liczb losowych o
danym rozkładzie [1] i umożliwia wykorzystanie tego
ciągu w konstrukcjach algorytmicznych.
Obecnie
każdy
z
dostępnych
systemów
operacyjnych i języków programowania udostępnia nam
kilka standardowych sposobów generacji ciągów
pseudolosowych. Dla środowiska programowania Java
jest to klasa java.util.Random, która pozwala na
generowanie ciągów pseudolosowych, lecz nie daje
PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005
możliwości ustawiania punktu pracy generatora czy
zachowywania stanu jego pracy do ponownego
uruchomienia. Te standardowe sposoby generacji nie
mogą zaspokoić potrzeb praktycznych we wszystkich
sytuacjach, dlatego warto mieć możliwość rozszerzania
palety generatorów, projektowania generatora „na
zamówienie”, przy tym pozostając w ramach niezależnej
od platformy technologii programowania, jaką jest Java.
Udzielenie odpowiedzi na pytania: czy dany
generator w danej sytuacji może być uznany za losowy,
czy rzeczywiście generuje on ciągi liczbowe o żądanym
rozkładzie nie stanowi łatwego zadania. W tym celu
zazwyczaj posługują się najróżniejszego rodzaju testami
i sposobami oceniania. Można wymienić tutaj testy
zgodności z rozkładem (test chi-kwadrat), testy
zgodności wybranych statystyk zmiennej losowej (test
sum, test średniej), czy testy kombinatoryczne (test
pokerowy lub kolekcjonera) [1-3].
Obecnie tematyka ćwiczeń praktycznych z zakresu
liczb pseudolosowych występuje w różnych kursach,
czytanych na uczelniach wyższych technicznych.
Przykładem mogą służyć kursy „Algorytmy i struktury
danych” czy „Reprogramowalne układy cyfrowe”.
Dlatego propozycja aplikacji naukowo-dydaktycznej,
przeznaczonej do konstruowania i do testowania
generatorów liczb pseudolosowych ma znaczenie stricte
praktyczne.
2. ZAŁOŻENIA KONCEPTUALNE I OPIS
STWORZONEJ APLIKACJI
W fundamencie budowy aplikacji autorskiej
umieszczone są trzy nadrzędne założenia: generator
obiektem
niezależnym,
generator
jednostką
sparametryzowaną i inicjowalną oraz interfejsy
generatora o budowie otwartej.
Zgodnie z modelem programowania obiektowego,
który dominuje w języku Java, generator liczb
pseudolosowych ma być postrzegany w stworzonym
systemie jako niezależny obiekt z zaimplementowanym
algorytmem produkowania liczb pseudolosowych.
Algorytm ten ma być sterowalny z poziomu GUI
aplikacji przy pomocy odpowiednich parametrów.
Parametry sterowania generatora można rozdzielić
na statyczne oraz dynamiczne. Parametry statyczne mają
1/5
www.pwt.et.put.poznan.pl
pozostawać niezmienne cały cykl życia generatora.
Natomiast dynamiczne będą podlegały zmianom w
miarę kolejnych generacji. Do parametrów statycznych
można zaliczyć również te, które są inicjowane
jednorazowo podczas uruchamiania generatora, aby
ustalić jego punkt pracy. Przyjęliśmy, że lista
parametrów sterowania ma być otwarta, by umożliwić
eksperymentowanie z budową generatora podczas prac
konstruktorskich.
Generator Liczb Pseudolosowych
obiektem
niezależnym
jednostką inicjowalną
i sparametryzowaną
otwarta
budowa
interfejsów
łatwość obsługi i
dokumentowania
Rys. 1.
Koncepcja
budowy
aplikacji
wspomagającej prace projektowe przy generatorach
liczb pseudolosowych
Każdy z parametrów sterowania określamy poprzez
nazwę (identyfikator), typ przechowywanej wartości
oraz samą wartość. Aplikacja ma automatycznie
rozpoznawać posiadane parametry badanego generatora i
umożliwiać ich zmianę. Dzięki temu powstaje szansa na
sprawdzenie sposobu funkcjonowania algorytmu
tworzenia ciągów liczb pseudolosowych w zależności od
zadanych wartości tych parametrów.
Do
przechowywania
wartości
parametrów
wykorzystujemy trzy typy danych: całkowity,
rzeczywisty oraz generator. Ostatni z typów jest
zdefiniowany w aplikacji, pozwala on na uzależnienie
określonego parametru od wartości zaczerpniętej z
innego generatora. Umożliwia to łatwe budowanie
kaskadowych generatorów liczb pseudolosowych.
Dzięki sparametryzowaniu generatorów istnieje
możliwość zapisywania do pliku parametrów aktualnego
stanu pracy generatora. To zapewnia sposobność
przerywania pracy generatora i kontynuowania jej w
dalszej generacji poprzez wczytanie zapisanych danych.
Dzięki tej decyzji zostaje spełniony warunek, który
pozwala stosować takowy generator w symulacjach
dydaktycznych,
bowiem
istnieje
możliwość
zrekonstruowania danego stanu generatora i powtórzenia
ćwiczenia.
Założyliśmy, że aplikacja ma przewidywać trzy
sposoby uruchamiania generatora. Pierwszy polega na
starcie generatora bez zmian jego parametrów. Drugi,
nazwany „z inicjowaniem”, umożliwia wykonanie
ponownego przydzielenia dla generatora zmiennych
statycznych jak i dynamicznych, np. przy resetowaniu
jego pracy do stanu początkowego. Natomiast trzeci
sposób, „z reinicjowaniem”, polega na ponownym
wyznaczeniu parametrów dynamicznych do wartości
wyjściowych w zależności od parametrów statycznych,
co daje możliwość powtórzenia generowanej sekwencji.
PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005
Jednym z podstawowych założeń projektu było
również
wykorzystanie
możliwości
kreowania
interfejsów.
Dzięki
zastosowanym
zabiegom
konstrukcyjnym należało osiągnąć efekt łatwego
dodawania do programu nowych algorytmów generacji
liczb losowych, przeprowadzania obliczeń i testów na
wygenerowanych danych, a także wizualizowania
otrzymanych wyników. Aplikacja ma stanowić jakoby
platformę, do której można dodawać nowe elementy i
dzięki temu poszerzać jej funkcjonalność.
Aplikacja autorska o nazwie „GenerProj” została
napisana w języku programowania Java w oparciu o
zestaw narzędzi programowych sdk 1.3. Jej zadaniem
jest wspieranie procesu tworzenia oraz testowania
generatorów. W swoim działaniu umożliwia ona:
• stworzenie żądanego generatora na
bazie zaimplementowanego kodu algorytmu,
• przetestowanie generatora pod kątem
różnych ustawień,
• sprawdzenie „jakości” generowanych
ciągów liczb pseudolosowych.
Cechę modułowości aplikacji osiągnięto dzięki
opracowaniu w pierwszym kroku jej projektowania
przejrzystego interfejsu programistycznego, który
pozwoliłby na tworzenie poszczególnych elementów
systemu wytwarzania, stosowania i testowania
generatorów. Jednocześnie zadbano o to, aby interfejs
programistyczny był całkowicie niezależny od
graficznego interfejsu użytkownika.
Interfejsy
unikatowe:
Podstawowy parametryzujący (ParameterInterface)
GeneratorDataInterface
Moduy bazowe: Algorytm Generatora
Klasy
pomocnicze:
ViewDataInterface
LaborDataInterface
Prezentacji Danych
Przekształceń Danych
GenerStoreFile.class
NumberStoreOne.class
Pliki stanu generatora:
GenParam.xml
GenProj.xml
Aplikacja Implementująca GLP
Środowisko Projektowania GLP
Rys. 2.
Schematyczne
współdziałania modułów projektu
przedstawienie
Schemat, przedstawiony na rysunku 2, obrazuje
interfejsy wewnętrzne stworzonej aplikacji. Jak można
zauważyć, interfejsem nadrzędnym jest interfejs
parametryzowania. Takie założenie narzuca na
podrzędne elementy konieczność tworzenia cech
algorytmu,
określających
jego
funkcjonowanie.
Jednocześnie implementując nowy algorytm uzależnia
się go od konkretnych zmiennych, na które może mieć
wpływ użytkownik. Dzięki temu umożliwiono ustalanie
punktu pracy algorytmu albo nacechowanie go
określonymi właściwościami. Kolejne, podrzędne
interfejsy, dotyczą konkretnych zastosowań. Jest to
interfejs generatora, który pozwala na implementowanie
algorytmów wytwarzania ciągów liczbowych. Następnie
interfejs wizualizowania danych oraz interfejs
przetwarzania danych, czyli algorytmy testowania i
obróbki matematycznej.
2/5
www.pwt.et.put.poznan.pl
Jako opcję dodatkową w aplikacji zapewniono
prosty sposób tworzenia opisów do generatorów, dzięki
czemu można nimi posługiwać się nawet przy ich małej
znajomości. Przyjęte rozwiązanie zakłada tworzenie
dokumentów w formacie podstawowym HTML.
Ponieważ jest to ogólnie znany standard, więc
stworzenie dokumentacji do generatora nie powinno
nastręczać większego problemu. Jednocześnie daje to
sposobność płynnej zmiany domyślnych wersji opisu na
dowolny język.
3. PRZYKŁADOWA IMPLEMENTACJA
GENERATORA FISHMANA
Aby
zaprezentować
sposób wykorzystania
udostępnionych
interfejsów,
posłużyliśmy
się
przykładem
dwóch
implementacji
generatorów
Fishman’a. Pierwszy z nich [3] został zaproponowany w
roku 1990 i bazuje na algorytmie liniowego generatora
kongruentnego. Ów algorytm charakteryzuje się
wzorem:
X[n+1]=(a*X[n]+c) mod M.
Fishman
zaproponował dla jego pracy następujące wartości
parametrów: M=232 (jest to 2147483648), c=0 oraz
a=1099087573. Drugi, z roku 1986, różni się zaledwie
swoimi parametrami. Wynoszą one odpowiednio:
M=231-1 (jest to 1073741823), c=0, a=742938285. Aby
zaimplementować jeden z owych generatorów należało
stworzyć klasę Javy, która byłaby poszerzona o metody
abstrakcyjne interfejsu GeneratorInterface. Metody te
wypełnialiśmy, kodując w ich wnętrzu algorytm
funkcjonowania liniowego generatora kongruentnego.
Dzięki temu, że interfejs GeneratorInterface stanowi
poszerzenie abstrakcyjnej klasy parametryzującej
mogliśmy w jej parametrach umiejscowić parametry
generatora: generowaną zmienną losową X oraz
argumenty algorytmu: a, c i m. Do poprawnego
funkcjonowania algorytmu potrzebna była również
wartość inicjująca początkowy stan generatora,
określana jako ziarno (seed). Ten parametr również
dodaliśmy do listy. Tym sposobem otrzymaliśmy
oczekiwany generator, gotowy już do swojej pracy.
Sparametryzowanie generatora dało również drugą,
dość istotną zaletę. Stworzony generator, z określonymi
parametrami funkcjonowania algorytmu, można było
zapisać w postaci pliku projektu generatora. Plik ów
tworzony jest przez aplikację w postaci kodu XML i
może być załadowany później w dowolnym programie
Java
przy
pomocy
udostępnionej
klasy
GenerStoreFile.class. Jest to sposób na zastosowanie
praktyczne wyników przeprowadzonych symulacji. Plik
stanu generatora uzyskany dla generatora Fishmana z
1990 został wylistowany poniżej.
Tab. 1. Listing pliku XML, opisującego stan
przykładowego generatora LCG (Fishman, 1990)
<?xml version='1.0' encoding='Latin1' ?>
<generator class='generator.GeneratorLCG'>
<parameter name='zm. losowa'> <Long>0</Long>
</parameter>
<parameter name='a'><Long>1099087573</Long>
</parameter>
<parameter name='c'><Long>0</Long>
PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005
</parameter>
<parameter name='m'><Long>2147483648</Long>
</parameter>
<parameter name='ziarno'>
<generator class='generator.GeneratorSystemTime'>
<parameter name='zm. Losowa'>
<Integer>0</Integer>
</parameter>
</generator>
</parameter>
</generator>
Plik stanu generatora w formacie XML
przechowuje wszystkie parametry przykładowego
generatora. Ponieważ generator nie był wykorzystywany
jeszcze do pracy, zmienna losowa posiada wartość
zerową. Plik przechowuje także informację o klasie
zawierającej algorytm generatora, dla jakiego został
stworzony (generator.GeneratorLCG). Można również
zauważyć, że ziarno generatora jest inicjowane poprzez
klasę
generator.GeneratorSystemTime
innego
generatora, która pobiera czas z zegara systemowego.
Taki plik stanu, po załadowaniu z wykorzystaniem
metody loadGeneratorFromFile klasy GenerStoreFile,
udostępni
generator
Fishman’a
w
programie
użytkownika, który będzie mógł się doń odwołać
wykorzystując
proponowany
interfejs
GeneratorInterface.
4. TESTOWANIE GENERATORÓW
Nieodłącznym elementem projektowania jest
testowanie
otrzymanych
wyników.
Stworzone
środowisko projektowe „GenerProj” realizuje również i
ten etap. Wykorzystuje ono przy tym dwa unikatowe
interfejsy - LaborDataInterface oraz ViewDataInterface.
Przeznaczeniem
pierwszego
z
nich
jest
implementowanie
algorytmów
matematycznego
przekształcania
zbioru
danych
liczbowych.
Przekształcenie takie może być równoznaczne z
przeprowadzeniem określonego testu statystycznego na
wygenerowanym zbiorze. Omawiany interfejs oferuje
bowiem dwie podstawowe metody: setInputData oraz
getOutputData. Metoda setInputData, jak wskazuje
nazwa, pozwala na podawanie danych, natomiast
getOutputData na pobieranie rezultatów przekształcenia.
Istotnym założeniem środowiska jest to, iż dane nie
muszą być przekazywane jednorazowo, lecz mogą być
podawane pakietami. Jednak od momentu rozpoczęcia
pobierania wyników strumień wejściowy przestaje być
uwzględniany i nie wpływa na stan wyjścia. Odbieranie
danych od przekształcenia również może zachodzić w
sposób pakietowy. Sytuacja taka ma miejsce, kiedy
przekształcenie generuje znaczną liczbę danych w
stosunku do ograniczonej pojemności środowiska.
Wyniki są wtedy dzielone na mniejsze fragmenty, które
kolejno są oddawane na zewnątrz. Po uzyskaniu
wszystkich danych strumień wyjściowy jest blokowany.
W praktyce przekształcenia są realizowane na dwa
podstawowe sposoby. Wśród algorytmów można
wyodrębnić takie, które do wykonania przekształcenia
potrzebują całościowego zbioru danych liczbowych oraz
takie, które mogą na bieżąco wykonywać obliczenia.
3/5
www.pwt.et.put.poznan.pl
Przykładowo, wyznaczanie minimum zbioru może być
wykonywane w trakcie otrzymywania danych
wejściowych.
Natomiast
określenie
częstości
występowania konkretnych wartości w grupach, bez
znajomości zakresu danych, wymaga „odczekania”
algorytmu na całościową informację. Tak więc właściwy
algorytm przekształcenia danych zostaje „uruchomiony”
albo w momencie podawania danych metodą
setInputData, albo w momencie pobierania wyników
poprzez metodę getOutputData.
Drugi interfejs ViewDataInterface powstał z myślą
o
zagospodarowaniu
przestrzeni
prezentacji
otrzymywanych
wyników
przekształceń.
Klasy
realizujące to zadanie w prezentowanym środowisku
projektowania są „zobowiązane” do stosowania pary
podstawowych
metod:
metody
sekwencyjnego
przyjmowania danych do zinterpretowania, setData, oraz
metody obrazowania ich w ustalonej przez siebie formie
showView. Dodatkowymi metodami, które uwzględnia
interfejs ViewDataInterface są refreshView, odświeżania
obrazowanej informacji, oraz getView, zwracającej
obiekt widoku, jeżeli zaistnieje potrzeba zamieszczenia
go w podrzędnej strukturze.
Aby praktycznie przyjrzeć się funkcjonowaniu
zaprezentowanych interfejsów można przeanalizować
przebieg
testu
chi-kwadrat
na
wcześniej
zaprojektowanym generatorze LCG proponowanym
przez Fishman’a z 1990. Test ten pozwala na
sprawdzenie zbieżności otrzymywanych danych do
zadanego rozkładu i stwierdza wobec niego, czy
uzyskane dane pseudolosowe są rozłożone w sposób
zbyt mocno od niego odbiegający lub zbyt zgodny. Test
ten przeprowadziliśmy wykonując go 15 razy na
wymienionym generatorze z liczebnością próbki
wynoszącą 10.000 oraz określając liczbę stopni swobody
na 19 (czyli 20 klas wedle których zostaną
poszeregowane wygenerowane dane). Przed każdym
testem generator był inicjowany przez ziarno,
zaczerpnięte z systemowego zegara, co zapewniało
ustalenie nowego początkowego punktu pracy. Efektem
końcowym testu jest ciąg piętnastu wartości chi-kwadrat,
które przedstawione są w zaokrągleniu do czwartego
miejsca po przecinku w tabeli 2.
Tab. 2. Wyniki testu Chi Kwadrat (15 próbek po 10.000
liczb) dla LCG Fishmana z 1990
24.9684
8.1337
27.6927
20.4839
14.38
36.556
11.0378
19.196
21.04
33.5752
15.6947
27.72
11.7966
20.3906
21.712
Dane te można ocenić na podstawie tabeli wartości
krytycznych rozkładu chi-kwadrat, której fragment,
odpowiadający
liczbie
stopni
swobody ν=19
zamieszczamy w tabeli 3 [7].
Ciekawostką jest to, że generator Fishmana z roku
1986
nie wykazuje dobrej jakości generowanych
ciągów, hipoteza liniowości rozkładu danych
pseudolosowych zostaje odrzucona. Jest to zgodne z
doświadczeniem autorów publikacji [6].
PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005
Tab. 3. Wartości krytyczne rozkładu chi-kwadrat
dla stopni swobody ν=19, w zależności od parametru α
0,01
7,633
0,05
10,117
0,1
11,651
0,2
13,716
0,3
15,352
0,4
16,850
0,5
18,338
0,6
19,910
0,7
21,689
0,8
23,900
0,9
27,204
0,95
30,144
0,99
36,191
Do przeglądania wyników testowania można
wykorzystać tryb prezentacji dostępny w aplikacji
autorskiej. Mechanizm prezentacji działa poprzez klasę
ViewTestChiSquare (Rysunek 3), realizującą interfejs
ViewDataInterface. Postać prezentowanych wyników
klasa opiera o wizualizację zaprezentowaną w [3].
Uzyskane wyniki podzielone są na 4 kategorie:
Odrzucone,
Podejrzane,
Akceptowalne
oraz
Zaakceptowane. Każda kategoria jest oznaczona swoim
prywatnym kodem (wyniki zaakceptowane są oznaczone
pustą kratką) oraz jest wyznaczona przez swój próg
prawdopodobieństwa. Próg jednoprocentowy oznacza,
że wynik zawiera się w zakresie wartości krytycznych
określonych dla prawdopodobieństw 0-1% lub 99-100%,
pięcioprocentowy dla prawdopodobieństw 1-5% lub 9599% itd. Tak więc ustalony próg powoduje
automatyczne odcięcie wartości od dołu (dla rozkładu
zbyt prawdopodobnego) oraz od góry (dla rozkładu
zbytnio odbiegającego od założonego rozkładu
statystycznego).
Rys. 3. Prezentacja graficzna testów Chi Kwadrat
Innym z ciekawszych testów, stosowanych
względem generatorów multiplikatywnych jest test
struktury przestrzennej. Sposób jego przeprowadzenia
oparto na publikacji [3]. Polega on na zobrazowaniu
wyników otrzymywanych z generatora pseudolosowego
w postaci graficznego wykresu, na którym zamieszcza
się zbiór punktów utworzonych z par kolejno
generowanych liczb. Ćwiczenie to, podobnie jak w
przykładzie autora, wykonano w oparciu o generator
multiplikatywny o następujących parametrach: a=12,
m=101. Wynik, zobrazowany na rysunku 4 przedstawia
zbiór punktów, który układa się w specyficzne linie.
Niezależne ciągi losowe charakteryzują się
równomiernym rozkładem naniesionych punktów, czego
efektem byłoby wypełnienie całej przestrzeni
4/5
www.pwt.et.put.poznan.pl
podzielonej na jednostkowe kostki. Natomiast w tym
przykładzie są wypełniane zaledwie niektóre z nich i
dodatkowo układają się w dobrze widoczne linie. Takie
ułożenie sugeruje, iż jest to ciąg zależnych zmiennych
losowych.
SPIS LITERATURY
[1] D. E. Knuth, Sztuka programowania. Tom 2.
Algorytmy seminumeryczne, WNT, Warszawa
2002
[2] R. Zieliński, Generatory liczb losowych, WNT,
Warszawa 1979
[3] R. Wieczorowski, R. Zieliński, Komputerowe
generatory liczb losowych, WNT, Warszawa
1997
[4] B. P. Zeigler, Teoria modelowania i symulacji,
PWN, Warszawa 1984
[5] S. Brandt, Analiza danych, rozdz. 4. „Metoda
Monte Carlo i generowanie liczb losowych”,
PWN, Warszawa 1998,
[6] P. L'Ecuyer, R. J. Simard, “Beware of linear
congruential generators with multipliers of the
form a = ±2q ±2r”, ACM Trans. Math. Softw.,
25(3), str. 367-374, 1999
[7] Tablice
matematyczne,
Wydawnictwo
Adamantan, str. 374, Warszawa 2002
Rys. 4. Prezentacja struktury przestrzennej par
punktów
wygenerowanych
z
generatora
multiplikatywnego o m=101 i a=12
5. PODSUMOWANIE
Ćwiczenia
praktyczne
z
zakresu
liczb
pseudolosowych mogą być wspierane autorską aplikacją
Java, którą zaprojektowano celowo jako środowisko
projektowe o budowie otwartej. Istotną zaletą aplikacji
jest to, że w wyniku prac projektowych powstają
wygodne warunki do implementacji przetestowanych
generatorów w innych programach Java poprzez
zastosowanie opracowanych interfejsów. Możliwość ta
ma znaczenie szczegółowe przy opracowaniu ćwiczeń
dla osób studiujących kierunek Informatyka.
PWT 2005 - POZNAŃ 8-9 GRUDNIA 2005
5/5

Podobne dokumenty