Jumat, 04 Juli 2014

Markov system adalah suatu system yang sedang mengalami suatu perbaikan dengan menggunakan metode markov
Metode Markov ini dapat diaplikasikan untuk sistem diskrit (discrete system)  atau pun sistem kontinyu (continuous system). Sistem diskrit adalah sistem yang  perubahan kondisinya (state) dapat diamati/terjadi secara diskrit. Sedangkan sistem kontinyu adalah sistem yang perubahan kondisi dan perilaku sistem  terjadi secara kontinyu. Penjelasan lebih detail tentang sistem diskrit dan sistem kontinyu ini akan diberikan pada sub bab berikutnya. 
 
Ada beberapa syarat agar metode Markov dapat diaplikasikan dalam evaluasi  keandalan sistem. Syarat-syarat tersebut adalah: 
 
(1) Sistem harus berkarakter lack of memory, dimana kondisi sistem dimasa mendatang tidak dipengaruhi (independent) oleh kondisi sebelumnya.  Artinya kondisi sistem saat evaluasi tidak dipengaruhi oleh kondisi  sebelumnya, kecuali kondisi sesaat sebelum kondisi saat ini. 
 
(2) Sistem harus stationery atau homogen, artinya perilaku sistem selalu  sama disepanjang waktu    atau peluang transisi sistem dari satu kondisi  ke kondisi lainnya akan selalu sama disepanjang waktu. Dengan demikian maka pendekatan Markov hanya dapat diaplikasikan untuk  sistem dengan laju kegagalan yang konstan. 
 
(3) State is identifiable. Kondisi yang dimungkinkan terjadi pada sistem  harus dapat diidentifikasi dengan jelas. Apakah sistem memiliki dua  kondisi (state) yakni kondisi beroperasi dan kondisi gagal, ataukah  sistem memeiliki 3 kondisi, yakni 100% sukses, 50% sukses dan 100%  gagal.
Kosep Pemodelan
sistem diwakili oleh dua kondisi (state) yang teridentifikasi, dan diberi nama kondisi 1 dan kondisi 2. Angka-angka yang terlihat pada gambar menunjukkan transition probability atau peluang transisi dari satu kondisi ke kondisi lainnya atau pun peluang tetap berada pada kondisi semula. Peluang transisi ini akan sama disepanjang waktu (stationery). Perhatikannlah kondisi yang pertama dan asumsikan bahwa sistem dimulai dari  kondisi ini dimana peluang transisi ke kondisi 2 adalah 0.5. Dengan demikian peluang tetap berada pada kondisi 1 adalah 1 - 0.5 = 0.5. Demikian juga bahwa peluang transisi dari kondisi 2 ke kondisi satu adalah 1/4. Dengan demikian peluang tetap berada pada kondisi 2 adalah 1 – 1/4 = 3/4. Kita lihat bahwa jumlah peluang transisi pada satu keadaan adalah 1 (unity).




Gambar ini mengasumsikan bahwa sistem berawal dari kondisi 1 dan transisi terjadi selama 4 interval waktu. Peluang masing-masing transisi juga terlihat pada gambar tersebut, yang nilainya konstan disepanjang interval. Peluang total dari masing-masing cabang pada event tree tersebut didapat dengan mengalikan semua peluang pada cabang tersebut. Diakhir, peluang total  apakah sistem berpindah dari kondisi 1 ke kondisi 2 atau tetap berada pada kondisi 1 setelah empat interval didapat dengan menjumlahkan semua peluang masing-masing cabang yang bersesuaian. Terlihat bahwa setelah empat interval peluang sistem berpindah dari kondisi 1 ke kondisi 2 adalah 85/128 dan peluang sistem berada pada kondisi satu adalah 43/128. (peluang total adalah 128/128 atau sama dengan 1)






Tabel diatas mengasumsikan bahwa sistem dimulai dari kondisi 1. Pada tiap time  interval jumlah probabilitas adalah sama dengan 1. Nilai probabilitas transisi dari  kondisi 1 ke kondisi 2 (kolom 3) atau probabilitas transisi tetap berada di kondisi 1 (kolom 2) berangsur-angsur menjadi konstan dengan bertambahnya time interval.

Posted on 03.29 by Unknown

1 comment

Kamis, 03 Juli 2014


Fuzzy Logic adalah teknik/ metode yang dipakai untuk mengatasi hal yang tidak pasti pada masalah – masalah yang mempunyai banyak jawaban. Pada dasarnya Fuzzy logic merupakan logika bernilai banyak/ multivalued logic yang mampu mendefinisikan nilai diantara keadaan yang konvensional seperti benar atau salah, ya atau tidak, putih atau hitam dan lain-lain. Penalaran Logika Fuzzy memnyediakan cara untuk memahami kinerja system dengan cara menilai input dan output system dari hasil pengamatan. Logika Fuzzy menyediakan cara untuk menggambarkan kesimpulan pasti dari informasi yang samar-samar, ambigu dan tidak tepat. Fuzzy logic Pertama kali dikembangkan oleh Lotfi A. Zadeh tahun 1965.

Alasan Kenpa digunakan logika Fuzzy:


-  Karena konsep logika Fuzzy mudah dimengerti.
- Logika Fuzzy fleksibel.
- Logika Fuzzy mampu memodelkan fungsi-fungsi nonlinear yang sangat kompleks.
- Logika Fuzzy dapat bekerja dengan teknik-teknik kendali secara konvensional.
- Logika Fuzzy memiliki toleransi terhadap data-data yang tepat.
- Logika Fuzzy didasarkan pada bahasa alami.
- Logika Fuzzy dapat membangun dan mengaplikasikan pengalaman-pengalaman para pakar secara langsung tanpa harus melalui proses pelatihan.


