75
Uniwersytet Warszawski Wydział Matematyki, Informatyki i Mechaniki Paweł Witas Nr albumu:178860 Symulator sieci Petriego ze znacznikami indywidualnymi Praca Magisterska na kierunku INFORMATYKA Praca wykonana pod kierunkiem dra Piotra Chrząstowskiego Instytut Informatyki Wrzesień 2003

Uniwersytet Warszawski Wydział Matematyki, Informatyki i ...students.mimuw.edu.pl/~witas/dyplom_Witas.pdf · Rosnąca złożoność systemów informatycznych i telekomunikacyjnych

  • Upload
    doduong

  • View
    224

  • Download
    0

Embed Size (px)

Citation preview

Uniwersytet Warszawski Wydział Matematyki, Informatyki i Mechaniki

Paweł Witas Nr albumu:178860

Symulator sieci Petriego ze znacznikami indywidualnymi

Praca Magisterska na kierunku INFORMATYKA

Praca wykonana pod kierunkiem dra Piotra Chrząstowskiego Instytut Informatyki

Wrzesień 2003

Streszczenie Rosnąca złożoność systemów informatycznych i telekomunikacyjnych oraz automatyzacja produkcji przemysłowej powodują konieczność modelowania działania systemów składających się z wielu współbieżnie działających podzespołów. Jednym z najpopularniejszych używanych w tym celu modeli są sieci Petriego, w tym sieci kolorowe. Celem tej pracy jest zaprezentowanie sposobów modelowania i analizy problemów z powyższej dziedziny za pomocą opracowanego przeze mnie programu „Symulator sieci Petriego ze znacznikami indywidualnymi”. Projektując ten program położyłem nacisk na intuicyjność polskojęzycznego interfejsu użytkownika, niezawodność działania oraz integrację z analizatorem sieci Petriego INA. Słowa kluczowe coloured Petri nets, individual tokens, design tools, Integrated Net Analyzer, INA, concurrency, simulator Klasyfikacja tematyczna

D.2.2 Design Tools and Techniques

Petri Nets

Pracę przedkładam do oceny Data Podpis autora pracy: Praca jest gotowa do oceny przez recenzenta. Data Podpis kierującego pracą:

SPIS TREŚCI:

1 Wstęp........................................................................................................................................................................ 6

2 Wprowadzenie do sieci Petriego ze znacznikami indywidualnymi..................................................................... 7

2.1 Sieci miejsc i tranzycji .................................................................................................................................... 7 2.2 Sieci ze znacznikami indywidualnymi i stałymi etykietami łuków ................................................................ 8 2.3 Sieci ze znacznikami indywidualnymi i zmiennymi etykietami łuków ........................................................ 10 2.4 Słabe odpalenie tranzycji w sieci kolorowej ze zmiennymi etykietami łuków ............................................. 12 2.5 Silne odpalenie tranzycji w sieci kolorowej ze zmiennymi etykietami łuków: ............................................ 14

3 Formalne definicje sieci Petriego wykorzystywanych w programie................................................................. 15

3.1 Definicja sieci miejsc i tranzycji (P/T sieci) ................................................................................................. 15 3.2 Reguła odpalania dla P/T sieci..................................................................................................................... 15 3.3 Definicja wielozbioru (ang. multiset) ........................................................................................................... 16 3.4 Definicja sieci kolorowej ze stałymi etykietami łuków................................................................................. 17 3.5 Reguła odpalania dla sieci kolorowej ze stałymi etykietami łuków............................................................. 17 3.6 Definicja funkcji substytucji R i funktora uzgadniania Q dla sieci kolorowej ze zmiennymi etykietami

łuków ............................................................................................................................................................. 18 3.7 Definicja sieci kolorowej ze zmiennymi etykietami łuków .......................................................................... 20 3.8 Reguła słabego odpalenia dla sieci kolorowej ze zmiennymi etykietami łuków ......................................... 21 3.9 Reguła silnego odpalenia dla sieci kolorowej ze zmiennymi etykietami łuków .......................................... 22 3.10 Dowód NP-zupełności problemu uzgadniania zmiennych-etykiet łuków z kolorami znaczników............. 23 3.11 Dowód wielomianowej złożoności zmodyfikowanego decyzyjnego problemu plecakowego ...................... 25 3.12 Opis algorytmu uzgadniania zmiennych-etykiet łuków z kolorami znaczników ........................................ 27

4 Porównanie sieci kolorowych ze zmiennymi etykietami łuków z sieciami relacji ........................................... 28

5 Instrukcja obsługi ................................................................................................................................................. 30

5.1 Wprowadzenie ............................................................................................................................................... 30 5.2 Instalacja programu ..................................................................................................................................... 30 5.3 Opis głównego okna programu .................................................................................................................... 32

5.3.1 Menu główne programu ......................................................................................................................... 33 5.3.2 Obszar rysowania ................................................................................................................................... 33 5.3.3 Pasek informacyjny. ............................................................................................................................... 33 5.3.4 Pasek narzędziowy .................................................................................................................................. 34

5.4 Okno edycji miejsca ...................................................................................................................................... 36 5.5 Okno edycji tranzycji .................................................................................................................................... 37 5.6 Okno edycji łuku ........................................................................................................................................... 38 5.7 Okno zmiany ustawień sieci ......................................................................................................................... 39

5.7.1 Strona „Symulator”................................................................................................................................ 39 5.7.2 Strona „Edytor”...................................................................................................................................... 40 5.7.3 Strona „Analizator”................................................................................................................................ 41 5.7.4 Strona „Kolory”...................................................................................................................................... 42 5.7.5 Strona „Czcionki”................................................................................................................................... 43 5.7.6 Strona „Opisy”........................................................................................................................................ 44

5.8 Analizator sieci Petriego INA (Integrated Net Analyzer)............................................................................ 45

5.8.1 Macierz sieci P/T ..................................................................................................................................... 45 5.8.2 Macierz sieci kolorowej .......................................................................................................................... 46 5.8.3 Właściwości sieci ..................................................................................................................................... 47 5.8.4 Graf osiągalności..................................................................................................................................... 49 5.8.5 Niezmienniki sieci ................................................................................................................................... 50 5.8.6 Przykład analizy właściwości wybranej sieci „stacja benzynowa”..................................................... 51

6 Dokumentacja techniczna programu .................................................................................................................. 55

6.1 Opis struktury programu .............................................................................................................................. 55 6.2 Formaty plików używanych przez program ................................................................................................. 57

6.2.1 Format pliku o rozszerzeniu .trn zawierającego zbiór tranzycji........................................................ 58 6.2.2 Format pliku o rozszerzeniu .mie zawierającego zbiór miejsc ........................................................... 59 6.2.3 Format pliku o rozszerzeniu .luk zawierającego zbiór łuków ............................................................ 60 6.2.4 Format pliku o rozszerzeniu .knf zawierającego konfigurację sieci Petriego ................................... 61

6.3 Wydruki nagłówków najważniejszych klas programu................................................................................. 63 6.3.1 Nagłówek klasy TForm1 zadeklarowanej w pliku petri.h .................................................................. 63 6.3.2 Nagłówek klasy TAnalizator zadeklarowanej w pliku analiza.h........................................................ 67 6.3.3 Nagłówek klasy Tranzycja ..................................................................................................................... 68 6.3.4 Nagłówek klasy Miejsce.......................................................................................................................... 69 6.3.5 Nagłówek klasy Strzalka ........................................................................................................................ 70 6.3.6 Nagłówek klasy Tranzycje ..................................................................................................................... 71 6.3.7 Nagłówek klasy Miejsca ......................................................................................................................... 71 6.3.8 Nagłówek klasy Strzałki ......................................................................................................................... 72 6.3.9 Nagłówek klasy Symbole ........................................................................................................................ 72 6.3.10 Nagłówek klasy Arr ........................................................................................................................... 73 6.3.11 Nagłówek klasy Geometria................................................................................................................ 74

7 Bibliografia:........................................................................................................................................................... 75

5

1 Wstęp Rosnąca złożoność systemów informatycznych i telekomunikacyjnych oraz automatyzacja produkcji przemysłowej powodują konieczność modelowania działania systemów składających się z wielu współbieżnie działających podzespołów. Jednym z najpopularniejszych używanych w tym celu modeli są sieci Petriego, w tym sieci kolorowe. Celem tej pracy jest zaprezentowanie sposobów modelowania i analizy problemów z powyższej dziedziny za pomocą opracowanego przeze mnie programu „Symulator sieci Petriego ze znacznikami indywidualnymi”. Projektując ten program położyłem nacisk na intuicyjność polskojęzycznego interfejsu użytkownika, niezawodność działania oraz integrację z analizatorem sieci Petriego INA. Program działa pod kontrolą systemu operacyjnego Microsoft Windows, dzięki czemu można go zainstalować na większości komputerów osobistych. Zalecane wersje systemu operacyjnego to NT4, 2000 i XP. Sposób obsługi mojego programu jest podobny do sposobu obsługi popularnych programów graficznych służących do tworzenia diagramów blokowych (np. MS Visio), co ułatwia jego opanowanie przez użytkownika w krótkim czasie. Program modeluje trzy rodzaje sieci Petriego: sieci miejsc i tranzycji, sieci ze znacznikami indywidualnymi i stałymi etykietami łuków oraz sieci ze znacznikami indywidualnymi i zmiennymi etykietami łuków. Powyższe rodzaje sieci można ze sobą łączyć w obrębie tworzonej sieci, co może dawać dodatkowe możliwości modelowania różnych zagadnień. Największą zaletą programu jest jego integracja z analizatorem sieci Petriego INA (Integrated Net Analyzer)1 umożliwiająca szybkie określenie własności sieci bez potrzeby poznawania przez użytkownika poleceń analizatora i formatów jego plików wejściowych. Analizator INA został stworzony na Uniwersytecie Humboldta w Berlinie. Autorami programu są Stephan Roch i Peter H. Starke. INA jest uważana za jeden z najlepszych analizatorów sieci Petriego dostępnych bezpłatnie. Strona domowa programu INA to http://www.informatik.hu-berlin.de/~starke/ina.html

1 [6] Stephan Roch, Prof. Peter H. Starke, “INA Integrated Net Analyzer Version 2.2 Manual”, Humbold-Universität zu Berlin, Institut für Informatik, Lehrstuhl für Automaten und Systemtheorie

6

2 Wprowadzenie do sieci Petriego ze znacznikami indywidualnymi2 2.1 Sieci miejsc i tranzycji

Rozważmy prosty system producenta-konsumenta modelujący zawieranie transakcji handlowych pomiędzy sprzedawcą i dwoma klientami.

W tej sieci miejsc i tranzycji klienci są nierozróżnialni. Aby być w stanie rozróżniać klientów (lub sprzedawców) między sobą, musimy przekształcić sieć miejsc i tranzycji w odpowiadającą jej sieć warunków i zdarzeń, w której wszystkie miejsca mają pojemność 1 i wszystkie łuki mają wagę 1.

Zauważmy że ilość tranzycji i miejsc po stronie pętli obsługujących klientów się podwoiła w porównaniu z siecią miejsc i tranzycji. Przy większej ilości klientów lub sprzedawców rysunek sieci stałby się nieczytelny.

2 [2]Wolfgang Reisig, „A Primer in Petri Net Design” (rozdział 4), Springer-Verlag, Berlin 1992

7

2.2 Sieci ze znacznikami indywidualnymi i stałymi etykietami łuków W sieciach ze znacznikami indywidualnymi możliwe jest nadanie znacznikom własności umownie zwanej kolorem, co umożliwia rozróżnianie między sobą znaczników znajdujących się na tym samym miejscu. Kolor znacznika zwykle jest opisywany symbolem składającym się z jednej lub wielu liter.

W powyższej sieci sprzedawca i klienci są reprezentowani przez znaczniki indywidualne „C”, „B” i „A”. Zauważmy, że znacznik danego koloru może przemieszczać się tylko po łuku, który jest etykietowany tym samym kolorem.

W wyniku odpalenia tranzycji „B z C” została zawarta transakcja pomiędzy sprzedawcą C i klientem B. Najważniejszą zaletą powyższej sieci w porównaniu z odpowiadającą jej siecią warunków i zdarzeń jest zredukowana ilość miejsc, bez utraty informacji zawartej w sieci warunków i zdarzeń. Ponadto łatwiej jest obserwować przemieszczanie się znaczników indywidualnych w obrębie sieci niż znaczników nierozróżnialnych. Wadą tej sieci jest brak redukcji ilości tranzycji w porównaniu z odpowiadającą jej siecią warunków i zdarzeń.

8

Odpalenie tranzycji w sieci ze znacznikami indywidualnymi i stałymi etykietami łuków.

Podsumowując, sieć ze znacznikami indywidualnymi i stałymi etykietami łuków składa się z: - miejsc, tranzycji i łuków tak jak w P/T sieci; - indywidualnych, rozróżnialnych znaczników; - znakowania początkowego; - etykiet łuków określających kolory znaczników. Miejsce p jest w presecie tranzycji t, jeśli istnieje łuk z p do t. Miejsce p jest w postsecie tranzycji t, jeśli istnieje łuk z t do p. W sieci ze znacznikami indywidualnymi i stałymi etykietami łuków: - konfiguracja jest to rozmieszczenie znaczników na miejscach; - tranzycja t jest gotowa do odpalenia, jeżeli każde miejsce p w presecie tranzycji t zawiera

znaczniki wyznaczane przez etykietę łuku z p do t; - odpalenie gotowej do odpalenia tranzycji t zachodzi w następujący sposób:

1. Usuwane są znaczniki wyznaczone przez etykiety łuków prowadzących z każdego miejsca w presecie odpalanej tranzycji do tej tranzycji.

2. Do każdego miejsca w postsecie odpalanej tranzycji dodawane są znaczniki wyznaczone przez etykiety łuków z tej tranzycji do jej postsetu.

9

2.3 Sieci ze znacznikami indywidualnymi i zmiennymi etykietami łuków W sieci ze znacznikami indywidualnymi i stałymi etykietami łuków została zredukowana jedynie ilość miejsc w porównaniu z odpowiadającą jej siecią warunków i zdarzeń, natomiast ilość tranzycji pozostała bez zmian. Opisane w tym rozdziale sieci ze znacznikami indywidualnymi i zmiennymi etykietami łuków są pozbawione tej wady. W celu odpalenia tranzycji w poniższej sieci należy znaleźć takie przyporządkowanie stałych (kolorów znaczników) do zmiennych (etykiet łuków), aby tranzycja mogła odpalić. Procesowi znalezienia tego przyporządkowania nadamy nazwę uzgadniania, natomiast zastąpieniu zmiennych etykiet łuków przez stałe etykiety łuków nadamy nazwę substytucji. Przyjmijmy, że stałe będą oznaczane dużymi literami, natomiast zmienne małymi literami. Ponadto dla łatwego odróżnienia stałych od zmiennych, zmienne będą pisane czerwoną czcionką.

Po uzgodnieniu x:=A; y:=C; z:=B nastąpi substytucja i odpalenie tranzycji, Rozważmy teraz trochę bardziej skomplikowany przykład:

W powyższym przykładzie uzgodnienie było następujące: x:=C; y:=B; z:=A.

10

Poniższa sieć ze znacznikami indywidualnymi i zmiennymi etykietami łuków jest odpowiednikiem sieci ze stałymi etykietami łuków z rozdziału 2.2.

W wyniku uzgodnienia x:=B; y:=C może zajść transakcja między sprzedawcą C a klientem B.

Zaletą sieci ze zmiennymi etykietami łuków jest ich skalowalność. Bez zmiany struktury sieci można dodawać nowe znaczniki indywidualne – w omawianym przykładzie będą to sprzedawcy i klienci. Kolejną zaletą jest łatwość przekształcenia sieci miejsc i tranzycji w sieć ze znacznikami indywidualnymi i zmiennymi etykietami łuków. W tym celu wystarczy zastąpić znaczniki nierozróżnialne przez znaczniki indywidualne i etykietować łuki zmiennymi określającymi znaczenie nadane kolorom znaczników indywidualnych. Przez znaczenie nadane kolorowi znacznika rozumiemy zmienną etykietującą łuk, po którym znaczniki tego koloru mogą się poruszać. W powyższym przykładzie zmienna x nadaje znaczenie x (tzn. „klient”) znacznikom A i B poruszającym się łukach etykietowanych tą zmienną. Podobnie zmienna y nadaje znaczenie y (tzn. „sprzedawca”) znacznikowi C.

11

Należy pamiętać, aby zbiory kolorów znaczników posiadających odmienne znaczenie były rozłączne – nie wolno na przykład dodać znacznika D zarówno do miejsca „sprzedawcy czekają na klientów” , jak i do miejsca „klienci chcą kupić towary”. Jest to związane z NP-zupełnością problemu uzgadniania zmiennych-etykiet łuków z kolorami znaczników indywidualnych w ogólnym przypadku, opisanym w rozdziale 3.10. Aby uniknąć ponadwielomianowej złożoności problemu uzgadniania należy przyjąć założenie, że funkcja substytucji jest różnowartościowa – na wszystkie zmienne muszą zostać przypisane różne stałe będące kolorami znaczników. Przy tym założeniu problem uzgadniania może zostać rozwiązany w czasie wielomianowym. Oznacza to jednak że uzgodnienie x:=D; y:=D jest błędne i niedopuszczalne. 2.4 Słabe odpalenie tranzycji w sieci kolorowej ze zmiennymi etykietami łuków Tranzycje o słabej regule odpalenia są oznaczane na rysunku sieci kolorem czarnym. Algorytm uzgadniania jest wywoływany tylko dla znaczników, które nie posiadają przypisanej im zmiennej-etykiety łuku określającej znaczenie koloru tego znacznika. Jeżeli znaczenie koloru pobieranego znacznika jest już ustalone, to nie może ono ulec zmianie podczas słabego odpalenia tranzycji. Znaczenie nadawane kolorom znaczników podczas odpalenia tranzycji jest zapamiętywane, aby podczas następnych odpaleń tranzycji nie uległo ono zmianie. Własność tą przedstawia poniższa sieć:

Po odpaleniu tranzycji t1 w miejscu s3 poza znacznikami A i B znajdzie się informacja o znalezionych przez algorytm uzgadniania przypisaniach kolorów znaczników do zmiennych. Informacja ta zostanie następnie wykorzystana podczas odpalenia tranzycji t2 w celu zachowania znaczeń kolorów znaczników. Wynika z tego, że podczas odpalenia tranzycji t2 algorytm uzgadniania nie zostanie użyty, dokonana zostanie jedynie substytucja zmiennych etykiet łuków na stałe etykiety łuków na podstawie informacji zawartej w miejscu s3. W programie „Symulator sieci Petriego ze znacznikami indywidualnymi” informacja ta jest kodowana w następujący sposób: (kolor znacznika, zmienna)+(kolor znacznika, zmienna)+..+(kolor_znacznika,zmienna) Dla powyższego przykładu informacja ta będzie miała następującą postać: (A,x)+(B,y) .

