Metody symulacyjne
Metody symulacyjne
J
Ę
ZYK SYMULACYJNY MODSIM
wprowadzenie do składni
wprowadzenie do składni
CECHY JĘZYKA SYMULACYJNEGO
CECHY JĘZYKA SYMULACYJNEGO
OPIS MODELOWANEGO SYSTEMU
PROCEDURY UPŁYWU CZASU
ŚLEDZENIE ZDARZEŃ, CZYNNOŚCI I PROCESÓW
TWORZENIE I USUWANIE ZDARZEŃ ORAZ
PRZETWARZANIE DANYCH Z NIMI ZWIĄZANYCH
PRZETWARZANIE DANYCH Z NIMI ZWIĄZANYCH
GENEROWANIE ZMIENNYCH LOSOWYCH O ZADANYCH
ROZKŁADACH
GROMADZENIE, ANALIZA I PREZENTACJA WYNIKÓW
SYMULACJI
Wytwórca środowiska programowego MODSIM II
CACI PRODUCTS COMPANY
CACI PRODUCTS COMPANY ( www.caciasl.com )
Podstawowe cechy języka:
język obiektowo zorientowany do programowania symulacji
dyskretno-zdarzeniowej
JĘZYK I ŚRODOWISKO
JĘZYK I ŚRODOWISKO MODSIM
MODSIM II
II
dyskretno-zdarzeniowej
składnia zbliżona do składni języków:
Modula 2, Ada, Pascal
wersje dla systemów: Windows, Windows NT, UNIX, OS/2 na
platformy sprzętowe PC oraz RISC
MODSIM II wymaga preinstalowanego środowiska C/C++
(np. MSVC v 1.5)
Wprowadzenie
Wprowadzenie
Umożliwia realizację:
upływu czasu
interakcji obiektów
wizualizacji i animacji
monitorowania przebiegu symulacji
monitorowania przebiegu symulacji
Środowisko programowe stanowią:
edytor kodu źródłowego wraz z kompilatorem i
debuggerem
ModBench
edytor grafiki
SimDraw
edytor animacji
SimVideo
SimObj
ModBench
ModBench
SimDraw
SimDraw
SimVideo
SimVideo
Moduły
Moduły
Każdy program stworzony w
MODSIM II
musi posiadać:
dokładnie jeden moduł główny -
MAIN MODULE
dowolną liczbę par modułów skojarzonych w osobnych plikach:
DEFINITION MODULE
- zawiera deklaracje struktur, procedur i
obiektów; udostępnia procedury innym modułom
obiektów; udostępnia procedury innym modułom
IMPLEMENTATION MODULE
- zawiera kod wykonywalny oraz
dodatkowe deklaracje
Uwaga:
w module DEFINITION nie może być kodu wykonywalnego
IMPLEMENTATION występują zawsze w parze z DEFINITION
stałe, typy, zmienne i procedury zadeklarowane w module
DEFINITION są widoczne w skojarzonym IMPLEMENTATION oraz
mogą być importowane z innych modułów
Moduły c.d.
Moduły c.d.
elementy zaimportowane do modułu DEFINITION nie są widoczne w
IMPLEMENTATION
nie można nic importować z modułu MAIN
do importowania służy polecenie
IMPORT
, np.
FROM UtilMod IMPORT DateTime, Delay;
sekwencja
FROM
...
IMPORT
... musi być umieszczona na początku
sekwencja
FROM
...
IMPORT
... musi być umieszczona na początku
modułu (przed innymi sekwencjami poleceń)
nie można zaimportować całego modułu (biblioteki) tylko
poszczególne elementy
nazewnictwo:
MAIN MODULE
- MNazwa
mmnazwa.mod
DEFINITION MODULE
nazwa
-
dnazwa.mod
IMPLEMENTATION MODULE
nazwa -
inazwa.mod
{ograniczenia na długość nazwy modułu}
Identyfikatory
Identyfikatory
- nazwy zdefiniowanych przez użytkownika elementów
programowych, np.: modułów, stałych, zmiennych, typów,
procedur itd.
Wymagania:
– nierozdzielony ciąg znaków (bez spacji, myślników oraz
– nierozdzielony ciąg znaków (bez spacji, myślników oraz
podkreśleń) - liter i/lub cyfr
– pierwszy znak - litera (!)
Uwaga: w MODSIM rozróżnia się małe/wielkie litery
Przykład:
– licznik, LICZNIK, Pole1, liczbaStanowiskObslugi...
Deklaracje
Deklaracje
blok programowy położony w module
definicyjnym lub przed częścią kodu
wykonywalnego w pozostałych modułach lub
podprogramach zaczynający się od jednego ze
słów kluczowych: CONST, TYPE, VAR
słów kluczowych: CONST, TYPE, VAR
opisuje definiowane przez użytkownika
wyrażenia przyjmujące stałe i zmienne wartości
oraz opisujące nowe typy danych
Deklaracje
Deklaracje
Definiowanie stałej wartości:
–
CONST
MaxLiczbaPacjentow = 30;
MaxCzasPracy = 120.0;
Definiowanie nowego typu danych:
–
TYPE
DniWolne = (Sobota, Niedziela);
DynamicznaTablica = ARRAY INTEGER OF REAL;
Deklaracje c.d.
Deklaracje c.d.
Definiowanie zmiennych:
–
VAR
liczbaPacjentow : INTEGER;
tablica : DynamicznaTablica; {zmienna referencyjna}
Uwaga
: nie ma zmiennych wskaźnikowych tylko referencje
Uwaga
: nie ma zmiennych wskaźnikowych tylko referencje
Automatyczna inicjalizacja wartości zmiennych
podstawowego typu
:
INTEGER
: 0
REAL
: 0.0
BOOLEAN
: FALSE
STRING
: null
CHAR
: CHR(0)
skalarne :
INTEGER (32-bit): -2.147.483.648 do +2.147.483.648
REAL (64-bit): +/- 1,7 E-308 do 1,7 E+308
CHAR:
pojedynczy znak, np. ’a’
BOOLEAN
{TRUE, FALSE}
Podstawowe typy danych
Podstawowe typy danych
BOOLEAN
{TRUE, FALSE}
łańcuchy znakowe (dynamiczne łańcuchy znaków automatycznie
zarządzane): STRING, np. „Pacjent oczekuje w kolejce”
wyliczeniowe : dopuszczalne nazwane wartości jednoznacznie
wyliczone w deklaracji „TYPE” np. Miesiace=(styczeń, luty);
okrojony typ skalarny lub wyliczeniowy, np. I = [1 .. 50]
Operatory podstawowych działań
Operatory podstawowych działań
:=
przypisanie
+
dodawanie/konkatenacja łańcuchów
znakowych
-
odejmowanie/znak ujemności
*
mnożenie
*
mnożenie
/
dzielenie rzeczywiste
DIV
dzielenie całkowitoliczbowe
MOD
modulo
Uwaga: operandy muszą być kompatybilne; operator
powinien być dostosowany do typu operand
– błędne wyrażenia: 2.0 + 2, 5 / 7, 5 + ’a’
Operatory relacji logicznych
Operatory relacji logicznych
Porównują wartości - wynik typu BOOLEAN
=
równy
<>
nierówny
<
mniejszy niż
<=
mniejszy niż lub równy
>
większy niż
>=
większy niż lub równy
Uwaga: operandy muszą być kompatybilne
– błędne wyrażenia: 2.0 < 2, 5 = ’a’
Operatory działań logicznych
Operatory działań logicznych
Dwie operandy po obu stronach
OR
suma logiczna
AND
iloczyn logiczny
Operand po prawej stronie
NOT
przeczenie
Uwaga: operandy muszą być wyrażeniami logicznymi
Instrukcje sterujące
Instrukcje sterujące
Instrukcja warunkowa
IF
:
IF Wyrażenie_logiczne1
Sekwencja_działań
[ ELSIF Wyrażenie_logiczne2
Sekwencja_działań]
Sekwencja_działań]
[ ELSE
Sekwencja_działań ]
END IF;
Uwaga:
-brak słowa kluczowego
THEN
-
END
występuje w parze z
IF
Instrukcje sterujące c.d.
Instrukcje sterujące c.d.
Instrukcja wyboru
CASE
:
CASE [typ prosty | string]
WHEN a..e, m:
Sekwencja_działań
WHEN p:
Sekwencja_działań
WHEN x...z:
Sekwencja_działań
WHEN x...z:
Sekwencja_działań
[ OTHERWISE
Sekwencja_działań ]
END CASE;
Uwaga:
-brak słowa kluczowego
OF
-
END
występuje w parze z
IF
Instrukcje sterujące c.d.
Instrukcje sterujące c.d.
Instrukcje pętli
–
WHILE
:
WHILE Wyrażenie_logiczne
Sekwencja_działań
END WHILE;
–
LOOP
:
–
LOOP
:
LOOP
Sekwencja_działań
END LOOP;
–
REPEAT
:
REPEAT
Sekwencja_działań
UNTIL Wyrażenie_logiczne;
Instrukcje sterujące c.d.
Instrukcje sterujące c.d.
–
FOR
:
FOR ident := wyrażenie TO | DOWNTO wyrażenie [BY wyrażenie]
Sekwencja_działań
END FOR;
–
FOREACH
:
FOREACH obiekt IN GROUP
Sekwencja_działań
END FOREACH;
Instrukcja natychmiastowego opuszczenia pętli:
EXIT
Uwaga:
-
END
występuje w parze z
nazwą pętli
Przykłady pętli
Przykłady pętli
WHILE a < b
a := a + 2;
END WHILE;
REPEAT
a := a + b;
UNTIL a < 100;
FOR i := 1 TO 20 BY 2;
t[i] := i * 2;
END FOR;
FOR i := 100 DOWNTO -20 BY 4;
t[i] := i * 2;
END FOR;
UNTIL a < 100;
LOOP
…
IF a > b
EXIT;
END IF;
…
END LOOP;
END FOR;
FOREACH el IN kolejka;
el.a := 6;
END FOR;
Podprogramy
Podprogramy
- nazwana, ograniczona kluczowymi słowami część kodu
programowego, dostępna z innych części programu
poprzez nazwę, realizująca określone operacje
Typy:
funkcje - określają zwrotnie wartość
funkcje - określają zwrotnie wartość
procedury - nie zwracają żadnych wartości
Podprogramy c.d.
Podprogramy c.d.
Deklaracja :
PROCEDURE
NazwaProcedury(
IN
w1:W1;
INOUT
w2:W2;
OUT
w3:W3)[: TypZwracanejWartości];
CONST
...
TYPE
...
VAR
...
CONST
...
TYPE
...
VAR
...
BEGIN
......
[
RETURN
...]
END PROCEDURE
;
Podprogramy c.d.
Podprogramy c.d.
Wywołanie procedury:
–
[w := ] NazwaProcedury(... , ... , ...);
Lista parametrów:
–
IN
- wartość przekazywana do procedury
–
OUT
- wartość zwracana przez procedurę po słowie RETURN
–
INOUT
- wartość zmiennej przekazana do procedury i zwrócona
do tej zmiennej, bez tworzenia kopii zmiennej
Podprogramy c.d.
Podprogramy c.d.
Przykład:
PROCEDURE SrDlugoscKolejki(IN liczbaklientow: INTEGER;
IN liczbaKas : INTEGER) : REAL;
VAR
srdlkol : REAL;
BEGIN
IF liczbaKas <> 0
IF liczbaKas <> 0
srdlkol := FLOAT (liczbaKlientow) / FLOAT (liczbaKas);
END IF;
RETURN srdlkol;
END PROCEDURE;
wywołanie:
.....
OUTPUT ( „Wyliczono :”, SrDlugoscKolejki(95, 15) );
.....
Standardowe procedury Wej/Wyj
Standardowe procedury Wej/Wyj
INPUT (w1,... ,wN)
- wczytanie N ciągów znaków z klawiatury oraz
zinterpretowanie zgodnie z typami zmiennych w1,..., wN
INPUT(dlugoscKolejki, liczbaKas);
OUTPUT (w1,... ,wN)
- wypisanie w powoływanym oknie sekwencji
wartości w1,...,wN
OUTPUT(nr, „Czas zmierzony = ” ,czasObslugi);
OUTPUT(nr, „Czas zmierzony = ” ,czasObslugi);
PRINT (w1,...,wN) WITH string
- wypisanie w powoływanym oknie
sekwencji wartości w postaci sformatowanego zgodnie ze string
ciągu wartości w1,..,wN
PRINT(nr, kwota) WITH „Kasa *** zarobiła *****.* zł.”
Uwaga:
w1,...,wN muszą być typu prostego
ciąg formatujący może być stałą, zmienną lub znakowy
Zło
ż
one typy danych
Zło
ż
one typy danych
Struktury statyczne :
FIXED ARRAY
- uporządkowany skończony zbiór elementów
jednego typu, np.
Pole = (..., figuraSzachowa, ...);
PlanszaSzachowa = FIXED ARRAY [1..8],[1..8] OF Pole;
elementy tablicy muszą mieć ustalony rozmiar
alokują ilość pamięci, zależną od ilości i typu
zadeklarowanych w definicji tablicy elementów
dostęp do elementów tablicy przez indeksy:
plansza[2, 3]
nie mogą być przekazywane jako parametr IN procedur
FIXED RECORD
- zdefiniowana przez użytkownika struktura
danych złożona ze skończonej liczby nazwanych pól prostego
lub złożonego typu, np.
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
SrodekWalki = FIXED RECORD;
typ : TypSrodkaWalki;
zasieg : REAL;
szybkostrzelnosc : REAL;
jednostkaAmunicyjna : INTEGER;
END RECORD;
elementy rekordu muszą mieć ustalony rozmiar
alokują ilość pamięci, zależną od ilości i typu
zadeklarowanych w definicji rekordu pól
dostęp do pola uzyskuje się przez złożenie nazwy rekordu
oraz nazwy pola, np.
srodekwalki.zasieg
może być używany w operacjach arytmetycznych oraz
wyrażeniach logicznych, np.
srodekwalki.zasieg := 500.0;
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
Struktury dynamiczne :
ARRAY
: tablica dynamicznie powoływana i usuwana przez
procedury wbudowane NEW oraz DISPOSE
VAR kolejkiSklepu : ARRAY INTEGER, INTEGER OF BOOLEAN;
k : INTEGER;
k : INTEGER;
BEGIN
...
NEW( kolejkiSklepu, 1..5);
FOR k := 1 TO 5
NEW(kolejkiSklepu[k], 1..k);
DISPOSE(kolejkiSklepu[k]);
END FOR;
...
DISPOSE(kolejkiSklepu
);
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
Efekt powyższej sekwencji poleceń :
Uwaga:
– w przypadku tablicy wielowymiarowej należy pamiętać
o oddzielnym powołaniu jej pól
– procedurą DISPOSE można zwalniać tylko wcześniej
zaalokowane obszary pamięci
– do chwili powołania tablicy zmienna typu ARRAY jest
inicjalizowana na wartość NILARRAY
– tablice mogą być operandami w wyrażeniach logicznych
’ = ’, ’ < > ’.
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
RECORD
: struktura danych podobna do FIXED RECORD-
różnice:
zajmuje pamięć dopiero po wykonaniu NEW(...), zwalnia
natychmiast po wykonaniu DISPOSE(...)
pola mogą być dynamicznymi strukturami danych
TYPE
TYPE
playerType = RECORD
imie : STRING;
team : STRING;
pozycja : positionType;
kolejnyGracz : playerType;
END RECORD;
VAR
team, gracz : playerType;
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
BEGIN
NEW(gracz);
team :=gracz;
NEW(gracz);
gracz.kolejnyGracz := team;
team := gracz;
team := gracz;
...
dla rekordu predefiniowane są:
NILREC
– wartość zmiennej typu RECORD do chwili
zaalokowania pamięci
ANYREC
– typ kompatybilny z każdym typem RECORD,
nie wolno używać go w procedurze NEW
rekordy mogą być operandami w wyrażeniach logicznych z
operatorami: ’ = ’ , ’ < > ’
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
Wybrane działania na strukturach dynamicznych
:
przypisanie
TYPE
TypRekordowy = deklaracja;
VAR
j, k : INTEGER;
j, k : INTEGER;
a, b : TypRekordowy;
...
BEGIN
k := 4; { przypisanie wartości }
NEW(b); { powołanie instancji b }
b := dane { uzupełnienie pól rekordu danymi }
...
j := k; { kopia wartości k przepisana do j }
a := b; { a oraz b wskazują na tę samą instancję rekordu }
4
k
INTEGER
0
j
INTEGER
some data
someRecType instance
NILREC
a
someRecType reference
b
someRecType reference
•
Pamięć przed przypisaniem
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
4
j
INTEGER
4
k
INTEGER
some data
someRecType instance
a
someRecType reference
b
someRecType reference
•
•
Pamięć po przypisaniu
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
klonowanie- działanie polegaj
ą
ce na stworzeniu kopii
struktury dynamicznej oraz przypisaniu jej do nowej
zmiennej referencyjnej
TYPE
TypRekordowy = deklaracja;
VAR
VAR
j, k : INTEGER;
a, b : TypRekordowy;
...
BEGIN
k := 4; { przypisanie warto
ś
ci }
NEW(b); { powołanie instancji b }
b := dane { uzupełnienie pól rekordu danymi }
...
j := k; { kopia warto
ś
ci k przepisana do j }
a := CLONE(b); { a wskazuje teraz na kopi
ę
instancji b}
4
k
INTEGER
0
j
INTEGER
some data
NILREC
a
someRecType reference
b
someRecType reference
·
Pami
ęć
przed przypisaniem
Zło
ż
one typy danych c.d.
Zło
ż
one typy danych c.d.
some data
someRecType instance
some data
someRecType instance
someRecType reference
a
someRecType reference
b
someRecType reference
·
·
some data
someRecType instance
4
j
INTEGER
4
k
INTEGER
Pami
ęć
po przypisaniu