Metaheuristic Optimization – Advanced

Metaheuristic pengertiannya telah sedikit diulas pada postingan yang lalu. Di sini sedikit diulas metode-metode yang dapat dikatakan advanced. Namun di sini advanced tidak serta-merta untuk tingkat lanjut melainkan sekedar memberitahukan metode-metode terbaru berdasarkan artikel-artikel jurnal yang sudah diterbitkan.

Metode heuristik terkini dapat diklasifikasikan berdasarkan aliran algoritma pencariannya, antara lain:

  • Mengambil inspirasi dari sifat-sifat alami (nature)
  • Mengambil inspirasi dari sifat-sifat fisika

Sifat-sifat yang diambil dari hukum alam telah banyak diteliti di metaheuristik, tetapi yang terkini dapat dirinci sebagai berikut:

  • PSO, bersasarkan sekolompok binatang dalam mencari makan
  • Dolphin     Echolocation (DE), berdasarkan teknik sonar yang dimiliki oleh lumba-lumba
  • Big Bang-Big Crunch (BB-BC), berdasarkan teori evolusi alam
  • Cuckoo Search (CS), berdasarkan sifat burung
  • Imperialist Competitive Algorithm (ICA)

Sementara itu ada algoritma-algoritma yang diambil dari sifat fisika, antara lain:

  • Charged System Search (CSS) dan Magnetic Charged System Search (MCSS), berdasarkan hukum Coulomb dan Newton
  • Colliding Bodies Optimization (CBO), berdasarkan tumbukan satu dimensi partikel
  • Ray Optimization (RO), berdasarkan hukum refraksi cahaya (snell)

Demikian kira-kira metode advanced metaheuristic yang bisa dibaca dari literatur-literatur baik jurnal maupun buku. Sekian informasinya, mudah-mudahan bisa dijelaskan lebih detil pada postingan berikutnya.

Mengambil File Microsoft Word dan Indexing Pada Matlab

[inf.retrievalt.komputer|lab.software|pert.9]

Salah satu langkah perolehan informasi yang penting adalah pembuatan indeks. Indeks merupakan salah satu kunci untuk pencarian informasi. Untuk menghasilkan pengindeks yang baik perlu menggunakan teknik-teknik yang ada pada pemrosesan teks. Postingan kali ini bermaksud mengetahui cara pembuatan indeks dengan file yang diambil dari microsoft word.

Mengambil File Ms Word

Banyak informasi yang memberikan cara bagaimana mengambil file word agar bisa diproses lebih lanjut pada Matlab. Biasanya file yang langsung bisa digunakan adalah file berekstensi txt, namun karena banyaknya file berformat DOC atau DOCX maka perlu mengetahui cara pengambilan file bertipe itu agar bisa diolah lebih lanjut pada Matlab. Agar lebih nyaman, ada baiknya membuat Graphic User Interface (GUI) agar lebih mudah digunakan atau disimpan agar mudah digunakan nantinya.

Masuk ke callback Ambil File dan isikan kode berikut menggunakan uigetfile yang mengeluarkan form ambil file. Akhiri dengan membuat variabel agar bisa digunakan nantinya lewat mekanisme handles.

  • [a,b]=uigetfile(‘*.docx’)
  • handles.a=a;
  • handles.b=b;
  • guidata(hObject,handles)

Sementara pada callback Pra-Proses diisi dengan kode-kode berikut dimulai dari mengambil data dari word:

  • word = actxserver(‘Word.Application’);
  • file=strcat(handles.b,handles.a)
  • wdoc = word.Documents.Open(file);
  • sometext = wdoc.Content.Text;