12

Dzięki temu nie jest możliwy następujący przebieg działania omawianej sieci:

13

2.5 Silne odpalenie tranzycji w sieci kolorowej ze zmiennymi etykietami łuków: Tranzycje o silnej regule odpalenia są oznaczane na rysunku sieci kolorem czerwonym. Algorytm uzgadniania jest wywoływany podczas każdego odpalenia takiej tranzycji. Wynika z tego że informacje o znaczeniu kolorów pobieranych znaczników nie są wykorzystywane ani zachowywane podczas silnego odpalenia tranzycji. W wyniku silnego odpalenia tranzycji na nowo nadawane są znaczenia kolorów wszystkich znaczników pobranych przez tą tranzycję. Rozważmy poniższą sieć, w której sprzedawcy i klienci zamieniają się rolami, a znaczniki krążą zataczając poziomą ósemkę:

Po uzgodnieniu x:=B; y:=D i odpaleniu tranzycji „transakcja” sieć będzie wyglądać następująco:

Ponieważ program zapamiętuje dokonane podczas odpalenia tranzycji przypisania kolorów znaczników do zmiennych, to po odpaleniu tranzycji „transakcja” w miejscu „sprzedawcy dostali pieniądze” znajdzie się informacja, że znacznik B jest przypisany do zmiennej x nadającej mu znaczenie x (tzn.„klient”), a w miejscu „klienci mają towary” znajdzie się informacja, że znacznik D jest przypisany do zmiennej y nadającej mu znaczenie y (tzn. „sprzedawca”). W związku z tym podczas odpalenia tranzycji „y dostał towar” musi zostać zmienione znaczenie znacznika B pobieranego z miejsca „sprzedawcy dostali pieniądze”. Odpowiada to zmianie roli znacznika B z „klient” na „sprzedawca. Podobnie podczas odpalenia tranzycji „x dostał pieniądze” rola znacznika D musi ulec zmianie z „sprzedawca” na „klient”.

14

3 Formalne definicje sieci Petriego wykorzystywanych w programie 3.1 Definicja sieci miejsc i tranzycji (P/T sieci)3

Szóstkę N=(S, T; F, K, M, W) nazywamy siecią miejsc i tranzycji (P/T siecią) wtedy i tylko wtedy, gdy: (a) (S, T; F) jest siecią skończoną; jej elementy S oraz T nazywamy odpowiednio miejscami

i tranzycjami; (b) K: S → N ∪ {ω} każdemu miejscu nadaje pojemność (być może nieograniczoną); (c) W: F→ N \ {0} każdemu łukowi sieci przyporządkowuje wagę; (d) M: S → N jest znakowaniem początkowym zgodnym z pojemnościami, tj.

M(s) ≤ K(s) dla wszystkich s ∈ S Składowe P/T sieci N oznacza się przez SN, TN, FN, KN, WN i MN .

3.2 Reguła odpalania dla P/T sieci Niech N będzie P/T siecią. (a) Odwzorowanie M: SN

→ N ∪ {ω} nazywamy znakowaniem sieci N wtedy i tylko wtedy, gdy M(s) ≤ KN(s) dla wszystkich s ∈ S. Niech M będzie znakowaniem N.

(b) Tranzycja t ∈ TN jest M-aktywna (gotowa do odpalenia) wtedy i tylko wtedy, gdy ( ) ( )

( ) ( ) ( )stWsKsMts

tsWsMts

NN

N

,:oraz

,:

−≤∈∀

≥∈∀

(c) M-aktywna tranzycja t ∈ TN w wyniku odpalenia daje takie znakowanie następnicze M’ dla M, że dla każdego s ∈ SN zachodzi

( )

( ) ( )( ) ( )( ) ( ) ( )( )⎪

⎪⎩

⎪⎪⎨

∩∈+−∈+∈−

′••

••

••

przypadku pozostalym wsMttsstWtsWsM

ttsstWsMttstsWsM

sMNN

N

N

gdy wtedy, tylkoi wtedy ,,\gdy wtedy, tylkoi wtedy ,\gdy wtedy, tylkoi wtedy ,

