Setelah membangun pengolah CSV, sekarang kita melangkah ke proyek yang menuntut perencanaan sebelum mengetik: simulasi sistem antrean teller tunggal. Simulasi antrean adalah cara klasik menjawab pertanyaan operasional tanpa harus bereksperimen di lokasi — berapa lama pelanggan rata-rata menunggu, sepanjang apa antrean pernah terbentuk, dan seberapa sibuk teller bekerja. Pertanyaan seperti itu muncul di kasir bank, helpdesk tiket, hingga penjadwalan job pada satu CPU, dan semuanya berbagi struktur yang sama: entitas yang datang, antrean yang menampung, dan satu sumber daya yang melayani.

Proyek ini sengaja dibuat deterministik: jadwal kedatangan dan durasi layanan ditetapkan penuh oleh skenario, tanpa angka acak. Keputusan ini bukan penyederhanaan setengah hati — simulasi yang deterministik menghasilkan angka yang sama pada setiap eksekusi, sehingga hasilnya bisa kita kunci dengan unit test dan dibandingkan antar skenario secara adil. Konsep keacakan model antrean (rantai M/M/1) tetap kita bahas sebagai latar konsep, tetapi mesin simulasi kita berjalan di atas jadwal yang tetap.

Kita membangunnya dalam empat bagian:

  1. Bagian 1: Memodelkan Antrean — menetapkan entitas Pelanggan, parameter skenario, dan alur event loop satu menit per tick.
  2. Bagian 2: Menerapkan Struktur Data — memakai std::queue sebagai antrean FIFO, lengkap dengan struct Teller.
  3. Bagian 3: Menjalankan Simulasi — tick loop yang mencatat log peristiwa, waktu tunggu, dan panjang antrean per tick.
  4. Bagian 4: Menganalisis Hasil — statistik rata-rata tunggu, tunggu maksimum, antrean maksimum, utilisasi, serta perbandingan tiga skenario.

Perilaku yang Diharapkan #

Program final menyimulasikan tiga skenario dengan parameter berbeda dan melaporkan statistiknya:

bash
g++ -std=c++23 -Wall -Wextra simulasi-antrean-final.cpp -o simulasi-antrean
./simulasi-antrean

Output yang Dihasilkan:

text
Simulasi Antrean Teller — deterministik (tanpa angka acak)

skenario  interval  layanan  pelanggan
lancar           5        4        10
sibuk            4        4        10
ramai            3        4        10

Hasil ringkas:
skenario   rata tunggu  tunggu maks  antrean maks  utilisasi  selesai (mnt)
lancar            0.000            0             0       81.6%        49
sibuk             0.000            0             0      100.0%        40
ramai             4.500            9             3      100.0%        40

Perhatikan cerita di balik tabelnya: skenario sibuk dan ramai sama-sama mencapai utilisasi 100%, tetapi hanya ramai yang membentuk antrean dan menunggakan. Perbandingan semacam ini adalah hasil akhir yang ingin kita capai, dan setiap angkanya bisa kita jelaskan baris demi baris dari model.

Seluruh kode sumber final tersedia pada bagian Berkas Sumber (src/simulasi-antrean.cpp) beserta harness uji (tests/uji-simulasi.cpp) yang memeriksa urutan FIFO, larangan layanan tumpang tindih, nilai emas statistik, dan determinisme. Mari kita mulai dari modelnya.