Saya mencoba menyelesaikan latihan berikut ini tetapi saya sebenarnya tidak tahu bagaimana memulai melakukan ini. Saya telah menemukan beberapa kode dalam buku saya yang terlihat seperti itu tetapi ini adalah latihan yang sama sekali berbeda dan saya tidak tahu bagaimana menghubungkannya satu sama lain. Bagaimana saya bisa mulai mensimulasikan kedatangan dan bagaimana saya tahu kapan mereka selesai? Saya tahu cara menyimpannya dan menghitung a, b, c, d sesuai dengan itu. Tapi saya tidak tahu bagaimana sebenarnya saya perlu mensimulasikan simulasi monte carlo. Bisakah seseorang membantu saya memulai? Saya tahu ini bukan tempat di mana pertanyaan Anda dijawab untuk Anda tetapi hanya diselesaikan sebagai gantinya. Tetapi masalahnya adalah saya tidak tahu bagaimana memulainya.
Meja bantuan dukungan TI mewakili sistem antrian dengan lima asisten menerima panggilan dari pelanggan. Panggilan terjadi sesuai dengan proses Poisson dengan tingkat rata-rata satu panggilan setiap 45 detik. Waktu layanan untuk asisten 1, 2, 3, 4, dan 5 adalah semua variabel acak Eksponensial dengan parameter λ1 = 0,1, λ2 = 0,2, λ3 = 0,3, λ4 = 0,4, dan λ5 = 0,5 mnt − 1, masing-masing ( jth help desk assistant memiliki λk = k / 10 min − 1). Selain pelanggan yang sedang dibantu, hingga sepuluh pelanggan lain dapat ditahan. Pada saat kapasitas ini tercapai, penelepon baru menerima sinyal sibuk. Gunakan metode Monte Carlo untuk memperkirakan karakteristik kinerja berikut,
(a) sebagian kecil dari pelanggan yang menerima sinyal sibuk;
(B) waktu respon yang diharapkan;
(c) waktu tunggu rata-rata;
(d) porsi pelanggan yang dilayani oleh setiap asisten help desk;
EDIT: yang saya miliki sejauh ini (tidak banyak):
pa = 1/45sec-1
jobs = rep(1,5); onHold = rep(1,10);
jobsIndex = 0;
onHoldIndex = 0;
u = runif(1)
for (i in 1:1000) {
if(u <= pa){ # new arrival
if(jobsIndex < 5) # assistant is free, #give job to assistant
jobsIndex++;
else #add to onHold array
onHoldIndex++;
}
}
sumber
Jawaban:
Ini adalah salah satu jenis simulasi yang paling instruktif dan menyenangkan untuk dilakukan: Anda membuat agen independen di komputer, membiarkan mereka berinteraksi, melacak apa yang mereka lakukan, dan mempelajari apa yang terjadi. Ini adalah cara yang luar biasa untuk belajar tentang sistem yang kompleks, terutama (tetapi tidak terbatas pada) yang tidak dapat dipahami dengan analisis matematika murni.
Cara terbaik untuk membangun simulasi semacam itu adalah dengan desain top-down.
Pada tingkat yang paling tinggi , kode tersebut akan terlihat seperti
(Ini dan semua contoh berikutnya adalah kode yang dapat dieksekusi
R
, bukan hanya kode semu.) Loop adalah simulasi yang didorong oleh peristiwa :get.next.event()
menemukan "peristiwa" yang menarik dan meneruskan deskripsi tentang hal ituprocess
, yang melakukan sesuatu dengannya (termasuk mencatat semua informasi tentang itu). Ia kembaliTRUE
selama hal-hal berjalan dengan baik; setelah mengidentifikasi kesalahan atau akhir simulasi, ia kembaliFALSE
, mengakhiri loop.Jika kita membayangkan implementasi fisik antrian ini, seperti orang yang menunggu surat nikah di New York City atau untuk surat izin mengemudi atau tiket kereta api hampir di mana saja, kita memikirkan dua jenis agen: pelanggan dan "asisten" (atau server) . Pelanggan mengumumkan diri mereka dengan muncul; asisten mengumumkan ketersediaan mereka dengan menyalakan lampu atau menandatangani atau membuka jendela. Ini adalah dua jenis acara untuk diproses.
Lingkungan ideal untuk simulasi semacam itu adalah lingkungan berorientasi objek yang benar di mana objek bisa berubah : mereka dapat mengubah keadaan untuk merespons secara independen terhadap hal-hal di sekitar mereka.
R
benar-benar mengerikan untuk ini (bahkan Fortran akan lebih baik!). Namun, kita masih bisa menggunakannya jika kita berhati-hati. Kuncinya adalah menjaga semua informasi dalam satu set umum struktur data yang dapat diakses (dan dimodifikasi) oleh banyak prosedur yang terpisah dan saling berinteraksi. Saya akan mengadopsi konvensi menggunakan nama variabel DALAM SEMUA CAPS untuk data tersebut.Level selanjutnya dari desain top-down adalah kode
process
. Itu menanggapi deskriptor acara tunggale
:Itu harus menanggapi acara nol ketika
get.next.event
tidak ada acara untuk dilaporkan. Jika tidak,process
terapkan "aturan bisnis" sistem. Praktis menulis sendiri dari uraian dalam pertanyaan. Cara kerjanya harus memerlukan sedikit komentar, kecuali untuk menunjukkan bahwa pada akhirnya kita perlu kode subrutinput.on.hold
danrelease.hold
(menerapkan antrian pelanggan-memegang) danserve
(menerapkan interaksi pelanggan-asisten).Apa itu "acara"? Itu harus berisi informasi tentang siapa yang bertindak, tindakan apa yang mereka ambil, dan kapan itu terjadi. Karena itu kode saya menggunakan daftar yang berisi ketiga jenis informasi ini. Namun,
get.next.event
hanya perlu memeriksa waktu. Ini bertanggung jawab hanya untuk menjaga antrian acara di manaSetiap peristiwa dapat dimasukkan ke dalam antrian ketika diterima dan
Peristiwa paling awal dalam antrian dapat dengan mudah diekstraksi dan diteruskan ke pemanggil.
Implementasi terbaik dari antrian prioritas ini akan menjadi tumpukan, tapi itu terlalu cerewet
R
. Mengikuti saran dalam The Art of R Programming karya Norman Matloff (yang menawarkan simulator antrian yang lebih fleksibel, abstrak, tetapi terbatas), saya telah menggunakan kerangka data untuk mengadakan acara dan hanya mencari waktu minimum di antara catatan-catatannya.Ada banyak cara ini bisa dikodekan. Versi terakhir yang diperlihatkan di sini mencerminkan pilihan yang saya buat dalam mengodekan bagaimana
process
bereaksi terhadap peristiwa "Asisten" dan caranew.customer
kerjanya:get.next.event
hanya mengeluarkan pelanggan dari antrean penangguhan, lalu duduk kembali dan menunggu acara lain. Terkadang perlu mencari pelanggan baru dengan dua cara: pertama, untuk melihat apakah ada yang menunggu di pintu (seolah-olah) dan kedua, apakah ada yang masuk ketika kita tidak melihat.Jelas,
new.customer
dannext.customer.time
ini rutinitas penting , jadi mari kita urus mereka selanjutnya.CUSTOMERS
adalah array 2D, dengan data untuk setiap pelanggan di kolom. Ini memiliki empat baris (bertindak sebagai bidang) yang menggambarkan pelanggan dan mencatat pengalaman mereka selama simulasi : "Tiba", "Dilayani", "Durasi", dan "Asisten" (pengidentifikasi numerik positif dari asisten, jika ada, yang melayani mereka, dan sebaliknya-1
untuk sinyal sibuk). Dalam simulasi yang sangat fleksibel, kolom-kolom ini akan dihasilkan secara dinamis, tetapi karenaR
suka bekerja, mudah untuk menghasilkan semua pelanggan pada awalnya, dalam satu matriks besar, dengan waktu kedatangan mereka sudah dihasilkan secara acak.next.customer.time
dapat mengintip kolom berikutnya dari matriks ini untuk melihat siapa yang akan datang berikutnya. Variabel globalCUSTOMER.COUNT
menunjukkan pelanggan terakhir yang tiba. Pelanggan dikelola dengan sangat sederhana melalui penunjuk ini, memajukannya untuk mendapatkan pelanggan baru dan melihat melampaui itu (tanpa memajukan) untuk mengintip pelanggan berikutnya.serve
mengimplementasikan aturan bisnis dalam simulasi.Ini mudah.
ASSISTANTS
adalah kerangka data dengan dua bidang:capabilities
(memberikan tingkat layanan mereka) danavailable
, yang menandai waktu berikutnya di mana asisten akan bebas. Pelanggan dilayani dengan menghasilkan durasi layanan acak sesuai dengan kemampuan asisten, memperbarui waktu ketika asisten berikutnya tersedia, dan mencatat interval layanan dalamCUSTOMERS
struktur data. TheVERBOSE
bendera berguna untuk pengujian dan debugging: ketika benar, itu memancarkan aliran kalimat bahasa Inggris yang menggambarkan poin pengolahan kunci.Bagaimana asisten ditugaskan kepada pelanggan adalah penting dan menarik. Seseorang dapat membayangkan beberapa prosedur: penugasan secara acak, dengan beberapa pemesanan tetap, atau menurut siapa yang telah bebas waktu paling lama (atau terpendek). Banyak dari ini diilustrasikan dalam kode komentar:
Sisa simulasi sebenarnya hanya latihan rutin dalam membujuk
R
untuk menerapkan struktur data standar, terutama buffer melingkar untuk antrian yang ditahan. Karena Anda tidak ingin mengamuk dengan global, saya menempatkan semua ini dalam satu prosedursim
. Argumennya menggambarkan masalah: jumlah pelanggan yang disimulasikan (n.events
), tingkat kedatangan pelanggan, kemampuan asisten, dan ukuran antrian tahan (yang dapat diatur ke nol untuk menghilangkan antrian sama sekali).Ini mengembalikan daftar struktur data yang dipertahankan selama simulasi; salah satu yang paling menarik adalah50 250
CUSTOMERS
array.R
membuatnya cukup mudah untuk merencanakan informasi penting dalam array ini dengan cara yang menarik. Berikut adalah satu output yang menunjukkan pelanggan terakhir dalam simulasi yang lebih lama dari pelanggan.250Pengalaman setiap pelanggan diplot sebagai garis waktu horizontal, dengan simbol lingkaran pada saat kedatangan, garis hitam solid untuk setiap penantian yang menunggu, dan garis berwarna untuk durasi interaksi mereka dengan asisten (warna dan jenis garis) bedakan di antara asisten) Di bawah plot Pelanggan ini adalah salah satu yang menunjukkan pengalaman asisten, menandai waktu ketika mereka dan tidak terlibat dengan pelanggan. Titik akhir setiap interval aktivitas dibatasi oleh batang vertikal.
Saat dijalankan
verbose=TRUE
, output teks simulasi terlihat seperti ini:(Angka di sebelah kiri adalah waktu setiap pesan dipancarkan.) Anda dapat mencocokkan deskripsi ini dengan bagian plot Pelanggan yang terbentang di antara waktu dan .165160 165
Kami dapat mempelajari pengalaman pelanggan yang ditahan dengan memplot durasi yang ditahan oleh pengidentifikasi pelanggan, menggunakan simbol khusus (merah) untuk menunjukkan kepada pelanggan yang menerima sinyal sibuk.
(Bukankah semua plot ini menghasilkan dasbor real-time yang hebat bagi siapa pun yang mengelola antrian layanan ini!)
Sangat menarik untuk membandingkan plot dan statistik yang Anda dapatkan dengan memvariasikan parameter yang dilewati
sim
. Apa yang terjadi ketika pelanggan datang terlalu cepat untuk diproses? Apa yang terjadi ketika antrian terus dibuat lebih kecil atau dihilangkan? Apa yang berubah ketika asisten dipilih dengan cara berbeda? Bagaimana angka dan kemampuan asisten mempengaruhi pengalaman pelanggan? Apa poin penting di mana beberapa pelanggan mulai ditolak atau mulai ditunda untuk waktu yang lama?Biasanya, untuk pertanyaan belajar mandiri yang jelas seperti ini, kami akan berhenti di sini dan meninggalkan detail yang tersisa sebagai latihan. Namun, saya tidak ingin mengecewakan pembaca yang mungkin sudah sejauh ini dan tertarik untuk mencoba ini sendiri (dan mungkin memodifikasi dan membangunnya untuk tujuan lain), jadi di bawah ini adalah kode kerja lengkap.
( Pemrosesan di situs ini akan mengacaukan lekukan pada setiap baris yang mengandung simbol , tetapi lekukan yang dapat dibaca harus dikembalikan ketika kode disisipkan ke dalam file teks.)$TEX $
sumber
R
ingin yang lain (tetapi cukup mirip) perspektif pada simulasi antrian. Saat menulis simulator kecil ini, saya mendapati diri saya berpikir banyak tentang seberapa banyak yang saya pelajari dengan mempelajari kode dalam (edisi pertama) teks Andrew Tanenbaum Sistem Operasi / Desain dan Implementasi. Saya juga belajar tentang struktur data praktis, seperti tumpukan, dari artikel Jon Bentley di CACM dan seri buku Programming Pearls- nya. Tanenbaum dan Bentley adalah penulis hebat yang harus dibaca setiap orang.