Di bawah ini adalah beberapa contoh aplikasi Fuzzy Logic:
• Sistem Pengereman Mobil (Nissan).
• Pengontrol kereta bawah tanah di Sendai, Jepang.
• Penghematan Konsumsi Daya Listrik AC (Mitsubhishi Heavy Industries Tokyo).

Posted on 14.52 by Unknown

1 comment


Pengertian Decision Tree
Decision Tree (Pohon Keputusan) adalah pohon dimana setiap cabangnyamenunjukkan pilihan diantara sejumlah alternatif pilihan yang ada, dan setiapdaunnya menunjukkan keputusan yang dipilih.Decision tree biasa digunakan untuk mendapatkan informasi untuk tujuanpengambilan sebuah keputusan. Decision tree dimulai dengan sebuah root node(titik awal) yang dipakai oleh user untuk mengambil tindakan. Dari node root ini,user memecahnya sesuai dengan algoritma decision tree. Hasil akhirnya adalahsebuah decision tree dengan setiap cabangnya menunjukkan kemungkinansekenario dari keputusan yang diambil serta hasilnya

Contoh Pemanfaatan Decision Tree

  • Diagnosa beberapa penyakit seperti kanker, hipertensi, stroke.

  • Menentukan apakah dengan kondisi yang ada layak untuk bermaintenis atau tidak

  •       Menentukan apakah sebuah investasi bisnis layak dilakukan atau tidak

  •       Pemilihan pegawai teladan sesuai dengan kriteria tertentu

  • Deteksi gangguan pada komputer atau jaringan komputer

  •       Pemilihan produk seperti rumah, kendaraan dan lain lain
 



Posted on 14.09 by Unknown

1 comment

Selasa, 01 Juli 2014

Algoritma A* adalah algoritma yang mana penyelesaikan masalah menggunakan graf untuk perluasan ruang statusnya. Dengan menerapkan suatu heuristik, algoritma ini membuang langkah-langkah yang tidak perlu dengan pertimbangan bahwa langkah-langkah yang dibuang sudah pasti merupakan langkah yang tidak akan mencapai solusi yang diinginkan. Algoritma A* membangkitkan simpul yang paling mendekati solusi. Simpul ini kemudian disimpan suksesornya ke dalam list sesuai dengan urutan yang paling mendekati solusi terbaik. Kemudian, simpul pertama pada list diambil, dibangkitkan suksesornya dan kemudian suksesor ini disimpan ke dalam list sesuai dengan urutan yang terbaik untuk solusi.
Algoritma ini akan mengunjungi secara mendalam (mirip DFS) selama simpul tersebut merupakan simpul yang terbaik. Jika simpul yang sedang dikunjungi ternyata tidak mengarah kepada solusi yang diinginkan, maka akan melakukan runut balik ke arah simpul akar untuk mencari simpul anak lainnya yang lebih menjanjikan dari pada simpul yang terakhir dikunjungi. Bila tidak ada juga, maka akan terus mengulang mencari ke arah simpul akar sampai ditemukan simpul yang lebih baik untuk dibangkitkan suksesornya. Strategi ini berkebalikan dengan algoritma DFS yang mencari sampai kedalaman yang terdalam sampai tidak ada lagi suksesor yang bisa dibangkitkan sebelum melakukan runut balik, dan BFS yang tidak akan melakukan pencarian secara mendalam sebelum pencarian secara melebar selesai. A* baru berhenti ketika mendapatkan solusi yang dianggap solusi terbaik.
Algoritma A* menggabungkan jarak estimasi/heuristik [h(n)] dan jarak sesungguhnya/cost [g(n)] dalam membantu penyelesaian persoalan. Heuristik adalah nilai yang memberi harga pada tiap simpul yang memandu A* mendapatkan solusi yang diinginkan. Dengan heuristik, maka A* pasti akan mendapatkan solusi (jika memang ada solusinya). Dengan kata lain, heuristik adalah fungsi optimasi yang menjadikan algoritma A* lebih baik dari pada algoritma lainnya. Namun heuristik masih merupakan estimasi/perkiraan biasa saja. Sama sekali tidak ada rumus khususnya. Artinya, setiap kasus memiliki fungsi heuristik yang berbeda-beda.











































Posted on 06.32 by Unknown

1 comment


Template matching adalah sebuah teknik dalam pengolahan citra digital untuk menemukan bagian-bagian kecil dari gambar yang cocok dengan template gambar. Template matching merupakan salah satu ide yang digunakan untuk menjelaskan bagaimana otak kita mengenali kembali bentuk-bentuk atau pola-pola. Template dalam konteks rekognisi pola menunjuk pada konstruk internal yang jika cocok (match ) dengan stimulus penginderaan mengantar pada rekognisi suatu objek. Atau pengenalan pola terjadi jika terjadi kesesuaian antara stimulus indera dengan bentuk mental internal. Gagasan ini mendukung bahwa sejumlah besar template telah tercipta melalui pengalaman hidup kita. Tiap-tiap template berhubungan dengan suatu makna tertentu.
Contoh proses identifikasi bentuk geometri :
Energi cahaya yang terpancar dari suatu bentuk mengena pada retina mata dan diubah menjadi energi neural yang kemudian dikirim ke otak. Selanjutnya terjadi pencarian di antara templatetemplate yang ada. Jika sebuah template ditemukan sesuai (match ) dengan pola tadi, maka subjek dapat mengenal bentuk tersebut. Setelah kecocokan antara objek dan template terjadi, proses lebih lanjut dan interpretasi terhadap objek bisa terjadi.
Teori Template matching memiliki keunggulan dan kelemahan, yaitu :
Keunggulan :
(1) Jelas bahwa untuk mengenal bentuk, huruf atau bentuk-bentuk visual lainnya diperlukan kontak dengan bentuk-bentuk internal.
(2) Template matching adalah prosedur pengenalan pola yang sederhana yang didasarkan pada ketepatan konfigurasi informasi penginderaan dengan “konfigurasi” pada otak. (Contohnya : barcode)
Kelemahan :
Jika perbandingan eksternal objek dgn internal objek 1:1, maka objek yang berbeda sedikit saja dengan template tidak akan dikenali. Oleh karena itu, jutaan template yang spesifik perlu dibuat agar cocok dengan berbagai bentuk geometri yang kita lihat dan kenal. Jika memang penyimpanan memori di otak seperti ini, otak tentu seharusnya sangat kewalahan dan pencarian informasi akan memakan waktu, padahal pada kenyataannya tidak demikian.
    Template Matching dapat dibagi antara dua pendekatan, yaitu : pendekatan berbasis fitur dan pendekatan berbasis template. Pendekatan berbasis fitur menggunakan fitur pencarian dan template gambar seperti tepi atau sudut, sebagai pembanding pengukuran matrik untuk menemukan lokasi template matching yang terbagus di sumber gambar.

