In adalah pembahasan ke 7 dari seri Algorithma Path Finding. Pembahasan pertama bisa Anda baca pada tautan ini.
Pada pembahasan sebelumnya kita membahas tentang bagaimana membuat karakter berjalan lebih halus dalam penerapan algorithma path-finding.
Pada tulisan kali ini kita akan membahas tentang A * (A Star) Path finding. A * Pathfinding adalah penyempurnaan dari algorithma path finding sebelumnya yang biasa dikenal dengan istilah fast-path-finding.
A * Path finding akan menghasilkan jalur yang lebih optimal.
Perhatikan perbedaan keduanya dalam kedua gambar berikut.
Jalur yang dibuat dari algorithma sebelumnya hasilnya tidak optimal. Karakter menempuh jalur yang lebih panjang.
Demonya bisa dicoba online di tautan ini:
Kode sumber bisa di unduh di tautan ini:
Video Youtube:
Apa yang berubah?
Dalam pembahasan kali ini kita mengenalkan konsep G. G adalah 'jarak' dari posisi awal ke posisi sekarang. G dihitung dengan cara berbeda dengan jarak sebelumnya (H) yang dihitung dari posisi sekarang ke posisi tujuan.
G tidak dihutung secara kira-kira/heuristic seperti H. G adalah jarak sebenarnya. Kita mendapatkan G dengan cara menambahkan nilai G dari cell parent. Cell parent mendapatkan nilai G dari parent sebelumnya, hingga ke cell yang pertama. Dengan cara ini, maka nilai G tidak dikira-kira.
Sebenarnya istilah 'jarak' kurang cocok untuk G, namun untuk menyamakan dengan H, maka saya pakai istilah jarak. G sebenarnya lebih cocok disebut biaya perjalanan dari titik awal ke titik sekarang.
Pada pembahasan sebelumnya kita menghitung jarak dengan cara mengira-ira dari posisi sekarang keposisi target.
Jarak(F) = H ...1)
Dengan adanya G maka perhitungannya jadi:.
Jarak(F) = G + H ...2)
G biasanya tidak berdiri sendiri tapi diberi pemberat.
Jarak (F) = G * P + H ...3)
P adalah pemberat. Bila nilainya satu maka G * P = G, (persamaan 2).
P bernilai lebih dari atau sama dengan satu. Semakin besar P, maka G akan semakin berat, dan hal ini akan mempengaruhi penghitungan jarak. Semakin besar pengaruh G, maka jarak yang dihasilkan akan semakin optimal, namun waktu yang dibutuhkan untuk menyelesaikan algorithma juga semakin lama.
Perubahan kode sumber
Kita melakukan perubahan pada kode sumber untuk mengenalkan G.
Perubahan pertama ada pada fungsi cellBuat().
function cellBuat(parent, x, y, tx, ty) {
...
let cell = {
x: x,
y: y,
buka: 1,
jarak: -1,
induk: parent,
g: parent ? parent.g + 1 : 0
};
cell.jarak = Math.abs(tx - x) + Math.abs(ty - y);
cell.jarak += (cell.g * 1.1);
return cell;
}
Terima kasih sudah mampir dan membaca
Tidak ada komentar:
Posting Komentar