# NOMOR 1: Pendekatan E[X^2] untuk Uniform(0,1)

set.seed(123)

# Generate data Uniform(0,1)
data <- runif(10000, 0, 1)

# Hitung X^2
data_squared <- data^2

# Hitung estimasi E[X^2]
est_E_X2 <- mean(data_squared)

# Hitung nilai teoritis
theoretical_E_X2 <- 1/3

cat("\n=== Soal 1: Simulasi E[X^2] Uniform(0,1) ===\n")
## 
## === Soal 1: Simulasi E[X^2] Uniform(0,1) ===
cat("Gunakan simulasi 10.000 angka random dari distribusi Uniform(0,1), kemudian hitung pendekatan E[X^2].\n\n")
## Gunakan simulasi 10.000 angka random dari distribusi Uniform(0,1), kemudian hitung pendekatan E[X^2].
# Tampilkan hasil
cat("Hasil Simulasi:\n")
## Hasil Simulasi:
cat("Pendekatan E[X^2] berdasarkan simulasi:", round(est_E_X2, 7), "\n")
## Pendekatan E[X^2] berdasarkan simulasi: 0.3297405
cat("Nilai teoritis E[X^2]:", round(theoretical_E_X2, 7), "\n\n")
## Nilai teoritis E[X^2]: 0.3333333
# Tampilkan penjelasan di console
cat("Penjelasan:\n")
## Penjelasan:
cat("Pada simulasi ini, dilakukan pembangkitan 10.000 data acak dari distribusi Uniform(0,1),\n")
## Pada simulasi ini, dilakukan pembangkitan 10.000 data acak dari distribusi Uniform(0,1),
cat("kemudian dihitung nilai pendekatan dari E[X²]. Hasil simulasi menunjukkan nilai E[X²] sebesar",
    round(est_E_X2, 4), "yang cukup mendekati nilai teoritis 1/3 atau", round(theoretical_E_X2, 4), ".\n")
## kemudian dihitung nilai pendekatan dari E[X²]. Hasil simulasi menunjukkan nilai E[X²] sebesar 0.3297 yang cukup mendekati nilai teoritis 1/3 atau 0.3333 .
cat("Distribusi hasil X² divisualisasikan menggunakan histogram yang menunjukkan sebagian besar\n")
## Distribusi hasil X² divisualisasikan menggunakan histogram yang menunjukkan sebagian besar
cat("nilai X² berada di sekitar nol. Hal ini sesuai dengan karakteristik distribusi Uniform(0,1),\n")
## nilai X² berada di sekitar nol. Hal ini sesuai dengan karakteristik distribusi Uniform(0,1),
cat("di mana saat nilai X kecil maka kuadratnya (X²) menjadi lebih kecil lagi.\n\n")
## di mana saat nilai X kecil maka kuadratnya (X²) menjadi lebih kecil lagi.
# Plot histogram
hist(data_squared, breaks=30, col="burlywood4",
     main="Histogram dari X² (Uniform(0,1))", xlab="X²")

set.seed(123)

n_list <- c(100, 1000, 10000)
data_list <- lapply(n_list, function(n) rnorm(n, mean=100, sd=15))

cat("\n=== Soal 2: Simulasi Simpangan Baku Normal ===\n")
## 
## === Soal 2: Simulasi Simpangan Baku Normal ===
cat("Buat masing-masing untuk n = 100, 1000, 10000 angka random dari distribusi Normal(100, 15^2), hitung simpangan baku, dan buat histogramnya.\n\n")
## Buat masing-masing untuk n = 100, 1000, 10000 angka random dari distribusi Normal(100, 15^2), hitung simpangan baku, dan buat histogramnya.
for (i in 1:length(n_list)) {
  cat("Simpangan baku untuk n =", n_list[i], ": ", sd(data_list[[i]]), "\n")
  hist(data_list[[i]], breaks=30, col='coral4',
       main=paste("Histogram Normal n =", n_list[i]),
       xlab="Nilai")
}
## Simpangan baku untuk n = 100 :  13.69224

## Simpangan baku untuk n = 1000 :  15.06891

## Simpangan baku untuk n = 10000 :  14.98314

 # Tampilkan penjelasan di console
  cat("\nPenjelasan:\n")
## 
## Penjelasan:
  cat("Data dihasilkan dari distribusi Normal dengan rata-rata 100 dan standar deviasi 15.\n")