Pendekatan Berbasis Fitur

Sebuah pendekatan berbasis fitur dapat dianggap; pendekatan dapat membuktikan lebih berguna, jika template gambar memiliki fitur yang kuat jika pencocokan di pencarian gambar bisa diubah dengan cara tertentu. Karena pendekatan ini tidak mempertimbangkan keseluruhan dari template gambar, komputasi dapat lebih efisien ketika bekerja dengan sumber gambar beresolusi lebih besar, sebagai pendekatan alternatif, berbasis template, mungkin memerlukan pencarian titik – titik yang berpotensi untuk menentukan lokasi pencocokan yang terbaik.

Pendekatan Berbasis Template

    Untuk template tanpa fitur yang kuat, atau ketika sebagian besar template gambar merupakan gambar yang cocok, sebuah pendekatan berbasis template mungkin efektif. Seperti disebutkan di atas, karena berbasis template, template matching berpotensi memerlukan sampling dari sejumlah besar poin, untuk mengurangi jumlah sampling poin dengan mengurangi resolusi pencarian dan template gambar oleh faktor yang sama dan melakukan operasi pada perampingan gambar yang dihasilkan (multiresolusi, atau piramida, pengolahan citra), menyediakan pencarian titik data dalam pencarian gambar sehingga template tidak harus mempunyai pencarian titik data, atau kombinasi keduanya.

Motion dan Oklusi

    Dalam kasus di mana template tidak dapat memberikan pencocokan langsung, mungkin lebih cocok untuk menerapkan penggunaan eigenspaces – template objek yang lebih detail yang sesuai dengan sejumlah kondisi yang berbeda, seperti berbagai perspektif, iluminasi, warna kontras, atau objek yang cocok diterima "pose". Misalnya, jika pengguna mencari seraut wajah, eigenspaces dapat terdiri dari gambar (template) wajah dalam posisi yang berbeda ke kamera, dalam kondisi pencahayaan yang berbeda, atau dengan ekspresi yang berbeda.
Hal ini juga memungkinkan gambar yang cocok untuk menjadi dikaburkan, atau oklusi oleh obyek, dalam kasus ini, memungkinkan untuk menyediakan banyak template untuk menutupi kemungkinan setiap oklusi. Dalam kasus di mana objek lunak atau poseable, motion juga menjadi masalah, dan masalah yang melibatkan motion dan oklusi menjadi ambigu. Dalam kasus ini, salah satu solusi yang mungkin adalah membagi template gambar ke dalam beberapa sub-foto dan melakukan pencocokan pada setiap subdivisi.

Pencocokan berbasis Template dan konvolusi

    Sebuah metode dasar template matching menggunakan konvolusi bayangan (template), disesuaikan dengan fitur tertentu dari template matching, yang ingin kita deteksi. Teknik ini dapat dengan mudah dilakukan pada gambar abu-abu atau tepi gambar. Hasil konvolusi akan di tempat tertinggi di mana struktur gambar sesuai dengan struktur bayangan, di mana nilai-nilai gambar besar dapat dikalikan dengan nilai-nilai bayangan besar.
Metode ini biasanya diimplementasi dengan terlebih dahulu memilih sebuah bagian dari pencarian gambar untuk digunakan sebagai template: Kita akan memanggil pencarian gambar S (x, y), dimana (x, y) mewakili koordinat setiap pixel dalam pencarian gambar. Kita akan memanggil template T (x t, y t,), dimana (x t, t y) merupakan koordinat dari setiap pixel dalam template. Kemudian kita hanya memindahkan pusat (atau asal) dari template T (x t, x t,) atas setiap titik (x, y) dalam pencarian gambar dan menghitung jumlah produk antara koefisien dalam S (x, y) dan T (x t, y t,) atas seluruh wilayah dari template. Karena semua kemungkinan posisi dari template yang berkenaan dengan pencarian gambar dianggap posisi terbaik. Metode ini kadang-kadang disebut sebagai 'Linear Spasial Filtering' dan template disebut masker penyaring.

Mempercepat Proses

Di masa lalu, tipe spasial filtering biasanya hanya digunakan dalam solusi hardware khusus karena kompleksitas komputasi operasi, namun kita dapat mengurangi kompleksitas ini dengan penyaringan dalam domain frekuensi dari gambar itu, disebut sebagai ' frekuensi domain filtering', hal ini dilakukan melalui penggunaan teorema konvolusi.
Cara lain untuk mempercepat proses pencocokan adalah melalui penggunaan dari suatu gambar piramida. Ini adalah serangkaian gambar, pada skala yang berbeda, yang terbentuk dengan berulang kali menyaring dan subsampling gambar asli agar menghasilkan gambar resolusi berkurang berurutan. Gambar resolusi lebih rendah dapat dicari untuk template (dengan mengurangi resolusi yang sama), untuk menghasilkan posisi semula yang memungkinkan untuk mencari pada skala yang lebih besar. Foto yang lebih besar kemudian dapat dicari dalam jendela kecil di sekitar posisi mulai menemukan lokasi template terbaik. Metode lain yang dapat menangani masalah seperti ini antara lain terjemahan, skala dan rotasi gambar.

