Bunu okudum: http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html
Ama anlamadığım bazı şeyler var, örneğin makale diyagonal hareketle yol bulma için böyle bir şey kullandığını söylüyor:
function heuristic(node) =
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
D'yi makalede olduğu gibi doğal görünümlü bir yol elde etmek için nasıl bilmiyorum, D'yi dediğim gibi bitişik kareler arasındaki en düşük maliyete ayarladım ve sezgisel meseleyle ilgili ne anlama geldiğini bilmiyorum 4 * D olsun, bu hiçbir şeyi değiştirmiyor gibi görünüyor.
Bu benim sezgisel fonksiyonum ve hareket fonksiyonum:
def heuristic(self, node, goal):
D = 5
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
def move_cost(self, current, node):
cross = abs(current.x - node.x) == 1 and abs(current.y - node.y) == 1
return 7 if cross else 5
Sonuç:
Gerçekleşmek istediğimiz pürüzsüz yelken yolu:
Kodumun geri kalanı: http://pastebin.com/TL2cEkeX
Güncelleme
Bu şimdiye kadar bulduğum en iyi çözüm:
def heuristic(node, start, goal):
dx1 = node.x - goal.x
dy1 = node.y - goal.y
dx2 = start.x - goal.x
dy2 = start.y - goal.y
cross = abs(dx1*dy2 - dx2*dy1)
dx3 = abs(dx1)
dy3 = abs(dy1)
return 5 + (cross*0.01) * (dx3+dy3) + (sqrt(2)-2) * min(dx3, dy3)
def move_cost(current, node):
cross = abs(current.x - node.x) == 1 and abs(current.y - node.y) == 1
return 7 if cross else 5
İkinci resimden istenen yolu üretir, ancak engelleri çok iyi idare etmez (duvarlara sürünme eğilimi gösterir) ve bazen daha uzun mesafelerde optimum yollar üretemez.
Geliştirmek için uygulayabileceğim bazı ince ayarlar ve optimizasyonlar nelerdir?