## Data dihasilkan dari distribusi Normal dengan rata-rata 100 dan standar deviasi 15.
  cat("Jumlah data (n) =", n_list[i], ".\n")
## Jumlah data (n) = 10000 .
  cat("Histogram menunjukkan sebaran data yang membentuk pola distribusi Normal.\n")
## Histogram menunjukkan sebaran data yang membentuk pola distribusi Normal.
  cat("Semakin besar n, bentuk histogram semakin mendekati kurva Normal ideal.\n\n")
## Semakin besar n, bentuk histogram semakin mendekati kurva Normal ideal.
set.seed(123)
simulasi_binom <- rbinom(5000, size=30, prob=0.25)
estimasi_p <- mean(simulasi_binom >= 15)

cat("\n=== Soal 3: Simulasi Binomial ===\n")
## 
## === Soal 3: Simulasi Binomial ===
cat("Simulasikan distribusi binomial Bin(30, 0.25) sebanyak 5000 kali, kemudian estimasi P(X >= 15).\n\n")
## Simulasikan distribusi binomial Bin(30, 0.25) sebanyak 5000 kali, kemudian estimasi P(X >= 15).
cat("Estimasi P(X >= 15):", estimasi_p, "\n")
## Estimasi P(X >= 15): 0.0024
# Tambahkan penjelasan di console
cat("Penjelasan:\n")
## Penjelasan:
cat("Telah dilakukan simulasi distribusi Binomial dengan parameter:\n")
## Telah dilakukan simulasi distribusi Binomial dengan parameter:
cat("- Jumlah percobaan (n) = 30\n")
## - Jumlah percobaan (n) = 30
cat("- Probabilitas sukses (p) = 0.25\n")
## - Probabilitas sukses (p) = 0.25
cat("- Jumlah simulasi = 5000 kali\n")
## - Jumlah simulasi = 5000 kali
cat("Dihitung estimasi peluang P(X >= 15), yaitu peluang mendapatkan 15 keberhasilan atau lebih.\n")
## Dihitung estimasi peluang P(X >= 15), yaitu peluang mendapatkan 15 keberhasilan atau lebih.
cat("Hasil estimasi peluang P(X >= 15):", estimasi_p, "\n")
## Hasil estimasi peluang P(X >= 15): 0.0024
cat("Hasil ini mendekati peluang teoritis yang sangat kecil, karena 15 keberhasilan dari 30\n")
## Hasil ini mendekati peluang teoritis yang sangat kecil, karena 15 keberhasilan dari 30
cat("dengan p=0.25 merupakan kejadian yang cukup jarang.\n\n")
## dengan p=0.25 merupakan kejadian yang cukup jarang.
# Bar plot distribusi binomial hasil simulasi
barplot(table(simulasi_binom), col="darkolivegreen",
        main="Distribusi Simulasi Binomial",
        xlab="Jumlah Keberhasilan", ylab="Frekuensi")

set.seed(123)

# Membangkitan data normal
X <- rnorm(1000, mean=89, sd=10)

# Hitung standar deviasi manual
s_manual <- sqrt( (sum(X^2) - (sum(X)^2)/length(X)) / (length(X)-1) )

# Hitung standar deviasi menggunakan fungsi bawaan R
s_builtin <- sd(X)

