J'ai lu ceci: http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html
Mais il y a certaines choses que je ne comprends pas, par exemple, l'article dit d'utiliser quelque chose comme ça pour trouver un chemin avec un mouvement diagonal:
function heuristic(node) =
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
Je ne sais pas comment définir D pour obtenir un chemin d'apparence naturelle comme dans l'article, j'ai défini D au coût le plus bas entre les carrés adjacents comme il est dit, et je ne sais pas ce qu'ils voulaient dire par les choses sur l'heuristique. être 4 * D, cela ne semble rien changer.
Voici ma fonction heuristique et ma fonction de déplacement:
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
Résultat:
Le chemin de navigation en douceur que nous voulons réaliser:
Le reste de mon code: http://pastebin.com/TL2cEkeX
Mise à jour
C'est la meilleure solution que j'ai trouvée jusqu'à présent:
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
Il produit le chemin souhaité à partir de la deuxième photo, mais ne gère pas très bien les obstacles (a tendance à ramper sur les murs) et ne parvient pas à produire des chemins optimaux parfois sur de plus longues distances.
Quels sont les ajustements et optimisations que je peux appliquer pour l'améliorer?