System state : koleksi variabel state yang diperlukan untuk menggambarkan sistem pada saat tertentu. Simulation clock : variabel yang menghasilkan nilai terbaru saat itu (current) dari waktu tersimulasi. Event list : daftar yang memuat waktu berikutnya ketika masing-masing event akan muncul.
Statistical counters : variabel yang digunakan untuk menyimpan informasi statistik tentang kinerja sistem. Initialization routine : subprogram untuk menginisialisasi model pada saat t = 0. Timing routine : subprogram yang menentukan event berikutnya dari event list dan kemudian memajukan simulation clock ke waktu di mana event berikutnya tersebut muncul.
Event routine : subprogram yang meng- update state sistem ketika tipe event tertentu muncul (masing-masing tipe event mempunyai satu event routine). Library routine : himpunan subprogram untuk menghasilkan (generate) observasi-observasi random dari distribusi probabilitas yang ditentukan sebagai bagian model simulasi.
Report generator : subprogram yang menghitung estimasi (dari statistical counters) dari ukuran kinerja yang diinginkan dan menghasilkan laporan (reports) ketika simulasi selesai. Main program : subprogram yang memanggil (call – invoke) timing routine untuk menentukan next event dan kemudian mentrasfer kontrol ke event routine yang bersesuaian untuk meng- update state sistem secara tepat. Main program mungkin juga memeriksa terminasi (pemberhentian) dan invokes report generator ketika simulasi berakhir.
Initialization routine 1.Set simulation clock = 0 2.Initialize system state & statistical counters 3.Initialize event list Main ProgramTiming routine 0. Invoke the initialization routine 1.Invoke the timing routine 2.Invoke event routine i (1 dan 2 diulang-ulang) 1.Menentukan next event type, sebut i 2.Memajukan simulation clock Event routine i 1.Update system state 2.Update statistical counters 3.Generate future events & add to event list Generate random variates i Library routine Start
Apakah simulasi selesai ? Report generator 1.Hitung estimasi-estimasi yang dibutuhkan 2.Tulis report Stop
Interarrival times A 1, A 2, … independent, identically distributed (IID) random variables. Identically distributed : interarrival times mempunyai distribusi probailitas yang sama. Customer yang tiba (arrives) dan menjumpai server idle akan langsung di-serve, dan service times S 1, S 2, … dari customer yang berurutan merupakan variabel-variabel random IID yang independent terhadap nilai-nilai A i. Customer yang tiba dan menjumpai server busy akan bergabung di akhir queue (antrian). Server memilih customer dari queue menggunakan cara (manner) FIFO.
Customer yang arrives Customers dalam queue Customer sedang di- serve Server Customer yang departs Simulasi akan mulai dalam keadaan (state) “empty-and-idle”, yaitu suatu keadaan di mana tidak ada customer yang datang dan server idle. Pada saat t = 0, menunggu kedatangan customer pertama yang akan terjadi setelah interarrival time pertama A 1 (bukan di t = 0). Simulasi akan berhenti ketika customer ke-n memasuki services. Waktu berakhirnya simulasi merupakan variabel random.
Arrival event Schedule the next arrival event Is the server busy ? Add 1 to the number in queue Set delay = 0 for this customer and gather statistics
Is the queue full ? Write error message & stop simulation Store time of arrival of this customer Add 1 to the number of customer delayed Make the server busy Schedule a departure event for this customer Return
Departure event Is the queue empty ? Make the server idle Subtract 1 from the number in queue Compute delay of customer entering service and gather statistics Eliminate departure event from consideration
Add 1 to the number of customer delayed Return Schedule a departure event for this customer Move each customer in queue (if any) up one place
PROGRAM SingleServerQ(Input, Output); CONST QLimit = 100; Busy = 1; Idle = 0; VAR NextEventType, NumCustsDelayed, NumDelaysRequired, NumEvents, NumInQ, ServerStatus : Integer; AreaNumInQ, AreaServerStatus, MeanInterarrival, MeanService, Tijme, TimeLastEvent, TotalOfDelays : Real; Timearrival: ARRAY[1..QLimit] of Real; TimeNextEvent: ARRAY[1..2] of Real; Zrng: ARRAY[1..100] of Integer; PROCEDURE Initialize;FORWARD; PROCEDURE Timing;FORWARD; PROCEDURE Arrive;FORWARD; PROCEDURE Depart;FORWARD; PROCEDURE Report;FORWARD; PROCEDURE UpdateTimeAvgStats;FORWARD; FUNCTION Expon(Mean : Real) : Real;FORWARD; PROCEDURE Randdf;FORWARD; FUNCTION Rand(Stream : Integer) : Real;FORWARD; PROCEDURE Randst(Zset : Integer; Stream : Integer);FORWARD; FUNCTION Randgt(Stream : Integer) : Integer;FORWARD;
Procedure Initialize; Begin {simulation clock} Time := 0.0; {state variables} ServerStatus := Idle; NumInQ := 0; TimeLastEvent := 0.0; {statistical counters} NumCustDelayed := 0; TotalOfDelays := 0.0; AreaNumInQ := 0.0; AreaServerStatus := 0.0; {event list} TimeNextEvent[1] := Time + Expon(MeanInterArrival); TimeNextEvent[2] := 1.0E+30 End;
Procedure Timing; Var I : Integer; MinTimeNextEvent : Real; Begin MinTimeNextEvent := 1.0E+29; NextEventType := 0; { menentukan tipe event dari next event yang muncul } For I := 1 To NumEvent Do Begin If TimeNextEvent[I] < MinTimeNextEvent Then Begin MinTimeNextEvent := TimeNextEvent[I]; NextEventType := I End End; { melihat apakah event list kosong } If NextEventType = 0 Then Begin { event list kosong, hentikan simulasi } writeln(‘Event list kosong pada pukul : ‘, Time); Halt End; { event list tidak kosong, majukan simulation clock } Time := MinTimeNextEvent End;
Procedure Arrive; Var Delay : Real; Begin { schedule next event } TimeNextEvent[1] := Time + Expon(MeanInterArrival); { melihat apakah server busy } If ServerStatus = Busy Then Begin NumInQ := NumInQ + 1; If NumInQ > QLimit Then Begin Writeln(‘Queue overload pada waktu :’,Time); Halt End; TimeArrival[NumInQ] := Time End Else (* dilanjutkan … *)
(* … lanjutan *) Else Begin { server idle } Delay := 0.0; TotalOfDelays := TotalOfDelays + Delay; { rubah status server menjadi busy } NumCustDelayed := NumCustDelayed + 1; ServerStatus := Busy; { schedule departure (service completion) } TimeNextEvent[2] := Time + Expon(MeanService) End End { end dari procedure arrival }
Procedure Depart; Var I : Integer; Delay : Real; Begin If NumInQ = 0 Then Begin ServerStatus := Idle; TimeNextEvent[2] := 1.0E+30; End Else Begin NumInQ := NumInQ - 1; Delay := Time – TimeArrival[1]; TotalOfDelays := TotalOfDelays + Delay; NumCustDelayed := NumCustDelayed + 1; TimeNextEvent[2] := Time + Expon(MeanService); For I := 1 To NumInQ Do TimeArrival[I] := TimeArrival[I + 1] End End;
Procedure Report; Var AvgDelayInQ, AvgNumInQ, ServerUtilization : Real; Begin AvgDelayInQ := TotalOfDelays / NumCustDelayed; AvgNumInQ := AreaNumInQ / Time; ServerUtilization := AreaServerStatus / Time; Writeln; Writeln(‘Rata-rata delay dalam queue ‘, AvgDelayInQ:11:3, ‘ menit’); Writeln(‘Rata-rata panjang queue ‘, AvgNumInQ:10:3); Writeln(‘Server Utilization ‘, ServerUtilization:10:3); Writeln(‘Waktu akhir simulasi : ‘,Time:12:3) End;
Procedure UpdateTimeAvgStats; Var TimeSinceLastEvent : Real; Begin { menghitung waktu sejak event terakhir, dan meng- update last-event-time marker } TimeSinceLastEvent := Time – TimeLastEvent; TimeLastEvent := Time; AreaNumInQ := AreaNumInQ + NumInQ * TimeSinceLastEvent; AreaServerStatus := AreaServerStatus + ServerStatus * TimeSinceLastEvent End;
Function Expon; { fungsi pembentukan variabel eksponensial } Var U : Real; Begin { men-generate variabel random U(0,1) } U := Rand(1); Expon := -Mean * Ln(U) End;
{ Single server Queuing Main Program } Begin (* Mulai Main Program *) { Inisialisasi pembangkit bilangan acak } Randdf; { Menentukan banyaknya event untuk prosedur timing } NumEvents := 2; Readln(MeanInterArrival, MeanService, NumDelaysRequired); { Menulis report heading dan input parameters } writeln(‘Single Server Queuing System’); writeln; …
…………….. lanjutan { Inisialisasi Simulasi } Initialize; While NumCustDelayed < NumDelaysRequired Do Begin Timing; UpdateTimeAvgStats; Case NextEventType Of 1 : Arrive; 2 : Depart; End End; Report End. (* Akhir Main Program *)
#include #include “rand.h” /* header file untuk random-number generator */ #define Q_LIMIT100 #define BUSY1 #define IDLE0 int next_event_type, num_custs_delayed, num_delays_required, num_events, num_in_q, server_status; float area_num_in_q, area_server_status, mean_interarrival, mean_service, time, time_arrival[Q_LIMIT+1], time_last_event, time_next_event[3], total_of_delays; FILE *infile, *outfile; void initialize(void); void timing(void); void arrive(void); void depart(void); void report(void); void update_time_avg_stats(void); float expon(float mean);