cat("\n=== Soal 4: Hitung Standar Deviasi Manual ===\n")
## 
## === Soal 4: Hitung Standar Deviasi Manual ===
cat("Buat function untuk menghitung standar deviasi dengan rumus manual, kemudian bandingkan dengan fungsi sd() bawaan R. Gunakan data random dari N(89, 10^2), sebanyak 1000 data.\n\n")
## Buat function untuk menghitung standar deviasi dengan rumus manual, kemudian bandingkan dengan fungsi sd() bawaan R. Gunakan data random dari N(89, 10^2), sebanyak 1000 data.
# Tampilkan hasil perhitungan
cat("Standar deviasi (manual):", round(s_manual, 5), "\n")
## Standar deviasi (manual): 9.91695
cat("Standar deviasi (bawaan R):", round(s_builtin, 5), "\n\n")
## Standar deviasi (bawaan R): 9.91695
# Penjelasan hasil di R Console
cat("Penjelasan:\n")
## Penjelasan:
cat("Data acak sebanyak 1000 angka dibangkitkan dari distribusi Normal dengan rata-rata 89 dan standar deviasi 10.\n")
## Data acak sebanyak 1000 angka dibangkitkan dari distribusi Normal dengan rata-rata 89 dan standar deviasi 10.
cat("Standar deviasi dihitung secara manual menggunakan rumus:\n")
## Standar deviasi dihitung secara manual menggunakan rumus:
cat("s = sqrt( (sum(x^2) - (sum(x)^2)/n ) / (n-1) )\n")
## s = sqrt( (sum(x^2) - (sum(x)^2)/n ) / (n-1) )
cat("Hasil perhitungan manual dan hasil dari fungsi bawaan R (sd) menunjukkan hasil yang sama.\n")
## Hasil perhitungan manual dan hasil dari fungsi bawaan R (sd) menunjukkan hasil yang sama.
cat("Hal ini membuktikan bahwa rumus manual yang digunakan telah sesuai dengan perhitungan standar deviasi sample.\n")
## Hal ini membuktikan bahwa rumus manual yang digunakan telah sesuai dengan perhitungan standar deviasi sample.
cat("\n=== Soal 5: Simulasi Antrian Bank ===\n")
## 
## === Soal 5: Simulasi Antrian Bank ===
cat("Sebuah bank memiliki 2 teller. Nasabah datang mengikuti Poisson (5 orang per jam), waktu pelayanan mengikuti Eksponensial (8 menit). Simulasikan selama 20 hari (6 jam per hari).\n")
## Sebuah bank memiliki 2 teller. Nasabah datang mengikuti Poisson (5 orang per jam), waktu pelayanan mengikuti Eksponensial (8 menit). Simulasikan selama 20 hari (6 jam per hari).
cat("Bagian:\n(a) Simulasi antrian\n(b) Hitung rata-rata waktu tunggu\n(c) Hitung persentase waktu teller sibuk\n(d) Bandingkan hasil bila ditambah menjadi 3 teller\n(e) Buat grafik panjang antrian sepanjang hari.\n\n")
## Bagian:
## (a) Simulasi antrian
## (b) Hitung rata-rata waktu tunggu
## (c) Hitung persentase waktu teller sibuk
## (d) Bandingkan hasil bila ditambah menjadi 3 teller
## (e) Buat grafik panjang antrian sepanjang hari.
library(simmer)
## Warning: package 'simmer' was built under R version 4.4.3
set.seed(123)

# Buat environment simulasi
bank <- simmer("Bank")

# Definisikan proses antrian nasabah
nasabah <- trajectory() %>%
  seize("teller", 1) %>%                          # Nasabah mulai dilayani
  timeout(function() rexp(1, 1/8)) %>%            # Lama pelayanan mengikuti distribusi eksponensial dengan rata-rata 8 menit
  release("teller", 1)                            # Setelah dilayani, teller bebas

# Tambahkan resource (2 teller) dan generator kedatangan nasabah
bank %>%
  add_resource("teller", capacity=2) %>%
  add_generator("nasabah", nasabah, function() rexp(1, 1/12))  # Kedatangan nasabah mengikuti eksponensial rata-rata 12 menit (5 orang per jam)
## simmer environment: Bank | now: 0 | next: 0
## { Monitor: in memory }
## { Resource: teller | monitored: TRUE | server status: 0(2) | queue status: 0(Inf) }
## { Source: nasabah | monitored: 1 | n_generated: 0 }
# Jalankan simulasi selama 20 hari kerja (6 jam per hari, 60*6*20 menit)
bank %>% run(until=20*6*60)
## simmer environment: Bank | now: 7200 | next: 7205.97175022682
## { Monitor: in memory }
## { Resource: teller | monitored: TRUE | server status: 1(2) | queue status: 0(Inf) }
## { Source: nasabah | monitored: 1 | n_generated: 575 }
# Ambil data hasil simulasi
data_arrival <- get_mon_arrivals(bank)

# Tampilkan hasil
cat("Total nasabah selama 20 hari:", nrow(data_arrival), "\n\n")
## Total nasabah selama 20 hari: 573
# Tambahkan penjelasan
cat("Penjelasan:\n")
## Penjelasan:
cat("Simulasi antrian bank dilakukan selama 20 hari, masing-masing hari bank buka selama 6 jam.\n")
## Simulasi antrian bank dilakukan selama 20 hari, masing-masing hari bank buka selama 6 jam.
cat("Kedatangan nasabah mengikuti distribusi eksponensial dengan rata-rata 5 orang per jam,\n")
## Kedatangan nasabah mengikuti distribusi eksponensial dengan rata-rata 5 orang per jam,
cat("sedangkan waktu pelayanan tiap nasabah mengikuti eksponensial dengan rata-rata 8 menit.\n")
## sedangkan waktu pelayanan tiap nasabah mengikuti eksponensial dengan rata-rata 8 menit.
cat("Teller yang tersedia ada 2 orang.\n")
## Teller yang tersedia ada 2 orang.
cat("Hasil simulasi menunjukkan total jumlah nasabah yang datang selama 20 hari sebanyak",
    nrow(data_arrival), "orang.\n\n")
