Ho letto questo: http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html
Ma ci sono alcune cose che non capisco, ad esempio l'articolo dice di usare qualcosa del genere per l'individuazione di percorsi con movimento diagonale:
function heuristic(node) =
dx = abs(node.x - goal.x)
dy = abs(node.y - goal.y)
return D * max(dx, dy)
Non so come impostare D per ottenere un percorso dall'aspetto naturale come nell'articolo, ho impostato D al costo più basso tra i quadrati adiacenti come si diceva, e non so cosa intendessero per roba euristica essere 4 * D, ciò non sembra cambiare nulla.
Questa è la mia funzione euristica e la funzione di spostamento:
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
Risultato:
Il liscio percorso di navigazione che vogliamo che accada:
Il resto del mio codice: http://pastebin.com/TL2cEkeX
Aggiornare
Questa è la migliore soluzione che ho trovato finora:
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
Produce il percorso desiderato dalla seconda immagine, ma non gestisce molto bene gli ostacoli (tende a strisciare sui muri) e non riesce a produrre percorsi ottimali a volte su distanze più lunghe.
Quali sono alcune modifiche e ottimizzazioni che posso applicare per migliorarlo?