Implementasi

Dalam implementasi sederhana ini, diasumsikan bahwa metode yang dijelaskan di atas diterapkan pada gambar abu-abu: karena abu-abu digunakan sebagai intensitas piksel.

minSAD = VALUE_MAX;

// loop through the search image
for ( int x = 0; x <= S_rows - T_rows; x++ ) {
    for ( int y = 0; y <= S_cols - T_cols; y++ ) {
        SAD = 0.0;

    // loop through the template image
    for ( int i = 0; i < T_rows; i++ )
        for ( int j = 0; j < T_cols; j++ ) {

                pixel p_SearchIMG = S[x+i][y+j];

                pixel p_TemplateIMG = T[i][j];

                SAD += abs( p_SearchIMG.Grey - p_TemplateIMG.Grey );
            }
    }

        // save the best found position
    if ( minSAD > SAD ) {
        minSAD = SAD;
            // give me VALUE_MAX
        position.bestRow = x;
        position.bestCol = y;
        position.bestSAD = SAD;
    }
}

Salah satu cara untuk melakukan template matching pada gambar warna adalah dengan menguraikan piksel ke dalam komponen warna mereka dan mengukur kualitas pertandingan antara warna template dan pencarian gambar dengan menggunakan jumlah SAD dihitung secara terpisah untuk setiap warna.

Contoh Aplikasi
“PENGGUNAAN METODE TEMPLETE MATCHING UNTUK IDENTIFIKASI KECACATAN PADA PCB”

Penerapan metode template matching pada identifikasi kecacatan PCB dapat dilakukan dengan langkah utama sbb:
1. Pengepasan posisi: Dilakukan dengan mencuplik 80% area citra untuk mendapatkan posisi ideal.
2. Hitung nilai korelasi silang : Untuk mengklasifikasikan suatu citra PCB adalah baik dan tanpa cacat sedikitpun, maka nilai korelasi adalah 1 dan cacat total maka nilai korelasinya adalah -1. Rumus yang digunakan adalah :


Dengan :

3. Deteksi akhir : Dari nilai korelasi yang didapat, nilai tersebut kemudian di konversikan dalam rentang 0 sampai 255 pada channel red untuk digambarkan dalam bentuk segiempat pada titik koordinat citra PCB yang mengalami cacat.
Prinsip metode ini adalah membandingkan antara image objek yang akan dikenali dengan image template yang ada. Image objek yang akan dikenali mempunyai tingkat kemiripan sendiri terhadap masing-masing image template.
Pengenalan dilakukan dengan melihat nilai tingkatkemiripan tertinggi dan nilai batas ambang pengenalan dari image objek tersebut. Bila nilai tingkat kemiripan berada di bawah nilai batas ambang maka image objek tersebut dikategorikan sebagai objek tidak dikenal.
Selanjutnya untuk dapat mengimplementasikan metode templete matching maka perlu dilakukan sejumlah operasi pengolahan citra digital, antara lain:
•    Penapisan Citra (Filtering) : dilakukan bila citra yang akan dianalisis memiliki derau sehingga perlu dihaluskan dengan tapis citra. Perancangan tapis dengan memanipulasi piksel-piksel tetangga membuat citra lebih halus, bentuk sudut, dan tepi citra tetap terjaga. Pada proses perekaman citra digital dapat terjadi gangguan yang bersifat frekuensi rendah, dimana terjadi proses pemerataan intensitas cahaya pada suatu titik sampel dengan titik-titik tetangganya. Gangguan lain yang sering terjadi pada proses perekaman citra digital adalah terjadinya gangguan berbentuk garis-garis akibat adanya kerusakan pada sebagian detektor sensor. Juga sering dijumpai gangguan lain dalam bentuk bercak hitam yang acak.
•    Pengambangan (Tresholding) : digunakan untuk mengubah citra dengan format keabuan yang mempunyai nilai lebih dari dua ke format citra biner yang hanya memiliki dua nilai (0 atau 1). Dalam hal ini titik dengan rentang nilai keabuan tertentu diubah menjadi warna hitam dan sisanya menjadi warna putih atau sebaliknya.
Aplikasi yang akan dibangun adalah sebuah simulasi sederhana untuk proses AOI (Automated Optical Inspection), dalam hal ini diasumsikan PCB master dan PCB input deteksi telah tersedia dalam bentuk file bitmap.
Secara umum implementasi dari identifikasi kecacatan PCB dengan menggunakan metode Templete Matching ini dapat digambarkan sebagaimana pada Gambar 1. Pada Gambar 1 tersebut :
• Grayscale digunakan untuk merubah citra warna menjadi citra keabuan.
• Median Filter : Digunakan untuk melakukan proses penapisan jika citra dianggap masih mengandung derau.
• Batas Ambang : Digunakan untuk mengatur tingkat proses pengambangan pada citra

