Estive lendo isso: http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html
Mas há algumas coisas que eu não entendo, por exemplo, o artigo diz para usar algo parecido com isto para encontrar caminhos com movimento diagonal:
function heuristic(node) =
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
Não sei como definir D para obter um caminho de aparência natural, como no artigo, defino D com o menor custo entre quadrados adjacentes, como ele disse, e não sei o que eles querem dizer com as coisas sobre a heurística. ser 4 * D, isso não parece mudar nada.
Esta é a minha função heurística e a função move:
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
Resultado:
O caminho tranqüilo que queremos que aconteça:
O restante do meu código: http://pastebin.com/TL2cEkeX
Atualizar
Esta é a melhor solução que encontrei até agora:
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
Ele produz o caminho desejado a partir da segunda foto, mas não lida com obstáculos muito bem (tende a rastejar nas paredes) e falha em produzir caminhos ideais, às vezes em distâncias maiores.
Quais são alguns ajustes e otimizações que posso aplicar para melhorá-lo?