Proyek ini adalah simulasi sederhana dari cara aplikasi peta seperti Google Maps atau Waze menemukan rute tercepat dari satu titik ke titik lainnya. Ini adalah cara yang fantastis untuk memahami algoritma graf.
Konsep Dasar
Anda akan membuat sebuah "peta" yang terdiri dari titik-titik (disebut node atau simpul) yang mewakili lokasi (misalnya, kota atau persimpangan jalan) dan garis-garis (disebut edge atau sisi) yang menghubungkan titik-titik tersebut. Setiap garis memiliki "bobot" yang bisa mewakili jarak, waktu tempuh, atau bahkan biaya. Tujuannya adalah menemukan jalur dengan total bobot terkecil dari titik awal ke titik tujuan.
Algoritma yang Digunakan
Algoritma Dijkstra: Ini adalah algoritma klasik dan paling umum digunakan untuk masalah ini. Dijkstra secara sistematis akan menjelajahi graf untuk menemukan jalur terpendek antara satu simpul (sumber) dengan semua simpul lain dalam graf. Ia bekerja dengan cara selalu memilih simpul terdekat yang belum dikunjungi.
Struktur Data: Anda akan memerlukan representasi graf (misalnya, menggunakan Adjacency List atau Adjacency Matrix) dan Priority Queue untuk membuat implementasi Dijkstra menjadi efisien.
Langkah-langkah Implementasi
Representasi Peta (Graf): Buat struktur data untuk menyimpan peta Anda. Cara paling fleksibel adalah dengan Adjacency List.
Buat dictionary
atau hash map
di mana setiap key adalah nama lokasi (misalnya, 'Jakarta').
Value dari setiap key adalah sebuah list
yang berisi tuple
atau object
dari tetangganya, beserta bobotnya. Contoh: {'Jakarta': [('Bandung', 150), ('Bogor', 60)], 'Bandung': [...]}
.
Implementasi Algoritma Dijkstra:
Inisialisasi jarak ke semua titik sebagai tak terhingga (∞), kecuali titik awal yang jaraknya 0.
Gunakan priority queue untuk menyimpan (jarak, titik)
dan selalu proses titik dengan jarak terkecil.
Saat mengunjungi sebuah titik, perbarui jarak ke tetangga-tetangganya jika Anda menemukan jalur yang lebih pendek melalui titik saat ini.
Simpan juga "jejak" atau dari mana Anda datang ke setiap titik agar bisa merekonstruksi rutenya nanti.
Input dan Output:
Input: Peta (graf), titik awal, dan titik tujuan.
Output: Urutan lokasi yang harus dilalui (rute terpendek) dan total jarak/waktu tempuhnya.
Contoh Sederhana
Misalkan peta Anda: A ke B (4km), A ke C (2km), B ke D (5km), C ke B (1km), C ke D (8km).
Untuk mencari rute dari A ke D:
Dijkstra akan menemukan bahwa rute A -> C -> B -> D memiliki total jarak 2 + 1 + 5 = 8km.
Rute A -> B -> D lebih jauh (4 + 5 = 9km).
Rute A -> C -> D juga lebih jauh (2 + 8 = 10km).
Jadi, outputnya adalah: ['A', 'C', 'B', 'D']
dengan total jarak 8
.
Tantangan & Pengembangan Lanjutan
Tambahkan faktor lalu lintas secara real-time dengan mengubah bobot sisi secara dinamis.
Gunakan Algoritma A* (A-star), variasi dari Dijkstra yang lebih cepat untuk peta besar karena menggunakan heuristik (estimasi jarak ke tujuan).
Implementasikan visualisasi graf dan rutenya menggunakan library seperti Matplotlib atau D3.js.
2. Sistem Rekomendasi Sederhana (Film atau Lagu) 🎬
Proyek ini meniru cara kerja Netflix atau Spotify dalam merekomendasikan konten yang mungkin Anda sukai berdasarkan preferensi sederhana. Ini adalah pengenalan yang bagus untuk algoritma penyaringan (filtering), pembobotan (weighting), dan pengurutan (sorting).
Konsep Dasar
Anda memiliki sekumpulan data (misalnya, daftar film dengan genre, tahun rilis, dan rating). Pengguna memberikan preferensinya (misalnya, "Saya suka film genre Action dengan rating tinggi"). Sistem Anda kemudian akan memproses data, menghitung "skor kecocokan" untuk setiap film, dan menyajikan daftar film yang paling direkomendasikan.
Algoritma yang Digunakan
Ini bukan tentang satu algoritma tunggal yang kompleks, melainkan kombinasi dari beberapa logika:
Filtering: Menyaring data berdasarkan kriteria absolut. Contoh: hanya tampilkan film bergenre 'Action'.
Scoring/Weighting: Memberikan skor pada setiap item yang tersisa berdasarkan beberapa faktor. Contoh: film dengan rating > 8 mendapat +3 poin, film yang dirilis dalam 2 tahun terakhir mendapat +2 poin.
Sorting: Mengurutkan item berdasarkan skor kecocokan dari yang tertinggi ke terendah. Algoritma seperti Quicksort atau Mergesort (yang biasanya sudah terpasang di fungsi sort()
bawaan bahasa pemrograman) akan digunakan di sini.
Langkah-langkah Implementasi
Representasi Data: Buat list
dari object
atau dictionary
. Setiap object
mewakili satu film dan memiliki properti seperti judul
, genre
(bisa berupa list
), rating
(1-10), dan tahunRilis
.
Logika Inti:
Buat fungsi yang menerima preferensi pengguna sebagai input.
Filter: Saring daftar film berdasarkan genre yang diminta pengguna.
Score: Untuk setiap film yang lolos filter, hitung skornya. Rumus skor bisa Anda tentukan sendiri, misalnya:
Skor = (Rating * 1.5) + (BonusTahunBaru)
di mana BonusTahunBaru
adalah 2 jika film dirilis setelah tahun 2022, dan 0 jika tidak.
Sort: Urutkan daftar film yang sudah diberi skor secara menurun (descending).
Input dan Output:
Contoh Sederhana
Tantangan & Pengembangan Lanjutan
Collaborative Filtering: Rekomendasikan film berdasarkan apa yang disukai oleh pengguna lain dengan selera serupa. Ini jauh lebih kompleks tetapi sangat powerful.
Content-Based Filtering Lanjutan: Analisis deskripsi atau sinopsis film menggunakan algoritma pemrosesan bahasa alami (NLP) untuk menemukan kata kunci yang cocok.
Buat antarmuka pengguna sederhana di mana pengguna bisa memberi rating pada film, dan sistem akan "belajar" preferensi mereka dari waktu ke waktu.
3. Penjadwal Tugas Otomatis (Task Scheduler) 📅
Proyek ini bertujuan untuk mengoptimalkan urutan pengerjaan tugas berdasarkan prioritas, durasi, dan tenggat waktu (deadline). Ini adalah contoh klasik dari algoritma greedy (serakah).
Konsep Dasar
Bayangkan Anda punya daftar tugas yang harus dikerjakan hari ini. Setiap tugas memiliki durasi (berapa lama mengerjakannya) dan deadline (kapan harus selesai). Anda tidak bisa mengerjakan semuanya sekaligus. Algoritma ini akan menentukan urutan pengerjaan tugas agar semua tugas selesai sebelum deadline-nya, atau setidaknya memaksimalkan jumlah tugas yang selesai tepat waktu.
Algoritma yang Digunakan
Algoritma Greedy: Pendekatan ini membuat pilihan yang "terlihat" paling baik pada saat itu juga, tanpa memikirkan konsekuensi jangka panjang. Dalam kasus ini, strategi greedy yang umum adalah: "Kerjakan tugas dengan deadline paling awal terlebih dahulu." Strategi ini terbukti optimal untuk masalah penjadwalan sederhana.
Sorting: Langkah pertama yang paling penting dalam pendekatan greedy ini adalah mengurutkan semua tugas berdasarkan deadline mereka.
Langkah-langkah Implementasi
Representasi Data: Buat list
dari object
atau dictionary
Tugas. Setiap tugas memiliki properti: nama
, durasi
(misal, dalam jam), dan deadline
(misal, jam ke-berapa dari sekarang).
Logika Inti:
Input dan Output:
Input: Daftar tugas dengan nama, durasi, dan deadline.
Output: Urutan tugas yang harus dikerjakan agar memaksimalkan jumlah tugas yang selesai tepat waktu.
Contoh Sederhana
Tantangan & Pengembangan Lanjutan
Tambahkan prioritas pada setiap tugas. Strategi greedy-nya bisa diubah menjadi: "Pilih tugas dengan prioritas tertinggi yang masih bisa diselesaikan sebelum deadline."
Tangani tugas yang memiliki dependensi (Tugas C baru bisa dikerjakan setelah Tugas A selesai). Ini akan mengubah masalah menjadi lebih kompleks dan memerlukan algoritma seperti Topological Sort.
Izinkan preemption (kemampuan untuk menjeda satu tugas untuk mengerjakan tugas lain yang lebih penting.