Gambar 1 Penerapan Templete Matching pada Identifikasi Cacat PCB
Pada penelitian sejenis, umumnya output dari penggunaan templete matching adalah berupa prosentase kemiripan antara image master dengan image input. Untuk permasalahan identifikasi kecacatan pada PCB ini, maka outputnya adalah posisi blok pada PCB input yang tidak sesuaidengan PCB master. Posisi blok itulah yang diidentifikasi terdapat kecacatan.
Pada penelitian ini dilakukan upaya untuk mendeteksi kecacatan pada PCB RAM. Dalam hal ini digunakan dua buah model PCB, yaitu PCB acuan (master) dan PCB RAM yang cacat. Aplikasi akan berusaha untuk mendeteksi kecacatan yang terjadi dalam bentuk output yang menunjukkan letak titik kecacatan pada PCB RAM tersebut. Masing-masing PCB yang digunakan adalah sebuah citra berkarakteristik bitmap.
Sebelum digunakan sebagai acuan pada pada proses templete matching ini,maka PCB master terlebih dahulu dibuatkan model grayscalenya. Pembentukan model grayscale ini dilakukan setelah sebelumnya menerapkan pemrosesan penapisan dan pengambangan citra. Gambar 2 menunjukkan pola grayscale dari PCB master.
Hal yang serupa juga dilakukan pada model PCB yang akan diidentifikasi. Gambar 3 menunjukkan pola PCB masukan yang siap diidentifikasi. Terlihat secara sekilas antara dua pola gambar tersebut tidak nampak perbedaan. Dengan demikian apabila inspeksi kecacatan dilakukan secara manual maka tidak akan mudah terdeteksi.
Setelah dua buah citra tersebut diproses dengan menggunakan aplikasi templete matching, maka terlihat hasil identifikasinya berupa lokasi dimana terdapat ketidak cocokan pola dan diasumsikan bahwa pada lokasi tersebut terdapat kecacatan PCB.Dalam hal ini titik-titik yang dianggap cacat karena tidak sesuai dengan citra pada master akan ditandai dengan blok korelasi berwarna merah dimana ukuran blok korelasi tersebut telah ditentukan sebelumnya oleh user. Gambar 4 menunjukkan output hasil template matching pada PCB input. Pada Gambar 4 tersebut terlihat adanya blok korelasi pada titik yang dianggap cacat karena memiliki kesalahan berupa putusnya jalur sirkuit PCB.

Gambar 2 Pola Grayscale PCB Master












Gambar 3 Pola PCB Yang siap diidentifikasi











Gambar 4 Hasil Identifikasi Kecacatan Pada PCB

Dalam penelitian ini PCB master dan PCB input diasumsikan telah tersedia dalam bentuk file bitmap. Proses penting untuk mendapatkan kedua jenis file tersebut adalah tahap pemindaian / scanning. Bila proses ini tidak dilakukan dengan teliti akan berakibat pada proses deteksi kecacatan yang tidak akurat.

Posted on 06.28 by Unknown

No comments

Jumat, 11 April 2014

Finite State Machine pada dasarnya adalah melakukan pemecahan behaviour dari object/agen berdasarkan statenya. Dan nantinya juga harus didefinisikan aturan2x transisi sehingga state dapat berubah dari yg satu ke yang lain.

Contoh implementasi FSM di game yaitu di game Pacman, yaitu pada karakter musuhnya (ghost). 4 hantu yang dikenal dengan nama Pinky, Clyde, Blinky, dan Inky….
pac-man_t-shirt
======================================================================
Sekedar warning saja: Source code untuk FSM ini sudah saya revisi lumayan banyak, udah jauh beda dari yg saya post di sini, jadi bagi yang mau pake yang terbaru sebaiknya donlot saja di GitHub. Contoh implementasinya juga sudah disertakan
======================================================================


Bentuk diagram state untuk hantu2x tsb kurang lebih seperti ini:
image
Di mana ada 5 state: Run From Player, Rise, Die, Chase Player, dan Move Randomly. Dan Antar state terdapat aturan transisi agar dapat melakukan perubahan state, misal ketika karakter utama memakan ‘pellet’ maka si musuh ini akan berubah state dari state ‘mengejar’ ke state ‘menjauh’ dari karakter utama, dan seterusnya. 
Contoh lain misalnya di game sepakbola: ada state shoot, tackle, heading, dll. Di game jenis FPS: tembak, cover, reload, get health, dll. Dan masih banyak lagi contoh implementasi FSM di berbagai macam genre game.
Finite State Machine di dunia AI Game Programming, merupakan salah satu teknik yang paling sering digunakan. Alasannya yaitu:
1. Implementasinya mudah dan cepat
2. Memudahkan proses debugging. Karena telah dipecah menjadi kepingan yang lebih kecil, proses debugging kalau terjadi behavoiur yang tidak semestinya, menjadi lebih mudah
3. Proses komputasi yg minimal, karena sejatinya FSM hanyalah conditional statement yang dikemas dalam bentuk yang lebih elegan.
4. Fleksibel, dapat dikombinasikan dengan teknik AI lain misalnya fuzzy logic dan neural network
Kekurangannya:
1. Behaviour dari agen mudah diprediksi, karena tidak ada searching dan atau learning di dalam agen tersebut
2. Karena mudah diimplementasi, kadang programmer langsung tembak di eksekusi tanpa melakukan desain FSM terlbih dahulu. Biasanya akan terjadi FSM yang terfragmentasi
3. Timbul apa yang dinamakan dengan State Oscillation yaitu ketika batasan antara dua buah state terlalu tipis:
image
2. Bentuk Implementasi
 
Ada beberapa bentuk FSM, diantaranya:

1. Naive Approach
Menggunakan conditional statement (if-else atau switch-case) tanpa memecah object menjadi object2x yang lebih kecil sesuai state nya.

Untuk agen yang cuma punya state yang sedikit, metode ini masih memungkinkan. Tapi kalau sudah kompleks, penggunaan metode ini jelas tidak dianjurkan, karena akan membentuk ‘spaghetti code’ dan monolithic conditional statement. Selain itu juga tidak scalable, tidak fleksibel, dan proses debugging menjadir lebih rumit.
BadGuiDesign
2. State Transition Table
Bentuk ini sudah mengimplementasikan State Pattern, dengan menempatkan transition logic di context (untuk lebih jelasnya tentang State Pattern, baca ini dulu). Bentuk ini juga sering disebut sebagai Classic FSM.