## Hasil simulasi menunjukkan total jumlah nasabah yang datang selama 20 hari sebanyak 573 orang.
# Hitung waktu tunggu masing-masing nasabah
data_arrival$waiting_time <- data_arrival$end_time - data_arrival$start_time - data_arrival$activity_time

# Hitung rata-rata waktu tunggu
mean_waiting_time <- mean(data_arrival$waiting_time)

# Tampilkan hasil
cat("Rata-rata waktu tunggu:", round(mean_waiting_time, 2), "menit\n\n")
## Rata-rata waktu tunggu: 0.94 menit
# Tambahkan penjelasan
cat("Penjelasan:\n")
## Penjelasan:
cat("Waktu tunggu dihitung dari selisih antara total waktu nasabah berada di sistem\n")
## Waktu tunggu dihitung dari selisih antara total waktu nasabah berada di sistem
cat("dikurangi dengan waktu pelayanan (activity_time). Dengan kata lain, waktu tunggu adalah\n")
## dikurangi dengan waktu pelayanan (activity_time). Dengan kata lain, waktu tunggu adalah
cat("waktu yang dihabiskan nasabah menunggu sebelum mulai dilayani.\n")
## waktu yang dihabiskan nasabah menunggu sebelum mulai dilayani.
cat("Hasil simulasi menunjukkan bahwa rata-rata waktu tunggu nasabah selama 20 hari adalah",
    round(mean_waiting_time, 2), "menit.\n\n")
## Hasil simulasi menunjukkan bahwa rata-rata waktu tunggu nasabah selama 20 hari adalah 0.94 menit.
# Mengambil data resource (teller)
res <- get_mon_resources(bank)

# Hitung utilisasi (persentase teller sibuk)
util <- res$server / res$capacity
persentase_sibuk <- round(mean(util) * 100, 2)

# Tampilkan hasil
cat("Persentase teller sibuk:", persentase_sibuk, "%\n\n")
## Persentase teller sibuk: 52.18 %
# Tambahkan penjelasan
cat("Penjelasan:\n")
## Penjelasan:
cat("Utilisasi dihitung dari rasio jumlah teller yang sedang melayani nasabah (server)\n")
## Utilisasi dihitung dari rasio jumlah teller yang sedang melayani nasabah (server)
cat("dibandingkan dengan total kapasitas teller yang tersedia.\n")
## dibandingkan dengan total kapasitas teller yang tersedia.
cat("Hasil simulasi menunjukkan bahwa rata-rata teller sibuk sebesar",
    persentase_sibuk, "% selama periode simulasi.\n")
## Hasil simulasi menunjukkan bahwa rata-rata teller sibuk sebesar 52.18 % selama periode simulasi.
cat("Semakin tinggi persentase ini, semakin tinggi tingkat pemanfaatan teller,\n")
## Semakin tinggi persentase ini, semakin tinggi tingkat pemanfaatan teller,
cat("namun jika terlalu tinggi juga bisa berisiko meningkatkan waktu tunggu nasabah.\n\n")
## namun jika terlalu tinggi juga bisa berisiko meningkatkan waktu tunggu nasabah.
library(simmer)
set.seed(123)

# Parameter simulasi
inter_arrival <- 12  # rata-rata 5 orang per jam -> 12 menit per orang
service_time <- 8    # rata-rata pelayanan 8 menit
jam_operasi <- 6
simulasi_hari <- 20
teller_capacity <- 3  # sekarang ada 3 teller

# Buat environment simmer
bank_3 <- simmer("Bank 3 Teller")

# Definisikan proses pelayanan nasabah
nasabah <- trajectory("nasabah") %>%
  seize("teller", 1) %>%                                # Nasabah dilayani
  timeout(function() rexp(1, 1/service_time)) %>%       # Lama pelayanan mengikuti eksponensial rata-rata 8 menit
  release("teller", 1)                                   # Setelah selesai dilayani, teller bebas

