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:
- Bagian 1: Memodelkan Antrean — menetapkan entitas
Pelanggan, parameter skenario, dan alur event loop satu menit per tick. - Bagian 2: Menerapkan Struktur Data — memakai
std::queuesebagai antrean FIFO, lengkap dengan structTeller. - Bagian 3: Menjalankan Simulasi — tick loop yang mencatat log peristiwa, waktu tunggu, dan panjang antrean per tick.
- 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:
g++ -std=c++23 -Wall -Wextra simulasi-antrean-final.cpp -o simulasi-antrean
./simulasi-antreanOutput yang Dihasilkan:
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% 40Perhatikan 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.
Menetapkan asumsi model, entitas Pelanggan, parameter skenario, dan alur event loop sebelum menulis mesin simulasi.
Buka → # Bagian 2: Menerapkan Struktur DataMemilih std::queue sebagai antrean FIFO, mengenali API-nya, dan melengkapi model dengan struct Teller.
Buka → # Bagian 3: Menjalankan SimulasiMembangun tick loop per menit, mencatat log peristiwa dan panjang antrean, lalu membaca tabel per pelanggan.
Buka → # Bagian 4: Menganalisis HasilMeringkas riwayat simulasi menjadi lima statistik, membandingkan tiga skenario berdampingan, dan mengunci seluruh hasil dengan harness uji deterministik.
Buka →