Dengan metode ini dibuat sebuah tabel yang dikenal dengan State Transition Table, bentuknya seperti ini:
image

Agen akan melakukan query dari tabel tersebut berdasarkan input yang diterima dari environmentnya. Kemudian ketika salah satu kondisi terpenuhi, dia akan mengubah current state menjadi state yang baru sesuai kondisinya.

Dengan begini, maka tentunya akan mempunyai fleksibilitas dan skalabilitas yang jauh lebih baik daripada jika menggunakan naive approach. Dengan drawback akan terbentuk monolithic conditional statements.image
3. Embedded Rules
Bentuk ini adalah kebalikan dari bentuk Classical Approach, yang berarti state transition didefinisikan di state itu sendiri. Dan sama dengan Classical Approach, bentuk ini juga akan menawarkan fleksibilitas dan skalabilitas yang baik, namun dengan efek samping agak sulit untuk di-mantain karena aturan2x transisi diletakkan di state sehingga ketika terjadi penambahan atau pengurangan state, maka harus dilakukan update juga terhadap state2x yang terkait.
image
3. Struktur
 
 
image
 
Komponen2x nya mirip dengan yang sudah dijelaskan di State Pattern. Untuk detailnya:
1. State Interface
Ada tiga method di sini:
1. Enter()
Method yang akan dijalankan ketika pertama kali masuk ke state tersebut. Biasanya digunakan untuk inisiasi data2x atau variabel, atau bisa juga untuk memainkan animasi ketika masuk state itu
2. Update()
Method yang akan berjalan bersamaan dengan terus berjalannya main game loop/update. Digunakan untuk menjalankan behaviour agent dan untuk melakukan checking kondisi apakah harus berpindah state atau tidak
3. Exit()
Method yang dipanggil ketika state tersebut ditinggalkan. biasanya untuk cleanup data2x dan variabel yang sudah tidak digunakan.
2. State Object
Cukup jelas….
bila kurang jelas, bisa baca ini dulu
3. Finite State Machine
Sebenarnya, ini adalah sebuah context, namun agar reusable, maka dibuat kelas tersendiri.
4. Agent
Context juga, namun di sini agent cukup meng-instatiate object FiniteStateMachine agar mempunyai FSM di dalam dirinya.
bored
Bored with all these bulls**t? Flirt male
Well, enough talking and lets dive into the code…..
4. Into the code….
 
Tapi tunggu sebentar, sebenarnya masih ada beberapa penjelasan lagi sebelum bener2x masuk ke code….
wtf
Hehe… Mau bagaimana lagi? untuk mendapatkan hasil yang baik perlu perencanaan yang baik juga. Maka dari itu, sebelum memulai ke code masri kita perjelas dulu apa yang akan dibuat di sini:
Contoh ini saya ambil dari buku Programming Game AI by Example , karya Mark Buckland, tentunya sudah sy porting ke Flash (Actionscript 3.0). Yang akan dibuat adalah sebuah agen bernama “Bob” seorang penambang (miner) yang akan berjalan otonom sesuai dengan kondisi dalam dirinya dan lingkungannya. Misalnya ketika lelah dia akan tidur, ketika sudah cukup tidur dia akan berangkant bekerja, dst.
Dan di sini nanti tidak ada aksi konkret yang dilakukan si Bob, tp memang cuma akan mengeluarkan output berupa text sesuai state yang sedang berjalan. Kalu cuma sebagai gambaran saja kyknya sekedar text juga sudah cukup lah.
miner02
Untuk lebih jelasnya tentang state dan transisi dari si Bob ini, berikut diagram nya:
image
Ada empat state: AtHome, Mining, AtBank, dan AtBar…. masing masing punya aturan transisi untuk berpindah ke state lain.
Dan dari sini kita sudah mendapat gambaran bahwa si Bob akan mempunyai variabel2x seperti: thirsty level, energy, location, jumlah gold carried, dan bank balance.
Jika behaviour dari Bob sudah cukup jelas, maka selanjutnya adalah membangun class diagramnya. Strukturnya jelas sama dengan yang sudah dibahas di atas, cuma untuk kasus ini dibuat lebih simpel dahulu, biar lebih mudah dimengerti. Dan bentuk implementasi yang digunakan yaitu Embedded Rule, di mana transisi didefinisikan di masing masing state. Langsung saja, di bawah ini class diagramnya:
image
1. State Interface
Sangat simpel, kita cukup membuat 3 method saja di sini, yang nantinya akan diimplement oleh state object:
   1: package  
   2: {
   3:     public interface IState 
   4:     {
   5:         function enter():void;
   6:         function update():void;
   7:         function exit():void;
   8:     }    
   9: }


2. State Machine
Selanjutnya kita buat State Machine nya:

   1: package  
   2: {
   3:     import states.*;
   4:     
   5:     public class StateMachine
   6:     {
   7:         private var curState:IState;
   8:         
   9:         public function StateMachine() 
  10:         {
  11:             curState = null;
  12:         }    
  13:         
  14:         public function update():void
  15:         {
  16:             curState.update();
  17:         }
  18:         
  19:         public function changeState(state:IState):void
  20:         {
  21:             if (curState != null)
  22:             {
  23:                 curState.exit();
  24:                 curState = null;
  25:             }
  26:             
  27:             curState = state;
  28:             curState.enter();
  29:         }
  30:         
  31:         public function getCurrentState():IState
  32:         {
  33:             return curState;
  34:         }
  35:     }
  36: }

Lets break this sh*t :