# Tambahkan resource dan generator kedatangan
bank_3 %>%
  add_resource("teller", capacity = teller_capacity) %>%
  add_generator("nasabah", nasabah, function() rexp(1, 1/inter_arrival))
## simmer environment: Bank 3 Teller | now: 0 | next: 0
## { Monitor: in memory }
## { Resource: teller | monitored: TRUE | server status: 0(3) | queue status: 0(Inf) }
## { Source: nasabah | monitored: 1 | n_generated: 0 }
# Jalankan simulasi selama 20 hari
bank_3 %>% run(until = simulasi_hari * jam_operasi * 60)
## simmer environment: Bank 3 Teller | now: 7200 | next: 7233.44011307565
## { Monitor: in memory }
## { Resource: teller | monitored: TRUE | server status: 0(3) | queue status: 0(Inf) }
## { Source: nasabah | monitored: 1 | n_generated: 572 }
# Mengambil data kedatangan nasabah
data_arrival_3 <- get_mon_arrivals(bank_3)

# Hitung waktu tunggu masing-masing nasabah
data_arrival_3$waiting_time <- data_arrival_3$end_time - data_arrival_3$start_time - data_arrival_3$activity_time

# Hitung rata-rata waktu tunggu
mean_wait_3 <- mean(data_arrival_3$waiting_time)
cat("Rata-rata waktu tunggu (3 teller): ", round(mean_wait_3, 2), " menit\n\n")
## Rata-rata waktu tunggu (3 teller):  0.13  menit
# Penjelasan waktu tunggu
cat("Penjelasan:\n")
## Penjelasan:
cat("Dengan menambahkan 1 teller (total 3 teller), dilakukan simulasi ulang selama 20 hari.\n")
## Dengan menambahkan 1 teller (total 3 teller), dilakukan simulasi ulang selama 20 hari.
cat("Rata-rata waktu tunggu nasabah kini menurun menjadi ", round(mean_wait_3, 2), " menit.\n")
## Rata-rata waktu tunggu nasabah kini menurun menjadi  0.13  menit.
cat("Hal ini menunjukkan adanya peningkatan efisiensi sistem pelayanan.\n\n")
## Hal ini menunjukkan adanya peningkatan efisiensi sistem pelayanan.
# Hitung persentase teller sibuk
res_3 <- get_mon_resources(bank_3)
util_3 <- res_3$server / res_3$capacity
persentase_sibuk_3 <- round(mean(util_3)*100, 2)
cat("Persentase teller sibuk (3 teller):", persentase_sibuk_3, "%\n\n")
## Persentase teller sibuk (3 teller): 36.6 %
# Penjelasan utilisasi
cat("Penjelasan:\n")
## Penjelasan:
cat("Dengan adanya 3 teller, tingkat pemanfaatan teller rata-rata adalah ", persentase_sibuk_3, "%.\n")
## Dengan adanya 3 teller, tingkat pemanfaatan teller rata-rata adalah  36.6 %.
cat("Penambahan teller membuat antrian lebih lancar, meskipun ada penurunan tingkat utilisasi per teller.\n")
## Penambahan teller membuat antrian lebih lancar, meskipun ada penurunan tingkat utilisasi per teller.
library(ggplot2)

# Menggunakan data resource sebelumnya (res)
queue <- res

# Plot panjang antrian
ggplot(queue, aes(time, queue)) +
  geom_line(color="darkred") +
  labs(title="Panjang Antrian Bank", x="Waktu (menit)", y="Jumlah Antrian")

