BAB III ANALISIS DAN PERANCANGAN SISTEM
III.2. Analisis AI
III.2.1 Analisis Algoritma A* (A Star)
Algoritma A* di dalam game akan diterapkan pada NPC (Non Playable Character) sebagai penentuan jalur terpendek atau pathfinding
menuju target. Cara kerja algoritma A* di dalam game The Walker lebih jelasnya sebagai berikut.
Gambar III. 4 Ilustrasi A*
Pada gambar III.4 diasumsikan bahwa wilayah pencarian dibagi-bagi menjadi kotak-kotak atau disebut node, node yang berwarna merah atau node (1,1) merupakan node A (posisi NPC) dan node yang berwarna hijau atau
node (2,5) merupakan node B (posisi karakter utama), sedangkan node yang berwarna biru {(1,3), (2,3), (3,3)} merupakan dinding penghalang atau disebut collision. Diasumsikan pencarian jalan dimulai dari node A menuju
node B.
Nilai F yang akan dihitung untuk setiap node terletak disudut kiri atas kotak, nilai G terletak di sudut kiri bawah kotak dan nilai H terletak disudut kanan bawah kotak.
Perhitungan nilai F didapat dari persamaan F= G+H. Sedangkan untuk nilai G digunakan nilai 10 untuk gerakan vertical atau horizontal, angka 10 digunakan hanya untuk memudahkan perhitungan. Sedangkan untuk gerakan
diagonal maka akan dikalikan dengan √2 yang berarti 10x√2 = 14,14. Untuk
memudahkan perhitungan angka 14,14 dibulatkan menjadi 14.
Untuk perhitungan nilai H digunakan fungsi heuristic, metode yang digunakan di dalam contoh ini adalah metode Manhattan dimana perhitungan jumlah node hanya yang bergerak secara vertical dan horizontal menuju tujuannya serta mengabaikan penghalang atau collision, yang kemudian nilainya dikalikan dengan 10. Atau dirumuskan dengan:
H = 10*(abs(currentX-targetX) + abs(currentY-targetY))
Inisialisasi nilai graph dan nilai matrix untuk menentukan posisi koordinat dari node-node yang digunakan. Dan inisialisasi awal untuk open list dan closed list berjumlah kosong atau null.
Selanjutnya adalah melakukan perhitungan untuk menemukan jalan dengan cara menghitung node-node yang berdekatan dari node A sampai node
B. Langkah-langkahnya adalah sebagai berikut:
1. Pertama, dimulai dari node A dan tambahkan ke dalam open list. Open list merupakan list untuk node-node yang harus diperiksa.
2. Ambil node A sebagai current node, dan set current node = best node. Atau dalam artian node A merupakan bagian dari jalan terpendek yang sudah didapatkan
3. Periksa apakah current node sama dengan node B, atau current node yang sudah didapatkan merupakan node tujuan. Jika iya maka jalan sudah ditemukan, jika tidak maka hapus node A dari
open list, dan tambahkan ke dalam closed list.
4. Periksa semua neighbor node atau node yang berdekatan dengan
node A apakah walkable atau tidak, abaikan node dengan collision
atau penghalang lalu tambahkan semua node tersebut ke dalam
open list. Dan untuk setiap node yang baru ditambahkan, simpan
node A sebagai “parent” yang nantinya akan digunakan untuk
menelusuri jalan.
Untuk lebih jelasnya proses perhitungan dilakukan per-iterasi dan dijelaskan sebagai berikut.
Iterasi pertama:
Pada iterasi pertama node (1,1) dimasukkan ke dalam open list, dan selanjutnya memeriksa neighbor node atau node yang berdekatan dengan
node (1,1) yaitu node {(0,0), (0,1), (0,2), (1,0), (1,2), (2,0), (2,1), (2,2)} dan dimasukkan ke dalam open list. Hapus node (1,1) dari open list dan masukkan ke dalam closed list. Ambil node dengan nilai F paling kecil sebagai current node berikutnya dalam perhitungan diatas didapat node (2,2) memiliki nilai F paling rendah dan diberikan tanda dengan kotak berwarna abu-abu.
Node yang menjadi current node atau node (2,2) diberikan nilai H = 30 yang didapatkan dari perhitungan 3 langkah atau 3 node menuju node B dan dikalikan 10, 3*10 = 30.
Iterasi pertama menghasilkan node-node di dalam open list dan closed list dijelaskan dengan tabel sebagai berikut.
Tabel III. 3 Tabel Perhitungan Iterasi Pertama
Open list Parent Closed list Current node
(0,0) (1,1) (1,1) (2,2) (0,1) (1,1) (0,2) (1,1) (1,0) (1,1) (1,2) (1,1) (2,0) (1,1) (2,1) (1,1) (2,2) (1,1)
Proses ini dilakukan berulang kali atau looping, dimulai dari open list
dan menemukan node dengan nilai F paling rendah. Langkahnya adalah sebagai berikut.
1. Hapus current node tersebut dari open list dan masukkan ke dalam
closed list.
2. Periksa semua node yang berdekatan dengan current node, abaikan
node yang unwalkable atau dalam contoh ini adalah node
penghalang. Jika tidak ada pada open list, tambahkan ke dalam
open list. Dan tambahkan “parent” untuk node tersebut.
3. Jika node sudah ada pada open list, periksa apakah ini jalan yang lebih baik dari node awal, dengan kata lain periksa apakah nilai G-nya lebih rendah apabila menggunakan node ini, jika lebih rendah maka hitung ulang nilai F dan G serta merubah arah pointer, jika tidak maka jangan lakukan apa-apa.
Selanjutnya perhitungan pada iterasi kedua dengan current node
berada pada node (2,2).
Gambar III. 6 Ilustrasi Iterasi Kedua
Periksa neighbor node atau node yang berdekatan dengan current node, disebelah kanan dan kanan bawah dari node ini adalah node penghalang atau unwalkable (gambar III.6) berarti diabaikan, dan disebelah kiri atas
adalah node (1,1) yang sudah berada di dalam closed list, yang berarti juga diabaikan.
Sedangkan node lainnya yang berdekatan sudah berada di dalam open list, jadi perlu diperiksa apakah node tersebut mempunyai jalan yang lebih baik atau tidak dengan menggunakan nilai G sebagai acuannya. Setelah diperiksa node-node tersebut ternyata tidak ada jalan yang lebih baik, maka tidak ada yang perlu diubah dan proses untuk current node ini selesai.
Node (3,2) node (2,1) dan node (1,2) memiliki nilai F yang sama, dapat dilihat pada gambar III.6 diatas, maka sistem akan memilih node (3,2) karena yang terakhir masuk ke dalam open list. Yang berarti current node
selanjutnya adalah node (3,2).
Iterasi kedua menghasilkan node-node di dalam open list dan closed list dijelaskan dengan tabel sebagai berikut.
Tabel III. 4 Tabel Perhitungan Iterasi Kedua
Open list Parent Closed list Current node
(0,0) (1,1) (1,1) (3,2) (0,1) (1,1) (2,2) (0,2) (1,1) (1,0) (1,1) (1,2) (1,1) (2,0) (1,1) (2,1) (1,1) (3,1) (2,2) (3,2) (2,2)
Selanjutnya perhitungan pada iterasi ketiga dengan current node
Gambar III. 7 Ilustrasi Iterasi Ketiga
Pada gambar III.7 diatas node (4,3) tidak dihitung atau tidak masuk ke dalam open list, karena karakter tidak akan bisa bergerak secara diagonal
menembus dinding atau collision sehingga node (4,3) otomatis menjadi
unwalkable.
Looping lagi seperti langkah sebelumnya, hapus dari open list dan tambahkan ke dalam closed list, periksa semua node yang berdekatan, masukkan ke dalam open list dan tambahkan parentnya, dan periksa lagi jalan terbaik dan parentnya. Pada node (3,1) parentnya mengalami perubahan karena setelah diperiksa nilai G yang dihasilkan dari current node lebih kecil, maka nilai F nya juga dirubah.
Nilai F pada node (3,1) juga sama dengan node (4,2), sama seperti contoh kasus sebelumnya maka node (4,2) dipilih sebagai current node.
Iterasi ketiga menghasilkan node-node di dalam open list dan closed list dijelaskan dengan tabel sebagai berikut.
Tabel III. 5 Tabel Perhitungan Iterasi Ketiga
Open list Parent Closed list Current node
(0,1) (1,1) (2,2) (0,2) (1,1) (3,2) (1,0) (1,1) (1,2) (1,1) (2,0) (1,1) (2,1) (1,1) (3,1) (3,2) (4,1) (3,2) (4,2) (3,2)
Selanjutnya perhitungan pada iterasi keempat dengan current node
berada pada node (4,2).
Gambar III. 8 Ilustrasi Iterasi Keempat
Iterasi keempat menghasilkan node-node di dalam open list dan closed list dijelaskan dengan tabel sebagai berikut.
Tabel III. 6 Tabel Perhitungan Iterasi Keempat
Open list Parent Closed list Current node
(0,0) (1,1) (1,1) (4,3) (0,1) (1,1) (2,2) (0,2) (1,1) (3,2) (1,0) (1,1) (4,2) (1,2) (1,1) (2,0) (1,1) (2,1) (1,1) (3,1) (3,2) (4,1) (4,2) (4,3) (4,2)
Perhitungan pada iterasi kelima dengan current node berada pada node
(4,3).
Gambar III. 9 Ilustrasi Iterasi Kelima
Node (3,4) menjadi unwalkable karena karakter tidak bisa langsung bergerak ke node tersebut, sehingga tidak masuk ke dalam open list.
Iterasi kelima menghasilkan node-node di dalam open list dan closed list dijelaskan dengan tabel sebagai berikut.
Tabel III. 7 Tabel Perhitungan Iterasi Kelima
Open list Parent Closed list Current node
(0,0) (1,1) (1,1) (4,4) (0,1) (1,1) (2,2) (0,2) (1,1) (3,2) (1,0) (1,1) (4,2) (1,2) (1,1) (4,3) (2,0) (1,1) (2,1) (1,1) (3,1) (3,2) (4,1) (4,2) (4,4) (4,3)
Perhitungan pada iterasi keenam dengan current node berada pada
node (4,4).
Gambar III. 10 Ilustrasi Iterasi Keenam
Iterasi keenam menghasilkan node-node di dalam open list dan closed list dijelaskan dengan tabel sebagai berikut.
Tabel III. 8 Tabel Perhitungan Iterasi Keenam
Open list Parent Closed list Current node
(0,0) (1,1) (1,1) (3,5) (0,1) (1,1) (2,2) (0,2) (1,1) (3,2) (1,0) (1,1) (4,2) (1,2) (1,1) (4,3) (2,0) (1,1) (4,4) (2,1) (1,1) (3,1) (3,2) (4,1) (4,2) (3,4) (4,4) (3,5) (4,4) (4,5) (4,4)
Pada iterasi ketujuh sudah dapat dipastikan target point masuk ke dalam closed list (gambar III.9) maka proses perhitungan selesai.
Penentuan jalan terbaik dengan melakukan pemeriksaan dimulai dari
target point atau node (2,5) dengan mengikuti arah pointer yang berarti akan membawanya kembali ke node awal, maka akan didapatkan jalan terbaiknya.
Dari perhitungan yang dilakukan diatas dapat diambil kesimpulan fungsi heuristik yang digunakan yaitu fungsi Manhattan merupakan
unadmissible heuristic atau tidak menjamin jalan yang ditemukan adalah jalan yang terbaik. Dalam contoh kasus perhitungan diatas, misalkan H*(n) merupakan cost sebenarnya dari simpul n ke simpul tujuan, maka pada algoritma A* terdapat beberapa kemungkinan yang terjadi, yaitu:
1). Jika H(n) = 0, sehingga hanya G(n) yang digunakan, maka A* akan bekerja seperti halnya algoritma Djikstra.
2). Jika H(n) ≤ H*(n), maka A* akan mengembangkan node
dengan nilai paling rendah dan algoritma A* menjamin ditemukannya jalan terbaik. Nilai H(n) terendah akan membuat algoritma mengembangkan lebih banyak node. Jika H(n) ≤
H*(n), maka H(n) dikatakan heuristik yang admissible.
3). Jika H(n) = H*(n), maka A* akan mengikuti jalan terbaik dan tidak akan mengembangkan node-node yang lain sehingga akan berjalan cepat. Tetapi hal ini tidak akan terjadi pada semua kasus. Informasi yang baik akan mempercepat kinerja A*.
4). Jika H(n) ≥ H*(n), maka A* tidak menjamin pencarian rute terpendek, tetapi berjalan dengan cepat.
5). Jika H(n) terlalu tinggi relative dengan G(n) sehingga hanya H(n) yang bekerja, maka A* berubah jadi Greedy Best First Search.
Perhitungan langkah diatas digambarkan dengan ilustrasi tree sebagai berikut.
(1,1) (0,0) (0,1) (0,2) (1,0) (3,3) Un-walkable/ collision (2,2) (2,1) (2,0) (1,2) (3,2) 84 70 64 70 70 50 50 64 60 50 44 60 50 40 30 30 24 (1,3) Un-walkable/ collision (1,2) Open list Nilai G tidak lebih kecil (1,1) Closed list (2,3) Un-walkable/ collision (2,1) Open list Nilai G tidak lebih kecil (3,1) (4,3) Un-walkable/ collision (4,2) (2,3) Un-walkable/ collision (2,2) Closed list (2,1) Open list Nilai G tidak lebih kecil (3,3) Un-walkable/ collision (3,1) Open list Nilai G tidak lebih kecil (4,1) (3,3) Un-walkable/ collision (3,2) Closed list (3,1) Open list Nilai G tidak lebih kecil (4,3) (4,1) Open list Nilai G tidak lebih kecil (3,4) Un-walkable/ collision (3,3) Un-walkable/ collision (3,2) Open list Nilai G tidak lebih kecil (4,4) (4,2) Closed list (3,5) (3,4) (3,3) Un-walkable/ collision (4,5) (4,3) Closed list (4,6) (4,5) (2,6) (2,5) Node tujuan Goal (2,4) (3,4) (3,6) (4,4)
Analisis dari algoritma A* sebagai penentuan jalan terbaik dapat dijelaskan dengan pseudocode di dalam game yang dibangun, melalui tabel dibawah ini.
Tabel III. 9 Tabel analisis algoritma A* pathfinding
Langkah Kondisi Pseudocode
1. Inisialisasi graph System type GraphType Graph[i].Name == type Return graph[i]
Return null
2. Inisialisasi matrix Matrix translate = X, Y, Z Matrix[] = X;
Matrix[] = Y; Matrix[] = Z; Return;
3. Inisialisasi open list dan closed list. OPEN = null && CLOSED = null
4. Masukkan node ke open list. OPEN = priority queue containing START
5. Ambil node dengan nilai F terendah dari open list, dan selanjutnya disebut sebagai current node. Hapus dari open list.
while lowest rank in OPEN is not the GOAL:
current = remove lowest rank item from OPEN
6. Masukkan current node ke closed list. add current to CLOSED 7. Untuk seluruh node yang terhubung
langsung dengan current node, lakukan:
a. Jika node yang diperiksa sudah termasuk dalam closed list,
for neighbors of current: cost = g(current) +
movementcost(current, neighbor) if neighbor in OPEN and cost less than g(neighbor):
abaikan.
b. Jika kondisi a tidak terpenuhi dan node belum termasuk di dalam open list, masukkan
node tersebut di open list.
c. Jika kondisi b tidak terpenuhi (berarti node diperiksa berada pada open list), dan nilai G dari
current node kurang dari nilai G dari node awal, ubah parent
dari node awal menjadi current node.
remove neighbor from OPEN, because new path is better
if neighbor in CLOSED and cost less than g(neighbor):
remove neighbor from CLOSED if neighbor not in OPEN and neighbor not in CLOSED:
set g(neighbor) to cost add neighbor to OPEN
set priority queue rank to g (neighbor) + h(neighbor)
set neighbor’s parent to current
8. Ulangi langkah nomor 3 sampai 6 jika kondisi dibawah ini tidak terpenuhi:
a. Node tujuan sudah berada di dalam closed list, atau b. Open list tidak berisi apa-apa
(tidak ditemukan jalan menuju
node tujuan).
stop looping if current = GOAL OPEN = null
9. Telusuri parent dari setiap node
dimulai dari node tujuan apabila jalan ditemukan.
reconstruct reverse path from goal to start by following parent pointers
III.2.2 Analisis Algoritma FuzzyLogic
Fuzzy logic di dalam pembangunan game ini digunakan untuk menentukan variasi perilaku yang akan dihasilkan oleh NPC (non playable character). Dengan adanya fuzzy logic, masing-masing NPC dapat merubah
perilaku berbasis perubahan variabel masukan menjadi perilaku yang akan dirancang menggunakan fuzzy logic.
Metode fuzzy yang digunakan adalah metode Sugeno, karena metode ini menghasilkan keluaran yang berupa konstanta tegas, sehingga dapat mewakili nilai perilaku yang sudah dirancang sebelumnya.
Analisis fuzzy logic yang akan dilakukan menggunakan aplikasi
MATLAB yang bertujuan untuk lebih mudah dalam perhitungan menentukan variasi perilaku NPC, tahap-tahapnya adalah sebagai berikut.
1. Variabel fuzzy
Terdapat tiga variabel yang digunakan yaitu variabel jarak dan variabel kekuatan (darah/health) sebagai variabel input, variabel perilaku NPC sebagai variabel output.
2. Nilai linguistik / terma
Dari tiga variabel yang digunakan, memiliki nilai linguistik sebagai berikut:
1). Jarak: Dekat, Sedang, Jauh 2). Kekuatan: Lemah, Kuat
3). Perilaku NPC: Melarikan diri, Bertahan, Menyerang, Menyerang Brutal
3. Fuzzyfikasi
Fuzzyfikasi merupakan proses memetakan nilai crisp (numerik) ke dalam himpunan fuzzy dan menentukan derajat keanggotaannya. Secara garis besar pemetaan nilai crisp ke dalam himpunan fuzzy
Gambar III. 12 Fuzzyfikasi
Fuzzyfikasi untuk setiap variabelnya digambarkan sebagai berikut. a. Variabel Jarak
Gambar III. 13 Fuzzyfikasi Variabel Jarak
Range nilai untuk variabel jarak diantara 0 – 10 dengan penjelasan setiap terma sebagai berikut:
1). Range nilai untuk terma dekat antara 0 – 4
2). Range nilai untuk terma sedang antara 3 – 7
b. Variabel Kekuatan
Gambar III. 14 Fuzzyfikasi Variabel Kekuatan
Range nilai untuk variabel kekuatan diantara 0 – 10 dengan penjelasan setiap terma sebagai berikut:
1). Range nilai untuk terma lemah antara 0 – 8
2). Range nilai untuk terma sedang antara 2 – 10 c. Variabel Perilaku NPC
Range nilai untuk variabel perilaku NPC diantara 0 – 30 dengan penjelasan setiap terma sebagai berikut:
1). Range nilai untuk terma menyerang brutal antara 0 – 11
2). Range nilai untuk terma menyerang antara 9 – 21
3). Range nilai untuk terma bertahanantara 19 – 31
4). Range nilai untuk terma melarikan diri antara 29 – 40
4. Kaidah fuzzy atau fuzzy’srules
Kaidah fuzzy (rules) atau aturan-aturan yang diterapkan dalam penentuan perilaku NPC berjumlah enam rules yaitu:
1). If (Jarak is Dekat) and (Kekuatan is Lemah) then (PerilakuNPC is MenyerangBrutal)
2). If (Jarak is Dekat) and (Kekuatan is Kuat) then (PerilakuNPC is Menyerang)
3). If (Jarak is Sedang) and (Kekuatan is Lemah) then (PerilakuNPC is MelarikanDiri)
4). If (Jarak is Sedang) and (Kekuatan is Kuat) then (PerilakuNPC is Menyerang)
5). If (Jarak is Jauh) and (Kekuatan is Lemah) then (PerilakuNPC is MelarikanDiri)
6). If (Jarak is Jauh) and (Kekuatan is Kuat) then (PerilakuNPC is Bertahan)
5. Agregasi dan Defuzzyfikasi
Agregasi untuk menentukan keluaran semua rules yang dikombinasikan menjadi sebuah fuzzy set tunggal. Defuzzyfikasi merupakan proses pemetaan besaran dari himpunan fuzzy set yang dihasilkan ke dalam bentuk nilai crisp.
Misalkan variabel jarak diberikan nilai crisp sebesar 1, dan variabel kekuatan diberikan nilai sebesar 9, maka proses agregasi yang menentukan keluaran sesuai dengan rules yang sudah dibuat akan dijelaskan seperti gambar berikut.
Gambar III. 16 Proses Agregasi dan Defuzzyfikasi
Gambar diatas memperlihatkan proses agregasi dengan hitungan menggunakan aplikasi MATLAB mencakup kombinasi dari enam
rules yang sudah dibuat, dan proses defuzzyfikasi pada gambar diatas menghasilkan nilai 4.34 yang berarti perilaku NPC yang
dihasilkan adalah “MenyerangBrutal” atau sesuai dengan rules
nomer 1 yaitu “IF (Jarak is Dekat) AND (Kekuatan is Lemah) THEN (PerilakuNPC is MenyerangBrutal)”.
6. Pengujian
Pengujian nilai-nilai yang dimasukkan ke dalam variabel input (jarak dan kekuatan) dan nilai yang dihasilkan oleh variabel output (perilaku NPC) dijelaskan dengan tabel sebagai berikut.
Tabel III. 10 Nilai Keluaran Dalam Proses Pengujian
Kekuatan Jar ak 1 2 3 4 5 6 7 8 9 10 1 3.92 3.92 6.38 8.31 9.94 11.5 13.1 15 15 15 2 4.34 4.34 6.85 8.31 9.94 11.5 12.9 15 15 15 3 4.84 4.84 8.46 10.1 10.1 10.1 11.8 15 15 15 4 35.4 35.4 29.6 26.6 24.9 23.1 20.2 15 15 15 5 36.1 36.1 31.4 27.9 24.9 22 18.9 15 15 15 6 35.4 35.4 29.6 26.6 24.9 23.1 20.2 15 15 15 7 35.2 35.2 31.5 29.9 29.9 29.9 28.2 25 25 25 8 35.7 35.7 33.1 31.7 30.1 28.5 27.1 25 25 25 9 36.1 36.1 33.6 31.7 30.1 28.5 26.9 25 25 25 10 36.1 36.1 33.6 31.7 30.1 28.5 26.9 25 25 25
Penjelasan dari tabel nilai keluaran dalam proses pengujian adalah sebagai berikut:
a. Tabel dengan shading warna (merah) menunjukkan
range nilai untuk terma menyerang brutal.
b. Tabel dengan shading warna (orange) menunjukkan
range nilai untuk terma menyerang.
c. Tabel dengan shading warna (hijau) menunjukkan
range nilai untuk terma bertahan.
d. Tabel dengan shading warna (biru) menunjukkan
Atau secara surface hasil dari nilai keluaran dapat digambarkan sebagai berikut:
Gambar III. 17 Surface Proses Fuzzyfikasi