7: kita buat object currentState

11: saat object StateMachine ini diinstatiate oleh object lain, set current state dengan null

16: melakukan updating terhadap state yang baru berjalan, dengan cara memanggil method update() yang ada di state object tersebut

19-29: method untuk melakukan pergantian state. Jika current state tidak null, maka jalankan dulu method exit() yang dimiliki state tersebut. Selanjutnya jadikan state yang diinput melalu parameter menjadi current state dan panggil method enter().

3. Base Entity
Base entity ini adalah base class yang nantinya akan diextends oleh Miner class. Kenapa membuat base clas dulu? ya sapa tau nantinya akan ditambah agen lain selain si Bob… daripada copy paste code, mending dipersiapkan dahulu base classnya dari awal….

Okey, ini code di dalam Base Entity:

   1: package entities 
   2: {
   3:     public class BaseEntity
   4:     {
   5:         protected var name:String;
   6:         
   7:         protected var curLoc:String;        
   8:         
   9:         protected var energy:int;
  10:         protected const maxEnergy:int = 20;
  11:         
  12:         protected var thirst:int;
  13:         protected const maxThirst:int = 10;
  14:         
  15:         public function BaseEntity(name:String) 
  16:         {
  17:             this.name = name;
  18:             
  19:             curLoc = Miner.HOME;
  20:             energy = maxEnergy;
  21:             thirst = 0;
  22:         }    
  23:         
  24:         public function update():void
  25:         {
  26:             
  27:         }
  28:         
  29:         public function isTired():Boolean
  30:         {
  31:             var temp:Boolean;
  32:             
  33:             if (energy <= 0)
  34:             {
  35:                 temp = true;
  36:             }
  37:             else
  38:             {
  39:                 temp = false;
  40:             }
  41:             
  42:             return temp;
  43:         }
  44:         
  45:         public function isFullyRested():Boolean
  46:         {
  47:             var temp:Boolean;
  48:             
  49:             if (energy >= maxEnergy)
  50:             {
  51:                 temp = true;
  52:             }
  53:             else
  54:             {
  55:                 temp = false;
  56:             }
  57:             
  58:             return temp;
  59:         }
  60:         
  61:         public function isThirsty():Boolean
  62:         {
  63:             var temp:Boolean;
  64:             
  65:             if (thirst >= maxThirst)
  66:             {
  67:                 temp = true;
  68:             }
  69:             else
  70:             {
  71:                 temp = false;
  72:             }
  73:             
  74:             return temp;
  75:         }
  76:         
  77:         public function isNotThirsty():Boolean
  78:         {
  79:             var temp:Boolean;
  80:             
  81:             if (thirst <= 0)
  82:             {
  83:                 temp = true;
  84:             }
  85:             else
  86:             {
  87:                 temp = false;
  88:             }
  89:             
  90:             return temp;
  91:         }
  92:         
  93:         public function increaseEnergy():void
  94:         {
  95:             energy += 2;
  96:         }
  97:         
  98:         public function decreaseEnergy():void
  99:         {
 100:             energy--;
 101:         }
 102:         
 103:         public function increaseThirst():void
 104:         {
 105:             thirst++;
 106:         }
 107:         
 108:         public function decreaseThirst():void
 109:         {
 110:             thirst -= 2;
 111:         }
 112:         
 113:         //getter setter
 114:         public function getEnergy():int
 115:         {
 116:             return energy;
 117:         }
 118:         
 119:         public function getThirst():int
 120:         {
 121:             return thirst;
 122:         }
 123:         
 124:         public function getLoc():String
 125:         {
 126:             return curLoc;
 127:         }
 128:         
 129:         public function setLoc(val:String):void
 130:         {
 131:             curLoc = val;
 132:         }
 133:         
 134:         public function getName():String
 135:         {
 136:             return name;
 137:         }
 138:     }
 139: }

5-13: kita buat variabel nama, currentLocation, energy, dan thirstLevel. Serta dua constant untuk menentukan nilai maksimum energy dan thirst level.

17-21: set nama entitas, set current location dengan “home”. Set energy sesuai energi maksimum, dan set thirst level dengan nilai nol. Jadi ketika entitias pertama kali diinstatiate mereka akan berada di rumah, energy nya full, dan thirst level nya nol.

24: method update() kosongkan saja, karena akan nantinya akan di-overriden oleh sub classnya

29-43: method isTired() untuk mendapatkan informasi apakah agen sudah lelah atau belum

45-59: apakah agen sudah benar2x segar atau belum

61-74: memberi informasi apakah agen haus atau tidak

method2x lain sepertinya sudah self-explained, jadi ga perlu dijelaskan lagi….