# Tambahkan penjelasan di console
cat("Penjelasan:\n")
## Penjelasan:
cat("Grafik di atas menunjukkan jumlah nasabah yang sedang mengantri di setiap waktu sepanjang simulasi.\n")
## Grafik di atas menunjukkan jumlah nasabah yang sedang mengantri di setiap waktu sepanjang simulasi.
cat("Kita dapat melihat fluktuasi panjang antrian. Semakin tinggi puncak grafik menunjukkan\n")
## Kita dapat melihat fluktuasi panjang antrian. Semakin tinggi puncak grafik menunjukkan
cat("bahwa pada waktu tersebut terjadi penumpukan nasabah yang menunggu.\n")
## bahwa pada waktu tersebut terjadi penumpukan nasabah yang menunggu.
cat("Jika antrian sering tinggi, bisa menjadi pertimbangan untuk menambah jumlah teller\n")
## Jika antrian sering tinggi, bisa menjadi pertimbangan untuk menambah jumlah teller
cat("atau memperbaiki proses pelayanan.\n\n")
## atau memperbaiki proses pelayanan.
cat("\n=== Soal 6: Simulasi Stok Toko Bu Sari ===\n")
## 
## === Soal 6: Simulasi Stok Toko Bu Sari ===
cat("Penjualan beras per hari Uniform(8,15), stok awal 100 karung. Setiap 5 hari pesan ulang 50 karung. Jika stok habis, kehilangan untung Rp 5.000 per karung.\n")
## Penjualan beras per hari Uniform(8,15), stok awal 100 karung. Setiap 5 hari pesan ulang 50 karung. Jika stok habis, kehilangan untung Rp 5.000 per karung.
cat("Bagian:\n(a) Simulasikan stok selama 60 hari\n(b) Hitung berapa kali stok habis\n(c) Uji strategi pemesanan: 40, 50, 60 karung\n(d) Uji frekuensi pemesanan: setiap 3, 5, atau 7 hari\n(e) Buat grafik stok & rekomendasi.\n\n")
## Bagian:
## (a) Simulasikan stok selama 60 hari
## (b) Hitung berapa kali stok habis
## (c) Uji strategi pemesanan: 40, 50, 60 karung
## (d) Uji frekuensi pemesanan: setiap 3, 5, atau 7 hari
## (e) Buat grafik stok & rekomendasi.
set.seed(123)

# Inisialisasi parameter
stok_awal <- 100
hari <- 60
stok <- numeric(hari)
penjualan <- runif(hari, min=8, max=15)  # Penjualan harian mengikuti distribusi uniform 8-15 karung
stok[1] <- stok_awal - penjualan[1]

# Simulasi stok selama 60 hari
for (i in 2:hari) {
  if (i %% 5 == 1) stok[i-1] <- stok[i-1] + 50  # Setiap 5 hari, pesan 50 karung
  stok[i] <- stok[i-1] - penjualan[i]
  if (stok[i] < 0) stok[i] <- 0  # Stok tidak boleh negatif
}

# Plot pergerakan stok
plot(stok, type="l", col="darkgoldenrod4", lwd=2, main="Stok Beras 60 Hari", xlab="Hari", ylab="Stok")

# Tambahkan penjelasan di console
cat("Penjelasan:\n")
## Penjelasan:
cat("Simulasi stok beras selama 60 hari dilakukan dengan penjualan harian acak 8-15 karung.\n")
## Simulasi stok beras selama 60 hari dilakukan dengan penjualan harian acak 8-15 karung.
cat("Setiap 5 hari, dilakukan pemesanan ulang sebanyak 50 karung.\n")
## Setiap 5 hari, dilakukan pemesanan ulang sebanyak 50 karung.
cat("Grafik menunjukkan fluktuasi stok setiap hari.\n")
## Grafik menunjukkan fluktuasi stok setiap hari.
cat("Saat stok mendekati nol, terjadi potensi kehabisan stok.\n")
## Saat stok mendekati nol, terjadi potensi kehabisan stok.
cat("Strategi pemesanan perlu dievaluasi agar stok tetap stabil dan meminimalkan kehilangan penjualan.\n")
## Strategi pemesanan perlu dievaluasi agar stok tetap stabil dan meminimalkan kehilangan penjualan.
# Hitung berapa hari kehabisan stok
habis <- sum(stok == 0)
cat("Toko kehabisan stok sebanyak", habis, "hari\n\n")
## Toko kehabisan stok sebanyak 2 hari
# Tambahkan penjelasan hasil
cat("Penjelasan:\n")
## Penjelasan:
cat("Dari hasil simulasi selama 60 hari, toko mengalami kehabisan stok sebanyak", habis, "hari.\n")
## Dari hasil simulasi selama 60 hari, toko mengalami kehabisan stok sebanyak 2 hari.
cat("Setiap kali stok mencapai nol, artinya ada permintaan yang tidak dapat dipenuhi.\n")
## Setiap kali stok mencapai nol, artinya ada permintaan yang tidak dapat dipenuhi.
cat("Hal ini berisiko menimbulkan kehilangan potensi keuntungan dan ketidakpuasan pelanggan.\n")
## Hal ini berisiko menimbulkan kehilangan potensi keuntungan dan ketidakpuasan pelanggan.
cat("Strategi pemesanan yang lebih optimal dibutuhkan untuk meminimalkan frekuensi kehabisan stok.\n")
## Strategi pemesanan yang lebih optimal dibutuhkan untuk meminimalkan frekuensi kehabisan stok.
set.seed(123)