Mówimy wówczas, że t odpala od M do M’, co oznaczamy przez M[t > M’. (d) Niech [M > będzie najmniejszym zbiorem takich znakowań, że

M ∈ [M > oraz jeżeli M1 ∈ [M > i dla pewnej tranzycji t ∈ TN : M1[t > M2 , to M2 ∈ [M > .

3 [1] Wolfgang Reisig, „Sieci Petriego” (rozdział 5), Wydawnictwa Naukowo-Techniczne, Warszawa 1988,

15

3.3 Definicja wielozbioru (ang. multiset)

Wielozbiory są to kolekcje obiektów nieuporządkowanych, ale posiadających liczbę wystąpień skojarzonych z każdym obiektem. Wielozbiór jest funkcją J: X → N, gdzie X jest zbiorem a N to liczby naturalne. Podobnie jak funkcja, wielozbiór może być zdefiniowany jako zbiór uporządkowanych par składających się z elementu zbioru i z liczby naturalnej określającej krotność tego elementu. Jeżeli krotność elementu x wynosi 0, to przyjmujemy że para (x,0) nie występuje w wielozbiorze. Wielozbiór pusty oznaczamy jako 0. Dodawanie wielozbiorów polega na dodawaniu krotności odpowiadających sobie obiektów należących do składników sumy, a odejmowanie wielozbiorów polega na odejmowaniu krotności odpowiadających sobie obiektów należących do odjemnej i odjemnika. Za U przyjmujemy uniwersum wszystkich możliwych elementów należących do dziedziny (np. zbiór wszystkich kolorów znaczników w sieci kolorowej).

( ) ( ) ( )( ) ( ) ( )

( ) ( )( ) ( ) : gdy wtw

: gdy wtw : gdy wtw : gdy wtw

2121

2121

213213

213213

xJxJUxJJxJxJUxJJ

xJxJxJUxJJJxJxJxJUxJJJ

≤∈∀≤=∈∀=

−=∈∀−=+=∈∀+=

W programie „Symulator sieci Petriego ze znacznikami indywidualnymi” wielozbiory znaczników są kodowane w następujący sposób: [ilość znaczników][kolor znacznika]+...+[ilość znaczników][kolor znacznika] Przykłady: 2A+B+4@ oznacza dwa znaczniki koloru A, jeden znacznik koloru B i cztery czarne znaczniki, używane w sieciach miejsc i tranzycji i w sieciach warunków i zdarzeń. Na rysunku sieci czarne znaczniki oznaczane są symbolem •, który jednak nie jest dostępny z klawiatury, zatem podczas wpisywania zastępuje go symbol @. Wpisując wielozbiór można pominąć znak @, zatem zapis 2A+B+4 jest równoważny powyższemu. (2A+B+4) + (3B+2C+7) = (2A+4B+2C+11) (2A+4B+2C+11) – (3B+2C+7) = (2A+B+4) (2A+B+4) ≤ (5A+3B+2C+7) Nieprawdą natomiast jest, że (2A+B+4) ≤ (3B+2C+7) , ponieważ po lewej stronie nierówności występują dwa znaczniki koloru A, natomiast po prawej stronie ilość znaczników koloru A wynosi zero. Dla odróżnienia od wielozbioru znaczników J, wielozbiór zmiennych oznaczymy literą V. Wielozbiór zmiennych jest funkcją V: X → N, gdzie X jest zbiorem a N to liczby naturalne. Wielozbiory zmiennych-etykiet łuków są zapisywane podobnie jak wielozbiory znaczników: [krotność zmiennej]symbol zmiennej + ... + [krotność zmiennej]symbol zmiennej. Podanie symbolu zmiennej jest wymagane, symbol zmiennej musi zaczynać się od litery. Przykład: Zapis 2x+y oznacza, że po łuku etykietowanym tym wyrażeniem podczas odpalenia tranzycji przemieszczą się dwa znaczniki mające (przypisane im przez algorytm uzgadniania) znaczenie x i jeden znacznik mający znaczenie y.

16

3.4 Definicja sieci kolorowej ze stałymi etykietami łuków

Niech J będzie wielozbiorem zawierającym znaczniki indywidualne występujące w danym miejscu sieci. Zatem J jest funkcją J: X → Ν . Szóstkę C=(S, T; F, K, M, W) nazywamy siecią kolorową ze stałymi etykietami łuków wtedy i tylko wtedy, gdy: (a) (S, T; F) jest siecią skończoną; jej elementy S oraz T nazywamy odpowiednio miejscami

i tranzycjami; (b) K: S → N ∪ {ω} każdemu miejscu nadaje pojemność (być może nieograniczoną); (c) W: F→ J \ 0 każdemu łukowi sieci przyporządkowuje wielozbiór stałych-etykiet łuku; (d) M: S → J jest znakowaniem początkowym zgodnym z pojemnościami, tj.

∑∈

≤∈∀)(

)()(:sMx

sKxJSs

Składowe sieci C oznacza się przez SC, TC, FC, KC, WC i MC .

3.5 Reguła odpalania dla sieci kolorowej ze stałymi etykietami łuków Niech C będzie siecią kolorową ze stałymi etykietami łuków (a) Odwzorowanie M: SC

→ J nazywamy znakowaniem sieci C wtedy i tylko wtedy, gdy . Niech M będzie znakowaniem sieci C. ∑

≤∈∀)(

)()(:sMx

C sKxJSs

(b) Tranzycja t ∈ TC jest M-aktywna (gotowa do odpalenia) wtedy i tylko wtedy, gdy ( )( ) ( )( )

( )( ) ( ) (( )stWJsKsMts

tsWJsMJts

CC

C

,J oraz

,

−≤∈∀

≥∈∀

)

(c) M-aktywna tranzycja t ∈ TC w wyniku odpalenia daje takie znakowanie następnicze M’ dla M, że dla każdego s ∈ SC zachodzi

( )

( ) ( )( ) ( )( ) ( ) ( )( )⎪

⎪⎩

⎪⎪⎨

∩∈+−∈+∈−

′••

••

••

przypadku pozostalym wsMttsstWtsWsM

ttsstWsMttstsWsM

sMCC

C

C

gdy wtedy, tylkoi wtedy ,,\gdy wtedy, tylkoi wtedy ,

\gdy wtedy, tylkoi wtedy ,

Mówimy wówczas, że t odpala od M do M’, co oznaczamy przez M[t > M’. (d) Niech [M > będzie najmniejszym zbiorem takich znakowań, że

M ∈ [M > oraz jeżeli M1 ∈ [M > i dla pewnej tranzycji t ∈ TC : M1[t > M2 , to M2 ∈ [M > .

17

3.6 Definicja funkcji substytucji R i funktora uzgadniania Q dla sieci kolorowej ze

zmiennymi etykietami łuków R jest funkcją różnowartościową: R: V → J gdzie V jest wielozbiorem zmiennych będących etykietami łuków odpalanej tranzycji wraz z ich współczynnikami (krotnościami), a J jest wielozbiorem stałych (kolorów znaczników indywidualnych wraz z ich krotnościami), zastępujących te zmienne podczas odpalenia tranzycji.

( ) ( )212121 gdy wtw: zRzRzzVzVz ≠≠∈∀∈∀ Oznacza to, że podczas odpalenia tranzycji w modelu ze znacznikami indywidualnymi i zmiennymi etykietami łuków, do różnych zmiennych nie można przypisać tego samego koloru znaczników.. Funkcja R spełnia warunek:

( )( ) ( ) ( )( )xJzVzRxJxVz =∧=∈∃∈∀ : czyli zmienne i odpowiadające im stałe mają te same krotności. Funkcja R dokonuje substytucji, czyli zastąpienia zmiennych-etykiet łuków przez stałe etykiety łuków przed odpaleniem tranzycji. Przed dokonaniem substytucji musi zostać dokonane ustalenie, jakie stałe (kolory znaczników) należy przypisać zmiennym etykietującym łuki z presetu4 i postsetu5 tej tranzycji, aby mogła ona odpalić. Informacja ta może być zaczerpnięta z miejsc z presetu tej tranzycji (nazywamy to słabym odpaleniem) lub obliczona w wyniku działania algorytmu uzgadniania (nazywamy to silnym odpaleniem). Opisane powyżej ustalenie jest realizowane za pomocą funktora uzgadniania Q. Odwzorowanie ( ) ( ) ( )( ) ( )popreZZ RRtBttWtMttQ ,,,,,,: →••• nazywamy funktorem uzgadniania dla odpalenia, przy czym t ∈ TZ jest odpalaną tranzycją, •t jest zbiorem miejsc z presetu odpalanej tranzycji, M(•t) jest znakowaniem miejsc z presetu odpalanej tranzycji, WZ(•t,t) jest zbiorem etykiet łuków prowadzących z miejsc z presetu odpalanej tranzycji do tej tranzycji, B(t) oznacza siłę odpalenia. Funktor Q zwraca parę (Rpre , Rpo), przy czym Rpre: V → J jest funkcją substytucji dla znaczników pobieranych z presetu odpalanej tranzycji, a Rpo: V → J jest funkcją substytucji dla znaczników umieszczanych w postsecie odpalanej tranzycji. Przypisanie koloru znacznika do zmiennej etykietującej łuki, po których znacznik tego koloru może się przemieszczać, nazywamy znaczeniem koloru tego znacznika. Funkcja Rpre określa znaczenie kolorów znaczników pobieranych z miejsc z presetu tranzycji podczas jej odpalenia. Funkcja Rpo określa znaczenie kolorów znaczników umieszczanych na miejscach w postsecie tranzycji podczas jej odpalenia.

4 Miejsce p jest w presecie tranzycji t, jeśli istnieje łuk z p do t. 5 Miejsce p jest w postsecie tranzycji t, jeśli istnieje łuk z t do p.

18

Funktor uzgadniania Q korzysta z algorytmu uzgadniania opisanego w rozdziale 3.12, wywołuje ten algorytm dla wszystkich kolorów znaczników pobieranych przez tranzycję podczas silnego odpalenia. Umożliwia to zmianę znaczenia nadanego kolorom znaczników podczas wcześniejszych odpaleń lub podczas tworzenia sieci. Podczas słabego odpalenia trazycji funktor Q wywołuje algorytm uzgadniania tylko dla kolorów znaczników bez przypisanego im znaczenia, w celu nadania go tym kolorom znaczników. Znaczenie kolorów pozostałych pobieranych znaczników nie ulega zmianie w wyniku słabego odpalenia. Zauważmy, że Rpre=Rpo podczas słabego odpalenia, natomiast podczas silnego odpalenia Rpre może (ale nie musi) być różne od Rpo . Wykażemy w rozdziale 3.10, że problem uzgadniania jest w ogólnym przypadku (tzn. gdy funkcja substytucji nie jest różnowartościowa) równoważny z problemem sumy wielu podzbiorów, zatem jest NP-trudny. Jednak gdy przyjmiemy, że funkcja substytucji jest różnowartościowa, to złożoność problemu uzgadniania jest wielomianowa, dzięki czemu program może działać sprawnie. Różnowartościowość funkcji substytucji ma także uzasadnienie praktyczne – jeżeli w presecie tranzycji użytkownik programu umieści łuk etykietowany kilkoma zmiennymi, to może spodziewać się, że każdej z tych zmiennych będzie przydzielony inny kolor znaczników. W przeciwnym przypadku (gdyby funkcja substytucji nie była różnowartościowa), wystarczyłoby etykietować łuk jedną zmienną z odpowiednio zwiększoną krotnością.

19

3.7 Definicja sieci kolorowej ze zmiennymi etykietami łuków

Niech J będzie wielozbiorem zawierającym kolory i krotności znaczników indywidualnych występujących w danym miejscu sieci, a V będzie wielozbiorem zawierającym zmienne będące etykietami łuków wraz z współczynnikami przy tych zmiennych (ich krotnościami). Zatem J jest funkcją J: X → Ν a V jest funkcją V: X → N. Znaczniki indywidualne w sieciach ze zmiennymi etykietami łuków są parami (x, z) takimi, że: x ∈J ; x jest to element wielozbioru J; x to zbiór wszystkich znaczników określonego koloru

znajdujących się w wybranym miejscu sieci, z ∈V ∪ 0 ; z jest to element wielozbioru V;

z określa zmienną (etykietę łuku po którym znacznik może się poruszać) wraz z krotnością tej zmiennej).

Zapis V ∪ 0 oznacza, że znacznik może mieć lub nie mieć drugiego elementu pary niepustego. Jeżeli z = 0, to składowa zmienna znacznika zostanie mu przydzielona, gdy znacznik ten weźmie udział w odpaleniu tranzycji. Krotność zmiennej z jest równa liczności zbioru x lub jest równa 0, gdy znacznik x jeszcze nie ma przydzielonej mu zmiennej-etykiety łuku. Dostęp do elementów pary (x, z) jest możliwy za pomocą operatorów wyłuskania A1 i A2: A1: (J, V) → J jest funkcją zwracającą pierwszy argument jako wartość. A2: (J, V) → V jest funkcją zwracającą drugi argument jako wartość. Siódemkę Z=(S, T, F, K, M, W, B) nazywamy siecią kolorową ze zmiennymi etykietami łuków wtedy i tylko wtedy, gdy: (a) (S, T, F) jest siecią skończoną; jej elementy S oraz T nazywamy odpowiednio miejscami i

tranzycjami; (b) K: S → N ∪ {ω} każdemu miejscu nadaje pojemność (być może nieograniczoną); (c) W: F→ V \ 0 każdemu łukowi sieci przyporządkowuje wielozbiór zmiennych-etykiet łuku; (d) M: S → (J, V) jest znakowaniem początkowym zgodnym z pojemnościami, tj.

( )( )∑∈

≤∈∀)(

1 )(:sMx

sKxAJSs

(e) B: T → {0, 1} każdej tranzycji przyporządkowuje siłę odpalenia, przy czym 0 oznacza odpalenie słabe a 1 oznacza odpalenie silne.

Składowe sieci Z oznacza się przez SZ, TZ, FZ, KZ, WZ, MZ ,BZ.

20

3.8 Reguła słabego odpalenia dla sieci kolorowej ze zmiennymi etykietami łuków

Podczas słabego odpalenia tranzycji algorytm uzgadniania jest wywoływany tylko dla znaczników, które nie posiadają przypisanej im zmiennych-etykiet łuków określających znaczenie kolorów tych znaczników. Jeżeli znaczenie koloru pobieranego znacznika jest już ustalone, to nie może ono ulec zmianie podczas słabego odpalenia tranzycji. Jeżeli uzgodnienie się nie powiedzie, algorytm uzgadniania zwróci informację o błędzie. W tym przypadku tranzycja nie będzie mogła odpalić. Podczas słabego odpalenia tranzycji, funktor uzgadniania Q uzyskuje informacje o dokonanym wcześniej uzgodnieniu ze znaczników z presetu odpalanej tranzycji. Informacje te są wykorzystywane do utworzenia funkcji substytucji Rpre i Rpo przez funktor Q.Umożliwia to zachowanie znaczenia nadanego kolorom znaczników, które dzięki temu nie mogą przemieszczać się za pomocą innych etykiet łuków niż to zdefiniował użytkownik.

Niech Z będzie siecią kolorową ze zmiennymi etykietami łuków. (f) Odwzorowanie M: SZ

→ (J, V) nazywamy znakowaniem sieci Z wtedy i tylko wtedy, gdy ( )( )∑

≤∈∀)(

1 )(:sMx

Z sKxAJSs . Niech M będzie znakowaniem sieci Z.

(g) Odwzorowanie ( ) ( ) ( )( ) ( )popreZZ RRtBttWtMttQ ,,,,,,: →••• nazywamy funktorem uzgadniania dla słabego odpalenia, przy czym t ∈ TZ jest odpalaną tranzycją, •t jest zbiorem miejsc z presetu odpalanej tranzycji, M(•t) jest zbiorem znakowań miejsc z presetu odpalanej tranzycji, WZ(•t, t) jest zbiorem etykiet łuków prowadzących z miejsc z presetu odpalanej tranzycji do tej tranzycji, B(t) = 0 oznacza słabe odpalenie. Funktor Q zwraca parę (Rpre, Rpo), przy czym Rpre: V → J jest funkcją substytucji dla znaczników pobieranych z miejsc presetu odpalanej tranzycji, a Rpo: V → J jest funkcją substytucji dla znaczników umieszczanych na miejscach postsetu odpalanej tranzycji.

(h) Tranzycja t ∈ TZ jest M-aktywna (gotowa do odpalenia) wtedy i tylko wtedy, gdy ( )( )( ) ( )( )( )

( )( )( ) ( ) (( )( )stWRJsKsMAJts

tsWRJsMAJts

ZpoZ

Zpre

, oraz

,

1

1

−≤∈∀

≥∈∀

)

(i) M-aktywna tranzycja t ∈ TZ w wyniku odpalenia daje takie znakowanie następnicze M’ dla M, że dla każdego s ∈ SZ zachodzi

( )

( )( ) ( )( ) ( )( ) ( )( )( )( ) ( )( ) ( )( ) ( )( )( )( ) ( )( ) ( )( ) ( )( ) ( ) ( )( )

( )⎪⎪⎩

⎪⎪⎨

∩∈+−+−∈++∈−−

′••

••

••

przypadku pozostalym wsMttsstWtsWsMAstWRtsWRsMA

ttsstWsMAstWRsMAttstsWsMAtsWRsMA

sMZZZpoZpre

ZZpo

ZZpre

gdy wtw,,,,,,\gdy wtedy, tylkoi wtedy ,,,\gdy wtedy, tylkoi wtedy ,,,

21

21

21

Mówimy wówczas, że t odpala od M do M’, co oznaczamy przez M[t > M’. (j) Niech [M > będzie najmniejszym zbiorem takich znakowań, że

M ∈ [M > oraz jeżeli M1 ∈ [M > i dla pewnej tranzycji t ∈ TZ : M1[t > M2 , to M2 ∈ [M > .

21

3.9 Reguła silnego odpalenia dla sieci kolorowej ze zmiennymi etykietami łuków

Podczas silnego odpalenia tranzycji, funktor uzgadniania Q tworzy funkcję substytucji R za pomocą algorytmu uzgadniania, opisanego w rozdziałach 3.10 i 3.12. Algorytm ten jest wywoływany dla wszystkich kolorów znaczników znajdujących się w presecie odpalanej tranzycji, także dla tych kolorów znaczników, które mają już nadane znaczenie. Umożliwia to zmianę znaczenia nadanego kolorom znaczników podczas wcześniejszych odpaleń lub podczas tworzenia sieci. Jeżeli uzgodnienie się nie powiedzie, algorytm uzgadniania zwróci informację o błędzie. W tym przypadku tranzycja nie będzie mogła odpalić. Niech Z będzie siecią kolorową ze zmiennymi etykietami łuków. (k) Odwzorowanie M: SZ

→ (J, V) nazywamy znakowaniem sieci Z wtedy i tylko wtedy, gdy ( )( )∑

≤∈∀)(

1 )(:sMx

Z sKxAJSs . Niech M będzie znakowaniem sieci Z.

(l) Odwzorowanie ( ) ( ) ( )( ) ( )popreZZ RRtBttWtMttQ ,,,,,,: →••• nazywamy funktorem uzgadniania dla silnego odpalenia, przy czym t ∈ TZ jest odpalaną tranzycją, •t jest zbiorem miejsc z presetu odpalanej tranzycji, M(•t) jest zbiorem znakowań miejsc z presetu odpalanej tranzycji, WZ(•t, t) jest zbiorem etykiet łuków prowadzących z miejsc z presetu odpalanej tranzycji do tej tranzycji, B(t) = 1 oznacza silne odpalenie. Funktor Q zwraca parę (Rpre, Rpo), przy czym Rpre: V → J jest funkcją substytucji dla znaczników pobieranych z miejsc presetu odpalanej tranzycji, a Rpo: V → J jest funkcją substytucji dla znaczników umieszczanych na miejscach postsetu odpalanej tranzycji.

(m) Tranzycja t ∈ TZ jest M-aktywna (gotowa do odpalenia) wtedy i tylko wtedy, gdy ( )( )( ) ( )( )( )

( )( )( ) ( ) (( )( )stWRJsKsMAJts

tsWRJsMAJts

ZpoZ

Zpre

, oraz

,

1

1

−≤∈∀

≥∈∀

)

(n) M-aktywna tranzycja t ∈ TZ w wyniku odpalenia daje takie znakowanie następnicze M’ dla M, że dla każdego s ∈ SZ zachodzi

( )

( )( ) ( )( ) ( )( ) ( )( )( )( ) ( )( ) ( )( ) ( )( )( )( ) ( )( ) ( )( ) ( )( ) ( ) ( )( )

( )⎪⎪⎩

⎪⎪⎨

∩∈+−+−∈++∈−−

′••

••

••

przypadku pozostalym wsMttsstWtsWsMAstWRtsWRsMA

ttsstWsMAstWRsMAttstsWsMAtsWRsMA

sMZZZpoZpre

ZZpo

ZZpre

gdy wtw,,,,,,\gdy wtedy, tylkoi wtedy ,,,\gdy wtedy, tylkoi wtedy ,,,

21

21

21

Mówimy wówczas, że t odpala od M do M’, co oznaczamy przez M[t > M’. (o) Niech [M > będzie najmniejszym zbiorem takich znakowań, że

M ∈ [M > oraz jeżeli M1 ∈ [M > i dla pewnej tranzycji t ∈ TZ : M1[t > M2 , to M2 ∈ [M > .

22

3.10 Dowód NP-zupełności problemu uzgadniania zmiennych-etykiet łuków z kolorami znaczników Problem sumy wielu podzbiorów 6 (ang. Multiple Subset Sum Problem (MSSP)) jest uogólnieniem klasycznego problemu sumy podzbioru. Problem ten jest równoważny ze szczególnym przypadkiem problemu plecakowego, w którym występuje wiele plecaków a wartość każdego przedmiotu jest wprost proporcjonalna do jego wagi (tzn. do jego masy spoczynkowej). Zakładam na potrzeby dowodu, że pojemność plecaka jest to jego nośność, czyli masa przedmiotów, które można do niego włożyć, a nie jego objętość. Formalna definicja problemu sumy wielu podzbiorów (MSSP) jest następująca: Dany jest zbiór N:={1,...,n} przedmiotów, każdy przedmiot i posiada dodatnią wagę wi oraz zbiór M:={1,...,m} plecaków, każdy plecak j ma dodatnią pojemność cj. Celem jest wybór podzbioru przedmiotów o maksymalnej wadze całkowitej, który może zostać zapakowany do plecaków. Problem może zostać sformułowany w następujący sposób: maksymalizuj ∑∑

∈ ∈Mj Niiji qw

przy czym , ,∑

∈≤Ni

jiji Mjcqw

{ } ., ,1,0

, ,1

MjNiq

Niq

ij

Mjij

∈∈∈

∈≤∑∈

Niech cmax i cmin oznaczają maksymalną i minimalną pojemność plecaków. Zakładamy, że , ponieważ w przeciwnym przypadku największy przedmiot może zostać usunięty z badanego problemu, i że , ponieważ w przeciwnym przypadku najmniejszy plecak może zostać usunięty.

maxmax cwiNi ≤∈

iNi wc ∈≥ minmin

Ładunek plecaka j reprezentuje całkowitą wagę przedmiotów załadowanych do j, jest on oznaczany przez λj. Problem sumy wielu podzbiorów jest NP-trudny. Rozważmy następujący problem decyzyjny oparty na problemie sumy wielu podzbiorów: Czy zbiór przedmiotów N można załadować do zbioru plecaków M ? Wykażę, że problem ten jest równoważny z decyzyjną wersją opisanego w rozdziale 3.6 problemu uzgadniana: Czy istnieje takie przyporządkowanie kolorów znaczników do zmiennych etykietujących łuki z presetu badanej tranzycji, aby mogła ona odpalić ?

6 [5] A. Caprara, H. Kellerer, U. Pferschy, “A PTAS for the Multiple Subset Sum Problem with Different Knapsack Capacities”, Information Processing Letters 73 (2000) 111-118

23

...,,,

, , , , ...w1 1z w2 2z w3 3z w4 4z w5 5z w zn n

c1 1x cm mc x4 4c x3 3c2 2x x

Decyzyjny problem sumy wielu podzbiorów: czy istnieje takie przyporządkowanie przedmiotów z1...zn o wagach w1...wn plecakom w kolorach x1...xm o pojemnościach c1...cm, aby zapakować wszystkie przedmioty ?

s

c +c +...+c1 1 2 2 mx x xm

w z + w z +...+ w z1 1 2 2 n n

t

Decyzyjny problem uzgodnienia: Czy istnieje takie przyporządkowanie znaczników o kolorach x1...xm i krotnościach c1...cm zmiennym z1...zn mających współczynniki (krotności) w1...wn, że tranzycja t może odpalić ? Aby przekształcić problem sumy wielu podzbiorów w problem uzgodnienia, należy przedmioty z1...zn o wagach w1...wn przekształcić w zmienne z1...zn o krotnościach w1...wn etykietujące łuk z miejsca s do tranzycji t. Plecaki w kolorach x1...xm o pojemnościach c1...cm należy przekształcić w kolorowe znaczniki x1...xm o krotnościach c1...cm . Powyższe problemy są równoważne, ponieważ włożenie przedmiotu zi o wadze wi do plecaka w kolorze xj o pojemności cj jest równoważne przyporządkowaniu koloru xj zmiennej zi a następnie pobraniu wi znaczników koloru xj z miejsca s za pomocą zmiennej-etykiety łuku zi podczas odpalenia tranzycji t.

24

Ilość pozostałego wolnego miejsca w plecaku w kolorze xj jest równa ilości znaczników koloru xj , które nie zostaną pobrane z miejsca s za pomocą zmiennej-etykiety łuku zi podczas odpalenia tranzycji t. Znaczniki te mogą zostać przyporządkowane do innych zmiennych, podobnie jak pozostałe wolne miejsce w plecaku może zostać zapełnione przez inne przedmioty. Włożenie wszystkich przedmiotów do plecaków jest równoważne ze znalezieniem przyporządkowania kolorów znaczników wszystkim zmiennym-etykietom łuku, co umożliwia odpalenie tranzycji. Ponieważ wykazałem, że problem uzgodnienia jest NP-trudny dla jednego miejsca w presecie tranzycji, zatem jest również NP-trudny, gdy w presecie tranzycji jest wiele miejsc.

3.11 Dowód wielomianowej złożoności zmodyfikowanego decyzyjnego problemu plecakowego Jeżeli założymy dla decyzyjnego problemu plecakowego, że do każdego plecaka należy włożyć dokładnie jeden przedmiot, to problem ten będzie można rozwiązać w czasie wielomianowym. Zmodyfikowany decyzyjny problem plecakowy: Czy istnieje takie przyporządkowanie przedmiotów z1...zn o wagach w1...wn plecakom w kolorach x1...xm o pojemnościach c1...cm, aby zapakować po jednym przedmiocie do każdego plecaka ? W tym celu należy plecaki posortować rosnąco względem ich pojemności. Alternatywnym sposobem sortowania plecaków jest policzenie, ile spośród wszystkich przedmiotów można włożyć do każdego plecaka (jeden przedmiot naraz). Ponieważ do najmniejszego plecaka można włożyć najmniej ze wszystkich przedmiotów, a do największego plecaka najwięcej, to po posortowaniu plecaków wg ilości przedmiotów, które można do tych plecaków włożyć, otrzymamy taki sam wynik co w wyniku sortowania plecaków względem ich pojemności. Ten sposób sortowania został użyty w programie „Symulator sieci Petriego”. Po posortowaniu plecaków należy załadowywać je kolejno, zaczynając od najmniejszego plecaka, a kończąc na największym. Przedmioty wkładane do plecaków można wybierać w dowolny sposób, oczywiście uwzględniając ich wagę, która nie może przekraczać pojemności plecaka. Jeżeli istnieje przyporządkowanie przedmiotów do plecaków, to zostanie ono obliczone w wyniku powyższego postępowania. Nie istnieje lepszy sposób rozmieszczania przedmiotów w plecakach przy podanych założeniach.

25

Dowód: Załóżmy, że mamy dwa plecaki, większy plecak x1 o pojemności c1 i mniejszy plecak x2 o pojemności c2 oraz dwa przedmioty, cięższy przedmiot z1 o wadze w1=c1 i lżejszy przedmiot z2 o wadze w2=c2. Niech plecaki będą ładowane w kolejności wyznaczanej przez ich indeksy. Jeżeli załadunek rozpoczniemy od większego plecaka x1, to będziemy mogli załadować do niego jeden z dwóch przedmiotów. Jeżeli do plecaka x1 włożymy lżejszy przedmiot z2 ,to nie zdołamy załadować plecaka x2, ponieważ przedmiot z1 będzie zbyt ciężki dla tego plecaka. Jeżeli jest m ≥ 2 plecaków, i nie są one posortowane rosnąco względem pojemności, to istnieją co najmniej dwa plecaki xa i xb takie, że większy plecak xb o pojemności cb jest ładowany przed mniejszym plecakiem xa o pojemności ca. Lista L plecaków do załadowania przedstawia się następująco: x1...xb...xa...xm , gdzie 1≤b<a ≤m. Załóżmy, że w zbiorze przedmiotów jest b przedmiotów o wadze równej pojemności najmniejszego plecaka, a waga każdego z pozostałych przedmiotów jest równa pojemności najmniejszego plecaka o pojemności większej niż ca. Plecakiem tym może być xb, jeżeli spełnia on ten warunek. Przedmiotów jest tyle samo lub więcej niż plecaków – gdy jest ich mniej to problem staje się trywialny. Mniejszego plecaka xa nie uda się załadować, jeżeli wszystkie lżejsze przedmioty zostaną załadowane do plecaków poprzedzających ten plecak na liście L, w tym do większego plecaka xb. Jeżeli jednak przywrócimy porządek częściowy plecaków względem ich pojemności, dla powyższego przykładu zamieniając miejscami plecaki xa i xb, to uda się je wszystkie załadować. Z powyższego dowodu wynika, że także problem uzgodnienia można rozwiązać w czasie wielomianowym przy założeniu różnowartościowości funkcji substytucji, ponieważ oba problemy są równoważne. Problem uzgodnienia można rozwiązać przy tym założeniu w czasie wielomianowym również w przypadku, gdy w presecie tranzycji jest wiele miejsc, ponieważ można go łatwo przekształcić w problem uzgodnienia dla jednego miejsca w presecie tranzycji, postępując zgodnie z algorytmem opisanym w rozdziale 3.12.

26

3.12 Opis algorytmu uzgadniania zmiennych-etykiet łuków z kolorami znaczników

Ponieważ problem uzgadniania okazał się w ogólnym przypadku NP-trudny, zmodyfikowałem definicję funkcji substytucji R tak aby była ona różnowartościowa, co umożliwiło rozwiązanie problemu uzgadniania w czasie wielomianowym. Złożoność algorytmu jest O( JV × ). W presecie tranzycji może znajdować się wiele miejsc, dlatego też pierwszą czynnością algorytmu jest ustalenie, jakie kolory znaczników z tych miejsc mogą zostać przypisane do każdej ze zmiennych etykietujących łuki z presetu tranzycji. W tym celu tworzona jest macierz rozmiaru JV × będąca funkcją charakterystyczną q : ( ) JV × { }1,0→możliwych przypisań kolorów znaczników do zmiennych, spełniającą warunki: ( ) ( ) ( ) ( ) ,, ,:, JjVijJqiVtsWisMjts ijZ ∈∈≤⋅∈∀∈∀∈∀ •

{ } ., ,1,0 JjViqij ∈∈∈ gdzie: V jest wielozbiorem zmiennych , każda zmienna i posiada dodatni współczynnik (krotność) V(i) , nazwy zmiennych są reprezentowane jako liczby z zakresu 1..V ; J jest wielozbiorem kolorów znaczników, każdy kolor j ma przypisaną mu ilość znaczników tego koloru J(j) , kolory znaczników są reprezentowane jako liczby z zakresu 1.. J . Następnie dla każdej zmiennej liczona jest ilość kolorów znaczników, które można przypisać na tą zmienną, czyli ilość jedynek w odpowiadającym tej zmiennej wierszu macierzy q.

( ) ∑∈

=∈∀Jj

ijqifVi :

Zmienne sortujemy rosnąco wg wartości funkcji f tworząc listę L. W ten sposób przekształciliśmy problem uzgodnienia dla wielu miejsc w presecie tranzycji w problem uzgodnienia dla jednego miejsca w presecie tranzycji. Dla potrzeb tego przekształcenia można przyjąć, że liczba znaczników koloru j jest równa ilości jedynek w kolumnie j macierzy q, a krotność zmiennej i jest równa ilości jedynek w wierszu i macierzy q. Przydzielanie kolorów znaczników do zmiennych następuje w sposób losowy, ale uwzględniający kolejność zmiennych na liście L. Najpierw losowane są kolory znaczników dla zmiennych o najmniejszej liczbie możliwych przypisań kolorów, a zmienne o największej liczbie możliwych przypisań kolorów są obsługiwane na końcu. Wylosowane kolory nie mogą się powtarzać i muszą spełniać warunek, że ., ,1 JjViqij ∈∈= Ponieważ po przydzieleniu koloru j do zmiennej i zerujemy odpowiadającą temu kolorowi kolumnę w tablicy funchar odpowiadającej za funkcję charakterystyczną q, z wyjątkiem elementu qij ,do dyspozycji następnej zmiennej pozostaje o jeden mniej kolorów znaczników. Po przydzieleniu kolorów do wszystkich zmiennych, funkcja charakterystyczna q będzie spełniała warunek: 1: ∑

=∈∀Jj

ijqVi

Przydzielone do wszystkich zmiennych kolory znaczników są zapisywane w tablicy jednowymiarowej rozmiaru V . Tablica ta jest wynikiem działania algorytmu uzgadniania, jest ona wykorzystywana podczas tworzenia funkcji substytucji Rpre i Rpo zdefiniowanych w rozdziale 3.6.

27

4 Porównanie sieci kolorowych ze zmiennymi etykietami łuków z sieciami relacji7

Sieci relacji wykazują duże podobieństwo z sieciami kolorowymi ze zmiennymi etykietami łuków. Podstawową różnicą między tymi sieciami jest sposób interpretowania napisów etykietujących łuki. W sieci relacji każdy napis f przy łuku sieci R jest przekształcany w relację EDf ×⊆ , będącą funkcją charakterystyczną { }1,0: →× EDf , gdzie D jest wielozbiorem znaczników, a E jest wielozbiorem etykiet łuków. Oznacza to, że w sieci relacji za pomocą pojedynczej etykiety łuku może się przemieścić wiele znaczników różnych kolorów, podczas gdy w sieci ze zmiennymi etykietami łuków za pomocą pojedynczej etykiety łuku (zmiennej o krotności n) może się przemieścić dokładnie n znaczników tego samego koloru. Ponadto w sieci relacji występuje pojęcie koloru odpalenia tranzycji, która może odpalić w jednym z wielu kolorów. Zależnie od koloru odpalenia tranzycja może pobrać różną, zdefiniowaną podczas tworzenia sieci liczbę znaczników każdego koloru.

Odpalenie tranzycji w kolorze A w sieci relacji.

Odpalenie tranzycji w kolorze B w sieci relacji.

Relacje dla poszczególnych etykiet łuków w tej sieci są zdefiniowane następująco: q1: (2a+b, A) ; q1: (a+2b, B) ; q2: (a+b, A) ; q2: (2a+2b, B) ; q3: (b, A) ; q3: (2a+3b, B) ; q4: (2a+2b, A) ; q4: (2a+2b, B) .

7 [1] Wolfgang Reisig, „Sieci Petriego” (rozdział 9) , Wydawnictwa Naukowo-Techniczne, Warszawa 1988

28

Zaletami sieci relacji są: - statyczne, ustalone na etapie tworzenia sieci znaczenie etykiet łuków, co ułatwia analizę własności sieci i umożliwia uniknięcie opisanego wcześniej problemu uzgadniania, który jest kłopotliwy z matematycznego punktu widzenia z powodu jego NP-zupełności w ogólnym przypadku ; - duża ilość publikacji na temat tych sieci; - istnienie programów do tworzenia i analizy sieci relacji, np. Graf 8. Wadami sieci relacji są: - duży nakład pracy podczas tworzenia sieci – dla każdej etykiety łuku trzeba wypełnić tabelę, w której dla każdego koloru odpalenia tranzycji należy zdefiniować wielozbiór znaczników biorących udział w odpaleniu; - konieczność wyboru koloru odpalenia tranzycji podczas symulacji działania sieci; - mała „wizualność” sieci – bez znajomości relacji związanych z każdą etykietą łuku trudno jest domyślić się sposobu działania tej sieci. Zalety sieci kolorowych ze zmiennymi etykietami łuków są następujące: - dynamiczne, przydzielane w czasie działania sieci znaczenie etykiet łuków i znaczników, dzięki czemu nie ma potrzeby definiować relacji dla poszczególnych etykiet łuków - duża „wizualność” sieci – na podstawie rysunku sieci można łatwo domyślić się jej sposobu działania, ponieważ każdej zmiennej jest przypisywany inny kolor znaczników, a krotności zmiennych i ilości przypisanych na te zmienne znaczników są sobie równe ; - działanie symulatora sieci nie wymaga ręcznego wyboru koloru odpalenia tranzycji ; - dwie definicje odpalenia: słaba i silna ; - możliwość łączenia zmiennych etykiet łuków ze stałymi etykietami łuków w obrębie jednej sieci, a nawet w obrębie jednego łuku. Wady sieci kolorowych ze zmiennymi etykietami łuków są następujące: - Analiza tych sieci jest możliwa dopiero po przypisaniu wszystkim znacznikom etykiet łuków, po których te znaczniki mogą się poruszać. Przypisania tego można dokonać ręcznie w trakcie tworzenia sieci, ale lepszym sposobem jest uruchomienie symulacji działania sieci. - W przypadku zastosowania silnej definicji odpalenia lub łączenia zmiennych etykiet łuków ze stałymi etykietami łuków w obrębie jednej sieci, analiza sieci będzie utrudniona.

W sieciach kolorowych ze zmiennymi etykietami łuków różnym zmiennym muszą być przypisane odrębne kolory znaczników podczas odpalania tranzycji. Jest to konsekwencją ominięcia NP-zupełności problemu uzgodnienia przez założenie różnowartościowości funkcji substytucji Rpre i Rpo. Różnowartościowość funkcji substytucji ma także uzasadnienie praktyczne – jeżeli w presecie tranzycji użytkownik programu umieści łuk etykietowany kilkoma zmiennymi, to może spodziewać się, że każdej z tych zmiennych będzie przydzielony inny kolor znaczników. W przeciwnym przypadku (gdyby funkcja substytucji nie była różnowartościowa), wystarczyłoby etykietować łuk jedną zmienną z odpowiednio zwiększoną krotnością.

8 [9] Zbigniew Suraj, Bogumił Komarek „Graf. System graficznej konstrukcji i analizy sieci Petriego”, Akademicka Oficyna Wydawnicza PLJ, Warszawa 1994

29

5 Instrukcja obsługi 5.1 Wprowadzenie Program służy do tworzenia, analizy i symulacji działania sieci Petriego następujących typów: P/T sieci, sieci ze znacznikami indywidualnymi i stałymi etykietami łuków oraz sieci ze znacznikami indywidualnymi i zmiennymi etykietami łuków. Program do efektywnej pracy wymaga komputera z procesorem Pentium lub kompatybilnym, wyposażonego w 128 MB RAM, myszkę (zalecana jest myszka z rolką zgodna ze standardem MS-IntelliMouse), kolorowy monitor i kartę graficzną zgodną z VGA (zalecana jest rozdzielczość co najmniej 800x600 ale możliwa jest też praca w rozdzielczości 640x480). Program działa w systemach operacyjnych Microsoft Windows NT4, Windows 2000 i Windows XP. Program posiada intuicyjny graficzny interfejs użytkownika sterowany głównie za pomocą myszy. 5.2 Instalacja programu W celu zainstalowania programu należy uruchomić program instalacyjny „setup.exe” znajdujący się na płycie CD w katalogu „setup”. Pokaże się standardowe okno instalatora „InstallShield”.

Należy potwierdzić domyślny wybór katalogu „C:\Program files\Witas\Symulator sieci Petriego”, lub wprowadzić własny katalog, do którego program ma zostać zainstalowany, a następnie wcisnąć przycisk ekranowy „Next”. Pojawi się następna strona, na której można wybrać nazwę folderu programu w menu „Start”. Po ponownym naciśnięciu przycisku ekranowego „Next” nastąpi instalacja programu. Po zakończeniu instalacji można od razu włączyć program klikając na pole wyboru „Yes, Launch the program file” i zamknąć program instalacyjny klikając na przycisk ekranowy „Finish. Po zakończonej pomyślnie instalacji program będzie dostępny w podmenu „Programy” menu „Start” pod nazwą „Symulator sieci Petriego”. W celu usunięcia programu z komputera należy uruchomić Panel sterowania systemu MS Windows, a następnie opcję „Dodaj lub usuń programy”. Pojawi się lista zainstalowanych w systemie programów, z której należy wybrać „Symulator sieci Petriego”, a następnie wcisnąć

30

przycisk ekranowy „Zmień/Usuń” i potwierdzić polecenie usunięcia programu wciskając „Tak”.

31

5.3 Opis głównego okna programu

Główne okno programu zawiera: pasek menu, pasek narzędzi, obszar rysowania i pasek informacyjny.

32

5.3.1 Menu główne programu zawiera następujące podmenu: Pliki, Opcje i Pomoc. Podmenu Pliki zawiera następujące pozycje: Nowa sieć - usuwa istniejącą sieć umożliwiając stworzenie nowej sieci. Otwórz - wczytuje sieć z pliku. Zapisz - zapisuje sieć do pliku. Dołącz wybrane – wczytuje sieć z pliku i dołącza do edytowanej sieci. Zapisz wybrane – zapisuje zaznaczony przez użytkownika fragment sieci do pliku. Eksportuj rysunek - tworzy plik BMP zawierający obraz sieci w wybranej skali. Drukuj sieć - tworzy wydruk sieci na wybranej drukarce. Ustawienia drukarki - pozwala wybrać drukarkę, jej rozdzielczość i rozmiar kartki papieru. Koniec pracy - wyłącza program. Podmenu Opcje zawiera następujące pozycje: Renumeracja obiektów - ponownie numeruje miejsca i tranzycje rozpoczynając od 1 Analiza właściwości sieci - uruchamia analizator sieci Petriego. Ustawienia programu - umożliwia edycję graficznych własności sieci oraz parametrów symulacji. Podmenu Pomoc zawiera pozycje: Instrukcja obsługi - pokazuje instrukcję obsługi programu. O programie - pokazuje informacje o programie i jego autorze. 5.3.2 Obszar rysowania służy do wizualizacji i graficznej edycji sieci. Jest on wyposażony w suwaki, za pomocą których można przesuwać pole widzenia po większym rysunku sieci. Posiadając mysz z rolką można w wygodny sposób za jej pomocą przesuwać pole widzenia. Aby przesunąć pole widzenia w poziomie należy obracać rolkę, jednocześnie trzymając wciśnięty prawy przycisk myszy (odnosi się to do myszy działających w trybie MS-IntelliMouse) Jeżeli rolka nie chce działać (np. po wczytaniu sieci lub zmianie skali), należy poruszyć wskaźnikiem myszy znajdującym się na obszarze rysowania w celu uaktywnienia rolki. Rolka jest wyłączona podczas przesuwania i wymiarowania wszystkich obiektów. Podczas przesuwania obiektu działa automatyczne przesuwanie pola widzenia, w tym celu trzeba umieścić kursor myszy w pobliżu krawędzi obszaru rysowania. Uwaga: automatyczne przesuwanie się pola widzenia nie działa podczas symulacji działania sieci.

5.3.3 Pasek informacyjny służy do komunikacji programu z użytkownikiem. Lewe pole wyświetla informację o pozycji kursora na obszarze rysowania w formacie ( współrzędna X, współrzędna Y ), przy czym lewy góry róg rysunku ma współrzędne (0 , 0) Środkowe pole wyświetla nazwę pliku sieci oraz ilość tranzycji, miejsc i łuków w sieci. Prawe pole wyświetla numer porządkowy i nazwę wybranego obiektu lub odpalonej tranzycji. Jeżeli wybrano więcej niż jeden obiekt, w polu tym będzie podana liczba wybranych miejsc i tranzycji. Podczas symulacji działania sieci w prawym polu jest wypisywana informacja o ostatnio odpalonej tranzycji lub informacja o niemożności odpalenia żadnej tranzycji.

33

5.3.4 Pasek narzędziowy zawiera następujące przyciski ekranowe:

Tryb wskazywania - umożliwia wybieranie obiektów, zmianę właściwości, przemieszczanie oraz zmianę rozmiarów i kształtu. Po kliknięciu na obiekt pojawią się uchwyty, za pomocą których można zmieniać jego rozmiar i kształt, a w prawym polu paska informacyjnego pojawia się informacja o tym obiekcie. Aby przemieścić obiekt, ustaw wskaźnik myszy na wnętrze obiektu, następnie wciśnij lewy przycisk myszy i nie puszczając go przesuń obiekt na nowe miejsce, po czym puść przycisk myszy. Podczas przesuwania obiektu poza granice pola widzenia nastąpi automatyczne przesuwanie się pola widzenia w kierunku wyznaczonym przez wskaźnik myszy. Gdy pole widzenia osiągnie pożądany obszar rysunku sieci, umieść wskaźnik myszy na polu widzenia i "upuść" obiekt. Powyższe wskazówki są ważne także dla grup wybranych obiektów. Aby wybrać wiele obiektów, należy otoczyć je ramką wyboru grupy obiektów, lub klikać kolejno na nie trzymając wciśnięty klawisz Shift. Ramka wyboru grupy obiektów pojawi się, gdy wciśniesz lewy przycisk myszy gdy kursor znajduje się na pustym miejscu rysunku i przesuniesz kursor myszy w nowe miejsce. Po puszczeniu lewego przycisku myszy obiekty (tj. miejsca i tranzycje) otoczone przez ramkę wyboru zostaną zaznaczone. Trzymając klawisz Shift podczas wywoływania ramki wyboru grupy obiektów, możesz zaznaczyć nowe obiekty nie usuwając zaznaczenia już wybranych. Wybrane obiekty możesz zapisać na dysk używając opcji menu „Zapisz wybrane”. Trzymając wciśnięty klawisz Ctrl podczas przesuwania wybranych obiektów spowodujesz ich skopiowanie. Aby dokonać edycji właściwości obiektu, dwukrotnie kliknij na ten obiekt lub na jego opis - pojawi się okno edycji właściwości obiektu. Aby usunąć obiekt, wybierz go i wciśnij klawisz Delete. Aby zgiąć łuk, wybierz go i przesuń jego uchwyt. Aby wyprostować łuk, wybierz go i wciśnij klawisz spacji.

Tryb dodawania tranzycji - po kliknięciu w wybrane miejsce obszaru rysowania pojawi się nowa tranzycja oraz okno edycji właściwości tranzycji (jeżeli wybrana została stosowna opcja na stronie Edytor okna Ustawienia).

Tryb dodawania miejsc - po kliknięciu w wybrane miejsce obszaru rysowania pojawi się nowe miejsce oraz okno edycji właściwości miejsca (jeżeli wybrana została stosowna opcja na stronie Edytor okna Ustawienia).

Tryb dodawania łuków - przesuń kursor myszy na pierwszy obiekt (tranzycję lub miejsce), a następnie wciśnij lewy klawisz myszy i nie puszczając go przesuń kursor myszy na drugi obiekt (odpowiednio: miejsce lub tranzycję). Jeżeli drugi obiekt znajduje się poza krawędzią ekranu, nie puszczając lewego klawisza myszy, najedź na krawędź, za którą znajduje się ten obiekt, co spowoduje automatyczne przesunięcie pola widzenia i wyświetlenie szukanego obiektu. Po przesunięciu kursora myszy na drugi obiekt i puszczeniu lewego klawisza myszy, obiekty zostaną połączone łukiem, pojawi się też okno edycji właściwości łuku (jeżeli wybrana została stosowna opcja na stronie Edytor okna Ustawienia). Jeżeli ta opcja nie została wybrana, nowy łuk będzie etykietowany jednym czarnym znacznikiem. Kliknij dwukrotnie na nowym łuku, aby dokonać edycji jego właściwości. Aby zlikwidować nowo utworzony łuk wciśnij klawisz Delete.

34

Usuwanie obiektów - wybierz obiekt, a następnie kliknij na ten przycisk ekranowy lub

wciśnij klawisz Delete, aby usunąć ten obiekt. Jeżeli usuwasz miejsce lub tranzycję, to usuniesz też wszystkie łuki związane z tym miejscem lub tranzycją.

Zablokuj tranzycję [kl. B] - wybierz tranzycję i wciśnij ten przycisk ekranowy, aby uniemożliwić odpalenie tej tranzycji. Ponowne wybranie tej tranzycji i wciśnięcie przycisku spowoduje odblokowanie tranzycji.

Zablokuj / odblokuj możliwość zmiany przypisań zmiennych do znaczników [kl. A] umożliwia zmianę siły (definicji) odpalenia - gdy tranzycja ma ramkę czerwoną to podczas odpalenia może nastąpić zmiana przypisań znaczników do zmiennych-etykiet łuków, jeżeli tranzycja ma czarną ramkę, to zmiana raz nadanych przypisań znaczników do łuków nie jest możliwa.

Uruchom symulację wstecz [kl. W] – wciśnij ten przycisk aby sieć zaczęła działać wstecz.

Prędkość działania sieci można zmienić w oknie Ustawienia programu.

W trybie symulacji nie można dodawać i usuwać obiektów, nie działa też automatyczne przesuwanie pola widzenia podczas ich przemieszczania.

Cofnij symulację o jeden krok [kl. C] - - po wciśnięciu tego przycisku zostania odpalona

wstecz jedna tranzycja. Tranzycje zaznaczone przez użytkownika mają wyższy priorytet niż pozostałe. W ten sposób można wymusić odpalenie wstecz wybranej tranzycji - wystarczy ją wskazać klikając na nią, a następnie nacisnąć klawisz C.

Tranzycje zablokowane nie mogą zostać odpalone.

Zatrzymaj symulację [kl. Z] – wciśnij ten przycisk jeżeli chcesz przejść do trybu edycji sieci lub gdy chcesz zmienić kierunek działania symulacji (wymaga to jej uprzedniego zatrzymania).

Uruchom symulację [kl. S]- wciśnij ten przycisk aby sieć zaczęła się wykonywać. Prędkość działania sieci można zmienić w oknie Ustawienia programu. W trybie symulacji nie można dodawać i usuwać obiektów, nie działa też automatyczne przesuwanie pola widzenia podczas ich przemieszczania.

Wykonaj jeden krok symulacji [kl. Enter] - po wciśnięciu tego przycisku zostania odpalona jedna tranzycja. Tranzycje zaznaczone przez użytkownika mają wyższy priorytet niż pozostałe. W ten sposób można wymusić odpalenie wybranej tranzycji - wystarczy ją wskazać klikając na nią, a następnie nacisnąć klawisz Enter. Tranzycje zablokowane nie mogą zostać odpalone.

Skalowanie rysunku sieci - umożliwia wybór skali rysunku w zakresie od 10% do 200 %. Skalę można wybrać z listy lub wprowadzić z klawiatury.

Używając klawiszy [+] i [-] z klawiatury numerycznej można płynnie zmieniać skalę rysunku.

35

5.4 Okno edycji miejsca

W oknie tym można edytować właściwości miejsca. Zawartość miejsca wprowadza się podając liczność znaczników każdego koloru i symbol tych znaczników, kolejne elementy wielozbioru oddzielając znakiem +. Czarny znacznik jest reprezentowany przez znak @. Pole wpisowe "Przypisania" umożliwia dla każdego koloru znaczników ustalenie jego znaczenia, tzn. zmiennej na którą program ma przypisać znacznik tego koloru podczas odpalenia tranzycji znajdującej się w zbiorze wyjściowym (postset) edytowanego miejsca. Zatem znacznik indywidualny jest parą (stała, zmienna), gdzie stała określa kolor znacznika, a zmienna jest etykietą łuku określającą jego znaczenie. Uniemożliwia to zmianę znaczenia kolorów znaczników podczas działania sieci. Jeżeli nie określisz znaczenia koloru jakiegoś znacznika, komputer sam wybierze znaczenie tego koloru podczas pobierania przez tranzycję znacznika w tym kolorze, a następnie zapisze je razem ze znacznikiem w odpowiednim miejscu ze zbioru wyjściowego tej tranzycji. Pojemność określa maksymalną pojemność danego miejsca; 0 oznacza nieograniczoną pojemność. Po wciśnięciu przycisku ekranowego "Przesuń nazwę" okno dialogowe się zamknie, a w miejscu wskaźnika myszy pojawi się prostokątna ramka odpowiadająca przesuwanej nazwie miejsca. Umieść ramkę w wybranym miejscu i naciśnij lewy przycisk myszy, aby przemieścić napis. Podczas przesuwania napisu działa automatyczne przesuwanie pola widzenia, w tym celu trzeba umieścić kursor myszy w pobliżu krawędzi obszaru rysowania. Podczas przesuwania napisu nie działa rolka myszy - należy korzystać z funkcji automatycznego przesuwania.

36

5.5 Okno edycji tranzycji

W oknie tym można edytować właściwości tranzycji Kontrolka "Silna definicja odpalenia" - umożliwia zmianę siły (definicji) odpalenia - gdy kontrolka jest zaznaczona to podczas odpalenia może nastąpić zmiana już nadanego przypisania koloru znacznika do zmiennej (etykiety łuku służącego do przemieszczania znacznika tego koloru). Gdy kontrolka nie jest zaznaczona (słaba definicja odpalenia), raz nadane przypisania koloru znacznika do zmiennej nie mogą zostać zmienione. Siła z jaką może odpalić tranzycja jest odwzorowana na rysunku sieci przez kolor ramki tranzycji – czarny dla słabej definicji odpalenia i czerwony dla silnej definicji odpalenia. Po wciśnięciu przycisku ekranowego "Przesuń nazwę" okno dialogowe się zamknie, a w miejscu wskaźnika myszy pojawi się prostokątna ramka odpowiadająca przesuwanej nazwie miejsca. Umieść ramkę w wybranym miejscu i naciśnij lewy przycisk myszy, aby przemieścić napis. Podczas przesuwania napisu działa automatyczne przesuwanie pola widzenia, w tym celu trzeba umieścić kursor myszy w pobliżu krawędzi obszaru rysowania. Podczas przesuwania napisu nie działa rolka myszy - należy korzystać z funkcji automatycznego przesuwania. Po wciśnięciu przycisku ekranowego "Obróć tranzycję" nastąpi obrócenie tranzycji o 90 o względem jej środka oraz stosowne przemieszczenie nazwy tranzycji, jeżeli jest to konieczne.

37

5.6 Okno edycji łuku

W oknie tym można edytować właściwości łuku. Stałe etykiety łuku wprowadza się podając liczność znaczników każdego koloru i nazwy kolorów tych znaczników, kolejne elementy wielozbioru oddzielając znakiem +. Nazwy znaczników muszą zaczynać się od litery. Wyjątkiem jest czarny znacznik reprezentowany przez znak @. Zmienne etykiety łuku wprowadza się podając współczynniki przy zmiennych oraz nazwy tych zmiennych, kolejne elementy wielozbioru oddzielając znakiem +. Nazwy zmiennych muszą zaczynać się od litery. Po wciśnięciu przycisku ekranowego "Przesuń opis etykiety" okno dialogowe się zamknie, a w miejscu wskaźnika myszy pojawi się prostokątna ramka odpowiadająca przesuwanemu napisowi. Umieść ramkę w wybranym miejscu i naciśnij lewy przycisk myszy, aby przemieścić napis. Podczas przesuwania napisu działa automatyczne przesuwanie pola widzenia, w tym celu trzeba umieścić kursor myszy w pobliżu krawędzi obszaru rysowania. Podczas przesuwania napisu nie działa rolka myszy - należy korzystać z funkcji automatycznego przesuwania. Przyciski ekranowy "Przesuń opis łuku" działa podobnie jak opisany wyżej przycisk „Przesuń opis etykiety". Przycisk ekranowy "Wyprostuj łuk" działa podobnie jak klawisz spacji - prostuje łuk będący linią łamaną.

38

5.7 Okno zmiany ustawień sieci Okno ustawień zawiera sześć stron, które można zmieniać klikając na zakładki: „Edytor”, „Symulator”, „Analizator”, „Kolory” , „Czcionki” , „Opisy”. Przycisk ekranowy „Zapisz jako domyślne” umożliwia zapamiętanie obecnych ustawień, dzięki czemu po wyłączeniu programu ustawienia te nie zostaną utracone. Po ponownym uruchomieniu programu ustawienia będą takie jak w chwili naciśnięcia przycisku „Zapisz jako domyślne”. 5.7.1 Strona „Symulator” Strona ta określa zachowanie symulatora sieci Petriego. Odpalenie tranzycji może być wizualizowane w jednej lub w dwóch fazach – gdy są dwie fazy to najpierw są zaznaczane (różnymi kolorami) miejsca z presetu odpalanej tranzycji i odpalana tranzycja, a następnie miejsca z postsetu odpalanej tranzycji i odpalana tranzycja. Gdy odpalanie jest wizualizowane w jednej fazie to miejsca z presetu i z postsetu odpalanej tranzycji są zaznaczane jednocześnie (różnymi kolorami). Zabezpieczenie przed migotaniem miejsc wyłącza zaznaczanie miejsc z presetu i postsetu odpalanej tranzycji, jeżeli czas wyświetlania 1 fazy odpalenia jest krótszy lub równy wprowadzonej wartości.

39

5.7.2 Strona „Edytor” Strona ta służy do określania wyglądu elementów graficznych rysunku sieci oraz do określania zachowania edytora sieci. Pola wpisowe „Długość grotu strzałki”, „Grubość grotu strzałki” i „Grubość łuku” dotyczą wszystkich łuków na rysunku sieci. Doradzam tworzenie dużych grotów strzałek, ponieważ są lepiej widoczne i mniej podatne na zniekształcenia spowodowane skalowaniem rysunku. Pola wpisowe „Szerokość tranzycji”, „Wysokość tranzycji”, „Promień okręgu miejsca” dotyczą nowo tworzonych obiektów, a nie już utworzonych. Pole wpisowe „Grubość konturu” dotyczy wszystkich miejsc i tranzycji na rysunku. Szerokość i wysokość planszy w pikselach musi zawierać się w przedziale 1000-16000 pikseli. Przed zmniejszeniem wymiarów planszy należy upewnić się że rysunek sieci zmieści się na zmniejszonej planszy (inaczej jego część będzie niedostępna do edycji). Kontrolka „Wyświetlaj okno edycji właściwości obiektu zaraz po jego utworzeniu” umożliwia włączenie lub wyłączenie tej opcji. Opcja ta powinna być wyłączona podczas edycji P/T sieci, a włączona podczas edycji kolorowych sieci Petriego ze względu na ich większą złożoność.

40

5.7.3 Strona „Analizator” Na tej stronie można wybrać maksymalną długość ścieżki w grafie osiągalności w polu wpisowym „Głębokość analizy grafu osiągalności”. Zbyt mała wartość może uniemożliwić analizę żywotności sieci, a zbyt duża wartość może spowodować zbyt długi czas analizy w przypadku gdy sieć nie jest ograniczona oraz utworzenie zbyt dużego pliku z grafem osiągalności, który z kolei może się nie zmieścić w pamięci operacyjnej komputera. Na stronie tej można też wybrać czcionkę, którą będą pisane informacje w oknie analizatora sieci Petriego. Należy wybrać czcionkę o jednakowej szerokości liter, aby tabele i właściwości sieci były czytelne. Aby zmienić czcionkę należy kliknąć na białe pole z nazwą czcionki. Wyświetli się poniższe okienko wyboru czcionki. Po wybraniu kroju czcionki, jej wielkości i koloru należy kliknąć OK.

41

5.7.4 Strona „Kolory” Strona ta służy do określania kolorów obiektów ekranowych. Aby zmienić kolor obiektu należy kliknąć na kolorowy pasek obok opisu tego obiektu. Wyświetli się poniższe okienko wyboru koloru. Po wybraniu nowego koloru obiektu należy kliknąć OK.

42

5.7.5 Strona „Czcionki” Strona ta służy do zmiany wielkości i kroju czcionek widocznych na rysunku sieci. Aby zmienić czcionkę należy kliknąć na białe pole z nazwą czcionki. Wyświetli się poniższe okienko wyboru czcionki. Po wybraniu kroju czcionki, jej wielkości i koloru należy kliknąć OK.

43

5.7.6 Strona „Opisy” Strona ta służy do wpisywania opisu sieci i tekstu opisującego maksymalną pojemność miejsc. Po opisaniu sieci wprowadzony tekst można umieścić w wybranym miejscu rysunku wciskając klawisz T. Opis sieci zostanie wtedy umieszczony w miejscu rysunku wskazywanym przez kursor myszy. Można też wprowadzić współrzędne pozycji opisu sieci z klawiatury do widocznych pól wpisowych. Aby zredagować już wpisany opis sieci należy dwukrotnie kliknąć na niego. Pojawi się poniższa strona okna ustawień.

Opis sieci można przesuwać po ekranie tak jak miejsca i tranzycje – metodą „ciągnij i upuść”. Uwaga: Przed kliknięciem na przycisk ekranowy „Zapisz jako domyślne” warto jest wyczyścić opis sieci, żeby uniknąć opisywania każdej nowo tworzonej sieci opisem obecnej sieci. Oczywiście można ten mechanizm wykorzystywać też w celu przeciwnym – np. żeby podpisywać każdą nowo utworzoną sieć swoim nazwiskiem lub nazwą instytucji.

44

5.8 Analizator sieci Petriego INA (Integrated Net Analyzer) Analizator INA9 został stworzony na Uniwersytecie Humboldta w Berlinie. Autorami programu są Stephan Roch i Peter H. Starke. INA jest uważana za jeden z najlepszych analizatorów sieci Petriego dostępnych bezpłatnie. Strona domowa programu INA to http://www.informatik.hu-berlin.de/~starke/ina.html INA działa w trybie tekstowym. Przed rozpoczęciem pracy z tym analizatorem wymagane jest stworzenie plików tekstowych definiujących sieć Petriego, która ma być poddana analizie. Program INA został zmodyfikowany przeze mnie tak, aby umożliwić mu pracę w trybie wsadowym i współpracę z programem „Symulator sieci Petriego ze znacznikami indywidualnymi”. Dlatego też nie należy zastępować programu INAWIN32.EXE przez inną jego wersję. Plik INAWIN32.EXE musi znajdować się w tym samym katalogu co plik PETRINET.EXE, aby możliwe było uruchomienie analizatora INA przez mój program Aby uruchomić analizator należy po utworzeniu sieci Petriego wybrać opcję Analizator z menu głównego programu „Symulator sieci Petriego ze znacznikami indywidualnymi”. Niestety INA nie potrafi analizować sieci kolorowych ze znacznikami indywidualnymi, w związku z czym podczas konwersji sieci kolorowej do sieci P/T następuje utrata kolorów znaczników, które są przekształcane na czarne znaczniki. Także stałe i zmienne będące etykietami łuków są przekształcane na wagi łuków w sieci P/T. Okno prezentujące wyniki działania analizatora zawiera 5, 6 lub 7 stron – zależnie od typu sieci. 5.8.1 Macierz sieci P/T Pierwsza strona zawiera macierzową reprezentację sieci P/T . Na podstawie macierzowej reprezentacji P/T sieci program tworzy pliki z rozszerzeniami PNT i MAR, które są przetwarzane przez analizator INAWIN32.

9 [6] Stephan Roch, Prof. Peter H. Starke, “INA Integrated Net Analyzer Version 2.2 Manual”, Humbold-Universität zu Berlin, Institut für Informatik, Lehrstuhl für Automaten und Systemtheorie

45

5.8.2 Macierz sieci kolorowej Druga strona zawiera macierzową reprezentację kolorowej sieci Petriego ze znacznikami indywidualnymi i zmiennymi etykietami łuków. Może ona ułatwić odnalezienie własności kolorowej sieci, które zostały utracone podczas konwersji do P/T sieci.

Sieć może także zawierać znaczniki indywidualne i stałe etykiety łuków zamiast zmiennych etykiet łuków. Sieć może również zawierać oba typy etykiet łuków - jednak to nie jest zalecane z powodu możliwych przypisań znaczników, które powinny się poruszać po łukach ze stałymi etykietami do łuków ze zmiennymi etykietami w wyniku działania mechanizmu substytucji.

46

5.8.3 Właściwości sieci Na stronie właściwości znajduje się wynik działania programu INA, zapisany w pliku tekstowym mającym nazwę analizowanej sieci i rozszerzenie INA. Aby poznać wszystkie własności analizowanej sieci, które udało się zbadać, należy przejść na koniec tego pliku, np. przytrzymując klawisz Page Down, aż pojawią się informacje: ORD HOM NBM PUR CSV SCF CON SC Ft0 tF0 Fp0 pF0 MG SM FC EFC ES N Y Y Y N Y Y Y N N N N Y N Y Y Y CPI CTI B SB REV DSt BSt DTr DCF L LV L&S Y Y Y Y ? N ? N Y Y Y N W pierwszym wierszu powyższego zestawienia są wypisane elementarne własności sieci: ORD - ordinary - sieć jest zwyczajna – tzn. każdy łuk ma krotność 1 – jest etykietowany jednym znacznikiem. HOM– homogenous - sieć jest jednorodna – jeśli dla każdego miejsca p, wszystkie łuki rozpoczynające się w p mają tą samą krotność. NBM- non-blocking multiplicity - sieć ma nieblokującą krotność – tzn. dla każdego miejsca p, minimalna krotność łuków kończących się w p (z presetu p) jest nie mniejsza niż maksymalna krotność łuków zaczynających się w p (z postsetu p). PUR - pure - INA sprawdza, czy są tranzycje dla których istnieje miejsce z presetu znajdujące się również w postsecie tej tranzycji. Takie sieci nie są „czyste” (ang. pure) czyli wolne od pętli. CSV - conservative - sieć jest konserwatywna jeśli wszystkie tranzycje dodają dokładnie tyle znaczników do miejsc z postsetu, ile zabierają z miejsc z presetu. W sieci konserwatywnej całkowita ilość znaczników nie zmienia się podczas odpalania dowolnej tranzycji. SCF - static conflict free - jeśli dwie tranzycje mają wspólne miejsce z presetu, to są one w statycznym konflikcie o znaczniki z tego miejsca. Zatem taka sieć nie jest wolna od statycznych konfliktów. CON - connected - sieć jest spójna jeśli dla każdego węzła w grafie nieskierowanym tej sieci, istnieje ścieżka do każdego innego węzła. Zatem kierunki łuków są nieistotne dla spójności. SC - strongly connected – sieć jest silnie spójna gdy jest spójna i dla każdego węzła w grafie skierowanym tej sieci istnieje ścieżka do każdego innego węzła. Ft0 - transition without pre-place - sieć ma Ft0-tranzycje jeśli są tranzycje bez presetu; Ft=0 tF0 - transition without post-place - sieć ma tF0-tranzycje jeśli są tranzycje bez postsetu; tF=0 Fp0 - place without pre-transition - sieć ma Fp0-miejsca jeśli są miejsca bez presetu; Fp=0 pF0 - place without post-transition – sieć ma pF0-miejsca jeśli są miejsca bez postsetu; pF=0 MG - marked graph - sieć jest grafem zamarkowanym, jeśli każde miejsce ma dokładnie jedną tranzycję w presecie i jedną tranzycję w postsecie. Krotności łuków są tu ignorowane. SM - state machine - sieć jest maszyną stanową, jeśli każda tranzycja ma dokładnie jedno miejsce w presecie i jedno miejsce w postsecie. Krotności łuków są tu ignorowane. FC - free choice - sieć ma wolny wybór, jeśli każde współdzielone miejsce jest jedynym miejscem z presetu dla każdej tranzycji znajdującej się w postsecie tego miejsca EFC - extended free choice - sieć ma rozszerzony wolny wybór jeśli tranzycje znajdujące się w postsecie współdzielonych miejsc mają te same miejsca w presecie. ES - extended simple - sieć jest bardzo prosta jeśli spełniony jest następujący warunek: Jeśli dwa miejsca mają wspólną tranzycję w postsecie, to dla jednego z tych miejsc, tranzycja w jego postsecie jest również tranzycją w postsecie dla innego miejsca. W szczególności jedno z tych dwóch miejsc może mieć również inne tranzycje w postsecie.

47

Najważniejsze własności z punktu widzenia analizy sieci są wypisane w drugim wierszu: CPI - covered by place invariants - sieć ma P-niezmienniki CTI - covered by transition invariants - sieć ma T-niezmienniki B - bounded - sieć jest ograniczona, to znaczy że istnieje takie k, że w żadnym z osiągalnych znakowań nie występuje więcej niż k znaczników w żadnym miejscu. SB - structurally bounded - sieć jest strukturalnie ograniczona, tzn. jest ograniczona dla każdego znakowania początkowego REV - reversible - sieć jest odwracalna – stan początkowy może zostać osiągnięty z każdego osiągalnego stanu.. Niestety INA zawiesza się gdy bada tą własność dla sieci, która nie jest ograniczona, dlatego też ta własność nie jest badana przez analizator programu „Symulator sieci Petriego ze znacznikami indywidualnymi”. DSt - dead state reachable - osiągalny jest stan martwy – taki, że żadna tranzycja nie może już odpalić. BSt - bad predicate - zły predykat – opcja ta nie jest używana podczas analizy. DTr - dead transition at initial marking - sieć ma martwe tranzycje w znakowaniu początkowym. DCF - dynamically conflict free - sieć jest dynamicznie wolna od konfliktów – nie jest osiągalny żaden stan, w którym dwie tranzycje są gotowe do odpalenia, ale odpalenie jednej z nich uniemożliwia odpalenie drugiej. L - live - sieć jest żywa, tzn. nie jest osiągalne znakowanie dla którego istnieje tranzycja która już nie może odpalić (jest martwa) LV - live when ignoring dead transitions – sieć jest żywa gdy zignorujemy martwe tranzycje. L&S - live and safe - sieć jest żywa i bezpieczna, tzn. jest żywa i dla każdego osiągalnego znakowania w każdym miejscu znajduje się nie więcej niż jeden znacznik.

48

5.8.4 Graf osiągalności Czwarta strona okna analizatora zawiera graf osiągalności badanej sieci. INA przedstawia graf osiągalności sieci w postaci listy wierzchołków. Każdy wierzchołek grafu osiągalności zawiera: State nr. - numer stanu (wierzchołka grafu osiągalności) P.nr: - listę numerów miejsc obecnych w analizowanej sieci toks - ilość znaczników na kolejnych miejscach tej sieci listę tranzycji, które mogą odpalić z tego stanu wraz ze stanami, które nastąpią po odpaleniu każdej z tych tranzycji. Ponieważ badana sieć może być nieograniczona, maksymalna długość ścieżki w grafie osiągalności została domyślnie ustalona na 1000, co powinno wystarczyć do analizy nawet bardzo złożonych sieci. Jeżeli jednak okaże się niewystarczająca, można ją zmienić na stronie „Analizator” okna „Ustawienia”.

49

5.8.5 Niezmienniki sieci Kolejne strony okna dialogowego Analizator przedstawiają obliczone P-niezmienniki i T-niezmienniki badanej sieci.

50

5.8.6 Przykład analizy właściwości wybranej sieci „stacja benzynowa” Rozważmy sieć modelującą działanie stacji benzynowej:

Stacja ta ma dwa dystrybutory paliwa, oznaczone L i P. Każdy z dystrybutorów paliwa umożliwia zatankowanie dwóch samochodów, znajdujących się w jego pobliżu na miejscach oznaczonych tak jak dystrybutor paliwa. Po zatankowaniu paliwa kierowca płaci za nie jednemu z dwóch kasjerów, po czym wyjeżdza ze stacji benzynowej. Aby poznać właściwości tej sieci należy najpierw wczytać sieć o nazwie „7”, a następnie wybrać pozycję „Analiza właściwości sieci” dostępną w podmenu „opcje” głównego menu programu. Pojawi się okno analizatora zawierające macierzową reprezentację tej sieci. Niestety INA nie potrafi analizować sieci kolorowych ze znacznikami indywidualnymi, w związku z czym podczas konwersji sieci kolorowej do sieci P/T następuje utrata kolorów znaczników, które są przekształcane na czarne znaczniki. Także stałe i zmienne będące etykietami łuków są przekształcane na wagi łuków w sieci P/T. Po przejściu na stronę „Właściwości”, można odczytać informacje, które INA zapisała do pliku o rozszerzeniu „ina”. Na początku tego pliku znajdują się informacje o właściwościach sieci, które INA ustaliła natychmiast po wczytaniu sieci, takich jak: typ sieci, tranzycje pozostające ze sobą w konflikcie i niektóre własności sieci. Poniżej zapisane są informacje o P-niezmiennikach i T-niezmiennikach badanej sieci. Na końcu pliku znajduje się zestawienie własności sieci w formacie opisanym w rozdziale 5.8.3.

51

Integrated Net Analyzer [v2.2p6-Mar 23 2001-win32] session report: Current net options are: token type: black (for Place/Transition nets) time option: no times firing rule: normal with capacities priorities : not to be used strategy : single transitions line length: 255 Net read from 7.pnt Information on elementary structural properties: Current name options are: transition names to be written place names to be written The net is statically conflict-free. The net is dynamically conflict-free. The net is pure. The net is not ordinary. The net is not conservative. The net is not subconservative. The net is not a state machine. The net is free choice. The net is extended free choice. The net is extended simple. The net is not safe. The net is not live and safe. The net is marked. The net is not marked with exactly one token. The net is a marked graph. The net is homogenous. The net has a non-blocking multiplicity. The net has no nonempty clean trap. The net has no transitions without pre-place. The net has no transitions without post-place. The net has no places without pre-transition. The net has no places without post-transition. Maximal in/out-degree: 2 The net is connected. The net is strongly connected. ORD HOM NBM PUR CSV SCF CON SC Ft0 tF0 Fp0 pF0 MG SM FC EFC ES N Y Y Y N Y Y Y N N N N Y N Y Y Y CPI CTI B SB REV DSt BSt DTr DCF L LV L&S ? ? ? ? ? ? ? ? Y ? ? N Deciding structural boundedness The net is structurally bounded. The net is bounded. The net is covered by semipositive place sub-invariants. 1 2 3 4 5 6 7 8 9 10 2 2 2 2 2 3 2 2 2 2 ORD HOM NBM PUR CSV SCF CON SC Ft0 tF0 Fp0 pF0 MG SM FC EFC ES N Y Y Y N Y Y Y N N N N Y N Y Y Y CPI CTI B SB REV DSt BSt DTr DCF L LV L&S ? ? Y Y ? ? ? ? Y ? ? N Current analysis options are: no symmetrical reduction maximal depth = 1000 do not use a 'bad' predicate Computation of the reachability graph States generated: 295 Arcs generated: 905 Capacities needed: Place 1 2 3 4 5 6 7 8 9 10 Cap: 4 4 8 2 4 4 8 2 4 4 The net has no dead transitions at the initial marking. The net has no dead reachable states. Livenesstest: Computing the strongly connected components

52

The net is live. The net is live, if dead transitions are ignored. The net is covered by semipositive T-invariants. ORD HOM NBM PUR CSV SCF CON SC Ft0 tF0 Fp0 pF0 MG SM FC EFC ES N Y Y Y N Y Y Y N N N N Y N Y Y Y CPI CTI B SB REV DSt BSt DTr DCF L LV L&S ? Y Y Y ? N ? N Y Y Y N Current options are: computation of place-invariants output (transposed) incidence matrix output format = complete table Input matrix (transposed incidence matrix): 1 2 3 4 5 6 7 8 9 10 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 | -1 -1 2 0 0 0 0 0 0 0 2 | 0 0 -2 -1 0 2 0 0 0 0 3 | 0 0 0 1 -2 0 0 1 0 0 4 | 0 0 0 0 2 -2 2 -1 0 0 5 | 0 1 0 0 0 0 -2 0 1 0 6 | 0 0 0 0 0 0 0 0 -1 1 7 | 1 0 0 0 0 0 0 0 0 -1 place invariants basis of net 7.7 : ================= Nr. 1 2 3 4 5 6 7 8 9 10 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 | 0 0 0 2 1 1 0 0 0 0 + 2 | 0 2 1 -2 -1 0 1 0 0 0 3 | 0 0 0 0 1 0 0 2 0 0 + 4 | 1 -1 0 0 0 0 0 0 1 1 @ The net has the rank property: rank < number of conflict clusters. At least the following places are covered by semipositive invariants: 4, 5, 6, 8, The net is covered by semipositive P-invariants. Non-reachability test of the state: p : 1 2 3 4 5 6 7 8 9 10 m(p): 4 4 0 2 0 0 0 2 0 0 No conclusions possible. ORD HOM NBM PUR CSV SCF CON SC Ft0 tF0 Fp0 pF0 MG SM FC EFC ES N Y Y Y N Y Y Y N N N N Y N Y Y Y CPI CTI B SB REV DSt BSt DTr DCF L LV L&S Y Y Y Y ? N ? N Y Y Y N Current options are: computation of transition-invariants output (transposed) incidence matrix output format = complete table

53

Input matrix (incidence matrix): 1 2 3 4 5 6 7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 | -1 0 0 0 0 0 1 2 | -1 0 0 0 1 0 0 3 | 2 -2 0 0 0 0 0 4 | 0 -1 1 0 0 0 0 5 | 0 0 -2 2 0 0 0 6 | 0 2 0 -2 0 0 0 7 | 0 0 0 2 -2 0 0 8 | 0 0 1 -1 0 0 0 9 | 0 0 0 0 1 -1 0 10 | 0 0 0 0 0 1 -1 transition invariants basis of net 7.7 : ====================== Nr. 1 2 3 4 5 6 7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 | 1 1 1 1 1 1 1 + @ ORD HOM NBM PUR CSV SCF CON SC Ft0 tF0 Fp0 pF0 MG SM FC EFC ES N Y Y Y N Y Y Y N N N N Y N Y Y Y CPI CTI B SB REV DSt BSt DTr DCF L LV L&S Y Y Y Y ? N ? N Y Y Y N Current options written to options.ina End of Analyzer session.

54

6 Dokumentacja techniczna programu 6.1 Opis struktury programu Program został napisany w systemie RAD (Rapid Application Development) o nazwie Borland C++ Builder 5.0 . System ten upraszcza tworzenie oprogramowania przez umożliwienie wizualnego tworzenia interfejsu użytkownika, udostępnienie biblioteki gotowych komponentów wizualnych i przez zarządzanie kodem źródłowym tworzonego programu za pomocą zintegrowanego środowiska pracy programisty. Główną klasą programu jest klasa TForm1 zdefiniowana w plikach Petri.cpp i Petri.h . Zawiera ona metody odpowiedzialne za główne okno programu, w którym następuje wizualizacja, edycja i symulacja działania sieci Petriego. Jej najważniejszym zadaniem jest interpretacja zdarzeń pochodzących od użytkownika, takich jak wciśnięcie przycisku myszy lub klawisza na klawiaturze, przesunięcie kursora myszy po ekranie lub obrócenie rolki myszy. W odpowiedzi na zdarzenie następuje wykonanie odpowiedniej czynności, zależnej od trybu pracy programu (np. dodanie, usunięcie, zmiana położenia elementu graficznego, wywołanie okna edycji wybranego obiektu, uruchomienie symulatora lub analizatora ). Klasa TAnalizator jest zdefiniowana w plikach analiza.cpp i analiza.h. Obiekty tej klasy przechowują macierzową reprezentację sieci, wywołują analizator INA (Integrated Network Analyzer) i prezentują wyniki jego pracy - własności sieci. Klasy Tranzycja, Miejsce i Strzalka zawierają metody obsługujące odpowiadające im elementy sieci Petriego (tzn. tranzycje, miejsca i łuki). Metody te zapewniające niezbędną funkcjonalność wyżej wymienionych klas, w tym odczyt i zapis wybranego obiektu do pliku tekstowego, przechowywanie danych w pamięci operacyjnej komputera i symulację działania sieci. Klasy Tranzycje, Miejsca i Strzalki służą do przechowywania zbiorów obiektów. Umożliwiają one dodawanie obiektów do zbioru, usuwanie ich ze zbioru, odczyt i zapis zbioru obiektów do pliku tekstowego oraz dostęp do wybranego obiektu. Klasa Symbole deklaruje tablicę symboli reprezentujących kolory znaczników w sieciach Petriego ze znacznikami indywidualnymi. Umożliwia ona dodawanie, wyszukiwanie i dostęp do napisów będących reprezentacją symboli w pamięci komputera. Klasa Konfig służy do przechowywania danych sieci Petriego, takich jak rozmiar graficznej reprezentacji sieci w pikselach, kolory przydzielone elementom graficznym sieci, domyślne parametry edytora i prędkość działania symulatora sieci. Klasa ta umożliwia odczyt i zapis powyższych danych do pliku tekstowego. Klasa Arr zdefiniowana w plikach arrint.cpp i arrint.h służy do przechowywania tablic liczb całkowitych mających 1, 2 lub 3 wymiary. Tablice jednowymiarowe mogą dynamicznie zmieniać swoją wielkość w trakcie pracy programu dostosowując się do rosnących potrzeb bez konieczności jawnego wywoływania funkcji realloc, natomiast tablice 2-wymiarowe i 3-wymiarowe nie mają tej funkcjonalności, a ich rozmiary muszą być określone przy tworzeniu obiektu klasy Arr. Klasa Arr jest zmodyfikowaną wersją klasy Arr zamieszczonej w książce Krzysztofa Barteczko pod tytułem „Praktyczne wprowadzenie do programowania obiektowego w C++” wydanej przez wydawnictwo Lupus w roku 1993. Modyfikacje polegały na ograniczeniu typu przechowywanych danych do liczb całkowitych, zaimplementowaniu jednowymiarowych tablic dynamicznych wraz z konstruktorami kopiującymi i poprawieniu błędu w funkcji dostępu do elementów tablic 3-wymiarowych.

55

TForm1

Miejsca

TEdycjaTranzycji

TKonfiguracjaTAnalizator

TAboutBox TEdycjaStrzalki

TEdycjaMiejsca

Diagram zależności między klasami

Klasy odpowiedzialne za graficzny interfejs użytkownika

Klasy odpowiedzialne za przechowywanie danych,wykonywanie obliczeń i symulację działania sieci Petriego

Tranzycja

Tranzycje

Miejsce

Konfig

Strzałki

Strzałka

Symbole Arr Geometria

ObjKeys

56

6.2 Formaty plików używanych przez program Sieć Petriego jest zapisywana na dysku twardym komputera do czterech plików tekstowych o nazwach takich jak nazwa sieci i następujących rozszerzeniach: .trn - plik zawiera zbiór tranzycji .mie - plik zawiera zbiór miejsc .luk - plik zawiera zbiór łuków .knf - plik zawiera informacje dotyczące sieci, sposobu jej rysowania i symulacji działania. To rozwiązanie umożliwia ręczną edycję sieci i ułatwia diagnostykę błędów w porównaniu z plikiem binarnym zawierającym te same informacje. Podczas edycji należy jednak zachować ostrożność ponieważ program nie sprawdza poprawności ręcznie wprowadzonych danych, zatem należy stosować tą technikę tylko w przypadkach koniecznych. Do wczytania sieci niezbędne są trzy pierwsze pliki (tzn. o rozszerzeniach .trn, .mie, .luk). Jeżeli brak jest pliku o rozszerzeniu .knf, przyjęta zostanie konfiguracja domyślna sieci zapisana w pliku default.cfg. Jeżeli pliku default.cfg nie ma w głównym katalogu programu Petrinet, zostanie przyjęta domyślna konfiguracja zapisana w kodzie programu. Brakujący plik o rozszerzeniu .knf zostanie automatycznie odtworzony w obu przypadkach, dlatego w razie problemów z plikiem konfiguracji zaleca się raczej jego usunięcie niż ręczne redagowanie zawartości. Przywróconą konfigurację zawsze można zmodyfikować w oknie „Ustawienia programu”. Należy zwrócić uwagę przede wszystkim na wymiary planszy na stronie „Edytor”, ponieważ w przypadku nieprawidłowego ustawienia tego parametru sieć może być widoczna tylko częściowo (maksymalne rozmiary planszy wynoszą 16000 pikseli). Program Petrinet tworzy następujące pliki dla analizatora INA nazwa_sieci.pnt - definicja macierzowej reprezentacji analizowanej sieci COMMAND.ina - ciąg poleceń wsadowych dla analizatora INA OPTIONS.ina - plik konfiguracyjny analizatora INA Analizator INA tworzy pliki tekstowe o nazwach takich jak nazwa sieci i następujących rozszerzeniach: .gra - graf osiągalności badanej sieci .mar - znakowanie (markowanie) początkowe badanej sieci .ina - zapis sesji z programem INA zawierający opis właściwości sieci .inv - P-niezmienniki badanej sieci .int - T-niezmienniki badanej sieci Format powyższych plików jest dokładnie opisany w dokumentacji analizatora INA10.

10 [6]Stephan Roch, Prof. Peter H. Starke, “INA Integrated Net Analyzer Version 2.2 Manual”, Humbold-Universität zu Berlin, Institut für Informatik, Lehrstuhl für Automaten und Systemtheorie

57

6.2.1 Format pliku o rozszerzeniu .trn zawierającego zbiór tranzycji Plik zawiera dane kolejnych tranzycji, posortowane w kierunku rosnących numerów tranzycji, oddzielone od siebie pojedynczą pustą linią tekstu. Format krotki tranzycji: Nazwa elementu w kolumnie 1 Nazwa elementu w kol. 2 Typ danych Numer tranzycji Liczba całkowita Nazwa tranzycji Pole tekstowe

Spacje zastąpione są przez znak ` Rozmiar czcionki nazwy tranzycji Liczba całkowita Współrzędna X nazwy tranzycji Współrzędna Y nazwy

tranzycji Liczba całkowita

Wsp. X lewego górnego rogu prostokąta tranzycji

Wsp. Y lewego górnego rogu prostokąta tranzycji

Liczba całkowita

Wsp. X prawego dolnego rogu prostokąta tranzycji

Wsp. Y prawego dolnego rogu prostokąta tranzycji

Liczba całkowita

Siła odpalenia tranzycji Zmienna logiczna 0 – słabe odpalenie 1 – silne odpalenie

Blokada odpalenia tranzycji Zmienna logiczna 0 – brak blokady 1 – blokada założona

Ilość miejsc w presecie tranzycji Liczba całkowita Ilość miejsc w postsecie tranzycji Liczba całkowita Lista numerów łuków wychodzących z presetu tranzycji

Lista elementów typu Liczba całkowita, elementy listy są oddzielone pojedynczą spacją. Pusty wiersz gdy preset jest zbiorem pustym

Lista numerów łuków prowadzących do postsetu tranzycji

Lista elementów typu Liczba całkowita, elementy listy są oddzielone pojedynczą spacją. Pusty wiersz gdy preset jest zbiorem pustym

Przykład krotki tranzycji: 2 tankowanie`paliwa 12 1378 1620 1441 1616 1481 1656 0 0 2 1 4 5 8

58

6.2.2 Format pliku o rozszerzeniu .mie zawierającego zbiór miejsc Plik zawiera dane kolejnych miejsc, posortowane w kierunku rosnących numerów miejsc, oddzielone od siebie pojedynczą pustą linią tekstu. Format krotki miejsca: Nazwa elementu w kolumnie 1 Nazwa elementu w kol. 2 Typ danych Numer miejsca Liczba całkowita Nazwa miejsca Pole tekstowe

Spacje zastąpione są przez znak `

Rozmiar czcionki nazwy Liczba całkowita Rozmiar czcionki znaczników Liczba całkowita Wsp. X nazwy miejsca Wsp. Y nazwy miejsca Liczba całkowita Wsp. X środka okręgu miejsca Wsp. Y środka okręgu miejsca Liczba całkowita Promień okręgu Liczba całkowita Pojemność miejsca Liczba całkowita Znaczniki Wielozbiór (multiset)

(znak – gdy miejsce jest puste) Przypisania znaczników do zmiennych-etykiet łuków

Multirelacja (znak - gdy brak danych lub gdy nie dotyczy)

Ilość tranzycji w presecie miejsca

Liczba całkowita

Ilość tranzycji w postsecie miejsca

Liczba całkowita

Lista numerów łuków wychodzących z presetu miejsca

Lista elementów typu Liczba całkowita, elementy listy są oddzielone pojedynczą spacją. Pusty wiersz gdy preset jest zbiorem pustym

Lista numerów łuków prowadzących do postsetu miejsca

Lista elementów typu Liczba całkowita, elementy listy są oddzielone pojedynczą spacją. Pusty wiersz gdy preset jest zbiorem pustym

Przykład krotki miejsca 3 niezatankowane`samochody`przy`dystrybutorach 12 12 1249 1537 1454 1546 47 0 VW+2BMW+FIAT+4M (VW,x)+(BMW,x)+(FIAT,x)+(M,y) 1 1 3 4

59

6.2.3 Format pliku o rozszerzeniu .luk zawierającego zbiór łuków Plik zawiera dane kolejnych łuków, posortowane w kierunku rosnących numerów łuków, oddzielone od siebie pojedynczą pustą linią tekstu. Format krotki łuku: Nazwa elementu w kolumnie 1 Nazwa elementu w kol. 2 Typ danych Numer łuku Liczba całkowita Nazwa łuku Pole tekstowe

Spacje zastąpione są przez znak `

Rozmiar czcionki nazwy Liczba całkowita Rozmiar czcionki opisu funkcji przejścia

Liczba całkowita

Wsp. X nazwy łuku Wsp. Y nazwy łuku Liczba całkowita Waga łuku – stałe będące etykietami łuku

Wielozbiór (multiset) (znak – gdy składowa stała wagi łuku=0)

Waga łuku – zmienne będące etykietami łuku

Wielozbiór (multiset) (znak – gdy składowa zmienna wagi łuku=0)

Wsp. X opisu funkcji przejścia Wsp. Y opisu funkcji przejścia

Liczba całkowita

Rodzaj obiektu będącego początkiem łuku

‘P’ – miejsce lub ‘T’ - tranzycja

Numer obiektu będącego początkiem łuku

Liczba całkowita

Numer obiektu będącego końcem łuku

Liczba całkowita

Ilość odcinków składających się na linię łamaną + 1

Liczba całkowita

Wsp. X początku pierwszego odcinka prostej łamanej

Wsp. Y początku pierwszego odcinka prostej łamanej

Liczba całkowita

. . . . . . . . . Wsp. X końca ostatniego odcinka prostej łamanej

Wsp. Y końca ostatniego odcinka prostej łamanej

Liczba całkowita

Przykład krotki łuku: 8 Łuk`8 12 10 465 304 @ - 505 321 T 4 1 2 499 338 499 290

60

6.2.4 Format pliku o rozszerzeniu .knf zawierającego konfigurację sieci Petriego Nazwa elementu Typ danych Długość grotu strzałki Liczba całkowita

(rozmiar podany w pikselach) Grubość grotu strzałki Liczba całkowita

(rozmiar podany w pikselach) Grubość strzałki (graficznej reprezentacji łuku) Liczba całkowita

(rozmiar podany w pikselach) Szerokość nowo utworzonej tranzycji Liczba całkowita

(rozmiar podany w pikselach) Wysokość nowo utworzonej tranzycji Liczba całkowita

(rozmiar podany w pikselach) Promień okręgu nowo utworzonego miejsca Liczba całkowita

(rozmiar podany w pikselach) Grubość konturu dla miejsc i tranzycji Liczba całkowita

(rozmiar podany w pikselach) Wyświetlaj okno edycji właściwości obiektu zaraz po jego utworzeniu

Zmienna logiczna : 0 – nie ; 1 – tak

Głębokość analizy grafu Liczba całkowita Czas wyświetlania 1 fazy odpalenia Liczba całkowita (odstęp czasu

podany w milisekundach) Długość przerwy między odpaleniami Liczba całkowita (odstęp czasu

podany w milisekundach) Zabezpieczenie przed migotaniem miejsc Liczba całkowita (górny próg

zadziałania w milisekundach) Ilość faz animacji odpalenia 1 lub 2 Zarezerwowane dla przyszłych wersji programu Zmienna logiczna : 0 – nie ; 1 – tak Skala rysunku sieci podana w procentach (100% to skala 1:1)

Liczba całkowita z przedziału <10, 200>

Szerokość planszy w pikselach Liczba całkowita z przedziału <1000, 16000>

Wysokość planszy w pikselach Liczba całkowita z przedziału <1000, 16000>

Pozycja suwaka na osi X Liczba całkowita Pozycja suwaka na osi Y Liczba całkowita Kolor tła Liczba całkowita Kolor tranzycji Liczba całkowita Kolor zablokowanej tranzycji Liczba całkowita Kolor odpalanej tranzycji Liczba całkowita Kolor miejsc Liczba całkowita Kolor miejsc z presetu odpalanej tranzycji Liczba całkowita Kolor miejsc z postsetu odpalanej tranzycji Liczba całkowita Kolor miejsc z prezetu i postsetu odpalanej tranzycji Liczba całkowita Kolor ramki i uchwytów Liczba całkowita Kolor zmiennych – etykiet łuków Liczba całkowita Nazwa fontu opisów obiektów Pole tekstowe

Spacje zastąpione są przez znak ` Kolor czcionki opisów obiektów Liczba całkowita Domyślny rozmiar czcionki opisów obiektów Liczba całkowita Nazwa fontu opisu sieci Petriego Pole tekstowe

Spacje zastąpione są przez znak `

61

Kolor czcionki opisu sieci Petriego Liczba całkowita Rozmiar czcionki opisu sieci Petriego Liczba całkowita Nazwa fontu znaczników Pole tekstowe

Spacje zastąpione są przez znak ` Kolor czcionki znaczników Liczba całkowita Domyślny rozmiar czcionki znaczników Liczba całkowita Nazwa fontu opisu funkcji przejścia Pole tekstowe

Spacje zastąpione są przez znak ` Kolor czcionki opisu funkcji przejścia Liczba całkowita Domyślny rozmiar czcionki opisu funkcji przejścia Liczba całkowita Nazwa fontu dla analizatora sieci Petriego Pole tekstowe

Spacje zastąpione są przez znak ` Kolor czcionki dla analizatora sieci Petriego Liczba całkowita Rozmiar czcionki dla analizatora sieci Petriego Liczba całkowita Współrzędna X położenia opisu sieci Petriego na rysunku Liczba całkowita Współrzędna Y położenia opisu sieci Petriego na rysunku Liczba całkowita Ilość wierszy opisu sieci Petriego Liczba całkowita Pierwszy wiersz opisu sieci Petriego Pole tekstowe

Spacje zastąpione są przez znak ` . . . . . .

Ostatni wiersz opisu sieci Petriego Pole tekstowe Spacje zastąpione są przez znak `

62

6.3 Wydruki nagłówków najważniejszych klas programu 6.3.1 Nagłówek klasy TForm1 zadeklarowanej w pliku petri.h //--------------------------------------------------------------------------- #ifndef PetriH #define PetriH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <Menus.hpp> #include <Buttons.hpp> #include <ComCtrls.hpp> #include <ToolWin.hpp> #include <Dialogs.hpp> #include <Printers.hpp> #include <ExtDlgs.hpp> #include <string.h> #include <stdlib.h> #include <dos.h> #include "edmiejsca.h" #include "edstrzalek.h" #include "edtranzycji.h" #include "konfiguruj.h" #include "about.h" #include "analiza.h" #include "Miejsca.h" #include "Strzalki.h" #include "Tranzycje.h" #include "Konfig.h" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TMainMenu *MainMenu1; TMenuItem *Pliki; TMenuItem *nowa_siec; TMenuItem *Otworz; TMenuItem *Zapisz; TMenuItem *Koniec; TToolBar *ToolBar; TSpeedButton *PrzyciskMiejsca; TScrollBox *scroll; TPaintBox *rys; TSpeedButton *PrzyciskLuku; TOpenDialog *OpenDialog; TSaveDialog *SaveDialog; TStatusBar *StatusBar; TSpeedButton *PrzyciskKursora; TSpeedButton *PrzyciskTranzycji; TSpeedButton *PrzyciskUsun; TSpeedButton *PrzyciskSymulacji; TSpeedButton *PrzyciskPause; TSpeedButton *PrzyciskPlay; TSpeedButton *PrzyciskBlokady; TMenuItem *Ustawienia; TTimer *Timer1; TPanel *Panel1; TLabel *Label1; TComboBox *ComboBox1; TMenuItem *Drukuj; TPrintDialog *PrintDialog; TMenuItem *Ustawieniadrukarki; TPrinterSetupDialog *PrinterSetupDialog; TMenuItem *N1; TMenuItem *N3; TMenuItem *Eksportuj; TMenuItem *N4; TSavePictureDialog *SavePictureDialog; TMenuItem *Opcje; TMenuItem *Analiza; TMenuItem *Pomoc; TMenuItem *About;

63

TMenuItem *Instrukcja; TMenuItem *N5; TMenuItem *N6; TMenuItem *Renumeracja; TSpeedButton *PrzyciskAutoSubst; TMenuItem *ZapiszWybrane; TMenuItem *DodajWybrane; TSpeedButton *PrzyciskPlayWstecz; TSpeedButton *PrzyciskWstecz; void __fastcall KoniecClick(TObject *Sender); void __fastcall Przerysuj(TObject *Sender); void __fastcall ZmianaWymiarow(TObject *Sender); void __fastcall FormDestroy(TObject *Sender); void __fastcall FormCreate(TObject *Sender); void __fastcall nowa_siecClick(TObject *Sender); void __fastcall OtworzClick(TObject *Sender); void __fastcall ZapiszClick(TObject *Sender); void __fastcall rysMouseMove(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall rysMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall rysMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall PrzyciskUsunClick(TObject *Sender); void __fastcall rysDblClick(TObject *Sender); void __fastcall PrzyciskLukuClick(TObject *Sender); void __fastcall PrzyciskMiejscaClick(TObject *Sender); void __fastcall PrzyciskTranzycjiClick(TObject *Sender); void __fastcall PrzyciskKursoraClick(TObject *Sender); void __fastcall PrzyciskSymulacjiClick(TObject *Sender); void __fastcall PrzyciskPauseClick(TObject *Sender); void __fastcall PrzyciskPlayClick(TObject *Sender); void __fastcall PrzyciskBlokadyClick(TObject *Sender); void __fastcall UstawieniaClick(TObject *Sender); void __fastcall scrollMouseWheelDown(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled); void __fastcall scrollMouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled); void __fastcall Timer1Timer(TObject *Sender); void __fastcall ComboBox1Change(TObject *Sender); void __fastcall ComboBox1KeyPress(TObject *Sender, char &Key); void __fastcall ComboBox1Enter(TObject *Sender); void __fastcall ComboBox1Click(TObject *Sender); void __fastcall ComboBox1Exit(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall Wydrukuj(TObject *Sender,TCanvas *Canvas,TPoint* mini, TPoint *maxi,float sf); // sf – współczynnik skalowania rysunku void __fastcall DrukujClick(TObject *Sender); void __fastcall UstawieniadrukarkiClick(TObject *Sender); void __fastcall PlikiClick(TObject *Sender); void __fastcall EksportujClick(TObject *Sender); void __fastcall OpcjeClick(TObject *Sender); void __fastcall PomocClick(TObject *Sender); void __fastcall AboutClick(TObject *Sender); void __fastcall AnalizaClick(TObject *Sender); void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall RenumeracjaClick(TObject *Sender); void __fastcall PrzyciskAutoSubstClick(TObject *Sender); void __fastcall ZapiszWybraneClick(TObject *Sender); void __fastcall DodajWybraneClick(TObject *Sender); void __fastcall PrzyciskPlayWsteczClick(TObject *Sender); void __fastcall PrzyciskWsteczClick(TObject *Sender); void __fastcall InstrukcjaClick(TObject *Sender);

64

private: // User declarations int min(int a,int b) {if (a<=b) return a;else return b;} int max(int a,int b) {if (a>b) return a;else return b;} int signum(int a) {if(a>0) return 1;else if(a<0) return -1; else return 0;} bool between(int a,int b,int x) {if((x>=min(a,b)) && (x<=max(a,b))) return true; else return false;} bool covers(int a,int b,int x,int y) { if(between(a,b,x) || between(a,b,y) || between(x,y,a) || between(x,y,b)) return true; else return false; } bool inside(int a,int b,int x,int y) { if(between(a,b,x) && between(a,b,y)) return true; else return false; } void __fastcall PoprawTranzycje(TObject *Sender,Tranzycja *akt_tranzycja); void __fastcall PoprawMiejsce(TObject *Sender,Miejsce *akt_miejsce); void __fastcall dodajNowyLuk(TObject *Sender); void __fastcall PoprawPasekStanu(TObject *Sender); void __fastcall Animacja(TObject *Sender); void __fastcall Czekaj(TObject *Sender, int msek); void __fastcall RysujGrotStrzalki(HDC,int,int,float,float); void __fastcall RysujUchwyty(TObject *Sender,TColor c); void __fastcall RysujXorRamke(TObject *Sender,int,int,int,int,TColor,int,int); void __fastcall RysujTranzycje(HDC, Tranzycja *tr,TColor kolor, TColor kolor_konturu,int,int); void __fastcall RysujLuk(HDC,Strzalka *luk,int,int); bool __fastcall CzyTekstSieZmiesci(TCanvas *Canvas,Miejsce *miejsce,float sf); // sf – współczynnik skalowania rysunku void __fastcall WypiszTekst(TCanvas *Canvas,Miejsce *miejsce,float sf, int mx,int my); // mx i my – przesunięcie lewego górnego rogu drukowanego rysunku względem // pocz. układu współrzędnych void __fastcall RysujMiejsce(TCanvas *Canvas,Miejsce *miejsce,float,int,int); void __fastcall RysujOpisy(TCanvas *Canvas,float,int,int); int __fastcall ZnajdzUchwyt(TObject *Sender,int x,int y,TPoint **wsp); void __fastcall UstawRamkeOpisuSieci(TObject *Sender); void __fastcall UstawRamkeOpisu(TObject *Sender); void __fastcall UsunUchwyty(TObject *Sender,bool czyscic_dane=true); void __fastcall UstawUchwytyLuku(TObject *Sender,Strzalka *luk); void __fastcall UstawUchwytyMiejsca(TObject *Sender,Miejsce *miejsce); void __fastcall UstawUchwytyTranzycji(TObject *Sender,Tranzycja *tranzycja); void __fastcall UstawUchwytyPT(TObject *Sender); int __fastcall ZnajdzUchwyconyObiekt(TObject *Sender,unsigned int nr); void __fastcall WyswietlOpisLuku(TObject *Sender, Strzalka *); void __fastcall KrokSymulacji(TObject *Sender,bool wstecz=0); bool __fastcall PrzesuwajEkran(int X,int Y); bool __fastcall CzyPrzesuwacEkran(int X,int Y); bool __fastcall JestOpisSieci(); void __fastcall MiniMaxi(TPoint *mini, TPoint *maxi,int minx,int miny, int maxx,int maxy); void __fastcall GraniceWydruku(TObject *Sender,TPoint *mini, TPoint *maxi); void __fastcall StanNormalny(); void __fastcall KliknietoMenu(TObject *Sender); void __fastcall ObracajTranzycje(TObject *Sender); void __fastcall ObracajAktywnaTranzycje(TObject *Sender); void __fastcall ProstujLuk(TObject *Sender); bool __fastcall MoznaTuUmiescic(TObject *Sender,int wx,int wy); void __fastcall KopiujWybrane(TObject *Sender,int wx,int wy); void __fastcall PrzesunWybrane(TObject *Sender,int wx,int wy); public: // User declarations __fastcall TForm1(TComponent* Owner); TRect ramka_opisu,ramka_opisu_sieci,ramka_funkcji; AnsiString nazwapliku,sciezkapliku; list<TPoint*> *uchwyty; TPoint **uchwyty_tab; TPoint *wsp_uchwytu; int uchwyty_tab_size; int nr_uchwytu; set<int,less<int> > *wybrane_miejsca; set<int,less<int> > *wybrane_tranzycje; Symbole *symbole_C,*symbole_V; Konfig *konfig; Miejsca *miejsca; Strzalki *luki; Tranzycje *tranzycje; Tranzycja *akt_tranzycja,*luk_tranzycja; Miejsce *akt_miejsce,*luk_miejsce; Strzalka *akt_luk,*nowy_luk; unsigned char typ_pocz_luku; // 'P' , 'T' lub ' ' (jeszcze nie wybrano) unsigned char kl; // nacisniety klawisz

65

int mysz_x,mysz_y; // zapamietana pozycja kursora myszy dla ramek (przeskalowana)

int stare_x,stare_y,stare_xp,stare_yp; // j.w. tylko dla linii (nowych lukow) int Xorg,Yorg; // pozycja kursora myszy (nie przeskalowana) int skala; // 100 % = 100 int Xmark,Ymark; // wspolrzedne pocz. zaznaczonego obszaru int delay_rysujramke; // opoznienie rysowania ramki po scrollingu // podane w "tyknieciach" zegara // odliczane od DELAY_RYSUJRAMKE do 0 dla unikniecia artefaktow na ekranie float sx,sy; // skala X i Y 100% = 1 bool mysz_p; // 1 = nacisnieto prawy przycisk myszy TShiftState mysz_kl;

// zapamietany stan myszy (tzn nacisniete przyciski myszy) int offset_x,offset_y,offset_x_opisu,offset_y_opisu,

offset_x_funkcji,offset_y_funkcji; // offset to roznica wspolrzednych okreslajacych uchwycony obiekt // i wspolrzednych kursora myszy int pocz_luku,koniec_luku; // numery obiektow tworzacych pocz. i koniec luku bool wykonuje; // 1 = wykonuje krok symulacji bool odtwarzam; // 1 = trwa symulacja dzialania sieci bool zaznaczam,przesuwam,wymiaruje,przesuwam_opis_sieci,przesuwam_opis, przesuwam_funkcje; // tryby pracy GUI programu bool pocz_zaznaczania,pocz_przesuwania,pocz_wymiarowania; bool podwojne_klikniecie; // 1 = kliknieto podwojnie lewym przyciskiem myszy bool bez_trzymania; // 1 = rysuj ramke napisu podczas jego przesuwania // bez trzymania przycisku myszy bool bez_ramek; // 1 = nie rysuj ramek przy okazji przerysowywania obrazu // po upuszczeniu obiektu // podczas dzialania symulacji bool nowyluk; // 1 = utworzono nowy luk - powstrzymuje niepotrzebne // przesuwanie napisow przed ich wpisaniem bool repaint; // 1 = wymagane jest przerysowanie rysunku sieci bool przesunac_ekran; // 0 - scrolling jest zabroniony, 1 - dozwolony bool byl_scrolling; // 1 - wymagane jest przerysowanie sieci bool czekam,przerwij_czekanie; // semafory uzywane podczas oczekiwania (Sleep) w czasie symulacji dzialania sieci }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif

66

6.3.2 Nagłówek klasy TAnalizator zadeklarowanej w pliku analiza.h //--------------------------------------------------------------------------- #ifndef analizaH #define analizaH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ComCtrls.hpp> #include <Menus.hpp> #include "Miejsca.h" #include "Strzalki.h" #include "Tranzycje.h" #include <Grids.hpp> #include <Dialogs.hpp> #include <process.h> #include <dir.h> //--------------------------------------------------------------------------- class TAnalizator : public TForm { __published: // IDE-managed Components TStatusBar *StatusBar; TPageControl *PageControl; TTabSheet *Stale_TabSheet; TTabSheet *P_INV; TTabSheet *Graf; TTabSheet *Wlasciwosci; TTabSheet *Zmienne_TabSheet; TStringGrid *Arkusz_C; TStringGrid *Arkusz_V; TTabSheet *PT_TabSheet; TStringGrid *Arkusz_PT; TRichEdit *GrafView; TRichEdit *InaView; TTabSheet *T_INV; TRichEdit *PView; TRichEdit *TView; void __fastcall FormDestroy(TObject *Sender); private: // User declarations bool __fastcall ZapisSieci_INA(AnsiString pnt); public: // User declarations __fastcall TAnalizator(TComponent* Owner); Arr *tab_C,*tab_V,*tab_PT; Miejsca *miejsca; Strzalki *luki; Tranzycje *tranzycje; Symbole *symbole_C,*symbole_V; bool tylko_czarne,stale,zmienne,brak_podstawien; int glebokosc_grafu; AnsiString nazwapliku_ina,nazwapliku_inv,nazwapliku_int, nazwapliku_pnt,nazwapliku_mar,nazwapliku_gra, nazwapliku_we,nazwapliku_wy,nazwapliku_sesji; int __fastcall Wywolaj_INA(); void __fastcall WyswietlPliki(); void __fastcall BezPolskichLiter(char *s); }; //--------------------------------------------------------------------------- extern PACKAGE TAnalizator *Analizator; #endif

67

6.3.3 Nagłówek klasy Tranzycja #ifndef _TRANZYCJA_ #define _TRANZYCJA_ #include <fstream.h> #include <iostream.h> #include <stdio.h> #include <string.h> #include <malloc.h> #include <list.h> #include <windows.hpp> #include "defs.h" #include "strzalki.h" #include "miejsca.h" #include <set> class Tranzycja { friend class Tranzycje; private: struct Tpara { int z; int n; }; struct TZmienna { int nr; int ilosc; }; int sortuj_zmienne(TZmienna *,int,int,int); int posortuj_zmienne(TZmienna *,int); Arr *Rpre; Arr *Rpo; Miejsce *miejsce_pom; protected: int nr; public: char *nazwa; int rozmiar_czcionki; TPoint wsp_nazwy,min,max; list<int> *preset; list<int> *poset; Tranzycja(); Tranzycja(int,int,int,int,int,int); ~Tranzycja(); int daj_nr() { return nr; } void popraw_strzalke(Strzalki * strzalki,TPoint *wp,TPoint *wk); void popraw_strzalki(Strzalki * strzalki,Miejsca * miejsca); void ustaw_pre_set_i_po_set(Strzalki *strzalki,Miejsca *miejsca,

bool Pre,bool Po); bool jest_luk(Strzalki * strzalki,int nr_miejsca,bool czypreset); bool moze_odpalic(Symbole *symbole_C,Symbole *symbole_V,

Strzalki * strzalki,Miejsca * miejsca); bool odpalam(Symbole *symbole_C,Symbole *symbole_V,

Strzalki * strzalki,Miejsca * miejsca); bool utworz_Rpre(Symbole *symbole_C,Symbole *symbole_V,

Strzalki * strzalki,Miejsca * miejsca); bool utworz_Rpo(Symbole *symbole_C,Symbole *symbole_V,

Strzalki * strzalki,Miejsca * miejsca); bool moze_odpalic_wstecz(Symbole *symbole_C,Symbole *symbole_V,

Strzalki * strzalki,Miejsca * miejsca); bool odpalam_wstecz(Symbole *symbole_C,Symbole *symbole_V,

Strzalki * strzalki,Miejsca * miejsca); bool utworz_Rpre_wstecz(Symbole *symbole_C,Symbole *symbole_V,

Strzalki * strzalki,Miejsca * miejsca); bool utworz_Rpo_wstecz(Symbole *symbole_C,Symbole *symbole_V,

Strzalki * strzalki,Miejsca * miejsca); bool silne_odpalenie, blokada, odpalono; friend istream& operator>>(istream&, Tranzycja&); friend ostream& operator<<(ostream&, Tranzycja&); }; #endif

68

6.3.4 Nagłówek klasy Miejsce #ifndef _MIEJSCE_ #define _MIEJSCE_ #include <iostream.h> #include <istream.h> #include <fstream.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <malloc.h> #include <list.h> #include <windows.hpp> #include "defs.h" #include "strzalki.h" class Miejsce { friend class Miejsca; protected: int nr; public: char *nazwa; int rozmiar_czcionki; int rozmiar_czcionki_znacznikow; TPoint wsp_nazwy; TPoint wsp_srodka; int promien; int pojemnosc; Arr *ilosc_znacznikow; Arr *ilosc_probnikow; Arr *last_subst; list<int> *preset; list<int> *poset; bool pre_set,po_set; Miejsce(); Miejsce(int n,int x,int y,int r,int rozm_czcionki,int rozm_znacznikow); ~Miejsce(); void popraw_strzalke(Strzalki *s,TPoint *wp,TPoint *wk); void popraw_strzalki(Strzalki *s); int daj_nr() {return nr; } int zawartosc(Symbole *symbole_C) { int c=0; for(int i=0;i<=symbole_C->dajmaxnr();i++) c+=(*ilosc_znacznikow)(i); return c; } int probna_zawartosc(Symbole *symbole_C) { int c=0; for(int i=0;i<=symbole_C->dajmaxnr();i++) c+=(*ilosc_probnikow)(i); return c; } int ilosc_podstawien(Symbole *symbole_C) { int c=0; for(int i=0;i<=symbole_C->dajmaxnr();i++) if(((*ilosc_znacznikow)(i)>0) && ((*last_subst)(i)>0)) c++; return c; } void wczytaj_znaczniki_z_wejscia(Symbole *symbole,istream &we); int wczytaj_znaczniki(Symbole*,char*);

int wczytaj_podstawienia_z_wejscia(Symbole *symbole_C,Symbole *symbole_V, istream &we);

int wczytaj_podstawienia(Symbole *symbole_C,Symbole *symbole_V,char*); char *wypisz_podstawienia(Symbole *symbole_C,Symbole *symbole_V); char *wypisz_znaczniki(Symbole *); void odczyt(Symbole *symbole_C,Symbole *symbole_V,istream &we); void zapis(Symbole *symbole_C,Symbole *symbole_V,ostream &wy); }; #endif

69

6.3.5 Nagłówek klasy Strzalka #ifndef _STRZALKA_ #define _STRZALKA_ #include <fstream.h> #include <iostream.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include <malloc.h> #include <list.h> #include <windows.hpp> #include "defs.h" #include "arrint.h" #include "symbole.h" class Strzalka { friend class Strzalki; protected: int nr; public: char *nazwa; int rozmiar_czcionki; int rozmiar_czcionki_funkcji; TPoint wsp_funkcji,wsp_nazwy; Arr *funkcja_C; Arr *funkcja_V; char typ_poczatku; // P-miejsce , T-tranzycja int nr_poczatku; int nr_konca; list<TPoint*> *odcinki; Strzalka(); Strzalka(int n,char typ,int nrpocz,int xpocz,int ypocz, int nrkonca,int xkonca,int ykonca,int rozm_czcionki,int rozm_funkcji); ~Strzalka(); int daj_nr() {return nr; } int wczytaj_funkcje(Symbole *symbole,char*,bool zmienne); void wczytaj_funkcje_z_wejscia(Symbole *symbole,istream &we, bool zmienne); int zawartosc_C(Symbole *); int zawartosc_V(Symbole *); char *wypisz_funkcje(Symbole *symbole,bool zmienne); void odczyt(Symbole *symbole_C,Symbole *symbole_V,istream &we); void zapis(Symbole *symbole_C,Symbole *symbole_V,ostream &wy); }; #endif _STRZALKA_

70

6.3.6 Nagłówek klasy Tranzycje #ifndef _TRANZYCJE_ #define _TRANZYCJE_ #include "tranzycja.h" class Tranzycje { private: int maxnr; int array_size; int ilosc_; Tranzycja **tr; int pierwsza_wolna_pozycja(); void nowe(); void zniszcz(); public: Tranzycje(); ~Tranzycje(); Tranzycja* operator()(int nr) { if ((nr>=0) && (nr<=maxnr)) return tr[nr]; else return NULL; } Tranzycja* znajdztranzycje(int x,int y); int ilosc() {return ilosc_;} int dajmaxnr() {return maxnr;} int dodaj(Tranzycja*); void usun(int); int odczyt(char * filename); int zapis(char * filename); void renumeruj(Strzalki *luki); }; #endif _TRANZYCJE_ 6.3.7 Nagłówek klasy Miejsca #ifndef _MIEJSCA_ #define _MIEJSCA_ #include "miejsce.h" class Miejsca { private: int maxnr; int array_size; int ilosc_; Miejsce **miej; int pierwsza_wolna_pozycja(); void nowe(); void zniszcz(); public: Miejsca(); ~Miejsca(); Miejsce* operator()(int nr) { if((nr>=0) && (nr<=maxnr)) return miej[nr]; else return NULL; } Miejsce* znajdzmiejsce(int x,int y); int dajmaxnr() {return maxnr;} int ilosc() {return ilosc_;} int dodaj(Miejsce*); void usun(int); int odczyt(Symbole *symbole_C,Symbole *symbole_V,char * filename); int zapis(Symbole *symbole_C,Symbole *symbole_V,char * filename); void renumeruj(Strzalki *luki); }; #endif _MIEJSCA_

71

6.3.8 Nagłówek klasy Strzałki #ifndef _STRZALKI_ #define _STRZALKI_ #include "strzalka.h" #include "geometria.h" class Strzalki : public Geometria { private: int maxnr; int array_size; int ilosc_; Strzalka **st; int pierwsza_wolna_pozycja(); void nowe(); void zniszcz(); public: Strzalki(); ~Strzalki(); Strzalka* operator()(int nr) { if((nr>=0) && (nr<=maxnr)) return st[nr]; else return NULL; } Strzalka *znajdzluk(int x,int y,float skala); int dajmaxnr() {return maxnr;} int ilosc() {return ilosc_;} int dodaj(Strzalka*); void usun(int); int odczyt(Symbole *symbole_C,Symbole *symbole_V,char * filename); int zapis(Symbole *symbole_C,Symbole *symbole_V,char * filename); void renumeruj(char typ,int nr_old,int nr_new); }; #endif _STRZALKI_ 6.3.9 Nagłówek klasy Symbole #ifndef _SYMBOLE_ #define _SYMBOLE_ #include <fstream.h> #include <iostream.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <malloc.h> #include <map.h> #include "defs.h" class Symbole { private: map <const string,int, less<string> > *mapa; int maxnr; int array_size; int ilosc_; char **tr; int pierwsza_wolna_pozycja(); void nowe(); void zniszcz(); public: Symbole(); ~Symbole(); char* operator()(int nr) { if ((nr>=0) && (nr<=maxnr)) return tr[nr]; else return NULL; } int znajdzsymbol(char *); int ilosc() {return ilosc_;} int dajmaxnr() {return maxnr;} int dodaj(char *t,int &ile); int odczyt(char * filename); int zapis(char * filename); }; #endif _SYMBOLE_

72

6.3.10 Nagłówek klasy Arr zadeklarowanej w pliku arrint.h #if !defined(__ARR_HC) #define __ARR_HC #if !defined(ArrWithKeys) #include "obj.h" #define _Arr_INH virtual public Obj #define _Arr_Class_Type CLASSname(Arr) #else #include "keys.h" #define _Arr_INH public Keys #define _Arr_Class_Type CLASSwithSORTname(Arr) #endif #include <iomanip.h> #include <limits.h> #include "defs.h" class Arr : _Arr_INH { _Arr_Class_Type; protected: static int Gl[3]; static int ipl; static int fw; char type; int *beg; int d[3]; int l[3]; void ErrMsg(int); void Init(int,int,int); int Alloc(int,int=1,int=1); virtual int ProcessInpErr(istream &src) { return RepeatInput(src); } public: Arr(void) : beg(NULL) { } Arr(Arr&); Arr(int n1,int n2 = 1, int n3 = 1) { Init(n1,n2,n3); } ~Arr() { if (beg) delete beg; beg = NULL; }; static void OutFormat(int ipl, int fw) {Arr::ipl = ipl; Arr::fw = fw; } static void SetGlobalLow(int low1,int low2 = 0, int low3 = 0) { Gl[0] = low1; Gl[1] = low2; Gl[2] = low3; } void Free(void) { if (beg) delete beg; beg = NULL; } void Use(int n1,int n2 = 1,int n3 = 1) { if (beg) delete beg; Init(n1,n2,n3); } void SetLow(int low1,int low2 = 0,int low3 = 0) { l[0] = low1; l[1] = low2; l[2] = low3; } int IsRow(int i) { return(i >= l[0] && i <= l[0]+d[0]-1); } int IsCol(int j) { return(j >= l[1] && j <= l[1]+d[1]-1); } int IsMelt(int i,int j) { return(i >= l[0] && i <= l[0]+d[0]-1 && j >= l[1] && j <= l[1]+d[1]-1); } int Sum(void); int SumRow(int r); int SumCol(int c); Arr& SetRow(int r,Arr& a); Arr& SetCol(int c,Arr& a); void VecToRow(int r, Arr& a); void VecToCol(int c, Arr& a); Arr& Row(int r); Arr& Col(int c); Arr& Dia(int d = 1); static Arr& Diag(int,int = 1); Arr& Trp(void); int Dim(int dim) { return d[dim-1]; } int Low(int dim) { return l[dim-1]; } char Typ(void) { return(type); };

73

int& operator() (int ii) { if(ii-l[0]>=d[0]) { beg=(int*)realloc(beg,(ii-l[0]+TOKEN_ARRAY_SIZE)*sizeof(int)); memset(beg+d[0],0,(ii-l[0]-d[0]+TOKEN_ARRAY_SIZE)*sizeof(int)); //for(int i=d[0];i<=ii-l[0];i++) beg[i]=0; d[0]=ii-l[0]+TOKEN_ARRAY_SIZE; } return(*(beg + (ii-l[0]))); } int& operator() (int ii,int jj) { return (*(beg + (ii-l[0])*d[1] + (jj-l[1]))); } int& operator() (int ii,int jj,int kk) { return (*(beg + (ii-l[0])*d[1]*d[2] + (jj-l[1])*d[2] + (kk-l[2]))); } Arr& operator= (Arr& arg); Arr& operator= (int arg); Arr& operator+ (Arr& arg); Arr& operator+ (int arg); friend Arr& operator+ (int f, Arr& arg) { return arg + f; } Arr& operator- (Arr& arg); Arr& operator- (int arg); friend Arr& operator- (int f, Arr& a); Arr& operator/ (Arr& arg); Arr& operator/ (int arg); friend Arr& operator/ (int f, Arr& a); Arr& operator* (int arg); Arr& operator& (Arr& arg); Arr& operator* (Arr& arg); friend Arr& operator* (int f, Arr& a) { return a*f; } virtual void Input(istream& src); virtual void Output(ostream& out); }; #endif

6.3.11 Nagłówek klasy Geometria #ifndef GEOMETRIA_H #define GEOMETRIA_H #include <windows.hpp> #include <math.h> class Geometria { public: bool OdcinkiSiePrzecinaja(const TPoint &Ap,const TPoint &Ak, const TPoint &Bp,const TPoint &Bk,bool); bool PunktNaOkregu(const TPoint &P,const TPoint &Srodek,int r,float &Wx,float &Wy); bool PunktWspolny(const TPoint &P1,const TPoint &P2, const TPoint &P3,const TPoint &P4, TPoint &P); int IloczynWektorowy(int,int,int,int); int min(int a,int b) {if (a<=b) return a;else return b;} int max(int a,int b) {if (a>b) return a;else return b;} bool wyznaczab (int x1, int y1, int x2, int y2, double * a, double * b); int polozenie(const TPoint &P1,const TPoint &P2,const TPoint &P); int odleglosc(const TPoint &P1,const TPoint &P2,const TPoint &P); }; #endif

74

7 Bibliografia:

1. Wolfgang Reisig, „Sieci Petriego”, Wydawnictwa Naukowo-Techniczne, Warszawa 1988

2. Wolfgang Reisig, „A Primer in Petri Net Design”, Springer-Verlag, Berlin 1992

3. Elike Best, Raymond Devillers, Maciej Koutny, „Petri Net Algebra“,Springer-Verlag, Berlin 1991

4. Kurt Jensen „Coloured Petri Nets“, Springer-Verlag, Berlin 1992, 1996

5. A. Caprara, H. Kellerer, U. Pferschy, “A PTAS for the Multiple Subset Sum Problem with

Different Knapsack Capacities”, Information Processing Letters 73 (2000) 111-118

6. Stephan Roch, Prof. Peter H. Starke, “INA Integrated Net Analyzer Version 2.2 Manual”, Humbold-Universität zu Berlin, Institut für Informatik, Lehrstuhl für Automaten und Systemtheorie

7. Kent Reisdorph, „C++ Builder 3”, Wydawnictwo Helion, Gliwice 1998

8. Krzysztof Barteczko „Praktyczne wprowadzenie do programowania obiektowego w języku

C++”, Wydawnictwo Lupus, Warszawa 1993

9. Zbigniew Suraj, Bogumił Komarek „Graf. System graficznej konstrukcji i analizy sieci Petriego”, Akademicka Oficyna Wydawnicza PLJ, Warszawa 1994

75