4. Miner

   1: package entities 
   2: {    
   3:     import states.*;
   4:     
   5:     import com.carlcalderon.arthropod.Debug;
   6:     
   7:     public class Miner extends BaseEntity
   8:     {
   9:         private var myStateMachine:StateMachine;
  10:         
  11:         public static const MINE:String = "Mine";
  12:         public static const BANK:String = "Bank";
  13:         public static const BAR:String = "Bar";
  14:         public static const HOME:String = "Home";
  15:         
  16:         protected var goldCarried:int;
  17:         protected const maxGoldCarried:int = 3;
  18:         
  19:         protected var goldAtBank:int;
  20:         protected const wealthy:int = 30;
  21:         
  22:         public function Miner(name:String) 
  23:         {
  24:             super(name);
  25:             
  26:             goldCarried = 0;
  27:             goldAtBank = 0;
  28:             
  29:             myStateMachine = new StateMachine();
  30:             myStateMachine.changeState(new MiningState(this));
  31:         }
  32:         
  33:         override public function update():void
  34:         {
  35:             myStateMachine.update();
  36:         }
  37:         
  38:         public function isPocketFull():Boolean
  39:         {
  40:             var temp:Boolean;
  41:             
  42:             if (goldCarried >= maxGoldCarried)
  43:             {
  44:                 temp = true;
  45:             }
  46:             else
  47:             {
  48:                 temp = false;
  49:             }
  50:             
  51:             return temp;
  52:         }
  53:         
  54:         public function isWealthy():Boolean
  55:         {
  56:             var temp:Boolean;
  57:             
  58:             if (goldAtBank >= wealthy)
  59:             {
  60:                 temp = true;
  61:             }
  62:             else
  63:             {
  64:                 temp = false;
  65:             }
  66:             
  67:             return temp;
  68:         }
  69:         
  70:         public function increaseGoldCarried():void
  71:         {
  72:             goldCarried++;
  73:         }
  74:         
  75:         public function depositGold():void
  76:         {
  77:             goldAtBank += goldCarried;
  78:             goldCarried = 0;
  79:         }
  80:         
  81:         //getter setter
  82:         public function getGoldCarried():int
  83:         {
  84:             return goldCarried;
  85:         }
  86:         
  87:         public function getGoldAtBank():int
  88:         {
  89:             return goldAtBank;
  90:         }
  91:         
  92:         public function getStateMachine():StateMachine
  93:         {
  94:             return myStateMachine;
  95:         }
  96:     }
  97: }

9: membuat object StateMachine, agar si Miner ini punya kemampuan FSM di dalamnya

16-20: membuat variabel jumlah emas yang dibawa, jumlah emas di bank, serta konstanta maksimum emas yang bisa dibawa dan jumlah emas di bank shg bisa disebut kaya (wealthy)

26-27: inisiasi nilai awal goldCarried dan goldAtBank dengan nilai nol

29-30: instatiating object StateMachine dan set state awal dengan state MiningState, berarti dia akan memulai dari kondisi sedang berada di tambang

33: meng-override method update() dari super class. Di sini akan dijalankan method update() di dalam StateMachine

38-52: check apakah kantong miner sudah penuh dengan emas

54-68: check apakah deposit emas di bank sudah memenuhi untuk disebut kaya (wealthy) atau belum

method2x selanjutnya sudah cukup jelas…

5. State Object

   1: package states 
   2: {
   3:     import com.carlcalderon.arthropod.Debug;
   4:     
   5:     import entities.*;
   6:     
   7:     public class MiningState implements IState
   8:     {
   9:         private var myEntity:Miner;
  10:         
  11:         public function MiningState(entity:Miner) 
  12:         {
  13:             myEntity = entity;
  14:         }
  15:         
  16:         /* INTERFACE IState */
  17:         
  18:         public function enter():void 
  19:         {
  20:             if (myEntity.getLoc() != Miner.MINE)
  21:             {
  22:                 myEntity.setLoc(Miner.MINE);
  23:                 
  24:                 Debug.log(myEntity.getName() + ": entering mine, lookin' for some gold chunk");
  25:             }
  26:         }
  27:         
  28:         public function update():void 
  29:         {
  30:             myEntity.increaseGoldCarried();
  31:             myEntity.increaseThirst();
  32:             myEntity.decreaseEnergy();
  33:             
  34:             Debug.log(myEntity.getName() + ": wurking at mine, collecting " + myEntity.getGoldCarried() + 
  35:             " chunk of gold. Current energy: " + myEntity.getEnergy() + ". Thirst level: " +
  36:             myEntity.getThirst());
  37:             
  38:             
  39:             if (myEntity.isTired() == true)
  40:             {
  41:                 Debug.log(myEntity.getName() + " : I'm tired, heading to home now");
  42:                 
  43:                 myEntity.getStateMachine().changeState(new AtHomeState(myEntity));
  44:             }
  45:             
  46:             if (myEntity.isThirsty() == true)
  47:             {
  48:                 Debug.log(myEntity.getName() + " : I'm thirsty, lookin' some cold beer at the bar");
  49:                 
  50:                 myEntity.getStateMachine().changeState(new AtBarState(myEntity));
  51:             }
  52:             
  53:             if (myEntity.isPocketFull() == true)
  54:             {
  55:                 Debug.log(myEntity.getName() + " : Mah pocket is full of gold, I should go to the bank");
  56:                 
  57:                 myEntity.getStateMachine().changeState(new AtBankState(myEntity));
  58:             }
  59:         }
  60:         
  61:         public function exit():void 
  62:         {
  63:             Debug.log(myEntity.getName() + ": leavin' this dark gold mine");
  64:         }        
  65:     }
  66: }

9: kita buat object Miner sehingga nantinya state ini punya akses ke method2x milik Miner

18-25: method enter(). Ketika memasuki state ini cek apakah current location benar di tambang (mine), jika tidak ubah dahulu lokasinya mnjd mine.

30-32: karena statenya sekarang sedang bekerja di tambang, maka tambahkan jumlah emas yang sedang dibawa. Juga tambahkan thrist levelnya. Untuk energy berarti juga akan terus berkurang.

39-44: cek, jika sudah lelah, maka akan berubah state menjadi AtHomeState

46-47: jika si miner ini haus, dia akan pergi ke bar

53-58: jika kantongnya sudah penuh dengan emas maka dia akan pergi ke bank

61-64: method exit(), sekedar mengeluarkan output text saja…

Begitulah struktur untuk state object MiningState, untuk state2x yang lain kurang lebih juga seperti itu. Karena kalau di jelaskan satu2x di sini nanti bakal panjang sekali maka dapat langsung donlot aja source codenya atau improvisasi sendiri kalau mau…

6. Test
Voila….

image


Akhir kata, seperti itulah implementasi FSM di actionscript 3.0 versi saya tentunya…

Posted on 06.28 by Unknown

No comments