Variabel “file” merupakan string yang diambil dari instruksi “uigetfile” pada pushbutton sebelumnya yang kemudian disimpan dalam variabel sometext. (Lihat penjelasannya di buku Text Mining dengan Matlab karya Bachs).

  • temp = sometext
  • temp = lower(temp)
  • temp = regexprep(temp,'</verse>’,’ S ‘)
  • temp = regexprep(temp,'<.*?”‘,”)
  • temp= regexprep(temp,’ ‘,”’,”’)
  • temp = regexprep(temp,’\W’,’ ‘)
  • temp = strtrim(regexprep(temp,’\s*’,’ ‘))
  • temp=regexprep(temp,’ ‘,”’,”’)
  • eval([‘wordsofverses={”’,temp,”’};’]);
  • limits = [0,find(strcmp(wordsofverses,’S’))]
  • for k=1:length(limits)-1
  • verses(k).vocab = unique(wordsofverses(limits(k)+1:limits(k+1)-1));
  • end;

Variabel “temp” berisi hasil pemrosesan yang dimulai dari lower untuk mengecilkan seluruh huruf hingga mengkonversi string word tersebut menjadi cell dalam variabel wordsofverses. Hasilnya kira-kira sebagai berikut. Semoga bermanfaat.

Lex and Yacc via Konsol (DOS Prompt)

[t.kompilasi|t.informatika|s.103|pert.11]

Jika yang lalu telah dibahas membuat kompiler lewat GUI Lex and Yacc, terkadang perlu mencoba lewat mode console karena jika bisa dengan mode ini, akan mudah jika menggunakan versi linux-nya. Coba masuk ke folder Lex and yacc di folder Flex Windows. Untuk memastikan file lex and yacc lengkap coba ketik “yacc –help”. Jika muncul seperti gambar berikut berarti tersedia.

Siapkan dulu file lex dan yacc contoh misalnya calc.l yang tersedia sebagai latihan. Ketik:

yacc –d –y calc2.y

Instruksi di atas akan menghasilkan dua file yaitu y.tab.h dan y.tab.c yang masing-masing adalah berturut-turut file header dan file bahasa c (bukan c++). Untuk yang LINUX (dengan nama aplikasi bison) sepertinya tidak perlu menggunakan –y (langsung yacc –d calc2.y saja). Tekan “dir y.tab*.*” untuk melihat kedua file tersebut.

Jalankan instruksi berikutnya:

lex calc2.l

Pastikan muncul file baru lex.yy.c yang akan digunakan untuk compile dan linking sehingga dihasilkan output calc.exe. Di sini linking antara lex.yy.c dengan y.tab.c hasil yacc sebelumnya.

cc lex.yy.c y.tab.c –ocalc2.exe

Hasilnya adalah file calc2.exe yang jika dijalankan dengan mengetik “calc2.exe” pada command prompt akan dihasilkan kalkulator berikut. Ketik 1+2 dan ketika ditekan enter muncul angka 3.

Oiya, postingan ini sekedar menginformasikan teknik pembuatan kompiler lewat aplikasi lex and yacc mode konsol yang biasanya jika menggunakan linux. Untuk yang dengan GUI lebih mudah lagi. Selamat mencoba.

Membuat Sebuah Interpreter dengan Lex and Yacc

[t.kompilasi|t.informatika|s.103|pert.10]

Jika pada pertemuan yang lalu dibahas bagaimana cara membuat kompiler yang berisi persamaan matematis dengan satu variabel keluaran, misal variabel x maka pada pertemuan kali ini akan diilustrasikan bagaimana membuat interpreter (yang berisi eksekusi baris-perbaris). Saat ini interpreter paling banyak digunakan mengingat aplikasi berbasis web yang paling banyak digunakan, misalnya php yang menerapkan prinsip interpreter.

Tutorial Lex and Yacc

Software Lex and Yacc memanfaatkan fasilitas yang dimiliki bahasa pemrograman c++. Hasilnya adalah sebuah kompiler baru yang sesuai dengan keinginan programmer. Untuk tutorial dapat dilihat di situs resminya yang disertai juga dengan contoh kode program yang akan digunakan pada postingan kali ini.

File-File yang Dibutuhkan

Seperti biasa file berekstensi *.l dan *.y diperlukan. Masing-masing berfungsi sebagai lexical generator (lex) dan semantic (yacc). Untuk sampel (silahkan unduh di sini), dua file utama adalah calc3.l dan calc3.y diperlukan selain satu buah file header, calc3.h. Ada satu buah file tambahan untuk interpreter (calc3a.c) yang menjalankan satu listing kalang/loop “while” sementara dua lainnya (calc3b.c dan calc3g.c). Lakukan proses kompilasi dan build pada calc3.l dan calc3.y.

Bagaimana cara menggunakan calc3a.c yang berfungsi sebagai interpreter? Tidak ada penjelasan detil pada situs resminya, sementara saya mengkopi isi dari calc3a.c di bawah instruksi “Include …” dan diletakan di bagian bawah calc3.y sebelum mengkompilasi file tersebut (akan menghasilkan y.tab.c dan y.tab.h). Jalankan file exe hasil build lex+yacc hingga menghasilkan interpreter di bawah. Untuk yang compiler dan graph sepertinya butuh penjelasan yang lebih rinci lagi di postingan yang akan datang.

 

Praktek Longest Common Subsequence (LCS) dengan C++ Online

[algoritma|t.informatika|r.408|pert.11]

Longest Common Subsequence (LCS) merupakan rentetan string dari dua string yang dibandingkan. Misalnya string1: a-b-d-a-c-e dan string2: b-a-b-c-e.

Di sini b-a-c-e merupakan LCS. String a tidak boleh dengan a pada string 1 karena berbenturan dengan koneksi b-b antara string 1 dan string 2. Salah satu metode yang efisien adalah dengan pemrograman dinamis dengan cara:

  • Membuat tabel
  • Mengekstrak LCS

Tabel berisi arah panah (kiri, atas, atau diagonal) disertai nilai tertentu yang gunanya untuk mengekstrak LCS.

Dari tabel diketahui LCS yang berwarna pink yaitu b-a-c-e.

Implementasi Dalam Bentuk Program

Banyak situs-situs ok yang menyediakan kode sumber untuk algoritma mencari LCS lewat pemrograman dinamis. Untungnya juga banyak situs-situs yang menyediakan compiler beberapa bahasa pemrograman, misalnya bahasa C++. Jadi tidak perlu khawatir jika di komputer tidak terinstal kompiler C++. Bahkan bisa dijalankan lewat handphone. Situs yang jalan untuk kode program sampel berikut adalah onlinegdb. Hapus semua lembar kerjanya (berisi contoh program mengeprint: “hello word”) copy dan paste kode berikut:

Program tersebut mencontohkan mencari LCS dari dua string AGGTAB dan GXTXAYB yang menghasilkan string LCS: GTAB. Tekan tombol RUN dan lihat hasilnya di bagian bawah jendela onlinegdb. Atau ganti dengan contoh di atas Char X[]=”ABDACE” dan Char Y[]=”BABCE” yang hasilnya berikut:

Untuk mengetahui prinsip kerja dasarnya dapat dilihat di video sederhana berikut. Sekian semoga bermanfaat.

Membuat Compiler Sendiri – Persamaan Matematis

[tek.kompilasi|t.inf|s.104|pert.9]

Pertemuan yang lalu telah disinggung membuat kompiler yang melakukan operasi perhitungan layaknya menggunakan kalkulator. Di sini dengan Lex and Yacc akan dicoba membuat kompiler yang bisa melakukan perhitungan seperti ini:

Yang belum mempunyai software lex and yacc silahkan klik di sini untuk mengunduhnya dengan ukuran sekitar 20-an Mb. Kebetulan software yang dishare berbasis Windows. Jika ingin yang linux, vendor juga menyediakan aplikasi lex and yacc berbasis linux seperti Ubuntu.

Prinsip Kerja

Generasi saya (kuliah 90-an) hanya mengenal disket dan belum mengenal punch card yang berisi kartu berlubang yang fungsinya sebagai instruksi ke komputer. Bayangkan jika kita diminta menghitung iterasi ratusan kali dengan kalkulator, tentu akan bentol jempol kita. Tapi dengan menginstruksikan agar komputer menghitung iterasi ratusan kali tersebut, sekali jalan langsung selesai. Jika dulu dengan kartu berlubang, saat ini instruksi berbasis teks yang diketik. Jadi komputer harus mampu melakukan scanning agar mengetahui instruksi tersebut sesuai dengan aturan sebelumnya atau tidak, baik dari sisi kata perkata atau logika yang berupa grammar. Jadi Lex and Yacc memiliki dua mesin:

  • Scanning kata per kata dengan mesin Lex (singkatan dari lexical generator), dan
  • Grammar check dengan mesin Yacc (singkatan dari yet another compilers compiler)

Makanya software tersebut dinamakan Lex and Yacc. Jika software sudah diinstal, silahkan pelajari dari situs resminya, yang juga dilengkapi dengan kode sumber untuk praktek kali ini.

Mengkompilasi File Lex

Ada dua file yang diperlukan untuk menghasilkan satu kompiler yaitu file lex (berekstensi *.l) dan yacc (berekstensi *.y). Silahkan masuk ke bab “Practice 2”. Kopi-kan saja ke Flex Windows (software Lex and Yacc versi windows) yang baru kita instal. Masuk ke menu Tools – Lex Compile. Lanjutkan dengan masuk ke menu yang sama: Tools – Lex Build. Maka akan dihasilkan satu file baru lex.yy.c yang merupakan hasil generate ke bahasa c.

Mengkompilasi File Yacc

Jika Lex bertanggung jawab mengecek kata/word yang terdaftar di bahasa pemrograman yang dirancang, Yacc bertanggung jawab terhadap grammatical-nya. Buat kode dengan nama yang sama dengan file Lex, hanya saja untuk Yacc harus berekstensi *.y. Lakukan proses yang sama dengan Lex di menu Tools – Yacc Compile dan dilanjutkan dengan membuild beserta Lex-nya lewat menu yang sama Tools – Lex+Yacc Build. Hasil dari proses kompilasi adalah dua buah file y.tab.c dan y.tab.h yang satu untuk header (di bahasa c dengan kode #include) yaitu y.tab.h dan satu lagi y.tab.c digunakan untuk build Lex+Yacc. Di bagian indikator bawah pastikan tidak ada masalah dan cek di file lokasi penyimpanan (di folder yang sama dengan lex dan yacc) apakah file berekstensi exe dengan nama yang sama dengan lex and yacc ada, misalnya yang saya gunakan calc2.exe.

Menjalankan Bahasa Pemrograman

Ada dua cara menjalankan bahasa pemrograman yang baru dibentuk yaitu dengan mengklik file calc2.exe atau nama lain yang Anda buat, atau dengan menekan Tools – Execute Exe Directly. Hasilnya akan memunculkan jendela di bawah ini, coba dengan melakukan operasi matematis tertentu dengan variabel. Selamat mencoba, semoga bermanfaat.

NOTE: Ada kesalahan di bagian yacc, tambahkan di bagian atas:

  • %{
  • #include <stdio.h>
  • void yyerror(char *);
  • int yylex(void);
  • int sym[26];
  • %}

Pemrograman Dinamis – Konsep Memoization

[algoritma|tek.inf|r408|pert.8]

Salah satu materi algoritma standar adalah pemrograman dinamis (Dynamic Programming). Walaupun ada kata “programming”-nya ternyata tidak ada hubungannya dengan kode/script. Ternyata istilah pemrogramannya karena teknik yang biasanya digunakan untuk optimalisasi ini memanggil suatu fungsi diri sendiri (rekursif) sebelum menentukan hasil-hasil yang optimal. Optimal di sini bisa maksimal atau minimal.

Pemotongan Batang (Rod Cutting)

Kasus ini contoh proses pemotongan bilah batang panjang agar dihasilkan margin keuntungan yang optimal. Misalnya batang baja sepanjang 10 inchi yang akan dipotong dengan potongan kelipatan 1 inchi.

Kombinasi dari ukuran potongan ternyata sangat menentukan keuntungan berdasarkan harga per potongnya. Misal, untuk baja sepanjang 4 inchi memiliki keuntungan dengan komposisi dua buah batang berukuran 2 inchi.

Selain dua buah potongan berukuran 2 inchi, panjang potongan menghasilkan harga 4, 7, dan 9. Sementara dua buah potongan 2 inchi menghasilkan harga 10 (tentu saja ini kasus bagi penjual, kalau pembeli tentu lebih menguntungkan beli potongan-potongan kecil satu inchi).

Memoization

Istilah ini saya fikir salah tulis, harusnya memorization, ternyata tidak. Istilah ini berasal dari kata “memo”, yaitu secarik surat/infor singkat. Misal untuk tiap-tiap panjang bilah akan dihasilkan nilai optimal sebagai berikut:

Perhatingan untuk baja sepanjang 1 sampai 3 inchi, optimalnya adalah tanpa dipotong, masing-masing berharga $1, $5, dan $8. Baja 2 in ada dua kemungkinan yaitu 1+1 atau 2 in tanpa dipotong. Karena 1in+1in menghasilkan hanya $2 maka yang dipilih 2 in tanpa dipotong, yaitu $5. Untuk baja berukuran 4 in ada beberapa kemungkinan seperti gambar batangan di atas dan dihitung semua kemungkinannya hingga diperoleh maksimal adalah dua potongan @2in. Pseucode-nya sebagai berikut:

Keterangan: baris ke-4 sampai 6 menghitung komposisi potongan baja. Misal untuk i=1, maka akan dicari maksimal dari 1 dan (n-1)-nya. Jika batang 4 in, maka 1 dan 3, berikutnya 2 dan 2 (dari n-2) dan seterusnya. Untuk kasus contoh di atas diperoleh nilai maks 10 (ketika i=2 dan satu potongan lainnya 2 in juga).

Karena potongan 2in sudah dihitung dari sebelumnya (batang ukuran 2in) maka ketika menghitung 4in tidak perlu menghitung kembali yang 2in hanya menggunakan riwayat yang lalu, alias dari “memo” sebelumnya. Di sinilah muncul istilah memoization, atau dalam bahasa Indonesianya mungkin memoisasi.

Top Down Memoization

Dengan rekursif, beberapa perhitungan dihitung berulang kali sehingga tidak efisien (naif). Oleh karena itulah pemrograman dinamis diterapkan untuk menggantikan proses rekursif berulang tersebut. Jadi sekali telah dihitung, maka jika akan menghitung proses yang sama hanya me-ngintip (lookup) hasil perhitungan yang lampau.

Untuk dengan memoization, ditambahkan arrah yang berisi nilai yang sudah dihitung dengan suatu routine yang disebut helper “Memouzed-Cut-Rod-Aux” (simbol minus tak hingga artinya unknown dan perlu dihitung):

Baris 1-3 mengecek apakah nilai sudah ada di array hasil perhitungan atau tidak. Jika tidak ada (else) masuk ke q yang unkhown (minus tak hingga) dengan baris 7 yang berisi maksimal komposisi-komposisi yang maksimal. Hanya saja di sini rekursif yang bekerja dengan mengecek hasil hitungan sebelumnya jika sudah ada di array hasil, langsung mengkopi saja tidak perlu menghitung lagi nilai r-nya (lihat r1 sampai r10 di contoh paling atas postingan ini untuk batang sepanjang 10 in).

Buttom Up Memoization

Teknik buttom up lebih sederhana karena tidak membutuhkan mekanisme rekursif, hanya dengan menghitung maksimal potongan-potongan dari terkecil hingga terbesarnya.

Keterangan: Seperti biasa array hasil dipersiapkan. Variabel j merupakan hasil optimal komposisi potongan yang bergerak dari kombinasi i dengan pasangannya. Misal ketika j=4 maka i bergerak dari i=1 dan r(3) mana yang lebih maksimal dibanding komposisi lainnya misal i=2 dan r(2), dan seterusnya. Baik buttom up ataupun top down memiliki running time yang kuadratik. Sekian, semoga bermanfaat.

Referensi:

Cormen, dkk. “intro to algorithms”, MIT Press: 2009.