Bagian 4

Arsitektur Sistem

Rumus dan rancangan teknis tiap tahap, persis mengikuti implementasi di src/wisata/ — bukan versi idealisasi dari proposal.

4.1 Ringkasan Empat Tahap

Desain arsitektur sesuai proposal (Gambar 2) memuat empat tahap berurutan: ① Cascade-Hybrid Recommendation (CBF → NeuMF), ② penggabungan menjadi Top-N rekomendasi final, ③ prediksi kunjungan wisatawan, dan ④ optimasi rute dengan algoritma genetika yang mengonsumsi keluaran ① dan ③ sekaligus.

Desain arsitektur sistem rekomendasi wisata

4.2 Tahap 1 — Content-Based Filtering (CBF)

Vektor fitur destinasi (35 dimensi) tersusun dari empat blok, masing-masing dinormalisasi L2 secara terpisah lalu diberi bobot sebelum digabung — sehingga blok berdimensi besar (fasilitas, kegiatan) tidak otomatis mendominasi kemiripan kosinus dibanding blok kecil (kategori, budget):

v_{atribut} = \Big[\, w_{kat}\,\widehat{f}_{kat} \;\Vert\; w_{fas}\,\widehat{f}_{fas} \;\Vert\; w_{keg}\,\widehat{f}_{keg} \;\Vert\; w_{bud}\,b \,\Big], \qquad \widehat{f} = \frac{f}{\lVert f \rVert_2}

dengan b = \dfrac{\log(1+\text{budget}) - \min}{\max - \min} (skala log, karena sebaran budget sangat menceng ke kanan).

Pembobotan IDF pada fasilitas dan kegiatan — atribut yang hampir universal (mis. "Fotografi", muncul di 66/70 destinasi) diberi bobot rendah, atribut langka diberi bobot tinggi:

\mathrm{idf}(t) = \ln\!\left(\frac{1+N}{1+\mathrm{df}(t)}\right) + 1

N = 70 destinasi, df(t) = jumlah destinasi yang memiliki atribut t [T9] .

Penggabungan dengan citra — fitur visual CNN (32 dimensi setelah PCA) digabung lewat bobot α yang dapat disetel:

v_{dest} = L2\Big[\, \alpha \cdot \widehat{v}_{atribut} \;\Vert\; (1-\alpha)\cdot \widehat{v}_{citra} \,\Big], \qquad \alpha \in \{0;\,0{,}25;\,0{,}5;\,0{,}75;\,1\}

α = 1 berarti atribut saja (mode sebelum citra tersedia); α = 0 berarti citra murni.

Profil pengguna — dicampur dari riwayat interaksi dan kategori yang diminati (stated preference), dengan bobot campuran w :

P_u = L2\Big[(1-w)\cdot L2\big(\textstyle\sum_i r_{ui}^{\,p}\, v_i \,/\, \sum_i r_{ui}^{\,p}\big) \;+\; w \cdot L2(\text{prior}_{kategori})\Big]

Pengguna tanpa riwayat interaksi otomatis mendapat w = 1 (prior sepenuhnya) — jalur cold-start tertangani tanpa cabang kode terpisah.

Skor CBF — kemiripan kosinus antara profil dan tiap destinasi [T9] :

\mathrm{skor}_{CBF}(u,i) = \cos(P_u, v_i) = \frac{P_u \cdot v_i}{\lVert P_u \rVert \, \lVert v_i \rVert}

4.3 Tahap 2 — Neural Collaborative Filtering (NeuMF)

NeuMF [T1] menggabungkan dua jalur yang mempelajari embedding pengguna dan destinasi secara terpisah (dimensi 32), lalu menyatukan keduanya:

\phi^{GMF} = p_u \odot q_i \qquad\text{(Generalized Matrix Factorization — interaksi linear)}
\phi^{MLP} = a_L\big(W_L\, a_{L-1}(\cdots a_1(W_1[p_u \,\Vert\, q_i] + b_1)\cdots) + b_L\big)

4 lapis dense (64 → 32 → 16 → 8), aktivasi ReLU, dropout 0,2.

\hat{y}_{ui} = \sigma\big(h^\top [\,\phi^{GMF} \,\Vert\, \phi^{MLP}\,]\big)

Dilatih dengan implicit feedback — rating ≥ 4 dianggap positif — dan negative sampling (4 negatif per positif, diambil dari destinasi yang belum pernah diinteraksi), memakai binary cross-entropy:

\mathcal{L} = -\!\!\sum_{(u,i) \in \mathcal{D}} \Big[ y_{ui}\log \hat{y}_{ui} + (1-y_{ui})\log(1-\hat{y}_{ui}) \Big]

4.4 Cascade: CBF → NeuMF

Berbeda dari hybrid berbobot (skor CBF dan NeuMF dijumlahkan, keduanya melihat seluruh katalog), cascade bekerja berjenjang: CBF menyaring Top-M kandidat (M = 20), lalu hanya kandidat itu yang diperingkat ulang oleh NeuMF. Destinasi di luar Top-M diberi skor −∞ sehingga tidak pernah muncul di hasil akhir, berapa pun skor NeuMF-nya:

\mathrm{skor}_{cascade}(u,i) = \begin{cases} \mathrm{skor}_{NeuMF}(u,i) & \text{jika } i \in \mathrm{TopM}_{CBF}(u) \\ -\infty & \text{selainnya} \end{cases}

Konsekuensinya, Recall@M tahap CBF menjadi langit-langit kinerja seluruh cascade — dibuktikan di Hasil §6.2.

4.5 Tahap 3 — Prediksi Kunjungan Wisatawan

Model sekuensial (RNN, GRU [T6] , atau LSTM [T5] ) memprediksi kunjungan harian per destinasi dari fitur lag dan statistik bergulir:

h_t = f_\theta(h_{t-1}, x_t), \qquad x_t = \big[\text{lag}_{1,7,14,28},\; \text{rerata bergulir},\; \text{fitur kalender},\; e_{destinasi}\big]

lag_365 sengaja tidak dipakai baku — menyertakannya membuang seluruh data 2023 (data latih menyusut 703 → 366 hari). Seluruh statistik bergulir dihitung setelah shift(1) untuk mencegah kebocoran data masa depan.

Dievaluasi dengan empat metrik — dua dilaporkan sekaligus karena data memuat nilai nol (situs Hindu pada hari Nyepi) yang membuat MAPE tak terdefinisi tanpa penanganan:

\mathrm{MAE} = \frac{1}{n}\sum |y_t - \hat{y}_t|
\mathrm{RMSE} = \sqrt{\frac{1}{n}\sum (y_t-\hat{y}_t)^2}
\mathrm{sMAPE} = \frac{100\%}{n}\sum \frac{|y_t-\hat{y}_t|}{(|y_t|+|\hat{y}_t|)/2}
\mathrm{MAPE} = \frac{100\%}{n}\sum \frac{|y_t-\hat{y}_t|}{\max(|y_t|,\,1)}

4.6 Tahap 4 — Optimasi Rute (Algoritma Genetika)

Dirumuskan sebagai Team Orienteering Problem [T7,T8] : dari sekumpulan kandidat, pilih sebagian dan tentukan urutannya di bawah batas waktu harian, jumlah hari, dan anggaran — melewatkan destinasi adalah bagian sah dari solusi, bukan kegagalan.

Fungsi fitness — inilah tempat klaim kebaruan bekerja: skor prioritas cascade dan prediksi kepadatan masuk bersamaan ke suku yang sama:

F(R) = w_{rel}\,\mathrm{Rel}(R) \;+\; w_{jar}\,\big(1-\widehat{D}(R)\big) \;+\; w_{pad}\,\big(1-\overline{C}(R)\big) \;-\; P(R)
P(R) = \begin{cases} w_{pen}\Big(\dfrac{\text{biaya}(R)}{B}-1\Big) & \text{jika biaya}(R) > B \\[4pt] 0 & \text{selainnya} \end{cases}
\mathrm{Rel}(R) = \frac{\sum_{k=1}^{n} \mathrm{rel}_{\sigma(k)}\cdot d_k}{\sum_{k=1}^n d_k}, \;\; d_k = \frac{1}{\log_2(k+1)}

Relevansi diberi diskon posisi ala nDCG — destinasi relevan yang dikunjungi lebih awal dihargai lebih tinggi.

\widehat{D}(R) = \min\!\Big(\frac{\text{total\_km}(R)}{v\cdot H \cdot n_{hari}},\; 1\Big)

Jarak dinormalisasi terhadap batas teoretis: kecepatan × jam tersedia × jumlah hari.

Operator genetika — populasi 100, 300 generasi (berhenti dini bila 60 generasi tanpa perbaikan), elitisme 5%, seleksi turnamen (k=3):

  • Order Crossover (OX) — mempertahankan urutan relatif induk kedua pada segmen yang tidak diwarisi dari induk pertama.
  • Mutasi campuran (laju 25%) — dipilih acak antara tukar posisi, sisip ulang, atau balik segmen.

Empat varian ablation — dibentuk dengan menolkan sebagian bobot, untuk mengisolasi kontribusi tiap suku (bukti kuantitatifnya di Hasil §6.4):

Varianw_relw_jarakw_padatPeran
A010Jarak saja — baseline TSP klasik
B110+ prioritas — setara sistem rekomendasi+rute biasa
C011+ kepadatan — kontrol
D111Ketiganya — usulan penelitian ini

4.7 Ringkasan Metrik Evaluasi

KomponenMetrikSumber
Rekomendasi (CBF, NeuMF, cascade) Precision@K, Recall@K, F1@K, nDCG@K, HR@K, MRR, Coverage, Gini [T10,T11]
Prediksi kunjungan MAE, RMSE, MAPE, sMAPE §4.5
Rute (GA) nDCG rute, efisiensi jarak, rata-rata kepadatan, kelayakan anggaran §4.6

Evaluasi rekomendasi memakai leave-one-out dengan full ranking atas 70 item (bukan negative sampling) — pilihan ini penting untuk interpretasi hasil, lihat Hasil §6.1.