# Fungsi simulasi stok
simulasi_stok <- function(pesan, hari=60, frekuensi=5) {
  stok <- numeric(hari)
  penjualan <- runif(hari, min=8, max=15)
  stok[1] <- 100 - penjualan[1]
  
  for (i in 2:hari) {
    if (i %% frekuensi == 1) stok[i-1] <- stok[i-1] + pesan
    stok[i] <- stok[i-1] - penjualan[i]
    if (stok[i] < 0) stok[i] <- 0
  }
  return(stok)
}

# Simulasi untuk 3 strategi pemesanan
stok_40 <- simulasi_stok(40)
stok_50 <- simulasi_stok(50)
stok_60 <- simulasi_stok(60)

# Hitung berapa kali kehabisan stok
cat("Hasil Simulasi Kehabisan Stok:\n")
## Hasil Simulasi Kehabisan Stok:
cat("Pesan 40 karung: kehabisan stok selama", sum(stok_40==0), "hari\n")
## Pesan 40 karung: kehabisan stok selama 10 hari
cat("Pesan 50 karung: kehabisan stok selama", sum(stok_50==0), "hari\n")
## Pesan 50 karung: kehabisan stok selama 2 hari
cat("Pesan 60 karung: kehabisan stok selama", sum(stok_60==0), "hari\n\n")
## Pesan 60 karung: kehabisan stok selama 0 hari
# Plot ketiga strategi
plot(stok_40, type="l", col="coral4", lwd=2, ylim=c(0, max(stok_60)),
     main="Perbandingan Strategi Pemesanan", xlab="Hari", ylab="Stok")
lines(stok_50, col="deeppink4", lwd=2)
lines(stok_60, col="deepskyblue4", lwd=2)
legend("topright", legend=c("Pesan 40", "Pesan 50", "Pesan 60"), 
       col=c("coral4", "deeppink4", "deepskyblue4"), lwd=2)

# Penjelasan hasil
cat("Penjelasan:\n")
## Penjelasan:
cat("Grafik menunjukkan perbandingan 3 strategi jumlah pesanan setiap 5 hari.\n")
## Grafik menunjukkan perbandingan 3 strategi jumlah pesanan setiap 5 hari.
cat("Semakin besar jumlah pesanan (misalnya 60 karung), frekuensi kehabisan stok makin kecil.\n")
## Semakin besar jumlah pesanan (misalnya 60 karung), frekuensi kehabisan stok makin kecil.
cat("Namun, pemesanan terlalu banyak bisa menimbulkan risiko overstock atau biaya penyimpanan.\n")
## Namun, pemesanan terlalu banyak bisa menimbulkan risiko overstock atau biaya penyimpanan.
cat("Strategi pemesanan 50 karung tampaknya cukup optimal dengan kehabisan stok lebih rendah dibanding 40,\n")
## Strategi pemesanan 50 karung tampaknya cukup optimal dengan kehabisan stok lebih rendah dibanding 40,
cat("tetapi tidak terlalu berlebihan seperti pemesanan 60 karung.\n")
## tetapi tidak terlalu berlebihan seperti pemesanan 60 karung.
# Simulasi untuk 3 frekuensi pemesanan (pakai jumlah pesan 50 karung)
stok_3hari <- simulasi_stok(50, frekuensi=3)
stok_5hari <- simulasi_stok(50, frekuensi=5)
stok_7hari <- simulasi_stok(50, frekuensi=7)

# Hitung kehabisan stok
cat("Hasil Simulasi Kehabisan Stok Berdasarkan Frekuensi:\n")
## Hasil Simulasi Kehabisan Stok Berdasarkan Frekuensi:
cat("Setiap 3 hari: kehabisan stok selama", sum(stok_3hari==0), "hari\n")
## Setiap 3 hari: kehabisan stok selama 0 hari
cat("Setiap 5 hari: kehabisan stok selama", sum(stok_5hari==0), "hari\n")
## Setiap 5 hari: kehabisan stok selama 1 hari
cat("Setiap 7 hari: kehabisan stok selama", sum(stok_7hari==0), "hari\n\n")
## Setiap 7 hari: kehabisan stok selama 11 hari
# Plot ketiga frekuensi
plot(stok_3hari, type="l", col="darkolivegreen4", lwd=2, ylim=c(0, max(stok_3hari, stok_5hari, stok_7hari)),
     main="Perbandingan Frekuensi Pemesanan", xlab="Hari", ylab="Stok")
