BAB 2 LANDASAN TEORI 2.1 Permasalahan NP-Hard dan NP-Complete Salah satu ukuran biaya dalam pengeksekusian sebuah algoritma adalah lamanya waktu yang diperlukan. Pengukuran waktu yang diperlukan dalam mengeksekusi suatu algoritma dinamakan kompleksitas waktu (time complexity) algoritma tersebut. Namun juga masih ada ukuran–ukuran lainnya, misalnya besarnya memori yang diperlukan untuk mengeksekusi algoritma tersebut (Liu, C.L, 1995, p272). Besarnya waktu yang dibutuhkan algoritma untuk menyelesaikan sebuah permasalahan sebanding dengan jumlah inputan yang diberikan untuk permasalahan tersebut. Semakin besar data maka akan semakin besar waktu yang diperlukan. (Weiss, Mark Allen, 1996, p149). Waktu yang dibutuhkan algoritma terbaik untuk menghasilkan solusi dari banyak problem (permasalahan) dapat dibagi menjadi dua kelompok. Kelompok pertama terdiri dari problem di mana waktu yang dibutuhkan untuk menghasilkan solusinya terbatas pada waktu polynomial dalam tingkat kecil disebut juga Polynomial Problem (P), seperti permasalahan evaluasi polynomial dengan O(n), pengurutan (sorting) dengan O(n log n) dan string editing dengan O(mn). Kelompok kedua terdiri dari permasalahan dengan algoritma Non Polynomial (NP), seperti permasalahan traveling sales person dengan O(n22n) dan permasalahan Knapsack dengan O(2n/2). Dalam pencarian untuk mengembangkan algoritma yang efisien, tidak satupun yang dapat mengembangkan algoritma dengan waktu polynomial untuk permasalahan kelompok kedua. Hal ini sangat penting karena algoritma yang waktu pencarian solusinya lebih besar dari polynomial (biasanya waktu pencarian adalah eksponensial) membutuhkan waktu yang cukup lama 5 untuk menjalankan problem skala menengah. (Horowitz, Sahni dan Rajasekaran, 1998, pp 495-553). Algoritma Non Polynomial (NP) dibagi menjadi dua kelas yaitu NP-hard dan NP-complete. Suatu problem yang termasuk kedalam NP-complete memiliki sifat dapat dipecahkan dalam waktu polynomial jika dan hanya jika seluruh problem NP-complete juga dapat dipecahkan dalam waktu polynomial. Jika sebuah problem NP-hard dapat dipecahkan dalam waktu polynomial maka seluruh problem NP-complete dapat dipecahkan dalam waktu polynomial. Seluruh problem NP-complete merupakan problem NP-hard, tetapi sebagian problem NP-hard belum tentu menjadi problem NP-complete (Horowitz, Sahni dan Rajasekaran, 1998, pp 495-553). Hubungan antara P, NP, NPcompelete dan NP-hard dapat dilihat dengan jelas dengan gambar berikut. Gambar 2.1 Relasi antara P, NP, NP-complete dan NP-hard 6 2.2 Definisi Heuristic Definisi Heuristic yang didapat dari berbagai sumber diterangkan pada penjelasan berikut ini: 1. Sebuah algoritma heuristic adalah suatu aturan untuk mengetahui bagaimana memecahkan permasalahan tertentu, tidak memberikan instruksi yang spesifik tetapi panduan umum untuk bermacam pendekatan yang mungkin dapat bekerja. (http://thesaurus.maths.org) 2. Istilah heuristic digunakan untuk algoritma di mana mencari solusi melalui semua kemungkinan yang ada, tetapi dalam pencariannya tidak bisa dijamin ditemukan solusi yang terbaik, oleh karena itu heuristic dapat dianggap algoritma perkiraan. Algoritma ini biasanya mencari solusi yang dekat dengan solusi terbaik dan proses pencariannya cepat dan mudah. Terkadang algortima ini dapat menjadi akurat dan menemukan solusi terbaik, tetapi algoritma ini tetap disebut heuristic hingga solusi terbaik itu terbukti untuk menjadi yang terbaik. (http://students.ceid.upatras.gr/) 2.3 0-1 Knapsack Problem Knapsack problem adalah suatu masalah dalam persoalan optimasi kombinatorial. Knapsack problem memperoleh namanya dari suatu masalah seorang pendaki gunung yang hanya dapat membawa barang pada tasnya maksimal pada berat tertentu, misalkan 15 kg dan ia harus membawa beberapa macam barang yang memiliki berat dan harga tertentu untuk ia jual, sehingga ia mendapatkan hasil keuntungan yang maksimal. 7 Knapsack problem (Martello, 1990, p13) ini bila diformulasikan secara matematis dengan banyaknya jumlah barang dari 1 sampai n dan sebuah vektor variabel biner xj (j = 1,...,n) sehingga berarti: xj = { 1 jika objek j dipilih 0 jika sebaliknya Kemudian, jika pj ukuran keuntungan yang diberikan barang j, wj adalah berat dari barang tersebut dan c adalah kapasitas maksimum yang dapat ditampung maka: n ∑ j =1 w jx j ≤ c, dan persamaan yang menghasilkan keuntungan maksimum adalah: n ∑ j =1 p jx j. xj = 0 atau 1. Jika dimisalkan ada suatu persoalan dengan n = 8, dimana: (pj) = (15, 100, 90, 60, 40, 15, 10, 1), (wj) = ( 2, 20, 20, 30, 40, 30, 60, 10), c = 102 Maka hasil optimal yang dihasilkan adalah x = (1, 1, 1, 1, 0, 1, 0, 0), dengan nilai keuntungan maksimum z = 280. 2.4 Bin Packing Dalam problem ini diberikan obyek sebanyak n (element) yang harus ditempatkan pada bin (tempat penyimpanan) dengan kapasitas L. Obyek i membutuhkan 8 unit li dari kapasitas bin. Tujuan bin packing adalah untuk menentukan jumlah bin yang dibutuhkan untuk menampung seluruh obyek n. tidak boleh ada obyek yang ditempatkan sebagian di dalam suatu bin dan sebagian lain di dalam bin lainnya. Three dimensional Bin Packing Problem juga digolongkan kedalam permasalahan NP-Hard. Digolongkan kedalam NP-Hard karena secara teori dan prakteknya sangat sulit dipecahkan. Apabila contoh permasalahan hanya sedikit maka dapat ditemukan solusinya secara mudah, tetapi dalam dunia nyata permasalahan sangatlah banyak dan kompleks, oleh karena itu dilakukan pendekatan heuristic. Pendekatan heuristic yang paling umum dan mendekati pemecahan problem ialah wall building algorithm. 2.4.1 Wall Building Heuristic Wall building heuristic mengisi kontainer dengan sejumlah layer yang sejajar dengan kedalaman kontainer. Algoritma ini hanya mempertimbangkan layer dengan kedalaman (d) tertentu yang sesuai dengan dimensi kotak, hal ini disebut normalized layer depth (Pisinger, 2002, p4). Untuk lebih jelasnya dapat dilihat pada gambar 2.2 berikut. 9 Gambar 2.2 wall building algorithm Tetapi kedalaman sebuah layer harus diseleksi secara teliti, hal ini dilakukan agar tercapainya solusi yang baik. Oleh karena itu ketika membuat sebuah layer, algoritma ini menerapkan aturan pengurutan untuk memilih nilai d. Diantara kotak yang tersisa, akan dipilih kotak yang memiliki dimensi terbesar. Alasan utama kenapa hal ini dilakukan karena kotak tersebut akan sulit untuk dimuat apabila dilakukan urutan terakhir didalam prosedur pengepakan. Setelah kedalaman layer ditentukan, akan dilakukan pengepakan dengan metode greedy per baris secara horizontal (horizontal strip) disetiap potongan layer. Setiap potongan akan dimasukkan kotak yang tersisa secara berurutan berdasarkan urutan panjang kotak yang terbesar terlebih dahulu. Seperti dijelaskan pada gambar 2.3 berikut 10 Gambar 2.3 setiap layer diisi oleh beberapa baris horizontal box 2.4.2 Tree Search Algoritma ini adalah pengembangan dari algoritma wall building dengan menggunakan algoritma tree search (Pisinger, 2002, p5-9) untuk menentukan layer depth dan strip width yang akan menghasilkan pengisian yang paling optimal. Idealnya untuk mendapatkan hasil yang terbaik semua normalized layer depth dan strip perlu dipertimbangkan, tetapi hal ini akan memerlukan kemampuan komputasi yang amat besar. Oleh karena itu untuk mengurangi kompleksitas komputasi diterapkan pendekatan m-cut dimana hanya sub-node tertentu saja yang dapat dipertimbangkan dari setiap branching node. Kemudian pada setiap branching node dipertimbangkan M1 layer depth berbeda yang dipilih berdasarkan suatu ranking rule. Lalu setiap layer tersebut diisi dengan beberapa strip, dimana setiap strip tersebut dapat disusun secara vertikal ataupun horizontal. Hanya M2 strips width tertentu yang dipertimbangkan. Ketika layer depth dan strip width telah ditentukan, strip tersebut segera diisi secara optimal dengan menggunakan Knapsack Problem. Dari M1 layer depth yang telah diisi itu dipilihlah sebuah layer yang memiliki hasil volume yang paling optimal. Setelah itu dilanjutkan dengan memproses layer yang berikutnya. Nilai dari M1 adalah 4 dan M2 adalah 8 nilai 11 yang memiliki kualitas solusi terbaik dan waktu komputasi yang paling efisien, kedua nilai itu diperoleh dari berbagai eksperimen yang telah dilakukan oleh pencipta algoritma ini. Pada setiap branching node terdapat tiga buah fungsi untuk menentukan ranking depth dan width yang terbaik pada suatu layer atau strip, yaitu: • Fungsi frekuensi f1 mengembalikan nilai hasil perbandingan suatu dimensi k dengan dimensi-dimensi lainnya dengan membandingkan semua dimensi wi, hi, di pada kotak-kotak yang lain. untuk k = α,..., β • Fungsi frekuensi f2 mengembalikan nilai hasil perbandingan suatu dimensi k dengan dimensi yang terbesar pada setiap kotak lainnya. untuk k = α,..., β • Fungsi frekuensi f3 mengembalikan nilai hasil perbandingan suatu dimensi k dengan dimensi yang terkecil pada setiap kotak lainnya. untuk k = α,..., β wi, hi, di = ukuran lebar, tinggi dan panjang suatu kotak k = ukuran salah satu sisi kotak α = ukuran sisi paling kecil pada seluruh kotak β = ukuran sisi paling besar pada seluruh kotak 12 Kemudian berdasarkan ketiga fungsi frekuensi tersebut dapat ditentukan sejumlah aturan prioritas. Tujuan dari seluruh aturan ini adalah untuk memilih kotak yang memiliki ukuran/dimensi yang terbesar lebih dahulu atau memilih kotak yang memiliki frekuensi paling banyak. Setelah itu strip tersebut dapat diisi baik secara vertikal ataupun horizontal Pengisian strip yang berukuran width w’ dan depth d’ tersebut dapat dianggap sebagai Knapsack Problem. Pertama-tama setiap kotak j dapat diputar ke salah satu arah dari enam kemungkinan arah putaran dimana wj ≤ w’, dj ≤ d’ dan h’ telah diminimalkan. Jika masih tidak memungkinkan untuk memasukkan kotak j pada w’ × d’ maka masukkan kotak tersebut pada daftar kotak yang tidak dapat dimasukkan, D. Atau dengan menentukan aj = hj= weight cj = vj = wjhjdj = profit Untuk setiap kotak yang ada dimana kotak j ∈ N\D. Sehingga strip packing problem tersebut menjadi maximize ∑c j∈ N \ D subject to ∑ j xj a jx j ≤ b j∈ N \ D x j ∈ {0 ,1}, j ∈ N \ D dimana N\D adalah kumpulan kotak yang dapat dimasukkan dan b adalah strip height. Lalu hasil yang diperoleh dapat lebih dioptimalkan lagi dengan cara memasangkan kotak-kotak tersebut dua dua ketika memungkinkan. Karena 13 kekompleksitasan dari algoritma ini O(n2) cara ini hanya dapat dilakukan sekali untuk setiap layer yang memiliki depth d’. Ketika sebuah kotak j telah diputar sedemikian rupa sehingga depth dj adalah kemungkinan yang paling memuaskan, dj ≤ d’. Suatu cara untuk mengetahui seberapa baik kotak tersebut dapat mengisi depth tersebut adalah α(j) = vj/(wjhjd’) = dj/d’ dengan tujuan dapat mengoptimalkan pengisian dengan memasangkan kotak j dengan kotak lain misalkan kotak i. Sehingga untuk setiap kotak i ≠ j semua kemungkinan rotasi dari i dan j juga dipertimbangkan dimana di + dj ≤ d’, setiap kali menghitung rasio β(i,j) = (vi + vj)/(d’ max{wi,wj} max {hi,hj}) Jika β(i,j) ≤ α(j) untuk semua kotak i dan semua rotasi, maka kotak j tetap dibiarkan sendiri tanpa dipasangkan dengan kotak lain. Sebaliknya jika β(i,j) > α(j) maka sebuah kotak baru, kotak k telah terbentuk dengan dimensi wk = max{wi,wj}; hk = max{hi,hj}; dk = d’ Sedangkan kedua kotak asalnya dikeluarkan dari daftar kotak untuk menghindari kotakkotak tersebut digunakan untuk kedua kalinya. 2.5 Pemodelan Piranti Lunak Pemodelan dalam suatu rekayasa piranti lunak merupakan suatu hal yang dilakukan ditahap awal. Pemodelan ini akan mempengaruhi pekerjaan-pekerjaan dalam rekayasa piranti lunak ini selanjutnya. Menurut Pressman (2005): Perangkat lunak adalah (1) perintah (program komputer) yang bila dieksekusi akan memberikan fungsi dan unjuk kerja seperti yang diinginkan. (2) struktur data yang 14 memungkinkan program memanipulasi informasi secara proporsional, dan (3) dokumen yang menggambarkan operasi dan kegunaan program. Salah satu cara perancangan perangkat lunak adalah dengan menggunakan model air terjun (waterfall model). Menurut Sommerville (1995), tahap-tahap utama dalam model air terjun dapat digambarkan dalam aktivitas dasar pengembangan seperti berikut ini: • Analisis dan penentuan kebutuhan Tugas, kendala dan tujuan sistem ditentukan melalui konsultasi dengan pengguna sistem, kemudian ditentukan cara yang dapat dipahami baik oleh pengguna maupun staf pengembang. • Desain sistem dan perangkat lunak Proses desain sistem terbagi dalam kebutuhan perangkat keras dan perangkat lunak. Hal ini menentukan arsitektur perangkat lunak secara keseluruhan. Desain perangkat lunak mewakili fungsi sistem perangkat lunak dalam suatu bentuk yang dapat ditranformasikan ke dalam satu atau lebih program yang dapat dieksekusi. • Implementasi dan pengujian unit Dalam tahap ini, desain perangkat lunak direalisasikan dalam suatu himpunan program atau unit-unit program pengujian, mencakup kegiatan verifikasi terhadap setiap unit sehingga memenuhi syarat spesifikasinya. • Integrasi dan pengujian sistem Unit program secara individual diintegrasikan dan diuji sebagai satu sistem yang lengkap untuk memastikan bahwa kebutuhan perangkat lunak telah terpenuhi. 15 Setelah pengujian, sistem perangkat lunak disampaikan kepada pengguna. • Pengoperasian dan pemeliharaan Secara normal, walaupun tidak perlu, tahap ini merupakan fase siklus hidup yang terpanjang. Sistem telah terpasang dan sedang dalam penggunaan. Pemeliharaan mencakup perbaikan kesalahan yang tidak ditemukan dalam tahap-tahap ini sebelumnya, meningkatkan implementasi unit-unit sistem dan mempertinggi pelayanan sistem sebagai kebutuhan baru yang ditemukan. Analisis dan pemenuhan kebutuhan Desain sistem dan perangkat lunak Implementasi dan pengujian unit Integrasi dan pengujian sistem Pengoperasian dan pemeliharaan Gambar 2.4 Perancangan Perangkat Lunak Model Waterfall Sumber : Sommerville (1995). 2.6 Alat Bantu Perancangan 2.6.1 Diagram Alir (Flowchart) Diagram alir adalah sebuah skema yang merepresentasikan sebuah algoritma atau sebuah proses (http://en.wikipedia.org/wiki/Flowchart). 16 Adapun simbol-simbol dari diagram alir yang digunakan dalam ilmu komputer seperti pada gambar 2.4. Simbol untuk mulai dan selesai Simbol untuk menentukan aliran data yang dilakukan Simbol untuk langkah proses Simbol untuk input ataupun output Simbol untuk merepresentasikan sebuah kondisi atau keputusan. Biasanya berisi pertanyaan ya/tidak atau test benar/salah Gambar 2.5 Simbol-simbol Diagram Alir (http://en.wikipedia.org/wiki/Flowchart) 2.6.2 Pseudocode Pseudocode adalah suatu bahasa pemrograman yang informal dan sangat fleksibel, yang tidak dimaksudkan untuk dieksekusi pada mesin, tetapi hanya digunakan untuk mengatur pemikiran program sebelum melakukan pengkodean (Page-Jones, 1980, p11). 17 Pseudocode dapat merupakan alternatif lain dalam perancangan perangkat lunak disamping alat-alat bantu berupa diagram. Tidak ada standarisasi dalam hal penulisan pseudocode. Pemrogram dapat menulisnya dalam bahasa apa saja yang mereka sukai dengan dipadukan dengan bahasa pemrograman tertentu. Pemrogram juga bebas menggunakan teknik dan aturannya sendiri. Robertson (1993, p6-7) menulis pseudocode-nya dengan menggunakan perjanjian sebagai berikut: 1. Pernyataan ditulis dalam bahasa Inggris sederhana. 2. Setiap perintah ditulis pada baris tersendiri. 3. Kata kunci atau identasi (penulisan yang menjorok ke dalam) digunakan untuk menandai struktur kontrol khusus. 4. Setiap himpunan perintah ditulis dari atas ke bawah dengan hanya satu awal dan satu akhir program. 5. Kumpulan pernyataan-pernyataan dapat dibentuk dalam modul-modul yang diberi nama tertentu.