43 dinamis. Graf statis adalah graf yang sudah terbentuk sebelum proses traversal dilakukan, sedangkan graf dinamis adalah graf yang terbentuk selama proses traversal dilakukan [2]. Algoritma breadth first search (BFS) adalah teknik traversal graf yang mengunjungi simpul-simpul berdasarkan urutan jarak simpul tersebut dengan simpul awal. Algoritma BFS memanfaatkan struktur data queue atau antrean untuk menentukan simpul selanjutnya yang akan dikunjungi. Berikut adalah langkah-langkah di dalam breadth first search (BFS): 1. Buat suatu antrean 2. Masukkan simpul awal ke antrean 3. Kunjungi simpul yang ada di awal antrean 4. Masukkan semua simpul yang bertetangga dengan simpul yang sedang dikunjungi dan belum pernah dikunjungi sebelumnya ke antrean 5. Ulangi langkah 3 dan 4 sampai antrean kosong [2] Algoritma depth first search (DFS) adalah teknik traversal graf yang mengunjungi simpul-simpul dengan mengutamakan kedalaman terlebih dahulu. Berbeda dari algoritma BFS yang memanfaatkan struktur data queue untuk menentukan simpul selanjutnya yang akan dikunjungi, algoritma DFS akan memanfaatkan struktur data stack untuk melakukan backtracking ketika ada simpul yang belum dikunjungi dan semua tetangga dari simpul yang sedang dievaluasi telah dikunjungi. Berikut adalah langkah-langkah di dalam depth first search (DFS): 1. Kunjungi simpul awal
44 2. Kunjungi simpul yang bertetangga dengan simpul yang sedang dikunjungi dan belum pernah dikunjungi sebelumnya 3. Ulangi langkah 2 hingga tidak adalah simpul yang belum dikunjungi [2] Di dalam depth first search (DFS), apabila ada simpul yang belum dikunjungi, tetapi semua simpul tetangga dari simpul yang sedang dikunjungi sudah dikunjungi seluruhnya, maka akan dilakukan backtrack ke simpul terakhir yang dikunjungi sebelum simpul saat ini. Dalam pencarian solusi dengan pendekatan graf dinamis, pencarian solusi akan dimulai dari suatu simpul. Kemudian, setiap simpul akan diperiksa apakah merupakan simpul solusi. Apabila bukan simpul solusi, maka akan dilakukan pembangkitan simpul lain dari simpul saat ini. Pembangkitan simpul dapat menggunakan pendekatan BFS ataupun DFS. Pencarian solusi dengan algoritma breadth first search (BFS) selalu menemukan solusi jika solusi memang ada dan solusi yang ditemukan pasti optimal. Kompleksitas waktu dan kompleksitas ruang breadth first search (BFS) adalah O(bd ) dengan b adalah jumlah maksimum cabang dari suatu simpul dan d adalah kedalaman dari solusi terbaik. Sementara itu, pencarian solusi dengan algoritma depth first search (DFS) juga selalu menemukan solusi jika solusi memang ada. Namun, solusi yang ditemukan tidak pasti optimal. Kompleksitas waktu dari algoritma depth first search (DFS) adalah O(bm) dan kompleksitas ruangnya adalah O(bm) dengan b adalah jumlah maksimum cabang dari
45 suatu simpul dan m adalah maksimum kedalaman dari ruang status [3]. Algoritma backtracking merupakan variasi dari algoritma traversal graf dengan pendekatan depth first search (DFS) yang lebih baik. Selain itu, algoritma backtracking juga dapat dipandang sebagai perbaikan dari algoritma exhaustive search karena semua kemungkinan solusi akan dievaluasi pada exhaustive search, sedangkan pada algoritma backtracking, hanya simpul-simpul yang mengarah ke solusi yang akan dievaluasi. Tiga elemen algoritma backtracking adalah sebagai berikut: 1. Solusi persoalan yang dinyatakan sebagai vektor ntuple 2. Fungsi pembangkit T 3. Fungsi pembatas B yang bernilai true jika simpul mengarah ke solusi dan bernilai false jika simpul melanggar constraint atau batasan [4] Pembangkitan simpul akan menggunakan pendekatan DFS dan simpul-simpul pada pohon ruang status dapat dibedakan menjadi 3 yaitu simpul hidup (live node), simpul-E (expand node), dan simpul mati (dead node). Simpul hidup (live node) adalah simpulsimpul yang sudah dibangkitkan, sedangkan simpul-E (expand node) adalah simpul yang sedang diperluas, dan simpul mati (dead node) adalah simpul yang tidak mengarah ke solusi.
46 Dalam penyelesaian masalah, konfigurasi awal persoalan akan direpresentasikan sebagai simpul akar pada pohon ruang status. Anak dari suatu simpul pada pohon ruang status merupakan hasil aplikasi fungsi pembangkit T pada simpul tersebut dan adalah semua konfigurasi persoalan yang mungkin dicapai dari simpul tersebut. Pengecekan kepada setiap simpul dilakukan dengan menerapkan fungsi pembatas B. Apabila fungsi pembatas B menghasilkan nilai false pada suatu simpul, maka simpul tersebut akan dijadikan simpul mati dan tidak akan di-expand lebih lanjut karena tidak akan mengarah ke solusi. Sementara itu, simpul daun pada pohon ruang status disebut sebagai simpul solusi dan lintasan dari simpul akar ke simpul daun membentuk solusi yang mungkin atas persoalan yang dihadapi. Berikut adalah langkah-langkah pencarian solusi dengan algoritma backtracking: 1. Terapkan fungsi pembatas B pada simpul saat ini. Apabila bernilai true, maka lanjut ke langkah ke-2, sedangkan apabila bernilai false, simpul tersebut akan dijadikan simpul mati dan simpul-E kembali ke simpul orang tua dan lanjut ke langkah ke-2 2. Memeriksa simpul apakah adalah solusi persoalan. Apabila bukan solusi persoalan maka bangkitkan salah satu anak dengan menggunakan fungsi pembangkit T dan kembali ke langkah ke-1 3. Proses dilakukan hingga semua solusi telah ditemukan
47 Family of Five within Thirty Seconds Problem adalah salah satu variasi dari river crossing puzzle. River crossing puzzle pertama kali diperkenalkan oleh Alcuin, seorang lulusan Inggris yang menjadi penasihat dari Charlemagne, seorang Kaisar Romawi Suci. Alcuin mengumpulkan kumpulan teka- tekinya pada sebuah buku berjudul Propositiones ad Acuendos Juvenes atau Problems to Sharpen the Young. River crossing puzzle kemudian terus berkembang dan muncul berbagai variasi yang berkaitan dengan puzzle tersebut. Dari variasi-variasi tersebut, ada yang memiliki tingkat kesulitan rendah dan ada yang memiliki tingkat kesulitan tinggi sesuai jumlah objek yang perlu dipindahkan dan batasan- batasan yang berlaku dalam pemindahan objek tersebut. Salah satu variasi yang muncul adalah family of five within thirty seconds problem. Gambar 4. 1 Contoh tampilan permainan river crossing puzzle a family of five within thirty seconds problem
48 yang dapat diunduh dari: https://play.google.com/store/apps/details?id=zl.puzzle.ri veriq Di dalam persoalan tersebut, terdapat sebuah keluarga yang terdiri dari lima orang. Kelima orang tersebut harus dipindahkan dari satu tepi sungai ke tepi sungai lainnya. Pemindahan orang antar tepi sungai dilakukan dengan menggunakan sebuah perahu. Namun, perahu memiliki kapasitas maksimal dua orang dan untuk menggerakkan perahu, dibutuhkan satu orang untuk menakhodainya. Masing- masing orang dari kelima orang tersebut membutuhkan waktu yang berbeda-beda untuk menyeberangi sungai menggunakan perahu. Waktu tersebut diurutkan dari yang terkecil adalah 1 detik, 3 detik, 6 detik, 8 detik, dan 12 detik. Apabila terdapat dua orang di dalam perahu, maka perahu akan sampai di tepi sungai lainnya dalam waktu terbesar antara waktu yang diperlukan dua orang di dalam perahu untuk sampai ke tepi sungai lainnya. Kelima orang tersebut harus mampu dipindahkan dari satu tepi sungai ke tepi sungai lainnya dalam waktu maksimal 30 detik. Algoritma backtracking akan diterapkan untuk menentukan semua solusi atas permasalahan a family of five within thirty seconds problem.
49 1. Deskripsi Persoalan Berdasarkan deskripsi persoalan yang ada, dapat disimpulkan bahwa tujuan utama persoalan a family of fivewithin thirty seconds problem adalah untuk memindahkan kelima orang yang terdapat di satu tepi sungai ke tepi sungai lainnya. Selain itu, terdapat juga batasan-batasan dalam penyelesaian persoalan a family of five within thirty seconds problem. Berikut adalah batasanbatasan (constraints) yang terdefinisi dalam permasalahan a family of five within thirty seconds problem: a. Pemindahan orang dari satu tepi sungai ke tepi sungai lainnya hanya dapat menggunakan sebuah perahu. b. Perahu hanya mampu menampung maksimum dua orang dan perlu ada satu orang yang menakhodainya. c. Setiap orang memiliki waktu tempuh yang berbeda-beda untuk menyeberangi sungai, yaitu 1 detik, 3 detik, 6 detik, 8 detik, dan 12 detik. d. Jika terdapat dua orang yang menaiki perahu untuk menyeberangi sungai, maka perahu memerlukan waktu tempuh maksimum antara kedua orang tersebut untuk menyeberangi sungai. e. Pemindahan kelima orang tersebut harus dilakukan dalam waktu maksimal 30 detik.
50 2. Pemodelan Persoalan Layaknya suatu permasalahan yang diselesaikan dengan algoritma backtracking, persoalan a family of five within thirty seconds problem akan memiliki sekumpulan kondisi yang dimodelkan sebagai simpul pada pohon ruang status. Kondisi yang digambarkan oleh simpul dalam dan daun pada pohon ruang status hanya kondisi ketika perahu sedang berada di tepi sungai tujuan, sedangkan simpul akar akan memodelkan kondisi awal ketika lima orang sedang di tepi sungai awal dengan perahu di tepi sungai tersebut. Simpul pada pohon ruang status untuk persoalan a family of five within thirty seconds problem akan berupa tuple dengan struktur sebagai berikut: X = ((x1, x2, x3, x4, x5), t) Berikut adalah properti terkait struktur tuple tersebut: a. x1 menyatakan posisi dari orang dengan waktu tempuh 1 detik. Nilai 0 menandakan orang tersebut ada di tepi sungai awal dan nilai 1 menandakan orang tersebut ada di tepi sungai tujuan. b. x2 menyatakan posisi dari orang dengan waktu tempuh 3 detik. Definisi nilai sama seperti x1. c. x3 menyatakan posisi dari orang dengan waktu tempuh 6 detik. Definisi nilai sama seperti x1. d. x4 menyatakan posisi dari orang dengan waktu
51 tempuh 8 detik. Definisi nilai sama seperti x1. e. x5 menyatakan posisi dari orang dengan waktu tempuh 12 detik. Definisi nilai sama seperti x1. f. t menyatakan waktu yang telah dihabiskan sejak permainan dimulai. Berikut adalah elemen-elemen algoritma backtracking untuk persoalan a family of five within thirty seconds problem: a. Solusi persoalan Sesuai dengan tujuan dari permainan river crossing puzzle dan struktur simpul yang telah didefinisikan sebelumnya, solusi persoalan a family of five within thirty seconds problem adalah simpul dengan struktur: X = ((1,1,1,1,1), t) Struktur solusi tersebut menandakan bahwa kelima orang tersebut harus berada pada tepi sungai tujuan dengan total waktu t sesuai deskripsi persoalan. Selain itu, perlu diperhatikan bahwa nilai t harus lebih kecil atau sama dengan 30 sesuai batasan yang terdefinisi untuk permasalahan a family of five within thirty seconds problem. b. Fungsi pembangkit Karena hanya kondisi ketika perahu berada di tepi sungai tujuan yang dimodelkan sebagai simpul pada pohon ruang status, harus dilakukan sedikit modifikasi pada fungsi pembangkit.
52 Aplikasi fungsi pembangkit pada suatu simpul dalam akan terlebih dahulu mengubah nilai salah satu elemen yang telah bernilai 1 menjadi 0. Kondisi ini menandakan bahwa satu orang dari tepi sungai tujuan akan kembali ke tepi sungai awal karena perahu memerlukan seseorang untuk menakhodainya. Karena simpul akar memodelkan kondisi awal dengan perahu di tepi sungai awal, maka pengubahan nilai 1 menjadi 0 ini tidak perlu dilakukan saat pembangkitan anak dari simpul akar. Selanjutnya, fungsi pembangkit akan mengubah dua buah nilai 0 pada simpul tersebut menjadi 1 yang menggambarkan keadaan bahwa dua orang menyeberangi sungai bersama-sama menggunakan perahu. Elemen 1 yang dipilih untuk diubah menjadi 0 adalah elemen 1 dengan waktu tempuh terkecil agar waktu yang dibutuhkan untuk kembali ke tepi sungai awal seminimum mungkin. Pemilihan 2 buah elemen 0 yang diubah menjadi 1 dilakukan dengan mengambil subset berukuran 2 dari himpunan elemen 0 dari simpul yang elemen 1 terkecilnya telah diubah menjadi 0. Sesuai teori kombinatorial, maka kemungkinan jumlah anak dari suatu simpul adalah C(n, 2)
53 dengan n adalah jumlah elemen bernilai 0 setelah pengubahan salah satu elemen 1 menjadi 0 jika simpul tersebut adalah simpul dalam. Berikut adalah contoh penerapan fungsi pembangkit pada salah satu simpul: T((1, 0, 0, 0, 1), 12) Kondisi di atas menggambarkan perahu ada di tepi sungai tujuan dengan orang pertama dan orang kelima telah berada di tepi sungai tujuan. Karena simpul tersebut bukan akar maka perlu mengubah elemen 1 yang waktu tempuhnya terkecil menjadi 0 sehingga kondisi menjadi T((0, 0, 0, 0, 1), 13) Simpul tersebut tidak akan dibuat sebagai simpul pada pohon ruang status karena menggambarkan kondisi ketika perahu ada di tepi sungai awal. Selanjutnya, fungsi pembangkit akan memilih dua nilai 0 acak untuk diubah menjadi 1. Karena nilai 0 ada 4, berarti untuk simpul ((1,0,0,0,1),12) mungkin memiliki C(4,2) anak yaitu 6 simpul. Misalnya dipilih elemen kedua dan ketiga untuk diubah nilainya menjadi 1, maka akan dibangkitkan suatu simpul anak dengan konfigurasi X = ((0, 1, 1, 0, 1), 19)
54 c. Fungsi pembatas Sesuai batasan persoalan a family of five within thirty seconds problem yang telah didefinisikan, fungsi pembatas untuk persoalan ini adalah total waktu tempuh lebih kecil atau sama dengan 30. Ketika suatu simpul menghasilkan false dari fungsi pembatas, maka simpul tersebut akan dimatikan karena melanggar constraint dan tidak mengarah ke solusi. 3. Implementasi Solusi Implementasi algoritma backtracking untuk persoalan a family of five within thirty seconds problem menggunakan pendekatan rekursif. Berikut adalah pseudocode yang diimplementasikan: procedure Backtrack(input x: Simpul) {Mencari semua solusi persoalan dengan metode backtracking menggunakan skema rekursif} {Masukan: x sebuah simpul} {Luaran: semua solusi persoalan} Algoritma: if total waktu tempuh <= 30 then if node adalah solusi then Cetak lintasan dari akar ke simpul x else Mengubah elemen 1 minimum menjadi 0 for each subset dengan panjang 2 dari himpunan elemen 0 do x1 <- x yang diubah kedua nilai 0 yang terpilih menjadi 1 Backtrack(x1)
55 Untuk memulai pencarian solusi, diberikan suatu simpul akar yaitu X = ((0,0,0,0,0), 0) yaitu semua orang masih berada di tepi sungai awal dan total waktu tempuh masih 0. Berikut adalah cuplikan pohon ruang status yang dibangun berdasarkan hasil penelusuran menggunakan algoritma backtracking: Gambar 4. 2 Cuplikan pohon ruang status Pohon ruang status yang dibuat hanya menggambarkan lintasan ke semua kemungkinan solusi dan beberapa contoh lintasan ke simpul yang
56 dimatikan karena melanggar batasan, bukan untuk menunjukkan keseluruhan pohon ruang status. Berdasarkan hasil percobaan, semua bagian pohon ruang status yang tidak dimunculkan dalam gambar tidak mengarah ke solusi. Simpul yang diberi warna hijau menunjukkan simpul solusi dan simpul yang diwarnai merah adalah contoh simpul yang melanggar batasan. Berikut adalah daftar lintasan solusi permasalahan a family of five within thirty seconds problem: 1) ((0,0,0,0,0), 0) → ((1,1,0,0,0), 3) → ((1,1,1,0,0), 10) → ((0,1,1,1,1), 23) → ((1,1,1,1,1), 29) 2) ((0,0,0,0,0), 0) → ((1,1,0,0,0), 3) → ((0,1,0,1,1), 16) → ((1,1,0,1,1), 22) → ((1,1,1,1,1), 29) 3) ((0,0,0,0,0), 0) → ((1,1,0,0,0), 3) → ((0,1,0,1,1), 16) → ((1,0,1,1,1), 25) → ((1,1,1,1,1), 29) 4) ((0,0,0,0,0), 0) → ((1,0,1,0,0), 6) → ((1,1,1,0,0), 10) → ((0,1,1,1,1), 23) → ((1,1,1,1,1), 29) Pada solusi pertama, orang pertama dan kedua akan terlebih dahulu menyeberangi sungai selama 3 detik. Karena belum semua orang menyeberangi sungai, maka orang pertama sebagai orang dengan waktu tempuh terkecil kembali ke tepi sungai awal.
57 Total waktu tempuh saat ini adalah 4 detik. Selanjutnya, orang pertama dan ketiga akan menyeberangi sungai selama 6 detik sehingga total waktu tempuh menjadi 10 detik. Karena belum semua orang menyeberangi sungai, maka orang pertama sebagai orang dengan waktu tempuh terkecil kembali ke tepi sungai awal dan total waktu tempuh menjadi 11 detik. Lalu, orang keempat dan kelima menyeberangi sungai sehingga waktu bertambah 12 detik dan total waktu tempuh menjadi 23 detik. Pada kondisi ini, tersisa orang pertama yang belum menyeberangi sungai sehingga orang kedua sebagai orang dengan waktu tempuh terkecil di tepi sungai tujuan kembali ke tepi sungai awal dan total waktu tempuh bertambah 3 detik menjadi 26 detik. Pada akhirnya, orang pertama dan kedua menyeberangi sungai selama 3 detik dan total waktu tempuh menjadi 29 detik. Karena semua orang telah berada di tepi sungai tujuan dan total waktu tempuh kurang dari atau sama dengan 30, maka permainan berhasil diselesaikan. Pada solusi kedua, orang pertama dan kedua menyeberangi sungai (total waktu = 3 detik). Lalu, orang pertama kembali diikuti orang keempat dan kelima menyeberangi sungai (total waktu = 16 detik). Selanjutnya, orang kedua kembali diikuti orang pertama dan kedua menyeberangi sungai (total waktu = 22 detik). Kemudian, orang pertama
58 kembali serta orang pertama dan orang ketiga menyeberangi sungai (total waktu = 29 detik). Pada solusi ketiga, orang pertama dan kedua menyeberangi sungai (total waktu = 3 detik). Lalu, orang pertama kembali diikuti orang keempat dan kelima menyeberangi sungai (total waktu = 16 detik). Selanjutnya orang kedua kembali diikuti orang pertama dan ketiga menyeberangi sungai (total waktu = 25 detik). Kemudian, orang pertama kembali serta orang pertama dan kedua menyeberangi sungai (total waktu = 29 detik). Pada kemungkinan solusi terakhir, orang pertama dan ketiga menyeberangi sungai (total waktu = 6 detik). Lalu, orang pertama kembali diikuti orang pertama dan orang kedua menyeberangi sungai (total waktu = 10 detik). Selanjutnya, orang pertama kembali diikuti orang keempat dan kelima menyeberangi sungai (total waktu = 23 detik). Kemudian, orang kedua kembali serta orang pertama dan kedua menyeberangi sungai (total waktu = 29 detik). Salah satu contoh lintasan yang tidak mengarah ke solusi adalah ((0,0,0,0,0), 0) → ((1,1,0,0,0), 3) → ((1,1,1,0,0), 10) → ((1,1,1,1,0), 19) → ((1,1,1,1,1), 32)
59 Pada lintasan tersebut, terlebih dahulu orang pertama dan kedua menyeberangi sungai (total waktu = 3 detik). Lalu, orang pertama kembali diikuti orang pertama dan ketiga menyeberangi sungai (total waktu = 10 detik). Selanjutnya, orang pertama kembali diikuti orang pertama dan keempat menyeberangi sungai (total waktu = 19 detik). Kemudian, orang pertama kembali serta orang pertama dan kelima menyeberangi sungai (total waktu = 32 detik). Meskipun kelima orang telah menyeberangi sungai, total waktu tempuh telah melebihi 30 detik sehingga lintasan tersebut tidak membentuk solusi.
60
61 Tujuan Pembelajaran
62 Berdasarkan kebutuhan waktunya, algoritma untuk menyelesaikan persoalan dapat dibagi menjadi dua kelompok besar: 1. Algoritma waktu-polinom (polynomial-time algorithms) Polynomial-time algorithm adalah algoritma yang kompleksitas waktunya dibatasi oleh fungsi polinom sebagai fungsi dari ukuran masukannya (n). Contoh: Persoalan sorting -> T(n) = O(n2), T(n) = O(n log n) Persoalan searching -> T(n) = O(n), T(n) = O(log n) Perkalian matriks -> T(n) = O(n3), T(n) = O(n2.83) Algoritma yang tergolong “bagus” 2. Algoritma waktu-non-polinom (nonpolynomial-time algorithms) Nonpolynomial-time algorithm adalah algoritma yang kompleksitas waktunya dibatasi oleh fungsi non-polinom sebagai fungsi dari ukuran masukannya (n). Contoh TSP -> T(n) = O(n!) Integer knapsack problem -> T(n) = O(2n) graph coloring, sum of subset, bin packing problem Persoalan “sulit” (hard problem).
63 1. Sebuah persoalan dikatakan tractable jika ia dapat diselesaikan dalam waktu yang wajar (reasonable). 2. Sebuah persoalan dikatakan intractable jika ia tidak dapat diselesaikan dalam waktu yang wajar dengan bertambahnya ukuran masukan persoalan. 3. Apa yang dimaksud dengan waktu yang wajar? Standar waktunya adalah polynomial time. a. Polynomial time: O(n2), O(n3), O(1), O(n lg n) b. Not in polynomial time: O(2n), O(nn), O(n!) untuk n yang kecil Dikaitkan dengan Mesin Turing, sebuah persoalan dikatakan: 1. Solvable, jika terdapat mesin Turing yang dapat menyelesaikannya. 2. Unsolvable, jika tidak terdapat mesin Turing untuk menyelesaikannya. Solvable problem dibagi menjadi dua kategori: 1. Tractable 2. Intractable Gambar 5. 1 Solvable problem
64 Adakah persoalan yang unsolvable? Ada. Contoh Persoalan unsolvable yang terkenal dikemukakan oleh Alan Turing pada tahun 1963, yaitu halting problem. Halting problem: diberikan sebuah program komputer dan input untuk program tersebut, tentukan apakah program akan berhenti (halt) dengan input tersebut atau berlanjut bekerja secara tak terbatas (infinite loop)? Tabel 5.1 Persoalan Unsolvable - Kode program berikut i = 0 while (true) { i = i + 1} tidak pernah berhenti (infinite loop) - Sedangkan program printf ("Hello World!“); berhenti dengan cepat. Algoritma deterministik adalah algoritma yang dapat ditentukan dengan pasti aksi apa yang akan dikerjakan selanjutnya oleh algoritma tersebut. Algoritma deterministik bekerja sesuai dengan cara program dieksekusi oleh komputer. Semua algoritma yang sudah kita pelajari sejauh ini adalah algoritma deterministic.
65 Gambar 5. 2 Komputasi Deterministik 1. Algoritma non-deterministik adalah algoritma yang di dalamnya berhadapan dengan beberapa pilihan aksi (opsi), dan algoritma memiliki kemampuan untuk menerka atau memilih sebuah aksi. 2. Algoritma non-deterministik dijalankan mesin nondeterministik (komputer hipotetik, komputer bersifat imajiner atau teoritis). Contoh: mesin turing nondeterministic.
66 Gambar 5. 4 Perbedaan komputasi deterministik vs komputasi non deterministic Algoritma non deterministik dapat digunakan untuk menghampiri solusi persoalan-persoalan yang solusi eksaknya membutuhkan waktu komputasi yang mahal. Gambar 5. 3 Mesin Turing Nondeterminsitik
67 Misalnya untuk menyelesaikan persoalan TSP, Knapsack, dll. Ada dua tahap di dalam algoritma nondeterministik: 1. Tahap menerka atau memilih (non-deterministik): Diberikan instance persoalan, tahap ini memilih atau menerka satu opsi dari beberapa opsi yang ada. Bagaimana cara membuat pilihan itu tidak didefinisikan aturannya. 2. Tahap verifikasi (deterministik): memeriksa apakah opsi yang diterka menyatakan solusi. Luaran dari tahap ini adalah sinyal sukses jika solusi ditemukan atau sinyal gagal jika bukan solusi. Gambar 5. 5 Contoh: Non-deterministic Search
68 Dalam membahas teori P dan NP, kita hanya membatasi pada persoalan keputusan (decision problem). Persoalan keputusan adalah persoalan yang solusinya hanya jawaban “yes” atau “no” (ekivalen dengan accept/reject, ada/tidak ada, bisa/tidak bisa) Contoh: 1. Diberikan sebuah integer x. 2. Tentukan apakah elemen x terdapat di dalam tabel? Ada/tidak ada 3. Diberikan sebuah integer x. 4. Tentukan apakah x bilangan prima? Prima/tidak prima P Problems adalah himpunan semua persoalan keputusan yang dapat dipecahkan oleh algoritma dengan kebutuhan waktu polinom. Semua persoalan keputusan yang dapat diselesakan dalam waktu polinom adalah anggota himpunan P. 1. Problems non-deterministic polynomial Non-deterministic polynomial-time algorithm adalah algoritma non-deterministik yang tahap verifikasinya dapat dilakukan dalam waktu polinomial. Verifikasi dalam waktu polinom artinya: Jika diberikan sebuah kandidat jawaban, kita dapat memeriksa apakah jawaban itu benar atau salah
69 dalam waktu polinom. Ini berbeda dengan menemukan solusi Persoalan dalam waktu polinom. NP Problems adalah himpunan persoalan keputusan yang dapat diselesaikan oleh non-deterministic polynomial-time algorithm. Contoh verifikasi pada pewarnaan graf: Periksa apakah graf G= (V, E) di bawah ini dapat diwarnai dengan tiga warna sehingga tidak ada dua simpul bertetangga berwarna sama. Verifikasi jawaban: Assignment simpul-simpul dengan tiga warna adalah benar. Memeriksa apakah dua simpul bertetangga berwarna sama kompleksitasnya O(|E|) -> Polynomial. Contoh verifikasi pada Satisfiable Problem (SAT): Verifikasi jawaban: Assignment C dengan nilainilai kebenaran tersebut menghasilkan C = true -> O(1)
70 Sayangnya, menemukan solusi untuk kedua persoalan di atas sangat sukar Contoh-contoh persoalan NP: a. TSDP, sebab jika diberikan solusi sebagai sebuah terkaan tur, maka dibutuhkan O(n) untuk memverifikasi solusi. b. Integer Knapsack Decision problem P adalah himpunan bagian dari NP, atau P NP, karena setiap persoalan keputusan yang kompleksitas waktunya polinomial solusinya juga dapat diverifikasi dalam waktu polinom. Di dalam persoalan P tidak ada tahap menerka. Diagram Venn P NP mengindikasikan dua hal: a. P = NP (improper subset), atau b. P ≠ NP (atau P NP, proper subset) Tidak seorangpun pernah membuktikan bahwa P ≠ NP atau P = NP. Pertanyaan apakah P = NP adalah salah satu pertanyaan penting dalam ilmu komputer. Pertanyaan ini sangat penting sebab, seperti telah disebutkan sebelumnya, kebanyakan P NP NP P
71 persoalan keputusan adalah NP. Karena itu, jika P = NP, maka betapa banyak persoalan keputusan yang dapat dipecahkan secara sangkil (efisien) dengan algoritma yang kebutuhan waktunya polinom. Namun kenyataannya, banyak ahli yang telah gagal menemukan algoritma waktu-polinom untuk persoalan NP. Karena itu, cukup aman kalau kita mengasumsikan saat ini bahwa P ≠ NP. Gambar 5. 6 Commonly believed relationship between P and NP Contoh: Persoalan sirkuit Hamilton Solusinya adalah: 1 – 2 – 3 – 6 – 7 – 8 – 9 – 10 – 11 – 5 – 4 – 1 a. Dapat diverifikasi dengan cepat b. Menemukan solusinya membutuhkan waktu eksponensial
72 2. NP-Complete Problems NP-Complete (NPC) adalah persoalan NP yang paling menarik perhatian. Definisi NPC adalah Sebuah persoalan X dikatakan NPC jika: a. X termasuk ke dalam kelas NP b. Setiap persoalan di dalam NP dapat direduksi menjadi X dalam waktu polinom Konsekuensi dari definisi di atas adalah jika kita dapat menemukan algoritma dengan waktu polinom untuk menyelesaikan persoalan X, maka kita dapat memecahkan semua persoalan di dalam kelas NP dalam waktu polinom. Nama "NP-complete" adalah kependekan dari "nondeterministic polynomial-time complete". Dalam nama ini, "nondeterministik" mengacu pada mesin Turing nondeterministik , suatu cara memformalkan secara matematis gagasan algoritma pencarian brute force. Waktu polinomial mengacu pada jumlah waktu yang dianggap "cepat" bagi algoritma deterministik untuk memeriksa solusi tunggal, atau bagi mesin Turing nondeterministik untuk melakukan seluruh pencarian. "Complete" mengacu pada properti yang mampu mensimulasikan segala sesuatu dalam kelas kompleksitas yang sama.
73 Properti NP-Complete a. Persoalan X adalah NPC jika sembarang persoalan lain di dalam NP dapat direduksi (ditransformasikan) menjadi X dalam waktu polinom b. Dua persoalan sembarang di dalam NPC dapat ditransformasikan satu sama lain dalam waktu polinom - X ditransformasi menjadi Y dalam waktu polinom - Y ditransformasi menjadi X dalam waktu polinom - Cara termudah untuk membuktikan sebuah persoalan baru Z adalah NPC adalah menemukan sebuah algoritma dalam waktu polinom untuk mentransformasikan sebuah persoalan yang sudah dikenal NPC menjadi persoalan Z. Jadi, untuk menunjukkan bahwa Z adalah NPC, caranya adalah sebagai berikut: a. Tunjukkan bahwa Z adalah anggota NP
74 b. Pilih Y yang sesuai dari koleksi persoalan NPC. c. Tunjukkan sebuah algoritma dalam waktu polinom untuk mentransformasikan instance persoalan Y menjadi instance persoalan Z. Contoh: Kita pilih sebuah persoalan dari NPC yaitu sirkuit Hamilton (HCP, Hamiltonian Circuit Problem) untuk menunjukkan bahwa persoalan TSDP juga termasuk ke dalam NPC. Jadi, di sini Y = HCP, dan Z = TSDP Persoalan HCP: Diberikan sebuah graf G dengan n buah simpul, tentukan apakah graf tersebut mengandung sirkuit Hamilton. Sirkuit Hamilton adalah sirkuit yang melalui setiap simpul di dalam graf G dan kembali lagi ke simpul semula.
75 Perhatikan bahwa sirkuit Hamilton di dalam graf G dengan n simpul akan mempunyai n buah sisi Untuk mentransformasikan instans HCP menjadi instans TSDP, maka algoritma transformasi yang sederhana adalah sbb: a. Setiap sisi di dalam graf G diberi nilai (bobot) 1 b. Nyatakan persoalan menjadi TSDP, yaitu adakah tur dengan total bobot n? Transformasi ini (yaitu memberi bobot setiap sisi dengan nilai 1) membutuhkan waktu polinom, yaitu O(m), m adalah jumlah sisi di dalam graf. Dengan transformasi ini, maka persoalan HCP sudah ditransformasi menjadi instans persoalan TSDP. Misalkan di dalam graf G = (V, E), |E| = m, yaitu jumlah sisi di dalam graf adalah n. Maka, algoritma memberi setiap sisi di dalam graf G dengan 1 adalah sbb: for tiap sisi (u, v) ∈ E do (u, v) 1
76 end Jumlah pengulangan untuk (u, v) 1 adalah sebanyak m kali, sehingga: T(n) = m = O(m) → polinomial Transformasi ini memberi sugesti bahwa jika TSDP dapat diselesaikan dalam waktu dalam polinom, maka HCP juga dapat diselesaikan dalam waktu polinom. Transformasi ini memberi sugesti bahwa jika TSDP dapat diselesaikan dalam waktu dalam polinom, maka HCP juga dapat diselesaikan dalam waktu polinom. Contoh Implementasi Sirkuit Hamilton Pada Python Berikut merupakan contoh implementasi sirkuit Hamilton pada python: # Python program for solution of hamiltonian cycle problem class Graph(): def __init__(self, vertices): self.graph = [[0 for column in range(vertices)] for row in range(vertices)] self.V = vertices
77 ''' Check if this vertex is an adjacent vertex of the previously added vertex and is not included in the path earlier ''' def isSafe(self, v, pos, path): # Check if current vertex and last vertex in path are adjacent if self.graph[ path[pos-1] ][v] == 0: return False # Check if current vertex not already in path for vertex in path: if vertex == v: return False return True # A recursive utility function to solve hamiltonian cycle problem def hamCycleUtil(self, path, pos):
78 # base case: if all vertices are included in the path if pos == self.V: # Last vertex must be adjacent to the first vertex in path to make a cycle if self.graph[ path[pos-1] ][ path[0] ] == 1: return True else: return False # Try different vertices as a next candidate in Hamiltonian Cycle. We don't try for 0 as # we included 0 as starting point in hamCycle() for v in range(1,self.V): if self.isSafe(v, pos, path) == True: path[pos] = v if self.hamCycleUtil(path, pos+1) == True: return True
79 # Remove current vertex if it doesn't lead to a solution path[pos] = -1 return False def hamCycle(self): path = [-1] * self.V ''' Let us put vertex 0 as the first vertex in the path. If there is a Hamiltonian Cycle, then the path can be started from any point of the cycle as the graph is undirected ''' path[0] = 0 if self.hamCycleUtil(path,1) == False: print ("Solution does not exist\n") return False self.printSolution(path)
80 return True def printSolution(self, path): print ("Solution Exists: Following", "is one Hamiltonian Cycle") for vertex in path: print (vertex, end = " ") print (path[0], "\n") # Driver Code ''' Let us create the following graph (0)--(1)--(2) | / \ | | / \ | | / \ | (3)-------(4) ''' g1 = Graph(5) g1.graph = [ [0, 1, 0, 1, 0], [1, 0, 1, 1, 1], [0, 1, 0, 0, 1,],[1, 1, 0, 0, 1],
81 [0, 1, 1, 1, 0], ] # Print the solution g1.hamCycle(); ''' Let us create the following graph (0)--(1)--(2) | / \ | | / \ | | / \ | (3) (4) ''' g2 = Graph(5) g2.graph = [ [0, 1, 0, 1, 0], [1, 0, 1, 1, 1], [0, 1, 0, 0, 1,], [1, 1, 0, 0, 0], [0, 1, 1, 0, 0], ] # Print the solution g2.hamCycle();
82 Hasil yang didapatkan Algoritma pendekatan adalah heuristik waktu polinomial yang tidak selalu menemukan solusi optimal tetapi berbeda dari heuristik umum dalam memberikan jaminan atas kualitas solusi yang dihasilkannya. Penggunaan algoritma pendekatan tidak terbatas hanya pada masalah optimasi NP-Hard. Secara umum, ide-ide dari perkiraan dapat digunakan untuk memecahkan banyak masalah di mana menemukan solusi yang tepat akan memerlukan terlalu banyak sumber daya. Terdapat dua pendekatan yang dimiliki algoritma pemrograman • Pendekatan Top-Down Perhitungan dilakukan dari tahap 1, 2, …, n – 1, n • Pendekatan Bottom-Up Perhitungan dilakukan dari tahap n, n – 1, …, 2, 1 1. Pendekatan Top-Down Pendekatan top-down mengikuti teknik menghafal. Ini terdiri dari dua peristiwa berbeda: rekursi dan caching. 'Rekursi' mewakili proses komputasi
83 dengan memanggil fungsi berulang kali, sedangkan 'caching' mewakili penyimpanan hasil antara. Misalkan x1 , x2 , …, xn menyatakan peubah (variable) keputusan yang harus ditentukan masingmasing untuk tahap 1, 2, …, n. Maka, pendekatan top-down mulai dari tahap 1, terus maju ke tahap 2, 3, dan seterusnya sampai tahap n. Rangkaian peubah keputusan adalah x1 , x2 , …, xn. 2. Pendekatan Bottom-Up Pendekatan ini menggunakan teknik tabulasi untuk mengimplementasikan solusi pemrograman dinamis. Ini mengatasi masalah yang sama seperti sebelumnya, tetapi tanpa rekursi. Rekursi diganti dengan iterasi dalam pendekatan ini. Oleh karena itu, tidak ada kesalahan stack overflow atau overhead prosedur rekursif. Kami memelihara tabel (matriks 3D) untuk menyelesaikan masalah dalam metode ini. Misalkan x1 , x2 , …, xn menyatakan peubah (variable) keputusan yang harus ditentukan masingmasing untuk tahap 1, 2, …, n. Maka, pendekatan bottom-up mulai dari tahap n, terus mundur ke tahap n – 1, n – 2, dan seterusnya sampai tahap 1. Rangkaian peubah keputusan adalah xn , xn-1 , …, x1 .
84 3. Perbandingan Pendekatan Top-Down dan BottomUp Tabel 5. 2 Top-Down vs Bottom-Up PENDEKATAN TOP-DOWN PENDEKATAN BOTTOM-UP Menggunakan teknik menghafal Menggunakan teknik tabulasi Sifat rekursif Sifatnya yang berulang Bahasa pemrograman terstruktur seperti COBOL, Fortran, C, dan lain-lain kebanyakan menggunakan teknik ini Bahasa pemrograman berorientasi objek seperti C++, C#, dan Python kebanyakan menggunakan teknik ini Pendekatan ini menggunakan dekomposisi untuk merumuskan solusi Pendekatan ini menggunakan komposisi untuk mengembangkan solusi Tabel pencarian dipelihara dan diperiksa sebelum menghitung submasalah apa pun Solusinya dibangun dari kasus paling bawah menggunakan iterasi
85 DAFTAR PUSTAKA Rinaldi Munir. 2020. Teori P, NP, dan NP-Complete Chandra Chekuri. 2021. CS 583: Approximation Algorithms Rinaldi Munir. 2021. Pengantar Strategi Algoritma Rinaldi Munir. 2020. Program Dinamis https://www.geeksforgeeks.org/hamiltonian-cycle https://www-simplilearncom.translate.goog/tutorials/data-structuretutorial/what-is-dynamicprogramming?_x_tr_sl=en&_x_tr_tl=id&_x_tr_h l=id&_x_tr_pto=tc Munir, Rinaldi. 2022. Algoritma Brute Force Bagian 1. https://informatika.stei.itb.ac.id/~rinaldi.munir/ Stmik/2021- 2022/Algoritma-Brute-Force-(2022)- Bag1.pdf Munir, Rinaldi. 2022. Breadth/Depth First Search (BFS/DFS) Bagian 1. https://informatika.stei.itb.ac.id/~rinaldi.munir/ Stmik/2020-2021/BFS-DFS-2021-Bag1.pdf
86 Munir, Rinaldi. 2022. Breadth/Depth First Search (BFS/DFS) Bagian 2. https://informatika.stei.itb.ac.id/~rinaldi.munir/ Stmik/2020-2021/BFS-DFS-2021-Bag2.pdf Munir, Rinaldi. 2022. Algoritma Runut-balik (Backtracking) Bagian 1. https://informatika.stei.itb.ac.id/~rinaldi.munir/ Stmik/2020- 2021/Algoritma-backtracking-2021- Bagian1.pdf https://ids.ac.id/apa-itu-pemrograman-dinamis/ https://fikti.umsu.ac.id/algoritma-greedy-pengertianjenis-dan-contoh-program/ https://repository.unej.ac.id/bitstream/handle/12345678 9/6944/Winda%20Mega%20Arista%20- %20071810101019.pdf?sequence=1 https://docplayer.info/31319796-Laporan-analisisalgoritma-dynamic-programming-laporan-inidisusun-sebagai-tugas-pengganti-kuis-padamata-kuliah-analisis-algoritma.html file:///C:/Users/dil/Downloads/pdf-makalah-algoritmagreedy-dan-dinamis_compress.pdf https://repository.unej.ac.id/bitstream/handle/12345678 9/6944/Winda%20Mega%20Arista%20- %20071810101019.pdf?sequence=1 https://informatika.stei.itb.ac.id/~rinaldi.munir/Stmik/2 016-2017/Makalah2017/Makalah-IF2211-2017- 139.pdf
87 https://media.neliti.com/media/publications/439699- none-6affe6ed.pdf https://codingstudio.id/blog/algoritma-adalahpengertian-jenis-dan-contoh/ http://repositori.uinalauddin.ac.id/1714/1/Muhammad%20Hasan.pf https://repository.unsri.ac.id/22757/1/16.Penerapan%20 algoritma%20dynamic%20programming%20- 2017.pdf
88 TENTANG PENULIS Walangi, S. T. Walangi, S. T. Lulus S1 di Program Studi Teknik Informatika Fakultas Teknik di STT Duta Bangsa tahun 2022. Saat ini adalah guru produktif TKJ di SMKS Bina Nasional informatika dan tengan menempuh pendidikan S2 sebagai mahasiswa aktif Universitas Pamulang. Pernah menjadi pemateri pada seminar prosiding nasional. Thoyyibah. T. S. Kom. M. Kom. Thoyyibah. T. S. Kom. M. Kom. Lulus S1 di Program Studi Teknik Informatika Fakultas Sains dan Teknologi tahun 2011. Lulus S2 di IPB tahun 2014. Lulus S3 di BINUS tahun 2023. Saat ini adalah dosen tetap Universitas Pamulang. Mengampu mata kuliah Komunikasi Data, Jaringan, Automata, Kecerdasan Buatan, Logika Informatika dll. Aktif menulis artikel di berbagai jurnal ilmiah. Beberapa kali menjadi pemakalah seminar prosiding nasional dan Internasional. Rinna Rachmatika, S. Kom. M. Kom. Rinna Rachmatika, S. Kom. M. Kom. Berprofesi sebagai dosen di Universitas Pamulang. Bidang Penelitiannya adalah Data Mining dan Linear Programming. Pernah mengikuti konfrensi nasional dan internasional. S1 dan S2 dari Universitas Pamulang.
89