lines(stok_5hari, col="darkblue", lwd=2)
lines(stok_7hari, col="darkorange4", lwd=2)
legend("topright", legend=c("Setiap 3 hari", "Setiap 5 hari", "Setiap 7 hari"), 
       col=c("darkolivegreen4", "darkblue", "darkorange4"), lwd=2)

# Penjelasan hasil
cat("Penjelasan:\n")
## Penjelasan:
cat("Dari simulasi dengan jumlah pemesanan tetap 50 karung, terlihat bahwa semakin sering melakukan pemesanan (misalnya setiap 3 hari),\n")
## Dari simulasi dengan jumlah pemesanan tetap 50 karung, terlihat bahwa semakin sering melakukan pemesanan (misalnya setiap 3 hari),
cat("maka kemungkinan kehabisan stok semakin kecil. Namun, pemesanan terlalu sering bisa meningkatkan biaya operasional atau logistik.\n")
## maka kemungkinan kehabisan stok semakin kecil. Namun, pemesanan terlalu sering bisa meningkatkan biaya operasional atau logistik.
cat("Frekuensi 5 hari menunjukkan keseimbangan yang cukup baik antara ketersediaan stok dan efisiensi pemesanan.\n")
## Frekuensi 5 hari menunjukkan keseimbangan yang cukup baik antara ketersediaan stok dan efisiensi pemesanan.
cat("Frekuensi 7 hari mulai menunjukkan risiko kehabisan stok yang lebih tinggi.\n")
## Frekuensi 7 hari mulai menunjukkan risiko kehabisan stok yang lebih tinggi.
library(ggplot2)

# Fungsi simulasi stok (dipakai ulang)
simulasi_stok <- function(pesan, hari=60, frekuensi=5) {
  stok <- numeric(hari)
  penjualan <- runif(hari, min=8, max=15)
  stok[1] <- 100 - penjualan[1]
  
  for (i in 2:hari) {
    if (i %% frekuensi == 1) stok[i-1] <- stok[i-1] + pesan
    stok[i] <- stok[i-1] - penjualan[i]
    if (stok[i] < 0) stok[i] <- 0
  }
  return(stok)
}

# Jalankan simulasi strategi terbaik (50 karung setiap 5 hari)
stok_terbaik <- simulasi_stok(50, frekuensi=5)

# Hitung jumlah kehabisan stok
jumlah_habis <- sum(stok_terbaik == 0)

# Cetak hasil + penjelasan
cat("Strategi Terbaik:\n")
## Strategi Terbaik:
cat("- Pemesanan sebanyak 50 karung setiap 5 hari.\n")
## - Pemesanan sebanyak 50 karung setiap 5 hari.
cat("- Total kehabisan stok selama 60 hari:", jumlah_habis, "hari.\n")
## - Total kehabisan stok selama 60 hari: 2 hari.
cat("- Hasil menunjukkan bahwa strategi ini menjaga kestabilan stok dengan risiko kehabisan minimal.\n")
## - Hasil menunjukkan bahwa strategi ini menjaga kestabilan stok dengan risiko kehabisan minimal.
cat("- Selain itu, frekuensi pemesanan cukup efisien tanpa terlalu sering melakukan pemesanan.\n")
## - Selain itu, frekuensi pemesanan cukup efisien tanpa terlalu sering melakukan pemesanan.
cat("- Strategi ini memberikan keseimbangan antara biaya pemesanan, penyimpanan, dan potensi kehilangan penjualan.\n")
## - Strategi ini memberikan keseimbangan antara biaya pemesanan, penyimpanan, dan potensi kehilangan penjualan.
# Visualisasi grafik stok
df <- data.frame(Hari = 1:60, Stok = stok_terbaik)

ggplot(df, aes(x=Hari, y=Stok)) +
  geom_area(fill="darkolivegreen", alpha=0.5) +
  geom_line(color="lightgreen", linewidth=1.2) +  
  geom_hline(yintercept=10, color="red", linetype="dashed", linewidth=1) +
  labs(title="Simulasi Stok Beras - Strategi Terbaik",
       subtitle="Pemesanan 50 karung setiap 5 hari",
       x="Hari", y="Jumlah Stok (karung)") +
  theme_minimal()