Saya memiliki peta berbasis persegi. Hanya gerakan horisontal dan vertikal yang diizinkan (tidak ada diagonal). Biaya perpindahan selalu 1.
Saya menerapkan algoritma A * pada peta itu, menggunakan jarak Manhattan sebagai heuristik jarak. Apakah heuristik ini konsisten? Bisakah saya menghindari pengecekan g(node)
terhadap node yang ada di set TERTUTUP?
Sunting: Secara konsisten saya maksudkan monoton.
tiles
path-finding
geometry
Emiliano
sumber
sumber
Jawaban:
Untuk benar-benar menjawab pertanyaan Anda: jarak manhatten konsisten ketika Anda dibatasi untuk bergerak secara vertikal / horizontal di sepanjang kisi yang tidak berbobot (ini dapat dengan mudah ditunjukkan oleh definisi pada wikipedia) . Jadi ya, dalam kasus Anda, Anda dapat menghindari mengecek ulang node di set tertutup.
Namun, begitu Anda mengizinkan gerakan diagonal atau sudut mana saja, jarak manhatten menjadi diterima karena terlalu melebih-lebihkan biaya diagonal, yang berarti itu tidak konsisten.
sumber
h(x) = min(manhattan(p1), manhattan(p2))
(yaitu p1 atau p2 adalah titik akhir yang baik dan saya ingin mencapai yang terdekat). Apakah inih(x)
masih monoton?h(x, p1)
danh(x, p2)
konsisten, makamin(h(x,p1), h(x,p2))
juga akan konsisten. Ini mudah untuk ditunjukkan dari definisi di wikipedia (kita perlu menunjukkan bahwamin(h(x, p1), h(x, p2)) <= distance(x,y) + min(h(y, p1), h(y, p2))
untuk semua nodex
dany
dengan keunggulan di antara mereka. Sekarang asumsikan ituh(x, p1)
adalah minimum; dapatkah Anda menunjukkan bahwa itu pasti<=
sisi kanan, menggunakan fakta bahwa kedua heuristik itu konsisten?)Ya, jarak Manhattan antara dua titik selalu sama, seperti jarak reguler di antara mereka. Anda dapat menganggap jarak Manhattan sebagai komponen X dan Y dari sebuah garis yang berjalan di antara dua titik.
Gambar ini ( dari Wikipedia ) menggambarkan hal ini dengan baik:
Itu hijau adalah jarak yang sebenarnya.
Itu biru , merah dan kuning semuanya mewakili jarak Manhattan yang sama (12 unit). Apa pun kombinasi gerakan ke atas dan kanan yang Anda gambar dari titik kiri bawah ke kanan bawah, Anda akan mendapatkan total jarak Manhattan yang sama.
sumber
h(x) = 1000
, yang jelas tidak konsisten) . Dia dapat menghindari memeriksa ulang node, tetapi hanya karena jarak Manhatten konsisten, yang jawaban ini tidak ditampilkan.2*manhatten
memenuhi itu, tetapi tidak konsisten.Dalam perpanjangan jawaban Byte56 saya ingin menunjukkan, bahwa dalam kumpulan data spesifik Anda, menggunakan Jarak Manhattan sebagai fungsi heuristik Anda sebenarnya akan selalu menjadi heuristik yang sempurna dalam arti bahwa itu akan selalu mengembalikan biaya jalur yang sebenarnya (dengan asumsi ada tidak ada yang "menghalangi" jalan).
Anda juga harus mencatat, bahwa semua node dalam arah yang benar (baik secara horisontally atau vertikal) akan menghasilkan jarak yang diharapkan sama (karena ada banyak jalur yang sama pendeknya dengan tujuan). Anda harus menyadari bahwa antrian prioritas Anda (set terbuka) harus, jika ada prioritas terikat, terlebih dahulu menentukan node yang ditambahkan terakhir (LIFO - Last In First Out). Dengan melakukan itu, Anda hanya akan memeriksa node yang akan berakhir di jalur optimal . Jika Anda memeriksa node yang sama-sama cocok dengan cara FIFO (First In First Out), Anda akan secara efektif memeriksa semua node yang merupakan bagian dari jalur terbaik. Masalah ini muncul karena ada beberapa jalur yang sama baiknya ke simpul tujuan.
sumber
Saya tidak yakin apa yang Anda maksud dengan "selalu" konsisten. Apakah jarak Manhattan pada jaringan tetap tidak tergantung pada jalur yang diambil? Ya, seperti jawaban Byte56.
Namun, misalnya, jarak Manhattan tidak berubah di bawah rotasi. Misalnya, jarak Manhattan ( norma-L1 ) antara titik asal dan titik
(10,10)
adalah|10-0| + |10-0| = 20
. Namun, jika Anda memutar koordinat Anda dengan 45 derajat (jadi sekarang titik tetap Anda berada di sepanjang salah satu arah grid), sekarang Anda akan menemukan titik yang sama sekarang(10sqrt(2),0)
, sehingga memiliki jarak Manhattan ke titik asal10sqrt(2)~14.14
.sumber